【问题标题】:Building R Package that uses RcppArmadillo, RcppEigen and depends on Cpp11 Plugins构建使用 RcppArmadillo、RcppEigen 并依赖于 Cpp11 插件的 R 包
【发布时间】:2017-06-25 20:33:32
【问题描述】:

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

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

    #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)]]

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

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

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

【问题讨论】:

    标签: rcpp armadillo r-package rcpp11


    【解决方案1】:

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

    包使用LinkingTo: 执行此操作,对于 C++11 指令,或者 src/Makevars SystemRequirements。请参阅 Writing R Extensions 记录此内容。

    【讨论】:

    • 感谢 Dirk 的回复。根据您的回答,我阅读了有关 C++11 的编写 R 扩展的 this part 并在 src/Makevars 文件中添加了一行。但是问题依然存在,Armadillo函数无法识别!这是否意味着RcppArmadilloC++11 不兼容?
    • 继续阅读同一手册,寻找LinkingTo。使用 documented 函数 RcppArmadillo.package.skeleton() 创建一个 working 包并找出我们的尝试不足之处。
    • 德克,我终于能够解决这个问题了!我最终可以通过运行RcppArmadillo.package.skeleton() 将我的包与测试包进行比较来找到它。原因是我在代码的开头使用了using namespace arma,而在使用犰狳类型之前从不使用arma::。错误是在缺少using namespace armaRcppExports.cpp 文件中产生的。我自己添加了那条线,它解决了问题。但是,那里提到“不要手动编辑”。无论如何,该行是自动添加的吗?手动编辑会不会出问题?
    • Dirk,我也想借此机会直接感谢您制作 Rcpp 和所有相关软件包。它们非常有用!你很棒,我非常感谢你为 R 社区所做的努力。
    • 我想我必须把它写成更新。作为对我的问题的回答,如果手动编辑会导致问题,我应该说是。因为当我使用手动将using namespace arma添加到集群中的RcppExport.cpp进行并行计算后制作的包时,它不起作用并产生了:Null value passed!结果,我在源代码中删除了该行,在所有 Armadillo 对象之前添加了 arma::,并重新构建了包。构建包时没有产生错误,它在集群中也能完美运行!
    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 2022-12-14
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多