[英]Call Rcpp c++ function from R code in the same package
我想用 C++ 和 R 代码构建一个 Rcpp package 代码。 仅使用 C++ 代码(已删除 R 代码),一切都可以编译并运行良好,并且在构建和加载导出的函数后可以按预期调用
<packageName>::<functionName>()
但是,当包含 R 代码和对 C++ 代码的调用时,我得到一个 object 在构建 ZEFE8407A8DZ03ADD76A7 时未找到错误
R CMD build <packageName>
[...]
** R
** byte-compile and prepare package for lazy loading
Error in <functionName>() :
object '_<packageName>_<functionName>' not found
Error: unable to load R code in package '<packageName>'
该错误发生在 C++ 代码编译成功后。
<functionName>()
映射到
_<packageName>_<functionName>
像往常一样在R/RcppExports.R
中,但它似乎不能在构建时由 R 代码加载。
package的结构和往常一样:
<packageName>
├── DESCRIPTION
├── man
│ ├── <functionName>.rd
│ └── <packageName>-package.rd
├── NAMESPACE
├── R
│ ├── <RCodeFileName>.R
│ └── RcppExports.R
├── README.md
└── src
├── <C++CodeFileName>.cpp
├── <C++CodeFileName>.o
├── <packageName>.so
├── RCppExports.cpp
├── RCppExports.o
└── symbols.rds
编译 package 时会生成.o
和.so
文件。
R 文件直接从 C++ 文件中调用 function:
[other stuff]
[...]
<functionName>()
NAMESPACE
文件也照常:
useDynLib(<packageName>, .registration=TRUE)
importFrom(Rcpp, evalCpp)
exportPattern("^[[:alpha:]]+")
这似乎是一个非常简单直接的问题(从 Rcpp 包中的 R 代码调用 C++ 代码)。 尽管如此,我似乎无法找到任何关于如何做到这一点的迹象。
编辑(2020 年 4 月 8 日): build
与INSTALL
在每种情况下都会出现问题
R CMD INSTALL <packageName>_<version>.tar.gz
如果包含的帮助文件
man/<packageName>-package.Rd
构建它以强制installing the package to process help pages
,该错误已经发生在
R CMD build <packageName>
如上所述。
编辑(2020 年 4 月 8 日):使用Rcpp.package.skeleton()
重现的步骤(无论如何在类 Unix 系统上)
Rscript -e 'Rcpp::Rcpp.package.skeleton("demo20200408")'
echo 'rcpp_hello_world()' > errorDemo/R/example.R
R CMD INSTALL errorDemo
你可能想放慢速度。 The Rcpp package itself comes with a demo package generator via the Rcpp.package.skeleton()
function. 运行!
逐个比较你所拥有的。
第二个生成器是例如内置在 RStudio 中,可在文件 -> 新项目 -> 新目录 -> Package 下使用 Rcpp 菜单选项。
否则,很难说。 你对你 function 的名字做了什么时髦的事吗? 因为这些映射到 R和C++ ,所以您对两者都有限制。 即你不能使用点(因为那将是 C++ 中的 class 方法符号)。
最后,即使未导出C++ function 也应该可以通过三个冒号从已安装和加载的 package 获得,即mypkg:::myFun()
最后,快速演示:
创造它edd@rob:/tmp$ Rscript -e 'Rcpp::Rcpp.package.skeleton("demo20200408")' Creating directories... Creating DESCRIPTION... Creating NAMESPACE... Creating Read-and-delete-me... Saving functions and data... Making help files... Done. Further steps are described in './demo20200408/Read-and-delete-me'. Adding Rcpp settings >> added Imports: Rcpp >> added LinkingTo: Rcpp >> added useDynLib directive to NAMESPACE >> added importFrom(Rcpp, evalCpp) directive to NAMESPACE >> added example src file using Rcpp attributes >> added Rd file for rcpp_hello_world >> compiled Rcpp attributes edd@rob:/tmp$
安装它
edd@rob:/tmp$ Rscript -e 'library(demo20200408); rcpp_hello_world()'
[[1]]
[1] "foo" "bar"
[[2]]
[1] 0 1
edd@rob:/tmp$
运行
edd@rob:/tmp$ Rscript -e 'library(demo20200408); rcpp_hello_world()' [[1]] [1] "foo" "bar" [[2]] [1] 0 1 edd@rob:/tmp$
并添加一个 R function 并调用它
edd@rob:/tmp$ echo 'r_hello_world <- function() cat("hi there\n")' > demo20200408/R/foo.R edd@rob:/tmp$ R CMD INSTALL demo20200408 * installing to library '/usr/local/lib/R/site-library' * installing *source* package 'demo20200408'... ** using staged installation ** libs make: Nothing to be done for 'all'. installing to /usr/local/lib/R/site-library/00LOCK-demo20200408/00new/demo20200408/libs ** R ** byte-compile and prepare package for lazy loading ** help *** installing help indices ** building package indices ** testing if installed package can be loaded from temporary location ** checking absolute paths in shared objects and dynamic libraries ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (demo20200408) edd@rob:/tmp$ Rscript -e 'library(demo20200408); r_hello_world()' hi there edd@rob:/tmp$
尽管 OP 声称仍然没有问题
在下面的最新评论中,声称生成的 function 无法调用。 那是错误的。
edd@rob:/tmp$ editor demo20200408/R/foo.R # subst. fave editor here edd@rob:/tmp$ cat demo20200408/R/foo.R r_hello_world <- function() { cat("hi there\n") ignored <- rcpp_hello_world() NULL } edd@rob:/tmp$ R CMD INSTALL demo20200408 * installing to library '/usr/local/lib/R/site-library' * installing *source* package 'demo20200408'... ** using staged installation ** libs make: Nothing to be done for 'all'. installing to /usr/local/lib/R/site-library/00LOCK-demo20200408/00new/demo20200408/libs ** R ** byte-compile and prepare package for lazy loading ** help *** installing help indices ** building package indices ** testing if installed package can be loaded from temporary location ** checking absolute paths in shared objects and dynamic libraries ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (demo20200408) edd@rob:/tmp$ Rscript -e 'library(demo20200408); r_hello_world()' hi there NULL edd@rob:/tmp$
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.