2

我遵循了迄今为止在本网站或 Dirk、Hadley 或其他人发表的笔记中解释的所有程序。但是,由于 cpp11 插件的问题,我在构建包时仍然遇到问题。

我用RcppArmadillo.package.skeleton()函数。我将我的 cpp 文件放在 src 目录中。NAMESPACE 文件看起来应该包含importFrom(Rcpp, sourceCpp)行。我还编辑了DESCRIPTION文件,在LinkingTo部分,我添加了RcppEigen和我使用的其他包。我终于compileAttributes(verbose=TRUE)在 R 中运行了这个函数,一切看起来都很好。因此,我认为我已经做了我应该做的一切。我还必须提到,当我在 R 中使用 编译我的代码时sourceCpp(),它可以完美运行并且编译时没有错误!为了更好地说明我的依赖关系,我将代码的第一块放在这里:

    #include <RcppArmadillo.h>
    #include <RcppNumerical.h>
    #include <RcppArmadilloExtensions/sample.h>
    #include <Eigen/LU> 
    #include <algorithm>

    // [[Rcpp::depends(RcppArmadillo)]]
    // [[Rcpp::depends(RcppEigen)]]
    // [[Rcpp::depends(RcppNumerical)]]
    // [[Rcpp::plugins(cpp11)]]

问题是当我构建我的包时,我收到与autocpp11 插件相关的类型的行的错误和警告。

在这个网站上搜索了类似的帖子后,我得出结论,我必须强制我的 R 编译器使用 c++11,因此我编辑了我的Makvars文件~/.R/Makevars,因为我使用的是 MAC,所以我 CXX=clang++ -std=c++11在该文件中添加了这一行:但是,当我这样做时,这 3 个错误消失了,但生成了 50 个新错误,因为不再识别所有 Armadillo 变量类型,例如 mat、uvec 等。所以我不知道如何解决这个问题。

我认为基本上put// [[Rcpp::plugins(cpp11)]]应该处理它,因为新版本的Rcpp支持这个插件,可能这就是为什么当我sourceCpp在RI中运行时没有错误并且一切看起来都很好。但我不知道在构建我的包时会发生什么。我的 Rcpp 版本是 0.12.8 。预先感谢您提供任何形式的帮助。

4

1 回答 1

2

依赖项(即其他头文件)和编译器选项的插件供sourceCpp().

包使用LinkingTo:and 来执行此操作,对于 C++11 指令,使用 src/Makevars or 或 SystemRequirements. 请参阅编写 R 扩展,其中记录了这一点。

于 2017-02-08T11:30:22.860 回答