2017-08-03 47 views
1

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

巴什称:这将打开R对话,并调用以下命令 [R install.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) 

,我会说“Y”接着又“Y”时,它表明一个库来创建。但是,当我从bash脚本执行此操作时,它只是说该库不可写并中止。

两个方案我在这里看到: 1)我告诉它的库编写程序包中我已经试过这一点,而包没去那里,他们到达了空。没有什么是从回购实际下载的。

2)以某种方式让脚本能够在我需要的两个肯定的响应中输入,以便让R完成它的任务并创建它自己的库。

对这些任何建议的任何建议将不胜感激!

回答

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不会提示您,并且您的脚本将按预期运行。

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字符的其他项分隔。该字符串被发送到脚本的标准输入。

或者,你也可以管串入脚本标准输入流:

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

所以这个问题实际上更多的是与“小问题”,我用来与R接口的软件包。在你的例子中,通往test.sh的管道工作正常,但实际上我从内部运行R脚本shell脚本。由于某些原因,当我从命令行访问它时,R似乎没有给出提示。 –

0

两个选项:

yes | r install.R 

或:

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

事实证明,你实际上不能将管道连接到littler,正如这里所建议的那样。但我很欣赏这个想法。我最终只是在启动R会话之前将必要的字符串打印到控制台,以便我可以快速复制/粘贴一段代码。两步而不是一步,但优于十步。 –

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. 

'y'只适用于第一个包,当R询问您是否要创建一个新库时。随后的软件包也将被丢弃在那里。

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

二,在你的bash脚本中,只需打开R与R。 .Rprofile将在启动时立即运行,并且软件包将自动下载。