Я пытаюсь добиться того, что вы могли бы наивно написать как:
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"
но становится трудно читать с более длинными списками параметров
Я пробовал это: read -r -d'' EXP <<- EOS, и я получаю эту ошибку: ERROR: option '-e' requires a non-empty argument
Попробуйте echo "$EXP", прежде чем звонить R. Если показанный результат выглядит так, как вы ожидаете, возможно, для R требуются дополнительные флаги для чтения многострочного ввода.
Сохраните сценарий как файл, затем вызовите Rscript myScript.R, связанный пост?
хм, эхо - это то, что я ожидаю, но я все еще получаю ошибки ARGUMENT '~+~~+~'MyDocument.Rmd',' __ignored__, я думаю, это должно быть как-то связано с тем, как R анализирует содержимое -e''
Спасибо, но я пытаюсь избежать подхода Rscript myScript.R @zx8754, так как тогда мне приходится писать 2 одноразовых сценария, когда я отправляю задание в кластер.
Использовать флаг --vanilla? увидеть этот пост
нет, тот же результат с R --vanilla/Rscript --vanilla, что и в этом посте, который может быть полезен...
использование нескольких флагов -e, как в этом посте, работает только в том случае, если каждый из них является полным выражением, которое может быть завершено с помощью ; или новой строки
Вы имеете в виду, что R --vanilla не работает с кодами с отступом?
да, добавление --vanilla отлично работает в однострочных версиях и не меняет ошибки, когда команда разбита на строки. что согласуется с тем, что, как я понимаю, должен делать режим --vanilla, я не вижу причин, по которым он изменит поведение синтаксического анализа аргументов на -e
Я тестировал R --no-save <<code и многострочный форматированный код R --vanilla <<code, он работает. Может, добавить версию R?
интересно, не могли бы вы поделиться своим точным синтаксисом? - я использую R 3.4.3





Это работает для меня (версия 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)
попробуйте
<< -EOF(с тире), чтобы сохранить отступ