Выполнить многострочное выражение R из оболочки (с отступом)

Я пытаюсь добиться того, что вы могли бы наивно написать как:

R -e "
rmarkdown::render(
  'MyDocument.Rmd', 
  params = list(
    year = 2017
  ),
  output_file = 'ExampleRnotebook.html'
)
"

Чтобы я мог создавать хорошо отформатированные сценарии отправки для запуска в кластере.

Я пробовал несколько вариантов ниже, мне интересно, может ли быть альтернативный подход для этого с флагом R -f?

read -r -d '' EXP << EOF
rmarkdown::render(
  'MyDocument.Rmd',
  params = list(
    year = 2017
  ),
  output_file = 'ExampleRnotebook.html'
)
EOF
R -e "$EXP"

но я получаю серию ошибок, которые выглядят так:

ARGUMENT 'params~+~=~+~list(' __ignored__

для разных строк выражения, за которыми следует:

> rmarkdown::render(
+ 
+ Error: unexpected end of input

Чтобы воспроизвести:

МойДокумент.Rmd =

---
title: "R Notebook"
output: html_notebook
params: 
  year: 0000
---

```{r}
params$year

```

Это отлично работает:

read -r -d '' EXP <<- EOF 
rmarkdown::render('MyDocument.Rmd', params = list(year = 2017 ), output_file = 'ExampleRnotebook.html')
EOF
R -e "$EXP"

но становится трудно читать с более длинными списками параметров

попробуйте << -EOF (с тире), чтобы сохранить отступ

Aserre 24.01.2019 15:32

Я пробовал это: read -r -d'' EXP <<- EOS, и я получаю эту ошибку: ERROR: option '-e' requires a non-empty argument

Richard J. Acton 24.01.2019 15:36

Попробуйте echo "$EXP", прежде чем звонить R. Если показанный результат выглядит так, как вы ожидаете, возможно, для R требуются дополнительные флаги для чтения многострочного ввода.

Aserre 24.01.2019 15:46

Сохраните сценарий как файл, затем вызовите Rscript myScript.R, связанный пост?

zx8754 24.01.2019 15:54

хм, эхо - это то, что я ожидаю, но я все еще получаю ошибки ARGUMENT '~+~~+~'MyDocument.Rmd',' __ignored__, я думаю, это должно быть как-то связано с тем, как R анализирует содержимое -e''

Richard J. Acton 24.01.2019 15:55

Спасибо, но я пытаюсь избежать подхода Rscript myScript.R @zx8754, так как тогда мне приходится писать 2 одноразовых сценария, когда я отправляю задание в кластер.

Richard J. Acton 24.01.2019 15:58

Использовать флаг --vanilla? увидеть этот пост

zx8754 24.01.2019 16:04

нет, тот же результат с R --vanilla/Rscript --vanilla, что и в этом посте, который может быть полезен...

Richard J. Acton 24.01.2019 16:09

использование нескольких флагов -e, как в этом посте, работает только в том случае, если каждый из них является полным выражением, которое может быть завершено с помощью ; или новой строки

Richard J. Acton 24.01.2019 16:14

Вы имеете в виду, что R --vanilla не работает с кодами с отступом?

zx8754 24.01.2019 16:14

да, добавление --vanilla отлично работает в однострочных версиях и не меняет ошибки, когда команда разбита на строки. что согласуется с тем, что, как я понимаю, должен делать режим --vanilla, я не вижу причин, по которым он изменит поведение синтаксического анализа аргументов на -e

Richard J. Acton 24.01.2019 16:18

Я тестировал R --no-save <<code и многострочный форматированный код R --vanilla <<code, он работает. Может, добавить версию R?

zx8754 24.01.2019 16:20

интересно, не могли бы вы поделиться своим точным синтаксисом? - я использую R 3.4.3

Richard J. Acton 24.01.2019 16:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
13
250
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это работает для меня (версия R 3.5.0):

R --no-save <<code
for(i in 1:3) {
  i + 
    2
}
print(i)

runif (5,
      1,10)
code

Разрывы строк и отступы Примечание: являются преднамеренными.

Обратите внимание, что этот подход полностью обходит использование флага -e и использует то же поведение, что и echo 'print("Hello World")' | R --no-save. (Спасибо @zx8754)

Richard J. Acton 24.01.2019 16:40

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