Rcpp Rcpp.package.skeleton( "mypackage" ) "rcpp_hello_world" недоступен для .Call() для пакета "mypackage"

Мне удалось установить Rcpp.package.skeleton для установки в Windows с помощью следующих команд в приглашении R -

Rcpp.package.skeleton("mypackage")
system("R CMD build mypackage")
system("R CMD INSTALL mypackage")
library(mypackage)

Это создает mypackage.dll. Однако, когда я выполняю следующие команды -

rcpp_hello_world <- function(){ .Call( "rcpp_hello_world", PACKAGE = "mypackage")}
rcpp_hello_world()

Я получаю следующую ошибку:

Error in .Call("rcpp_hello_world", PACKAGE = "mypackage") : 
"rcpp_hello_world" not available for .Call() for package "mypackage"

Я запускаю sessionInfo() и получаю следующее:

attached base packages:
[1] tools     stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] mypackage_1.0 inline_0.3.13 Rcpp_0.11.1

Утверждение, что у меня есть новый mypackage.

Есть ли какие-либо дополнительные проверки, которые я могу сделать, чтобы увидеть, что происходит? Любые идеи?

Ответы

Ответ 1

FWIW, я просто получил аналогичную ошибку при дооснащении существующего пакета R-only с Rcpp, и проблема заключалась в отсутствии useDynLib(mypackage) в NAMESPACE.

Ответ 2

Пакет тестируется широко перед каждой версией, в том числе на Windows-using Win-builder. Тесты регрессии даже включают создание пакета таким образом, путем вызова package.skeleton().

Он также перестраивается после выпуска CRAN. Многие используют его.

Для всех этих людей тесты подходят и когда long long нельзя использовать, это #define -d.

Теперь вы настаиваете на построении нестандартным способом: ни один источник, который я знаю, рекомендует вызывать R CMD INSTALL через system(). Я подозреваю, что у вас просто есть ошибка $PATH и найти другую неправильную версию g++.

Я предлагаю сделать то, что предлагает документация, и запустить

  R CMD INSTALL mypackage*tar.gz

в командной строке cmd.exe.

Ответ 3

Если файл пакета NAMESPACE содержит строку useDynLib(mypackage, .registration = TRUE) (возможно, через линию кислорода #' @useDynLib, .registration = TRUE), затем необходимо удалить PACKAGE = "mypackage" из вызовов функций .C/.Call:

то есть .Call( "rcpp_hello_world", PACKAGE = "mypackage") становится .Call("rccp_hello_world").