我有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的包,并且有不同的结果:
新项目 - &gt;新目录 - &gt; R package-&gt;类型:包w / Rcpp,将Rfile.R和Cppfile.cpp都添加为源文件。建设与发展重装,一切都很好。这些功能可以正常工作。
新项目 - &gt;新目录 - &gt; R package-&gt;类型:包w / Rcpp,将Rfile.R和Cppfile.cpp都添加为源文件。选择&#34;使用Roxygen&#34;生成文档,检查其所有选项。建设与发展重新加载,功能不起作用。输入&#34; RF&#34;给出RF的内容,输入&#34; CPPF&#34; pops&#34;找不到对象&#34;。
新项目 - &gt;新目录 - &gt; R package-&gt;类型:包w / Rcpp,仅添加Cppfile.cpp作为源文件。选择&#34;使用Roxygen&#34;生成文档,检查其所有选项。建设与发展重新加载,功能正常。 然后将Rfile.R直接复制到项目文件夹 - &gt; R文件夹中。建设与发展重新加载,一切正常,功能运作良好。
我使用的是Roxygen错误还是Roxygen有错误?我需要它来记录。我可以坚持第三种方式,这需要花费很多精力才能找到,但有线。
谢谢!
解决问题的一种方法: 选择&#34;使用Roxygen&#34;生成文档时,请不要检查&#34; NAMESPACE文件&#34;选项。
答案 0 :(得分:10)
你混淆了两件事(不幸的是很容易混淆):
首先,// [[Rcpp::export]]
属性用于在两个文件RcppExports.cpp
和RcppExports.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中构建它们。