在R包中重命名和隐藏导出的Rcpp函数

Cel*_*llo 7 r rcpp roxygen2 r-package

编写一个R包,我有一个R函数,它调用特定的Rcpp函数。Rcpp函数仅用作辅助函数,我不想为其创建.Rd文件。到目前为止,我的解决方案是在命名空间文件中导出这两个函数,这会导致警告在我运行check命令后立即为Rcpp函数创建.Rd文件。如果我删除了命名空间文件中的helper函数,那么我将摆脱此警告,从而导致R函数无法再找到它的问题。

有没有办法解决这个问题。这意味着要使Rcpp函数对于R函数仍然可见,同时要摆脱有关Rcpp函数不存在.Rd文件的警告?

非常感谢 :-)

coa*_*ess 9

注册问题的来源:NAMESPACE文件

我假设您的NAMESPACE文件中有:

exportPattern("^[[:alpha:]]+") 
Run Code Online (Sandbox Code Playgroud)

这基本上是“自动”导出任何以字母开头的功能。因此,将提取您通过导出的Rcpp函数// [[Rcpp::exports]]

为了解决这个问题,有两种解决方案。第一种是“ hack”,第二种是export()NAMESPACE文件中正确使用。

自定义命名Rcpp函数

对于第一个解决方案,您可以更改导出Rcpp函数的方式,以明确说明该函数应在R中出现的方式。由于NAMESPACE注册了所有以字母开头的功能的配置,此名称更改的重要方面是在功能名称的前面加上句点(.),例如:

// [[Rcpp::export(".function_name")]]
Run Code Online (Sandbox Code Playgroud)

举一个现实的例子,使用C ++函数some_function()

// [[Rcpp::export]]
void some_function(int value)
Run Code Online (Sandbox Code Playgroud)

此处使用Rcpp属性会将函数名称导出到Rsome_function()

现在,要显式命名该函数,R可能会有所不同:

// [[Rcpp::export(.some_function)]]
void some_function(int value)
Run Code Online (Sandbox Code Playgroud)

将会以的形式导出到R.some_function()。可能更具说明性的是,我们可以将其更改为完全不同的名称,例如

// [[Rcpp::export(toad)]]
void some_function(int value)
Run Code Online (Sandbox Code Playgroud)

这意味着导出的调用C ++函数的R函数为。toad()

指定出口

您可能希望采用的另一种方法是显式声明应该导出哪个函数和应该导出哪个函数。为此,NAMESPACE必须删除文件中的exportPattern("^[[:alpha:]]+")条目,并且必须将每个可用功能指定为export(function)。例如,cIRT程序包的NAMESPACE每个函数都应“公开”导出。

话虽如此,大多数用户使用生成文档roxygen2。在此文档生成器下,您可以在roxygen2标签(例如#' @tag//' @tag)中指定应使用以下命令将函数导出NAMESPACE

# R code
#' @export
Run Code Online (Sandbox Code Playgroud)

要么

// C++ code
//' @export
Run Code Online (Sandbox Code Playgroud)

C ++的功能文档中,它看起来像:

//' Title
//'
//' Description
//' 
//' @export
Run Code Online (Sandbox Code Playgroud)

如果您希望导出函数,则无需使用编写文档//' @export


Dir*_*tel 6

这里有两个方面:

  1. 从R调用C ++函数。您需要// [[Rcpp::export]]为此的标签,它将创建一个R接口。

  2. 使该R / C ++接口功能对包的客户端“可见”。那是不同的,由来控制NAMESPACE。只是不在此处列出,而仅列出您的其他功能。您仍然可以使用冒号从外部调用它:yourpackage:::yourCppFunction()

这样,您的C ++代码是可调用的(每1个),不需要一个Rd文件(每2个,因为未导出)。只有可见的R包装器需要一个手册页条目。

对于一个可行的示例,请在随时打包中查看此C ++文件,该文件不在NAMESPACE文件中,因此没有帮助页面,但仍可调用它来测试代码。