Многострочный Rscript в Dockerfile
Я пытаюсь создать образ докера с помощью R, и я хотел бы иметь возможность разбить шаги установки моего пакета в чистом, удобном для чтения виде в несколько строк, но 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
если возможно. Я видел, как другие просто ссылались на свой R-скрипт, просто вызывая его через Rscript, но я хотел бы видеть все мои шаги установки внутри моего Dockerfile, а не копировать и запускать внешний R-скрипт в моем контейнере. Спасибо за вашу помощь.
Rscript test.R
2 ответа
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 не будут обрабатывать экранирование. Они просто предполагают, что ваш текст буквальный. Таким образом, вы не можете продолжить строку в одинарных кавычках в 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\"))"
используя двойные кавычки в обоих.
Существует довольно много справочных файлов 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
пакеты, но пакеты R от CRAN работают одинаково: одна длинная строка, разбитая на обратную косую черту. Мы склонны использовать install.r
или же install2.r
от Литтлера за это. Таким образом, ваш код станет
install.r tidytext \
janitor \
corrr \
officer \
devtools \
pacman
Недооцениваемым аспектом является то, что вы можете получить некоторые из них как двоичные файлы либо в Debian, либо в Ubuntu, но я оставляю себе задачу выяснить это для себя.