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.r
或 install2.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\"))"
两者都使用双引号。
我正在尝试使用 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.r
或 install2.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\"))"
两者都使用双引号。