Многострочный 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, но я оставляю себе задачу выяснить это для себя.

Другие вопросы по тегам