首页 > 解决方案 > 如何在 R 库中制作不可见的函数

问题描述

我做了一个带有一些 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”

标签: rrcpp

解决方案


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

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

#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'

推荐阅读