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

问题描述 投票:4回答:3

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

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

非常感谢 :-)

r rcpp r-package roxygen2
3个回答
6
投票

Origin of the Registration Issue: the NAMESPACE file

我假设您在NAMESPACE文件中有:

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

这基本上“自动”导出以字母开头的任何函数。因此,您通过// [[Rcpp::exports]]导出的Rcpp函数正在被选中。

要解决这个问题,有两种解决方案。第一个是更多的“黑客”,第二个涉及在export()文件中正确使用NAMESPACE

Custom Naming the Rcpp Function

对于第一个解决方案,您可以更改导出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()

Specify exports

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

有了这个说法,大多数用户使用roxygen2生成文档。在此文档生成器下,您可以在roxygen2标记中指定,例如#' @tag//' @tag,该函数应该导出到NAMESPACE

# R code
#' @export

要么

// C++ code
//' @export

在C ++的函数文档中,这将是:

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

如果您不想导出函数,那么您所要做的就是不使用//' @export记录它。


6
投票

这里有两个方面:

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

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

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


-2
投票

你只需要使用

// [[Rcpp::export]]

在你的Rcpp功能之前。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.