Rcpp:C++函数在R包中不起作用

Bra*_*wan 2 r rcpp rstudio r-package

我在R中有一些函数,我用Rcpp对它们进行了重新编码.每个函数都有一个独立的.cpp文件.一个叫做的功能add_inflow().以前,我将所有cpp函数放在我的桌面上并使用Rcpp::sourceCpp("add_inflow.cpp").然后,这个c ++函数可以通过插入参数给我一个输出值.

然后我想stormwindmodel通过遵循Compiled Code,R Packages,Hadley将它们嵌入我的R包中

首先,我运行devtools::use_rcpp(),然后将所有cpp函数移动到src文件下.然后,我点击了构建和重新加载按钮,它已成功完成.在这一点上,我发现原始的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"  
Run Code Online (Sandbox Code Playgroud)

我错过了任何一步吗?对我有什么建议吗?

如果问题的质量不够好,请给我反馈,我会尽快编辑.

Kev*_*hey 6

您可能错过了文件中的useDynLib(<pkg>)条目NAMESPACE.如果您正在使用Roxygen并按照本书中的示例进行操作,则需要在R文件中包含以下内容(此时最好的猜测是您错过了此步骤):

#' @useDynLib your-package-name
#' @importFrom Rcpp sourceCpp
NULL
Run Code Online (Sandbox Code Playgroud)

每当您重新记录包时,@useDynLib <pkg>Roxygen指令都会指示roxygen2useDynLib(<pkg>)NAMESPACE文件中包含a .

您是否记得将上面的关联行添加到R文件夹(例如at R/package-init.R)的包中的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()
Run Code Online (Sandbox Code Playgroud)