Ответ 1
Содержание script.r
:
#!/usr/bin/env Rscript
message("Hello")
Сделайте его исполняемым (в командной строке):
chmod +x script.r
Вызов из командной строки:
./script.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, которая не терпит неудачу на том или ином, и заставляет мое сердце болеть очень плохо.
Есть ли какой-то лучший способ, который я пропускаю?
Содержание script.r
:
#!/usr/bin/env Rscript
message("Hello")
Сделайте его исполняемым (в командной строке):
chmod +x script.r
Вызов из командной строки:
./script.r
Попробуйте littler. littler
предоставляет хэш-бэнг (т.е. script, начинающийся С#!/some/path) для GNU R, а также использование простой командной строки и трубопровода.
Ответ Мигеля Санчеса такой, каким он должен быть. Другим способом выполнения Rscript может быть команда "env" для запуска системного интерфейса RScript.
#!/usr/bin/env Rscript
#!/path/to/R
не будет работать, потому что R сам является script, поэтому execve
несчастлив.
Я использую R --slave -f script
Если вы заинтересованы в анализе аргументов командной строки на R script, попробуйте RScript, который связан с R с версии 2.5.x
http://stat.ethz.ch/R-manual/R-patched/library/utils/html/Rscript.html
Это работает,
#!/usr/bin/Rscript
но я не знаю, что произойдет, если на вашей машине установлено более 1 версии R.
Если вы сделаете это так,
#!/usr/bin/env Rscript
он говорит интерпретатору просто использовать то, что R появляется первым на вашем пути.
Просто примечание, чтобы добавить к этому сообщению. Более поздние версии 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
может быть вам полезен.
Если программа, которую вы используете для выполнения ваших 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]:~$
Возможно, вы захотите использовать модуль 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 и другие опции, чтобы удалить все загрузочные файлы.
Попробуйте smallR для написания быстрых R-скриптов в командной строке:
http://code.google.com/p/simple-r/
(r
команда в каталоге)
Вывод из командной строки с использованием smallR будет выглядеть так:
r -p file.txt
Ниже для меня работает 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 установлена и т.д.
Не очень, но похоже, что это работает!
Вы когда-нибудь знали, что можете использовать свой браузер для использования RStudio на сервере?