使用roxygen2构建R包时出错

时间:2014-05-26 12:15:17

标签: r rcpp roxygen2

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

Cppfile.cpp中的内容:

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

Rfile.R中的内容:

RF<-function(k){return(CPPF(k))}

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

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

  1. 新项目 - &gt;新目录 - &gt; R package-&gt;类型:包w / Rcpp,将Rfile.R和Cppfile.cpp都添加为源文件。建设与发展重装,一切都很好。这些功能可以正常工作。

  2. 新项目 - &gt;新目录 - &gt; R package-&gt;类型:包w / Rcpp,将Rfile.R和Cppfile.cpp都添加为源文件。选择&#34;使用Roxygen&#34;生成文档,检查其所有选项。建设与发展重新加载,功能不起作用。输入&#34; RF&#34;给出RF的内容,输入&#34; CPPF&#34; pops&#34;找不到对象&#34;。

  3. 新项目 - &gt;新目录 - &gt; R package-&gt;类型:包w / Rcpp,仅添加Cppfile.cpp作为源文件。选择&#34;使用Roxygen&#34;生成文档,检查其所有选项。建设与发展重新加载,功能正常。 然后将Rfile.R直接复制到项目文件夹 - &gt; R文件夹中。建设与发展重新加载,一切正常,功能运作良好。

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

    谢谢!

    解决问题的一种方法: 选择&#34;使用Roxygen&#34;生成文档时,请不要检查&#34; NAMESPACE文件&#34;选项。

2 个答案:

答案 0 :(得分:10)

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

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

其次,roxygen条评论可用于管理NAMESPACE,例如使用@export标记。请注意,这与<{1}}的不同

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

如果要使用.来管理roxygen,则需要在C ++函数中添加NAMESPACE条注释,以便在命名空间中导出它们。因此,您可以按以下方式修改您的功能:

roxygen

请注意,对于#include <Rcpp.h> using namespace Rcpp; //' @export // [[Rcpp::export]] int CPPF(int k){return ++k;} 的新版本,您可能必须运行roxygen2::upgradeRoxygen()以确保roxygen2接管NAMESPACE

答案 1 :(得分:3)

因此,如果2.不起作用,请将其作为roxygen2团队的(可重现的)错误报告提交。

我看不到Rcpp问题; Imports:/ NAMESPACE声明可能出现问题。我在这里看不到Rcpp问题(因为1.工作正常)。

FWIW我也在某些软件包上使用roxygen2,我也不时在RStudio中构建它们。