如何在 Windows 上为旧 R 匹配 Rcpp 和 RcppArmadillo 的版本?
Posted
技术标签:
【中文标题】如何在 Windows 上为旧 R 匹配 Rcpp 和 RcppArmadillo 的版本?【英文标题】:how to match versions of Rcpp and RcppArmadillo for older R on windows? 【发布时间】:2015-02-10 16:43:41 【问题描述】:我使用 R 3.1.2 和最新版本的 Rcpp 0.11.3 和 RcppArmadillo 0.4.600.0 在 Windows(Win 7,64 位)上创建了 RcppArmadillo 包。包编译、安装和运行良好。之后,我编写了一些代码,将 bigmemory 包中的 BigMatrix 与我的 RcppArmadillo 包一起使用。事实证明 bigmemory 不适用于 Windows 上的 R 3.1.2。为了使用 bigmemory,我将 R 降级为 R 2.15.3,并从 CRAN 获得了 Rcpp 0.10.4 和 RcppArmadillo 0.4.000.2。现在我可以使用 bigmemory 但我无法编译我的 RcppArmadillo 包。基本上,它会发出一长串以
开头的错误消息C:/Program Files/R/R-2.15.3/library/RcppArmadillo/include/RcppArmadilloForward.h:99:33: error: 'ConstReferenceInputParameter' is not a template
错误看起来像是版本不兼容问题RcppArmadillo "ReferenceInputParameter is not a template",Dirk 建议从源代码安装 Rcpp 0.10.5。所以我找到了 Rcpp 0.10.5 的压缩包并手动安装了它。问题是我仍然收到大量不同的错误消息
g++ -m32 -I"C:/PROGRA~1/R/R-215~1.3/include" -DNDEBUG -I"C:/Program Files/R/R-2.15.3/library/Rcpp/include" -I"C:/Program Files/R/R-2.15.3/library/RcppArmadillo/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include" -O2 -Wall -mtune=core2 -c RcppExports.cpp -o RcppExports.o
g++ -m32 -I"C:/PROGRA~1/R/R-215~1.3/include" -DNDEBUG -I"C:/Program Files/R/R-2.15.3/library/Rcpp/include" -I"C:/Program Files/R/R-2.15.3/library/RcppArmadillo/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include" -O2 -Wall -mtune=core2 -c rcpparma_hello_world.cpp -o rcpparma_hello_world.o
g++ -m32 -shared -s -static-libgcc -o rcppArma.dll tmp.def RcppExports.o rcpparma_hello_world.o -LC:/PROGRA~1/R/R-215~1.3/bin/i386 -lRlapack -LC:/PROGRA~1/R/R-215~1.3/bin/i386 -lRblas -lgfortran -Ld:/RCompile/CRANpkg/extralibs64/local/lib/i386 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/PROGRA~1/R/R-215~1.3/bin/i386 -lR
RcppExports.o:RcppExports.cpp:(.text+0x82): undefined reference to `Rcpp::internal::enterRNGScope()'
RcppExports.o:RcppExports.cpp:(.text+0xa7): undefined reference to `SEXPREC* Rcpp::internal::r_true_cast<14>(SEXPREC*)'
RcppExports.o:RcppExports.cpp:(.text+0xc9): undefined reference to `Rcpp::RObject::RObject(SEXPREC*)'
RcppExports.o:RcppExports.cpp:(.text+0xf5): undefined reference to `Rcpp::traits::storage_type<14>::type* Rcpp::internal::r_vector_start<14>(SEXPREC*)'
RcppExports.o:RcppExports.cpp:(.text+0x199): undefined reference to `Rcpp::traits::storage_type<14>::type* Rcpp::internal::r_vector_start<14>(SEXPREC*)'
我怀疑它仍然是版本不兼容的问题,但我不知道如何匹配 Rcpp 版本和 RcppArmadillo 版本。是否有兼容性表,有人可以提供建议吗?
【问题讨论】:
【参考方案1】:所有 CRAN 包都有一个Archive/
子目录。通过选择最后一个可用的bigmemory
包的日期,您可以找到Rcpp
和RcppArmadillo
的对应包:在该特定bigmemory
版本之前的最新版本。然后,您可以下载并安装这些(前提是您已设置为从源代码安装,我假设您是,根据上下文)。
有些人正在进行一些提供“快照”功能的工作,但我不知道您现在可以使用的高级辅助函数。
编辑:不过,您可能应该在这里做的是获取最近的 bigmemory
source 包并从源代码安装。
【讨论】:
感谢 Dirk,这正是我想要的。对于我的 bigmemory 4.2.11,发布前的最后一个包是 Rcpp 0.9.5 和 RcppArmadillo 0.2.27。 Rcpp 安装得很好,RcppArmadillo 有一个奇怪的错误,我不知道如何破解,因为没有 makefile。错误是:g++.exe:错误:C:/Program:没有这样的文件或目录 g++.exe:错误:Files/R/R-2.15.3/library/Rcpp/lib/i386/libRcpp.a:没有这样的文件或目录。由于某些不清楚的原因,基本上编译行在“C:/ Program”之后的中间换行。 一般建议不要将R安装在有空格的目录中:C:/Program
可能是C:/Program Files
的截断部分。我总是使用C:/opt/R
;较新的版本可以更好地防止这种情况,但是对于像 Rcpp 0.9.5 这样的旧版本,您可能没有其他选择。但也请参阅我的编辑:也许您可以从源代码安装更新的 bigmemory。
第一个安装R.3.1.2的bigmemory是4.2.11。之前的最新版本是Rcpp 0.9.5和RcppArmadillo 0.2.27。但是,我现在无法编译我的包。当我尝试 sourceCpp 时,我得到错误“'sourceCpp' 不是从 'namespace:Rcpp' 导出的对象”。如果我尝试使用 CMD INSTALL 安装软件包,我会从 RcppExports.cpp 收到一堆错误,我认为这是内部生成的。第一个错误是:“RcppExports.cpp: In function 'SEXPREC* rcppArma_rcpparma_outerproduct(SEXP)': RcppExports.cpp:30:9: error: 'input_parameter' is not a member of 'Rcpp::traits'”
在让 Rcpp 工作时,您似乎遇到了更普遍的问题。有许多文档和教程建议如何在 Windows 上为 R 编译包,以及如何在 Windows 上从源代码构建 Rcpp,这些可能会有所帮助。我没有什么要补充的了,我会回避这个话题。如果您需要更多帮助,请考虑 rcpp-devel 邮件列表。
好的:)。我远非一般建筑或 Rcpp 方面的专家。尽管如此,我还是从源代码和 Rcpp 和 RcppArmadillo 安装了大量的 R 包。最新版本工作正常。一般来说,从源代码安装通常可以工作或需要一些小技巧。让这些旧版本的 Rcpp 和 RcppArmadillo 一起工作似乎需要的还不止这些。感谢您尝试提供帮助。【参考方案2】:
checkpoint 包可以创建一个本地 R 库,其中包含截至给定日期的包。
有教程[here]。
【讨论】:
受限于从 2014 年 9 月 17 日开始存在的快照存档。 换句话说,这通常是正确的,但不能回答这里提出的问题。 R 2.15.3,如 OPs 问题中所述,提供了一个非常好的主意。 很多东西可能是什么东西。关键是您建议的检查点,这与他选择从中选择版本的时期相去甚远。所以检查点在这里仍然是一个不适用的答案。 也许检查点的开始日期太近,但另一方面也可能不是。在这种情况下,这提供了一个特别简单的解决方案,因此值得一试。以上是关于如何在 Windows 上为旧 R 匹配 Rcpp 和 RcppArmadillo 的版本?的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 上使用 Rtools 中包含的不同 gcc 版本和 Rcpp
如何通过在 Rcpp 或 Armadillo 中将矩阵乘以向量元素来复制 R 的功能?