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

时间:2017-09-04 14:24:36

标签: r rcpp r-package roxygen2

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

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

非常感谢:-)

3 个答案:

答案 0 :(得分:6)

注册问题的起源:NAMESPACE文件

我假设你的NAMESPACE文件中有:

exportPattern("^[[:alpha:]]+") 

这基本上是#34;自动"导出任何以字母开头的函数。因此,您正在通过// [[Rcpp::exports]]导出您的Rcpp功能。

要解决此问题,有两个解决方案。第一个是更多的" hack"第二个是在export()文件中正确使用NAMESPACE

自定义命名Rcpp函数

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

// [[Rcpp::export(".function_name")]]

作为一个现实生活中的例子,使用函数 C ++ 函数some_function()

// [[Rcpp::export]]
void some_function(int value)

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

现在,为 R 显式命名函数将是:

// [[Rcpp::export(.some_function)]]
void some_function(int value)

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

// [[Rcpp::export(toad)]]
void some_function(int value)

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

指定导出

您可能希望采用的另一种方法是明确声明应导出哪个函数以及导出哪个函数。为此,NAMESPACE文件必须除去exportPattern("^[[:alpha:]]+")条目,并且每个应该可用的函数必须指定为export(function)。例如,cIRT package's NAMESPACE的每个功能应该是" public"导出。

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

# R code
#' @export

// C++ code
//' @export

C ++ 的功能文档中,这将是:

//' Title
//'
//' Description
//' 
//' @export

如果您想要导出某个功能,那么您只需要 将其与//' @export一起记录。

答案 1 :(得分:5)

这里有两个方面:

  1. 让C语言可以从R调用。你需要// [[Rcpp::export]]标签,它会创建一个R接口。

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

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

    对于一个有效的示例,请参阅C++ file in the anytime package文件中没有的NAMESPACE,因此没有帮助页面,但仍然可以调用以测试代码。

答案 2 :(得分:0)

你只需要使用

// [[Rcpp::export]]
在你的Rcpp功能之前

查看示例there和相应的R文件there

您还需要将these two lines添加为roxygen(替换为您的包名称)。