我在安装plyr R软件包时遇到问题,并出现以下错误:
Installing package into '/home/mousavian/R/x86_64-pc-linux-gnu-library/3.2'
(as 'lib' is unspecified)
* installing *source* package 'plyr' ...
** package 'plyr' successfully unpacked and MD5 sums checked
** libs
g++ -I/share/apps/R/lib64/R/include -DNDEBUG -I/usr/local/include -I"/home/mousavian/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -fpic -g -O2 -c RcppExports.cpp -o RcppExports.o
gcc -I/share/apps/R/lib64/R/include -DNDEBUG -I/usr/local/include -I"/home/mousavian/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -fpic -g -O2 -c loop_apply.c -o loop_apply.o
loop_apply.c: In function 'loop_apply':
loop_apply.c:15:3: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for(int i = 0; i < n1; i++) {
^
loop_apply.c:15:3: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
make: *** [loop_apply.o] Error 1
ERROR: compilation failed for package 'plyr'
* removing '/home/mousavian/R/x86_64-pc-linux-gnu-library/3.2/plyr'
Warning message:
In install.packages("R packages/plyr_1.8.3.tar.gz", repos = NULL) :
installation of package 'R packages/plyr_1.8.3.tar.gz' had non-zero exit status
当尝试通过install.packages命令从源安装R软件包时,如何使用-std = c99选项?
由于
答案 0 :(得分:3)
如果尚未存在,请在$ HOME中创建一个目录(在您的情况下为/home/mousavian/.R
)。在里面,创建一个Makevars
文件(没有扩展名)。使用您喜欢的编辑器编辑此文件并写下:
CC = gcc -std=c99
然后,保存并在启动R后,只需运行
install.packages("plyr", dependencies = TRUE)
应该使用gcc -std=c99
进行编译。
答案 1 :(得分:1)
默认/etc/R/Makeconf
包括CC = gcc -std=gnu99
(R 3.3.2以及可能大多数或所有其他近期版本,但我认为正在进行的开发版本会跳升到21世纪)
接受的答案可能会有效,但不是R
默认值。设置CC=gcc
而没有其他选项会丢弃此默认值,这是获取此错误的另一个原因。除非你知道自己在做什么,否则最好单独保留默认值。
答案 2 :(得分:1)
编译器错误提示您选择 C99 或 C11 。因此,除非您有意编译旧代码,否则请先尝试 C11 。如果那没用,您可以随时尝试使用旧版 C99 。
withr::with_makevars
对于每个未直接从源代码编译的软件包,编辑单个软件包Makevars或协调对include / lib目录的全局更改,对于未来来说并不是一个好的策略。不要那样做!编辑R的make
配置的一种很好的选择是仅使用安装命令使用withr::with_makevars
来操纵Makevars
:
library(withr)
with_makevars(c(PKG_CFLAGS = "-std=c11"),
install.packages("plyr", repos = NULL, type = "source"),
assignment = "+=")
此外,由于它是withr
依赖项,因此您可能已经安装了devtools
。
答案 3 :(得分:0)
作为附录,可能会节省几分钟的时间:在Rstudio服务器(我无法控制)的R更新到3.3.2后,我遇到了类似的问题,但是使用g ++。 g ++的编译器选项可以添加到Makevars
,如下所示:
CXX1XSTD = -std=gnu++11
(我需要编译所需的gnu ++ 11包)