在我的工作中,每天都会重新实例化访问我们集群的边缘节点服务器。这意味着我必须每天早上克隆我们的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做它自己的事情并创建自己的库。
对这些建议中的任何建议都会非常感激!
答案 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。
第二,,只需使用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不会提示您,您的脚本将按预期运行。