2009-04-15 5 views
96

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

#!/path/to/R 
... 

или

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

, но я не был в состоянии сделать любой из этих работ.

Другой вариант - сохранить скрипты исключительно в R, например. script.R, и ссылаясь на него с R --file=script.R или аналогичным. Однако иногда сценарий будет опираться на неясные ключи командной строки, в которых точечная часть кода существует вне сценария. Пример: прокрасть вещи в R из bash через локальный .Rprofile, нужные ключи - это все, что есть --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 не терпит неудачу на том или ином, и заставляет мое сердце болеть.

Есть ли какой-нибудь лучший способ, которого я не хватает?

ответ

114

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

#!/usr/bin/Rscript 

cat("Hello") 

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

./script.r 
+1

Да, я думаю, что это «официальный» способ сделать это. – Frank

+5

И запуск 'Rscript --help' из командной строки перечислит множество полезных опций, которые могут быть добавлены к shebang, например' --vanilla'. – flodel

+7

Давайте также упомянуть функцию 'commandArgs' и пакеты' getopt' и 'optparse' для синтаксического анализа командной строки. Таким образом, аргументы и параметры также могут передаваться вашим сценариям при запуске из командной строки. – flodel

-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 + х RunR.

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

#!runr 
# some R commands 
x = 1 
x 

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

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

+1

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

16

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

2

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

#!/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]:~$ 
0

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

8

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

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

+3

Fyi для случайных читателей: многие из этих ответов задают дату 'Rscript' (и' littler'), если вам интересно. – michael

9

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

#!/usr/bin/env Rscript 
+1

Не «общесистемный», а скорее «env» позволит вам запустить первый «Rscript», найденный в вашем собственном '$ PATH', что позволяет фактически запускать что-то _друже, чем общесистемный/по умолчанию' Rscript' (который не может быть установлен в '/ usr/whatever'). Я бы рекомендовал использовать 'env' для вещей' R' и 'Rscript', поскольку они, в частности, не могут быть установлены в стандартных местах. (Обычные скрипты 'bash', однако, обычно могут безопасно всегда использовать' #!/Bin/bash'.) – michael

0

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

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

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

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

r -p file.txt 
+1

Вместо этого (который кажется мертвым) 'littler', безусловно, будет предпочтительнее (поскольку он все еще жив); или просто используйте 'Rscript' (который фактически вышел после создания' littler'.) – michael

5

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

#!/usr/bin/Rscript 

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

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

#!/usr/bin/env Rscript 

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

4

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

+0

Это ответ? – dario

+0

Этот ответ потенциально полезен, поскольку неясно, к какой платформе (* nix или Mac OS) относится OP. С небольшой переработкой (посмотрите на формат кода и удалите апологетическое начало), это было бы хорошим дополнением к ответам здесь. – BenBarnes

+0

Это еще одна причина использовать '#!/Usr/bin/env Rscript' вместо жестко закодированного пути в сценариях' R' (и добавить этот длинный путь к вашему '$ PATH') – michael

Смежные вопросы