Dockerfile中的多行Rscript

时间:2017-11-05 23:05:26

标签: r bash docker rscript

我正在尝试使用R构建一个docker镜像,并且我希望能够以简洁易读的方式在多行中突破我的包安装步骤,但bash似乎并不喜欢由于不知道结局在哪里而接近。

有没有办法让这长串代码分成多行?

Rscript -e 'devtools::install_cran(c("tidytext","janitor","corrr","officer","devtools","pacman"))'

或许,这样的事情:

Rscript -e 'devtools::install_cran(c("tidytext","janitor",
                              "corrr","officer","devtools","pacman"))'

这可能与Rscript有关吗?我尝试在每一行的末尾使用\,但它仍然不起作用。

我理解install2.r可以逐行列出包,但是如果可能的话,我希望有一个包矢量传递给devtools::install_cran。我看到其他人只是简单地通过Rscript调用它们来引用他们的R脚本,但是我希望看到我的Dockerfile中的所有安装步骤,而不是在我的容器中复制和运行外部R脚本。谢谢你的帮助。

Rscript test.R

2 个答案:

答案 0 :(得分:3)

BASH会将换行解释为命令的结尾。

在BASH中(我假设您正在使用),反斜杠后跟换行符被解释为该行的延续。除非它在单引号内!

因此...

Rscript -e 'devtools::install_cran(c("tidytext","janitor",
                          "corrr","officer","devtools","pacman"))'

将被解释为两个命令......

Rscript -e 'devtools::install_cran(c("tidytext","janitor",

"corrr","officer","devtools","pacman"))'

两者都没有很好的形成。

此外,BASH中的单引号字符串不会处理转义。他们只是假设你的文字是文字的。所以你不能在BASH中的单引号字符串中继续一行。

底线是,如果要在BASH中的带引号的字符串中继续,则必须使用双引号字符串。您的选择如下:

Rscript -e "devtools::install_cran(c('tidytext','janitor', \  
                'corrr','officer','devtools','pacman'))"

在BASH中使用双引号,在R或......中使用单引号

Rscript -e "devtools::install_cran(c(\"tidytext\",\"janitor\", \    
                \"corrr\",\"officer\",\"devtools\",\"pacman\"))"

在两者中使用双引号。

答案 1 :(得分:0)

您可以查看相当多的参考Docker文件。以下是Rocker Project生成官方r-base图像的一部分:

RUN apt-get update \     
        && apt-get install -y --no-install-recommends \     
                ed \                                 
                less \   
                locales \     
                vim-tiny \   
                wget \  
                ca-certificates \
                fonts-texgyre \ 
        && rm -rf /var/lib/apt/lists/* 

现在这是针对apt个软件包的,但CRAN的R软件包以相同的方式工作:一个长行,由反斜杠分解。我们倾向于使用littler中的install.rinstall2.r来实现此目的。所以你的代码将成为

install.r tidytext \
   janitor \
   corrr \
   officer \
   devtools \
   pacman 

一个不被重视的方面是你可以实际上从Debian或Ubuntu中获取其中的一些二进制文件,但我留下了为自己找到这个的工作。