Dockerfile 中的多行 Rscript

Multi-Line Rscript in Dockerfile

我正在尝试使用 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

您可以查看很多参考 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 获得其中一些作为二进制文件,但我留下了寻找这个的腿部工作为自己出去。

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

两者都使用双引号。