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

116

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

#!/path/to/R
...

или

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

но я не смог заставить ни то, ни другое работать.

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

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

Вариант, который я в настоящее время меньше всего презираю, - это встраивание R в сценарий bash:

#!/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 не откажется от одного или другого, и заставляет мое сердце сильно болеть.

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

blahdiblah
источник

Ответы:

133

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

#!/usr/bin/env Rscript

args = commandArgs(trailingOnly = TRUE)
message(sprintf("Hello %s", args[1L]))

Первая линия - это линия шебанга . Лучше всего использовать /usr/bin/env Rscriptвместо жесткого кодирования путь к вашей установке R. В противном случае вы рискуете сломать ваш скрипт на других компьютерах.

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

chmod +x script.r

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

./script.r world
# Hello world
Конрад Рудольф
источник
1
Да, я думаю, что это «официальный» способ сделать это.
Фрэнк
5
А запуск Rscript --helpиз командной строки отобразит множество полезных опций, которые можно добавить в shebang, например --vanilla.
flodel
8
Также упомянем commandArgsфункцию getoptи optparseпакеты и для разбора командной строки. Таким образом, аргументы и параметры также могут передаваться в ваши сценарии при запуске из командной строки.
flodel
1
Обратите внимание, что это работает, только если #!/usr/bin/Rscript(что не является стандартной практикой для сценариев R).
gented
16

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

Йоуни К. Сеппянен
источник
11

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

#!/usr/bin/env Rscript
The_Cute_Hedgehog
источник
1
Не «общесистемный», а скорее envпозволил бы вам запустить первый Rscriptнайденный в вашем собственном $PATH, тем самым позволяя фактически запускать что-то другое, кроме общесистемного / по умолчанию Rscript(которое может не быть установлено /usr/whatever). Я бы рекомендовал использовать envfor Rи Rscriptпрочее, поскольку они, в частности, не могут быть установлены в стандартных местах. (Однако обычные bashскрипты обычно можно безопасно использовать всегда #!/bin/bash.)
Майкл
@michael Нет, ты ошибаешься насчет Баша, и это опасный совет. Единственное, что можно безопасно жестко запрограммировать, - это /bin/sh. Все остальное должно использовать envпоиск. В частности, Bash чаще всего устаревает на вычислительных кластерах, и у пользователей есть свои собственные настраиваемые установки (обычно ~/.local/binили совместно используемые в чем-то вроде /softwareмонтирования NFS). Кроме того, на MacOS, /bin/bashэто всегда устаревает из - за проблем лицензирования, и до настоящего времени Bash чаще , расположенной на /usr/local/bin/bash(я понимаю ваш комментарий 3 -х лет , но это довольно важно.)
Konrad Rudolph
Нет, извините, это просто неправда. Однако у вас твердое мнение по этому поводу, поэтому я не буду обсуждать этот вопрос. Если употребление /bin/shпри любых обстоятельствах не является «опасным», то вы должны признать, что то же самое можно сказать и о /bin/bash. Использование envболее непредсказуемо из-за надежных / несовместимых PATHнастроек для разных пользователей, но каждый пользователь R может действительно захотеть этого поведения, тогда как bashскрипты этого не сделают. Наконец, для CI / облака, вызывающего новые сценарии bash, просто вызовите их, используя /path/to/my/bash myscriptили явно установите путь и вызывайте их с помощью env script. EOT
Майкл
9

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

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


источник
4
Уважаем, случайным читателям: многие из этих ответов появились раньше Rscriptlittler), если вам интересно.
Майкл
@michael Ни один из ответов здесь не предшествовал Rscript, который был выпущен в 2007 году с R 2.5.0.
Конрад Рудольф
4

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

#!/usr/bin/Rscript

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

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

#!/usr/bin/env Rscript

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

ее имена
источник
2

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

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

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

axa@artemis:~$ cat r.test
#!/usr/bin/R -q -f
error
axa@artemis:~$ ./r.test
> #!/usr/bin/R -q -f
> error
Error: object "error" not found
Execution halted
axa@artemis:~$
Эндрю Айлетт
источник
2

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

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

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

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

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

Джон
источник
Этот ответ потенциально полезен, поскольку неясно, к какой платформе (* nix или Mac OS) относится OP. После небольшой переделки (посмотрите на код формата и удалите извиняющееся начало) это было бы хорошим дополнением к ответам здесь.
BenBarnes
2
Это еще одна причина использовать #!/usr/bin/env Rscriptвместо жестко заданного пути в Rсценариях (и добавить этот длинный путь в свой $PATH)
Майкл
0

Возможно, вы захотите использовать модуль 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 и другие параметры, чтобы удалить все беспорядки при запуске.

рамануджанова
источник
0

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

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

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

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

r -p file.txt
Том
источник
2
Вместо этого (который кажется мертвым), littlerбезусловно, будет предпочтительнее (поскольку он все еще жив); или просто используйте Rscript(который на самом деле появился после того, как littlerбыл создан.)
Майкл
-1

Следующее работает для меня, использующего 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 .

Затем в вашем файле сценария:

#!runr
# some R commands
x = 1
x

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

Не очень красиво, но вроде работает!


источник
1
Как насчет разных сценариев R, требующих разных параметров? А как насчет передачи аргументов сценариям R из командной строки?
blahdiblah