如何在R库中制作不可见的函数

时间:2019-12-16 10:27:07

标签: r rcpp

我用一些Cpp函数做一个R库,我用Rcpp.package.skeleton()做。 在同一个Cpp文件中,我具有更多功能。 有没有一种方法可以使我无法使用的功能不可见?

例如我有:

#include <Rcpp.h>
// [[Rcpp::export]]

int a (int x){
return x+2;
}

// [[Rcpp::export]]
int b(int y){
z=a(y);
return(z);
}

我只想调用“ b”函数。

我使用Rcpp骨架制作包裹,如果我执行R CMD检查,警告提示告诉我:

Undocumented code objects:'a'

因为我只为函数“ b”做文档。

有没有一种方法可以做到这一点?在RStudio中,当我编写要编写的功能的功能预览时出现,并且我不希望功能“ a”使用它,而只希望功能“ b”使用

1 个答案:

答案 0 :(得分:4)

如果仅打算在C ++代码中使用C ++函数,则根本不需要使用// [[Rcpp::export]]行的第一个实例。这样,您仍然可以从C ++代码中的a()内调用b(),但是在R中只有b可以作为函数使用。

如果您希望能够在包内部将a()用作R函数,但希望对最终用户隐藏它,则需要使用以句点开头的名称导出它,因此您可以输入// [[Rcpp::export]]而不是// [[Rcpp::export(.a)]]。现在,您可以在包的R代码中使用.a()作为函数了,但是对包的最终用户来说是隐藏的。

#include <Rcpp.h>

// [[Rcpp::export(.a)]]
int a (int x){
return x+2;
}

// [[Rcpp::export]]
int b(int y){
z = a(y);
return(z);
}

现在,在R中,您可以执行以下操作:

> library(MatteosPackage)
> b(1)
[1] 3
>.a(1)
Error in .a(1) : could not find function ".a"
> MatteosPackage::.a(1)
Error: '.a' is not an exported object from 'namespace:MatteosPackage'