使用bash脚本安装R包 - 响应提示

时间:2017-08-03 21:46:36

标签: r bash littler

在我的工作中,每天都会重新实例化访问我们集群的边缘节点服务器。这意味着我必须每天早上克隆我们的repo并安装一堆R包。我写了一个bash脚本(使用https://github.com/eddelbuettel/littler从命令行打开R)来自动执行此操作,除了一个打嗝之外它还能正常工作。

Bash电话:     r install.R

打开R会话并调用以下命令:

repos <- "http://... [our CRAN equivalent]"
install.packages("[package_name]",repos)

现在,通常情况下,如果我自己在R中输入此内容,我会将此作为回复:

Installing package into ‘/usr/hdp/2.5.5.3-2/spark2/R/lib’ (as ‘lib’ is unspecified)
Warning in install.packages("[name_of_package]", repos = "http://...") :

'lib = "/usr/hdp/2.5.5.3-2/spark2/R/lib"' is not writable
Would you like to use a personal library instead?  (y/n) 

我会说&#39; y,&#39;接着是另一个&#39; y&#39;当它建议创建一个库。但是,当我从bash脚本执行此操作时,它只是说库不可写并中止。

我在这里看到两个选项: 1)我告诉它编写软件包的库。我已经尝试过了,虽然软件包确实在那里,但它们是空的。实际上没有从回购中下载任何内容。

2)以某种方式让脚本能够管理我需要的两个肯定响应,以便让R做它自己的事情并创建自己的库。

对这些建议中的任何建议都会非常感激!

4 个答案:

答案 0 :(得分:1)

这有多种解决方案。我将展示两种类似的解决方案。

互动脚本:

#!/bin/bash
# test.sh

printf "Response 1: "
read resp1
echo "You inserted $resp1"
printf "Response 2: "
read resp2
echo "You inserted $resp2"

要将两个条目输入此脚本,我们可以使用here string

$ ./test.sh <<< $'yes\nno\n'
Response 1: You inserted yes
Response 2: You inserted no

每个条目由\ n字符与其他条目分隔。此字符串将发送到脚本的标准输入。

或者,您也可以将字符串传递给脚本stdin stream:

$ printf 'yes\nno\n' | ./test.sh
Response 1: You inserted yes
Response 2: You inserted no

答案 1 :(得分:0)

两个选项:

yes | r install.R

或:

{ echo y; echo y; } | r install.R

答案 2 :(得分:0)

注意:这在技术上有效,但非常笨拙且容易出错。请看我的其他答案。

我想出了办法。

首先,创建或修改.Rprofile。在该文件的顶部添加安装和响应。例如:

repos = [CRAN or wherever you're sourcing from]
install.packages(package1, repos)
y
y
install.packages(package2, repos)
install.packages(package3, repos)
... # etc.

当R询问您是否要创建新库时,只有第一个包需要“#”。随后的软件包也将被丢弃。

如果您真的希望它是免提的,并且脚本在安装R软件包后执行其他操作,您可以在末尾添加quit()语句,该语句将退出R并执行您想要的任何其他操作脚本要做。当你想稍后启动R时,这可能会很烦人,所以你希望脚本能够传递几个不同的.Rprofiles。

在bash脚本中

第二,,只需使用R打开R. .Rprofile将在启动时立即运行,包将自动下载。

答案 3 :(得分:0)

一种比我最初发布的更好的方法:

在bash:

创建一个特定的安装库(与默认的R想要创建的相同)

mkdir -p R/x86_64-pc-linux-gnu-library/3.3
Rscript --vanilla install_packages.R

在install_packages.R中:

pkg_list <- # however you want to get this

for (pkg in pkg_list) {  
  install.packages(pkg, repos = "your_cran_mirror", 
                   lib = "R/x86_64-pc-linux-gnu-library/3.3") 
  if (!require(pkg, character.only = T)) {
    quit(save = "no", status = 1, runLast = FALSE)  
  }
}

使用此方法,R不会提示您,您的脚本将按预期运行。