Rcpp:C++ 函数在 R 包中不起作用
Rcpp: C++ functions don't work in 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"
我是否遗漏了任何步骤?对我有什么建议吗?
如果问题质量不够好,请给我反馈,我会尽快编辑。
您的 NAMESPACE
文件中可能缺少 useDynLib(<pkg>)
条目。如果您使用 Roxygen 并按照书中的示例进行操作,则需要在 R 文件中包含以下内容(此时最好的猜测是您错过了这一步):
#' @useDynLib your-package-name
#' @importFrom Rcpp sourceCpp
NULL
@useDynLib <pkg>
Roxygen 指令指示 roxygen2
包在您重新记录包时在 NAMESPACE
文件中包含一个 useDynLib(<pkg>)
。
您是否记得将上面的相关行添加到 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()
我在 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"
我是否遗漏了任何步骤?对我有什么建议吗?
如果问题质量不够好,请给我反馈,我会尽快编辑。
您的 NAMESPACE
文件中可能缺少 useDynLib(<pkg>)
条目。如果您使用 Roxygen 并按照书中的示例进行操作,则需要在 R 文件中包含以下内容(此时最好的猜测是您错过了这一步):
#' @useDynLib your-package-name
#' @importFrom Rcpp sourceCpp
NULL
@useDynLib <pkg>
Roxygen 指令指示 roxygen2
包在您重新记录包时在 NAMESPACE
文件中包含一个 useDynLib(<pkg>)
。
您是否记得将上面的相关行添加到 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()