NAMESPACE文件我假设您的NAMESPACE文件中有:
exportPattern("^[[:alpha:]]+")
Run Code Online (Sandbox Code Playgroud)
这基本上是“自动”导出任何以字母开头的功能。因此,将提取您通过导出的Rcpp函数// [[Rcpp::exports]]。
为了解决这个问题,有两种解决方案。第一种是“ hack”,第二种是export()在NAMESPACE文件中正确使用。
对于第一个解决方案,您可以更改导出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属性会将函数名称导出到R中some_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。
这里有两个方面:
从R调用C ++函数。您需要// [[Rcpp::export]]为此的标签,它将创建一个R接口。
使该R / C ++接口功能对包的客户端“可见”。那是不同的,由来控制NAMESPACE。只是不在此处列出,而仅列出您的其他功能。您仍然可以使用冒号从外部调用它:yourpackage:::yourCppFunction()。
这样,您的C ++代码是可调用的(每1个),不需要一个Rd文件(每2个,因为未导出)。只有可见的R包装器需要一个手册页条目。
对于一个可行的示例,请在随时打包中查看此C ++文件,该文件不在NAMESPACE文件中,因此没有帮助页面,但仍可调用它来测试代码。