我有两个文件,Rfile.R和Cppfile.cpp。
Cppfile.cpp中的内容:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
int CPPF(int k){return ++k;}R文件中的内容:
RF<-function(k){return(CPPF(k))}我想要建立一个基于这两个文件的R包。我使用了Rstudio和Roxygen2的最新版本。
我尝试了3种使用或不使用Roxygen2构建包的方法,并得到了不同的结果:
我是用错了活性氧还是RO2有虫子?我要把它记录下来。我可以坚持第三种方式,这花费了我很大的精力去寻找,但连线。
谢谢!
解决这个问题的一种方法是:当选择“用RO2生成文档”时,不要选中“命名空间文件”选项。
发布于 2014-05-26 19:16:54
您混淆了两件事情(不幸的是,这很容易混淆):
首先,// [[Rcpp::export]]属性用于在两个文件( RcppExports.cpp和RcppExports.R )中自动生成包装器函数.包装器R函数CPPF将由Rcpp::compileAttributes()在这里自动生成,并放入R/RcppExports.R中.
其次,可以使用roxygen注释来管理NAMESPACE,例如使用@export标记。请注意,这与// [[Rcpp::export]]不同!
自动生成的函数不会自动导出.Rcpp.package.skeleton()将生成一个NAMESPACE文件,该文件将自动导出给定名称的所有函数;即exportPattern("^[[:alpha:]]+")条目。对于小型包来说,这已经足够了;但是随着包变得更加复杂,您将需要对您的命名空间进行更细粒度的控制。或者,您可以采用一种约定,在这种约定中,所有内部的、非导出的函数都以.开头。无论哪种方式,这种机制都允许将自动生成的函数导出到包命名空间中。
如果要使用roxygen管理NAMESPACE,则需要将roxygen注释添加到C++函数中,如果希望将它们导出到命名空间中。因此,您可以按以下方式修改您的函数:
#include <Rcpp.h>
using namespace Rcpp;
//' @export
// [[Rcpp::export]]
int CPPF(int k){return ++k;}请注意,您可能必须运行roxygen2::upgradeRoxygen(),以确保roxygen2接管了新版本的roxygen2的NAMESPACE。
发布于 2014-05-26 12:34:44
因此,如果2不工作,将其作为(可重复的)错误报告提交给roxygen2团队。
我没有看到Rcpp问题;导入:/命名空间声明可能出了问题。我在这里没有看到Rcpp问题(因为1很好)。
FWIW我还在一些包上使用roxygen2,我也不时用RStudio构建它们。
https://stackoverflow.com/questions/23869956
复制相似问题