Rcpp:C ++函数不适用于R包

时间:2016-12-09 00:02:39

标签: r rstudio rcpp r-package

我在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"  

我是否错过任何步骤?对我有什么建议吗?

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

1 个答案:

答案 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()