使用roxygen2构建R包时出错

use*_*927 9 r rcpp roxygen2

我有2个文件,Rfile.R和Cppfile.cpp.

Cppfile.cpp中的内容:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
int CPPF(int k){return ++k;}
Run Code Online (Sandbox Code Playgroud)

Rfile.R中的内容:

RF<-function(k){return(CPPF(k))}
Run Code Online (Sandbox Code Playgroud)

我想基于2个文件构建一个R包.我使用最新版本的Rstudio和Roxygen2.

我尝试了3种方法来构建包含或不包含Roxygen2的包,并且有不同的结果:

  1. New Project-> New Directory-> R package-> Type:Package w/Rcpp,将Rfile.R和Cppfile.cpp都添加为源文件.构建和重新加载,一切正常.这些功能可以正常工作.

  2. New Project-> New Directory-> R package-> Type:Package w/Rcpp,将Rfile.R和Cppfile.cpp都添加为源文件.选择"使用Roxygen生成文档",检查其所有选项.构建和重新加载,功能不起作用.输入"RF"给出RF的内容,输入"CPPF"弹出"未找到对象".

  3. New Project-> New Directory-> R package-> Type:Package w/Rcpp,只添加Cppfile.cpp作为源文件.选择"使用Roxygen生成文档",检查其所有选项.Build&Reload,功能正常.然后将Rfile.R直接复制到项目文件夹 - > R文件夹中.Build&Reload,一切都很好,功能很好.

我使用Roxygen错了还是Roxygen有虫子?我需要它来记录.我可以坚持第三种方式,这需要花费很多精力才能找到,但有线.

谢谢!

解决问题的一种方法:选择"使用Roxygen生成文档"时,请勿选中"NAMESPACE文件"选项.

Kev*_*hey 11

你混淆了两件事(不幸的是很容易混淆):

首先,该// [[Rcpp::export]]属性用于在两个文件中自动生成包装函数,RcppExports.cpp以及RcppExports.R.包装器R函数CPPF将在Rcpp::compileAttributes()此处自动生成,并放入R/RcppExports.R.

其次,roxygen注释可用于管理NAMESPACE,例如使用@export标签.请注意,这是不同// [[Rcpp::export]]!

自动生成的功能不会自动导出.该Rcpp.package.skeleton()会生成一个NAMESPACE自动导出一个给定名称的所有功能的文件; 即,exportPattern("^[[:alpha:]]+")条目.这对于小包装来说已经足够了; 但随着您的软件包变得越来越复杂,您将需要对命名空间进行更细粒度的控制.或者您可以采用一种惯例,其中所有内部非导出函数都以a开头..无论哪种方式,此机制都允许将自动生成的函数导出到包命名空间.

如果要用于roxygen管理NAMESPACE,则需要roxygen在C++函数中添加注释(如果要在命名空间中导出它们).所以你可以修改你的功能如下:

#include <Rcpp.h>
using namespace Rcpp;

//' @export
// [[Rcpp::export]]
int CPPF(int k){return ++k;}
Run Code Online (Sandbox Code Playgroud)

请注意,您可能必须运行roxygen2::upgradeRoxygen()以确保roxygen2接管NAMESPACE新版本的roxygen2.