Ответ 1
FWIW, я просто получил аналогичную ошибку при дооснащении существующего пакета R-only с Rcpp, и проблема заключалась в отсутствии useDynLib(mypackage)
в NAMESPACE
.
Мне удалось установить 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.
Есть ли какие-либо дополнительные проверки, которые я могу сделать, чтобы увидеть, что происходит? Любые идеи?
FWIW, я просто получил аналогичную ошибку при дооснащении существующего пакета R-only с Rcpp, и проблема заключалась в отсутствии useDynLib(mypackage)
в NAMESPACE
.
Пакет тестируется широко перед каждой версией, в том числе на 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
.
Если файл пакета NAMESPACE содержит строку
useDynLib(mypackage, .registration = TRUE)
(возможно, через линию кислорода #' @useDynLib, .registration = TRUE
), затем необходимо удалить PACKAGE = "mypackage"
из вызовов функций .C
/.Call
:
то есть
.Call( "rcpp_hello_world", PACKAGE = "mypackage")
становится .Call("rccp_hello_world")
.