r - Rcpp 导出模式
问题描述
我写了一个使用Rcpp
and的包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")
?
解决方案
您可以在 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
NAMESPACE
CRAN 上还有许多其他类似的软件包,所以我对您对文件的断言感到有点“惊讶” 。
推荐阅读
- pyspark - 按倾斜列重新分区时文件大小不均匀以避免小文件
- python - 如何管理 GIT 子模块/树的文件结构?
- javascript - javascript计数的随机速度?
- python - 2 个 ArUco 标记平面之间的角度
- python - 熊猫数据框:将一列中的值与前一个值进行比较
- c - 如何创建一个简单的函数,给定一个单词可以删除 C 中包含它的特定行
- spring - Spring WS 中配置自己替换 DefaultMethodEndpointAdapter 的正确方法是什么?
- c# - LINQ 等效于 SQL LIKE 用于带有数字的文本字段
- c# - 调用下一个委托后,中间件应使请求失败
- java - 定期从 spring 安全上下文中检索到的用户为空