Intereting Posts
текстуры с прозрачным фоном с использованием alpha blending opengl C ++ Как создать гетерогенный контейнер Полноэкранный режим на мониторе A при настройке с двумя мониторами ломается при перемещении окон с монитора B на него Автоматическая генерация заглушек функций C ++ Ошибка ввода данных в частный вектор (недопустимое использование) Поведение униформ после glUseProgram () и скорости Получение исполняемого пути cmake для выполнения его по пользовательской команде CMAKE_COMPILER_IS_GNUCXX и CMAKE_CXX_COMPILER_ID пусты Заказать функции в файлах .cpp для соответствия порядку в файлах .h в Visual Studio 2015? Задача циклической ссылки C ++ Можно ли написать программу без использования функции main ()? clang “hello, world!” ошибки ссылок в windowsх В чем разница между std :: condition_variable и std :: condition_variable_any? CLion CMakeLists.txt добавить аргументы argv в конфигурацию gcc vs clang – неоднозначная перегрузка при использовании переадресации lambda на основе make_overload

Перемещение из sourceCpp в пакет с помощью Rcpp

В настоящее время у меня есть .cpp файл, который я могу скомпилировать с помощью sourceCpp() . Как и ожидалось, создается соответствующая функция R, и код работает так, как ожидалось.

Вот:

 #include  using namespace Rcpp; // [[Rcpp::export]] NumericVector exampleOne(NumericVector vectorOne, NumericVector vectorTwo){ NumericVector outputVector = vectorOne + vectorTwo; return outputVector; } 

Теперь я конвертирую свой проект в пакет с помощью Rcpp . Поэтому я создал скелет с rStudio и начал смотреть, как конвертировать вещи.

В превосходном учебнике Хэдли на Cpp он говорит в разделе «Использование Rcpp в пакете»:

Если ваши пакеты используют атрибут Rcpp :: export, то добавляется еще один шаг в процессе сборки пакета. Функция compileAttributes проверяет исходные файлы в пакете на атрибуты Rcpp :: export и генерирует код, необходимый для экспорта функций в R.

Вы должны повторно запускать compileAttributes всякий раз, когда функции добавляются, удаляются или изменяются их подписи. Обратите внимание: если вы создаете свой пакет с помощью RStudio или devtools, то этот шаг происходит автоматически.

Таким образом, похоже, что код, скомпилированный с помощью sourceCpp() должен работать так же, как и в пакете.

Я создал соответствующий R-файл.

 exampleOne <- function(vectorOne, vectorTwo){ outToR <- .Call("exampleOne", vectorOne, vectorTwo, PACKAGE ="testPackage") outToR } 

Затем я (ре) построил пакет, и я получаю эту ошибку:

Error in .Call("exampleOne", vectorOne, vectorTwo, PACKAGE = "voteR") : C symbol name "exampleOne" not in DLL for package "testPackage"

Кто-нибудь имеет представление о том, что еще мне нужно делать, когда вы делаете код, который компилируется с помощью sourceCpp (), а затем используете его в пакете?

Я должен отметить, что я прочитал: «Написание пакета, который использует Rcpp» http://cran.rstudio.com/web/packages/Rcpp/vignettes/Rcpp-package.pdf, и понять основную структуру, представленную там. Однако, посмотрев исходный код RcppExamples , кажется, что структура в виньетках не совсем такая же, как в примере пакета. Например, не используются файлы .h. Также ни виньетка, ни исходный код не используют атрибут [[Rcpp :: export]]. Это все затрудняет отслеживание того, где моя ошибка.

Вот моя «прогулка» о том, как перейти от использования sourceCpp () к пакету, который использует Rcpp. Если есть ошибка, вы можете отредактировать это или сообщить мне, и я отредактирую его.

[ПРИМЕЧАНИЕ: Я рекомендую использовать RStudio для этого процесса.]

