Какой лучший способ использовать R-скрипты в командной строке (терминале)?

Очень удобно иметь R-скрипты для выполнения простых графиков из командной строки. Тем не менее, запуск R из bash скриптов совсем не удобен. Идеал может быть что-то вроде

#!/path/to/R
...

или

#!/usr/bin/env R
...

но я не смог сделать ни одну из этих работ.

Другим вариантом является сохранение скриптов исключительно в R, например. script.R и вызывать его с помощью R --file=script.R или аналогичного. Однако иногда script будет полагаться на неясные ключи командной строки, в которых точечная часть кода существует вне script. Пример: прокрасть вещи в R из bash через локальный .Rprofile, нужные переключатели будут тогда все --vanilla, за исключением --no-init-file.

Другим вариантом является bash script для хранения флагов R и безболезненно исполняемый, который затем вызывает R script. Проблема в том, что это означает, что одна программа просто разделилась на два файла, которые теперь нужно синхронизировать, переносить на новые компьютеры вместе и т.д.

Опция, которую я в настоящее время наименее презираю, встраивает R в bash script:

#!/bin/bash
... # usage message to catch bad input without invoking R
... # any bash pre-processing of input
... # etc
R --random-flags <<RSCRIPT
# R code goes here
RSCRIPT

Все в одном файле. Он является исполняемым и легко обрабатывает аргументы. Проблема состоит в том, что объединение bash и R, как это в значительной степени исключает возможность любой IDE, которая не терпит неудачу на том или ином, и заставляет мое сердце болеть очень плохо.

Есть ли какой-то лучший способ, который я пропускаю?

Ответ 1

Содержание script.r:

#!/usr/bin/env Rscript

message("Hello")

Сделайте его исполняемым (в командной строке):

chmod +x script.r

Вызов из командной строки:

./script.r

Ответ 2

Попробуйте littler. littler предоставляет хэш-бэнг (т.е. script, начинающийся С#!/some/path) для GNU R, а также использование простой командной строки и трубопровода.

Ответ 3

Ответ Мигеля Санчеса такой, каким он должен быть. Другим способом выполнения Rscript может быть команда "env" для запуска системного интерфейса RScript.

#!/usr/bin/env Rscript

Ответ 4

#!/path/to/R не будет работать, потому что R сам является script, поэтому execve несчастлив.

Я использую R --slave -f script

Ответ 6

Это работает,

#!/usr/bin/Rscript

но я не знаю, что произойдет, если на вашей машине установлено более 1 версии R.

Если вы сделаете это так,

#!/usr/bin/env Rscript

он говорит интерпретатору просто использовать то, что R появляется первым на вашем пути.

Ответ 7

Просто примечание, чтобы добавить к этому сообщению. Более поздние версии R несколько похоронили Rscript. Для R 3.1.2-1 в OSX, загруженном в январе 2015 г., я нашел Rscript в

/sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript

Итак, вместо чего-то вроде #! /sw/bin/Rscript мне нужно было использовать следующее в верхней части моего script.

#! /sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript

locate Rscript может быть вам полезен.

Ответ 8

Если программа, которую вы используете для выполнения ваших script, нуждается в параметрах, вы можете поместить их в конец #! строка:

#!/usr/bin/R --random --switches --f

Не зная R, я не могу проверить правильно, но это работает:

[email protected]:~$ cat r.test
#!/usr/bin/R -q -f
error
[email protected]:~$ ./r.test
> #!/usr/bin/R -q -f
> error
Error: object "error" not found
Execution halted
[email protected]:~$

Ответ 9

Возможно, вы захотите использовать модуль python rpy2. Однако "правильный" способ сделать это с R CMD BATCH. Вы можете изменить это для записи в STDOUT, но по умолчанию это запись в файл .Rout. См. Пример ниже:

[ramanujan:~]$cat foo.R
print(rnorm(10))
[ramanujan:~]$R CMD BATCH foo.R
[ramanujan:~]$cat foo.Rout

R version 2.7.2 (2008-08-25)
Copyright (C) 2008 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

[Previously saved workspace restored]


 ~/.Rprofile loaded.
Welcome at  Fri Apr 17 13:33:17 2009
> print(rnorm(10))
 [1]  1.5891276  1.1219071 -0.6110963  0.1579430 -0.3104579  1.0072677 -0.1303165  0.6998849  1.9918643 -1.2390156
>

Goodbye at  Fri Apr 17 13:33:17 2009
> proc.time()
   user  system elapsed
  0.614   0.050   0.721

Примечание: вам нужно попробовать использовать --vanilla и другие опции, чтобы удалить все загрузочные файлы.

Ответ 10

Попробуйте smallR для написания быстрых R-скриптов в командной строке:

http://code.google.com/p/simple-r/

(r команда в каталоге)

Вывод из командной строки с использованием smallR будет выглядеть так:

r -p file.txt

Ответ 11

Ниже для меня работает MSYS bash в Windows - у меня нет R на моем ящике Linux, поэтому я не могу попробовать его там. Вам нужны два файла - первый, который называется runr, выполняет R с параметром файла

# this is runr
# following is path to R on my Windows machine
# plus any R params you need
c:/r/bin/r --file=$1

Вам нужно сделать этот исполняемый файл chmod + x runr.

Затем в файле script:

#!runr
# some R commands
x = 1
x

Обратите внимание на #! строка runr, возможно, должна включать полный путь к runr, в зависимости от того, как вы используете команду, как ваша переменная PATH установлена ​​и т.д.

Не очень, но похоже, что это работает!