含Rcpp的R包禁用exportPattern时NAMESPACE如何配置函数导出?
Rcpp包显式导出的正确配置方案
- 核心结论:仅需在
NAMESPACE中导出面向用户的R函数r1即可,所有内部调用的函数(包括R函数r2、C++函数c1/c2)都不需要在NAMESPACE中做export声明。 - 原理说明
C++函数的可调用性分为两层,和NAMESPACE的导出规则完全独立:- 第一层是C到R的接口导出:你在编写C代码时给函数加
// [[Rcpp::export]]注解,只是完成了这一层的配置,作用是让C++函数编译后能被R代码识别调用,本质是把函数注册到了你包的内部命名空间中,不会直接暴露给包的终端用户。 - 第二层是R包的用户可见导出:这一层完全由
NAMESPACE的export规则控制,只有被显式export的函数,用户才能通过包名::函数名或者加载包后直接调用函数名访问;未被export的内部函数,仅能通过包名:::函数名(三个冒号)的非公开方式访问,普通用户不会主动调用这类函数。
- 第一层是C到R的接口导出:你在编写C代码时给函数加
- 你的场景具体配置
- 手动编写
NAMESPACE的话,只需要保留一行export(r1)即可,删除自动生成的exportPattern("^[[:alpha:]]+")规则。 - 包内部的R代码调用内部函数不需要额外调整:
r1可以直接调用r2、c1,r2可以直接调用c2,如果担心命名冲突,也可以用你的包名:::内部函数名的方式调用,稳定性更高。
- 手动编写
- 更省心的管理方案
如果用roxygen2来管理包文档和命名空间,只需要给面向用户的r1加@export标签,其余内部函数(不管是R实现还是C++实现)都不要加@export标签,roxygen2会自动生成符合要求的NAMESPACE文件,不需要手动修改。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

