我编写了一个使用Rcpp和RcppArmadillo的包。Rcpp.package.skeleton为包(包括Rcpp )设置了一个基本的包结构。这些插入中包括exportPattern("ˆ[[:alpha:]]+")中的NAMESPACE行。它定义了以字母字符开头的任何函数都将被导出。
假设包包含以下功能:
r1:包用户可用的R函数r2:另一个R函数,不是由用户调用,而是由r1调用c1:一个C++函数,不是由用户调用,而是由r1调用c2:一个C++函数,不是由用户调用,而是由r2调用存储库维护人员坚持我不能使用exportPattern("ˆ[[:alpha:]]+"),这意味着我必须显式地导出函数。如果我正确理解,在一个常规的R包中(没有C++内容),我只需要导出用户可用的函数,在本例中是export("r1")。在一个确实依赖C++的包中,什么是适当的设置?C++函数需要从src目录中的文件导出到R中,但这是否也意味着它们需要在NAMESPACE:export("r1")、export("c1")、export("c2")中导出。
发布于 2021-06-10 12:17:05
您可以在您的C++代码中使用扩展的导出标记,并让生成的R函数以一个点开始,这意味着它不会导出。例如,在RcppAnnoy包中,我为助手函数执行此操作
#include "RcppAnnoy.h"
// [[Rcpp::export(.annoy_version)]]
Rcpp::IntegerVector annoy_version() {
return Rcpp::IntegerVector::create(Rcpp::Named("major")=RCPPANNOY_VERSION_MAJOR,
Rcpp::Named("minor")=RCPPANNOY_VERSION_MINOR,
Rcpp::Named("patch")=RCPPANNOY_VERSION_PATCH);
}然后,必须用:::调用该函数,因为它不是导出的:
> RcppAnnoy:::.annoy_version()
major minor patch
0 0 18
> NAMESPACE具有正则表达式的标准最小值,以及所需的(当然也是文档化的) useDynLib()和import()
useDynLib(RcppAnnoy, .registration=TRUE)
import(methods, Rcpp)
exportPattern("^[[:alpha:]]+") # export all identifiers starting with letters在CRAN上还有许多其他类似的包,所以我对您关于NAMESPACE文件的断言感到有点“惊讶”。
https://stackoverflow.com/questions/67920759
复制相似问题