Таким образом, у вас есть свойство sourceCpp (), и теперь вам нужно создать пакет. Это не сложно, но может быть немного сложнее, потому что информация о создании пакетов с Rcpp варьируется от исчерпывающей полной документации, которую вы хотите с любым пакетом R (но это выше вашей головы как новичок), и новичок, чувствительный (которые могут не учитывать детали, которые вам понадобятся).

Здесь я использую oneCpp.cpp и twoCpp.cpp как имена двух файлов .cpp, которые вы будете использовать в своем пакете.

Вот что я предлагаю:

A. Сначала я предполагаю, что у вас есть версия theCppFile.cpp которая компилируется с помощью sourceCpp () и работает так, как вы ожидаете. Это не обязательно, но если вы новичок в Rcpp OR-пакетах, приятно убедиться, что ваш код работает в этой простой ситуации, прежде чем переходить к более сложному случаю ниже.

B. Теперь создайте свой пакет с помощью Rcpp.package.skeleton() или используйте Project> Create Project> Package w / Rcpp wizard в RStudio (настоятельно рекомендуется). Вы можете найти информацию об использовании Rcpp.package.skeleton () в [hadley / devtools] [1] или [Rcpp Attributes Vignette] [2]. Полная документация для написания пакетов с Rcpp находится в [Написание пакета, который использует Rcpp] [3], однако это предполагает, что вы хорошо знаете свой путь по C ++ и не используете новый способ «Атрибуты» для выполнения Rcpp. Это будет неоценимо, если вы перейдете к созданию более сложных пакетов.

Теперь у вас должна быть структура каталогов для вашего пакета, которая выглядит примерно так:

 yourPackageName - DESCRIPTION - NAMESPACE - \R\ - RcppExports.R - Read-and-delete-me - \man\ - yourPackageName-package.Rd - \src\ - Makevars - Makevars.win - oneCpp.cpp - twoCpp.cpp - RcppExports.cpp 

После того, как все настроено, выполните «Build & Reload», если вы используете RStudio или compileAttributes() если вы не находитесь в RStudio.

C. Теперь вы должны увидеть в своем каталоге \ R файл с именем RcppExports.R . Откройте его и проверьте. В RcppExports.R вы должны увидеть функции обертки R для всех файлов .cpp которые у вас есть в каталоге \src . Довольно сладкий, а?

D) Попробуйте выполнить функцию R, соответствующую функции, которую вы написали в theCppFile.cpp . Это работает? Если так двигаться дальше.

E) Теперь вы можете просто добавить новые .cpp файлы, такие как otherCpp.cpp в otherCpp.cpp \src при их создании. Затем вам просто нужно перестроить пакет, и обертки R будут сгенерированы и добавлены в RcppExports.R для вас. В RStudio это просто «Build & Reload» в меню «Построение». Если вы не используете RStudio, вы должны запустить compileAttributes()

Короче говоря, трюк заключается в вызове compileAttributes() из корня пакета. Так, например, для пакета foo

 $ cd /path/to/foo $ ls DESCRIPTION man NAMESPACE R src $ R R> compileAttributes() 

Эта команда будет генерировать RcppExports.cpp и RcppExports.R , которые отсутствовали.

Вам не хватает леса для деревьев.

sourceCpp() – это недавняя функция; это часть того, что мы называем атрибутами Rcpp, у которого есть собственная виньетка (с тем же названием, в пакете, на моем веб-сайте и на CRAN), которую вы можете прочитать. В нем, помимо прочего, подробно описано, как превратить что-то, скомпилированное и запущенное с помощью sourceCpp() в пакет . Это то, что вы хотите.

Случайное переключение между документацией не поможет вам, и в конце подлинной исходной документации авторы пакетов могут быть предпочтительнее. Или для того, чтобы развернуть его: вы используете новую функцию, но старую документацию, которая ее не отражает. Попробуйте написать базовый пакет с Rcpp, то есть приступить к нему с другого конца.

Наконец, есть список рассылки …