首页 > 解决方案 > Rcpp 导出模式

问题描述

我写了一个使用Rcppand的包RcppArmadilloRcpp.package.skeleton为包括Rcpp. 在这些插入中exportPattern("ˆ[[:alpha:]]+")NAMESPACE. 它定义了任何以字母字符开头的函数都将被导出。

假设包包含以下功能:

存储库维护者坚持我不能使用exportPattern("ˆ[[:alpha:]]+"),这意味着我必须明确地导出函数。如果我理解正确,在常规 R 包(没有 C++ 内容)中,我只需要导出用户可用的功能,即export("r1")在这种情况下。依赖 C++ 的包中的适当设置是什么?C++ 函数需要从src目录中的文件导出到 R。但这是否也意味着它们需要在NAMESPACE: export("r1"), export("c1"),中导出export("c2")

标签: rpackagercpp

解决方案


您可以在 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

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


推荐阅读