构建使用RcppArmadillo,RcppEigen并依赖于Cpp11插件的R包

时间:2017-02-08 09:40:30

标签: rcpp armadillo r-package rcpp11

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

我使用了RcppArmadillo.package.skeleton()函数。我把我的cpp文件放在src目录中。 NAMESPACE文件看起来应该包含importFrom(Rcpp, sourceCpp)行。我还编辑了描述文件,在 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)]]

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

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

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

1 个答案:

答案 0 :(得分:2)

LinkingTo: 可以使用两个依赖项(即其他标头)和编译器选项的插件。

包使用src/Makevars执行此操作,对于C ++ 11指令, SystemRequirements class testA : UIViewController { let objectb = testB() var viewlet = [String]! override func viewDidLoad() { super.viewDidLoad() if viewlet == nil { objectb.ready() } else { let sel : Selector = NSSelectorFromString(viewlet[0]) self.perform(sel) } } } 。请参阅Writing R Extensions文档。