Dockerfile中的多行Rscript

我正在尝试使用R来构build一个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 

BASH将把新行解释为命令的结尾。

在BASH(我假设你正在使用)中,反斜杠后跟一个换行符被解释为该行的延续。 除了在单引号里面的时候!

所以…

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

将被解释为两个命令…

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

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

这两者都没有形成。

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

底线是,如果你想在BASH中引用的string内继续,你必须使用双引号string。 你的select如下:

 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\"))" 

在两个中使用双引号。

有相当多的参考Docker文件,你可以看看。 下面是我们从Rocker项目中的一个产生官方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软件包的工作方式也是一样的:一条长线,用反斜杠分隔。 我们倾向于install2.r使用install.rinstall2.r 。 所以你的代码会变成

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

一个不为人知的方面是,实际上你可以从Debian或者Ubuntu上获得一些二进制文件,但是我自己却不知道这些。