1

在我的工作中,访问我们集群的边缘节点服务器每天都会重新实例化。这意味着我必须每天早上克隆我们的 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) 

当它建议创建一个库时,我会说“y”,然后是另一个“y”。但是,当我从 bash 脚本执行此操作时,它只是说该库不可写并中止。

我在这里看到两个选项:1)我告诉它在哪个库中编写包。我试过这个,虽然包确实去了那里,但它们到达时是空的。实际上没有从 repo 下载任何内容。

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

任何关于其中任何一个的建议将不胜感激!

4

4 回答 4

1

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

交互式脚本:

#!/bin/bash
# test.sh

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

要将两个条目通过管道传输到此脚本中,我们可以使用here 字符串

$ ./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
于 2017-08-03T22:23:48.527 回答
0

两种选择:

yes | r install.R

或者:

{ echo y; echo y; } | r install.R
于 2017-08-04T01:12:22.763 回答
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 询问您是否要创建一个新库时,'y' 应该只对第一个包是必需的。随后的包也将被丢弃在那里。

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

其次,在您的 bash 脚本中,只需使用R. .Rprofile 将在启动时立即运行,并且包将自动下载。

于 2017-08-21T21:11:46.323 回答
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 不会提示您,您的脚本将按预期运行。

于 2018-02-16T15:56:59.817 回答