我在R中有一些功能,我用Rcpp对它们进行了重新编码。每个函数都有一个独立的.cpp文件。一个名为add_inflow()
的函数。以前,我将所有cpp函数放在桌面上并使用Rcpp::sourceCpp("add_inflow.cpp")
。然后,这个c ++函数可以通过插入参数给我一个输出值。
然后我想按照Compiled Code, R Packages, Hadley
将它们嵌入我名为stormwindmodel
的R包中
首先,我运行devtools::use_rcpp()
,然后将所有cpp函数移动到src
文件下。然后,我点击了build& reload按钮,它已成功完成。在这一点上,我发现原始的R功能在环境面板中,但没有看到我的cpp功能。然后我运行load_all
,这次cpp functinos出现了。但是,当我运行add_inflow_Cpp()
函数时,Rstudio给了我这个输出:
Error in .Call("stormwindmodel_add_forward_speed_Cpp", PACKAGE = "stormwindmodel", :
"stormwindmodel_add_forward_speed_Cpp" not available for .Call() for package "stormwindmodel"
我是否错过任何步骤?对我有什么建议吗?
如果问题质量不够好,请给我反馈,我会尽快编辑。
答案 0 :(得分:6)
您可能遗漏了useDynLib(<pkg>)
文件中的NAMESPACE
条目。如果您正在使用Roxygen并按照本书中的示例进行操作,则需要在R文件中包含以下内容(此时最好的猜测是您错过了此步骤):
#' @useDynLib your-package-name
#' @importFrom Rcpp sourceCpp
NULL
@useDynLib <pkg>
Roxygen指令指示roxygen2
包在useDynLib(<pkg>)
文件中包含NAMESPACE
,无论何时重新记录包。
您是否记得将上面的相关行添加到R文件夹中的R文件中(例如R/package-init.R
处),并在添加后重新记录该包?如果您已正确完成所有操作,则应该会在useDynLib(<pkg>)
文件中添加NAMESPACE
,并将<pkg>
替换为您的软件包的实际名称。
应该注意devtools::use_rcpp()
不自动为您执行此操作 - 在运行该功能后,它会指示您需要手动执行此步骤:
> devtools::use_rcpp()
Adding Rcpp to LinkingTo and Imports
* Creating `src/`.
* Ignoring generated binary files.
Next, include the following roxygen tags somewhere in your package:
#' @useDynLib sparklyr
#' @importFrom Rcpp sourceCpp
NULL
Then run document()