Запустить R скрипт из командной строки

484

У меня есть файл, называется a.r, он имеет chmod755,

sayHello <- function(){
   print('hello')
}

sayHello()

Как я могу запустить это через командную строку?

Саит
источник
3
Возможные дубликаты Как лучше всего использовать R-сценарии в командной строке?
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
5
tl; dr: просто добавьте в качестве первой строки вашего сценария:#!/usr/bin/env Rscript
майкл

Ответы:

671

Если вы хотите, чтобы вывод выводился на терминал, лучше всего использовать Rscript

Rscript a.R

Обратите внимание, что при использовании R CMD BATCH a.Rэтого вместо перенаправления вывода на стандартный вывод и отображения на терминале будет создан новый файл с именем a.Rout.

R CMD BATCH a.R
# Check the output
cat a.Rout

Еще одна вещь, которую стоит отметить при использовании Rscript, это то, что он не загружает methodsпакет по умолчанию, что может вызвать путаницу. Поэтому, если вы полагаетесь на все, что предоставляют методы, вы захотите явно загрузить это в свой скрипт.

Если вы действительно хотите использовать ./a.Rспособ вызова скрипта, вы можете добавить соответствующий #!в верхней части скрипта

#!/usr/bin/env Rscript
sayHello <- function(){
   print('hello')
}

sayHello()

Я также отмечу, что если вы работаете в * Unix-системе, есть полезный пакет littler , который обеспечивает простую передачу командной строки в R. Может быть необходимо использовать littler для запуска блестящих приложений через скрипт? Более подробную информацию можно найти в этом вопросе .

Dason
источник
28
Без #! ваша командная строка пытается запустить его как сценарий командной строки, используя тот же интерпретатор, который интерпретирует ваши команды. Он не знает, что он должен быть R, даже если файл заканчивается суффиксом .R или .r. # сообщает командной строке, какой язык содержится в файле.
Spacedman
4
Я поймал несколько вопросов здесь за эти годы и мог ссылаться как на Литтлера, так и на Rscript. Главное, как ты сказал людям, R CMD BATCHэто ужасно. Все, кроме этого ...
Дирк Эддельбюттель
@Dason Я также работаю с R-сценарием и пытаюсь выполнить R-сценарий из Java-программы, и я вижу некоторую ошибку. Вот мой вопрос . Посмотрим, сможете ли вы помочь. Сейчас я использую ваш пример функции hello, чтобы сделать его простым.
user1950349
Есть ли способ изменить путь к библиотеке в самой команде? Нечто похожееR CMD INSTALL -l ~/R/lib-dev
mikemtnbikes
@mikemtnbikes Не то, что я знаю. Всегда можно добавить что-то, чтобы изменить .libPaths () внутри скрипта. Но я не вижу никакой опции, подобной той, которая указана на странице руководства для Rscript.
Дейсон
107

Это не отвечает на вопрос напрямую. Но кто-то может оказаться здесь, потому что он хочет запустить терминал R из терминала. Например, если вы просто хотите установить несколько отсутствующих пакетов и выйти, этот oneliner может быть очень удобным. Я часто использую его, когда вдруг обнаруживаю, что пропускаю некоторые пакеты, и хочу установить их там, где я хочу.

  • Для установки в папку по умолчанию:

    R -e 'install.packages(c("package1", "package2"))'
  • Чтобы установить в место, которое требует rootпривилегий:

    R -e 'install.packages(c("package1", "package2"), lib="/usr/local/lib/R/site-library")' 
biocyberman
источник
5
Для запуска команды вы также можете использовать Rscript -e "getwd()"в терминале. Rscript будет печатать только выходные данные команды, а не полное сообщение о запуске R.
Поль Ружье
Вы также можете использовать, r -e "cat(getwd(),'\n')"если у вас установлен littler. В этом ответе Дирк Эддельбюттель объясняет разницу между Литтлером и Rscript.
Поль Ружье
2
Спасибо за ожидание моей проблемы! Мне нужна была еще одна вещь:R -e 'install.packages("package", repos="http://cran.us.r-project.org")'
Эрин
4
Нужно использовать R -r 'options(warn=2); install...', чтобы остановить выполнение и получить ненулевой код ошибки в случае сбоя установки. В противном случае любые install.packagesошибки являются просто предупреждениями.
rvernica
21

Вам нужна ?Rscriptкоманда для запуска R-скрипта из терминала.

Проверьте http://stat.ethz.ch/R-manual/R-devel/library/utils/html/Rscript.html

пример

## example #! script for a Unix-alike

#! /path/to/Rscript --vanilla --default-packages=utils
args <- commandArgs(TRUE)
res <- try(install.packages(args))
if(inherits(res, "try-error")) q(status=1) else q()
Мехул Ратод
источник
Это был просто пример того, как вы бы написали / запустили скрипт R, в вашем файле добавьте #! / Path / to / rscript, а затем chmod + x <your script.r> и ./<your script.r>
Мехул Ратод
10

Как запустить Rmd в команде с knitr и rmarkdown несколькими командами, а затем загрузить файл HTML в RPubs

Вот пример: загрузите две библиотеки и выполните команду R

R -e 'library("rmarkdown");library("knitr");rmarkdown::render("NormalDevconJuly.Rmd")'

R -e 'library("markdown");rpubsUpload("normalDev","NormalDevconJuly.html")'
Шичэн Го
источник
3
Обратите внимание, что будет проще пропустить загрузку библиотеки; R -e 'markdown::rpubsUpload("normalDev","NormalDevconJuly.html")'
gregmacfarlane
3

Еще один способ использования Rscript для систем * Unix - это подстановка процессов .

Rscript <(zcat a.r)
# [1] "hello"

Который, очевидно, делает то же самое, что и принятый ответ, но это позволяет вам манипулировать и запускать ваш файл, не сохраняя при этом мощности командной строки, например:

Rscript <(sed s/hello/bye/ a.r)
# [1] "bye"

Подобный Rscript -e "Rcode"ему также позволяет запускать без сохранения в файл. Поэтому его можно использовать вместе со скриптами, которые генерируют R-код, например:

Rscript <(echo "head(iris,2)")
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
Себастьян Мюллер
источник
3

Просто для документации, иногда вам нужно запустить скрипт как sudo:

sudo Rscript path/to/your/file.R
Кроманьонец
источник
2
Когда вам нужно это сделать?
Simplegamer