从命令行安装R包

9

我需要通过命令行构建可重复的R安装。看起来很容易,所以我创建了一个包含我感兴趣的软件包名称的文件,例如

packages.txt:

ggvis
glmnet
caret

一个名为installPkgs.R的R脚本:

f = read.csv('packages.txt', header=FALSE)
z = install.packages(f[,1], repos='https://cran.rstudio.com')   

然后,我应该能够从命令行运行此程序:
Rscript installPkgs.R

当我这么做时,包被下载但没有安装。我错过了什么?

1
你得到了什么输出?你可能忽略了一个特定的错误消息,它会中止安装。你是否安装了包的所有外部要求(这些不会自动安装)? - Konrad Rudolph
输出显示正在下载软件包,然后一行说明“下载的二进制软件包位于 /var/folders/blahblahblah。此时,输出就会停止,没有其他任何输出。 - KirkD-CO
我还在install.packages()调用中添加了'dependencies = TRUE' - 结果相同。 - KirkD-CO
你确定这些包没有安装吗?当二进制包成功安装时,这是您通常收到的正常消息。由于它是二进制的,因此无需编译或花哨的安装过程。 - divibisan
是的。我特意寻找了尚未安装在我的系统上的软件包。我还在安装后添加了一个library(blah)行,确实出现了错误。如果我从R或从RStudio内部运行install.packages('blah'),它就可以正常工作。只是当我从Rscript调用时似乎不起作用。根据回复,我认为这个“应该”可以工作 - 这是正确的假设吗? - KirkD-CO
显示剩余2条评论
3个回答

5

回答自己的问题,以使答案明显且不淹没在注释中。

在我的代码中,软件包列表被解释为因子而不是字符字符串。因此,我需要在read.csv()函数中设置参数或全局参数stringsAsFactors = FALSE。

烦死了。


1
使用readr read_csv的另一个原因。虽然我认为R在最近的版本中将stringsAsFactors更改为默认为false。 - qwr

1

通过一个小改动,上述代码可以从命令行接受包名:

install.packages(commandArgs(trailingOnly = TRUE), repos='https://cran.rstudio.com')

因此,运行以下命令:

Rscript installPkgs.R "ggvis" "glmnet" "caret"

应该能够达到与上述相同的结果,而无需使用文本文件。


你好,欢迎来到Stackoverflow。通常,答案会尽可能考虑操作环境。你的解决方案虽然省去了文本文件(操作上下文),可能简化了提问者的生活,但直接忽略了stringsAsFactors作为错误的原因。不过,我也喜欢你的方法。 - Chris

1

另一种解决方案甚至不需要脚本文件 - Dockerfile等的好选择:

Rscript -e "install.packages(c('ggvis', 'glmnet', 'caret'), repos='https://cran.rstudio.com')"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接