首页
学习
活动
专区
圈层
工具
发布

Rcpp
EN

Stack Overflow用户
提问于 2021-06-10 12:04:16
回答 1查看 296关注 0票数 0

我编写了一个使用RcppRcppArmadillo的包。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中,但这是否也意味着它们需要在NAMESPACEexport("r1")export("c1")export("c2")中导出。

EN

回答 1

Stack Overflow用户

发布于 2021-06-10 12:17:05

您可以在您的C++代码中使用扩展的导出标记,并让生成的R函数以一个点开始,这意味着它不会导出。例如,在RcppAnnoy包中,我为助手函数执行此操作

代码语言:javascript
复制
#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);
}

然后,必须用:::调用该函数,因为它不是导出的:

代码语言:javascript
复制
> RcppAnnoy:::.annoy_version()
major minor patch 
    0     0    18 
> 

NAMESPACE具有正则表达式的标准最小值,以及所需的(当然也是文档化的) useDynLib()import()

代码语言:javascript
复制
useDynLib(RcppAnnoy, .registration=TRUE)
import(methods, Rcpp)
exportPattern("^[[:alpha:]]+")    # export all identifiers starting with letters

在CRAN上还有许多其他类似的包,所以我对您关于NAMESPACE文件的断言感到有点“惊讶”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67920759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档