Очень удобно иметь сценарии 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 не откажется от одного или другого, и заставляет мое сердце сильно болеть.
Есть ли лучший способ, которым я скучаю?
Rscript --help
из командной строки отобразит множество полезных опций, которые можно добавить в shebang, например--vanilla
.commandArgs
функциюgetopt
иoptparse
пакеты и для разбора командной строки. Таким образом, аргументы и параметры также могут передаваться в ваши сценарии при запуске из командной строки.#!/usr/bin/Rscript
(что не является стандартной практикой для сценариев R).Попробуй поменьше .
littler
предоставляет возможность хеширования (т.е. сценарий, начинающийся с #! / some / path) для GNU R, а также простое использование командной строки и конвейера.источник
Ответ Мигеля Санчеса такой, каким он должен быть. Другой способ выполнения Rscript может быть командой env для запуска общесистемного RScript.
источник
env
позволил бы вам запустить первыйRscript
найденный в вашем собственном$PATH
, тем самым позволяя фактически запускать что-то другое, кроме общесистемного / по умолчаниюRscript
(которое может не быть установлено/usr/whatever
). Я бы рекомендовал использоватьenv
forR
иRscript
прочее, поскольку они, в частности, не могут быть установлены в стандартных местах. (Однако обычныеbash
скрипты обычно можно безопасно использовать всегда#!/bin/bash
.)/bin/sh
. Все остальное должно использоватьenv
поиск. В частности, Bash чаще всего устаревает на вычислительных кластерах, и у пользователей есть свои собственные настраиваемые установки (обычно~/.local/bin
или совместно используемые в чем-то вроде/software
монтирования NFS). Кроме того, на MacOS,/bin/bash
это всегда устаревает из - за проблем лицензирования, и до настоящего времени Bash чаще , расположенной на/usr/local/bin/bash
(я понимаю ваш комментарий 3 -х лет , но это довольно важно.)/bin/sh
при любых обстоятельствах не является «опасным», то вы должны признать, что то же самое можно сказать и о/bin/bash
. Использованиеenv
более непредсказуемо из-за надежных / несовместимыхPATH
настроек для разных пользователей, но каждый пользователь R может действительно захотеть этого поведения, тогда какbash
скрипты этого не сделают. Наконец, для CI / облака, вызывающего новые сценарии bash, просто вызовите их, используя/path/to/my/bash myscript
или явно установите путь и вызывайте их с помощьюenv script
. EOT#!/path/to/R
не будет работать, потому что R сам по себе скрипт, поэтомуexecve
он недоволен.я использую
R --slave -f script
источник
Rscript
(иlittler
), если вам интересно.Если вас интересует анализ аргументов командной строки для сценария R, попробуйте RScript, который поставляется с R, начиная с версии 2.5.x
http://stat.ethz.ch/R-manual/R-patched/library/utils/html/Rscript.html
источник
Это работает,
но я не знаю, что произойдет, если на вашем компьютере установлено более одной версии R.
Если вы сделаете это так
он говорит интерпретатору просто использовать то, что R появляется первым на вашем пути.
источник
Если программе, которую вы используете для выполнения сценария, требуются параметры, вы можете поместить их в конец #! линия:
Не зная R, я не могу правильно протестировать, но, похоже, это работает:
источник
Просто примечание, которое нужно добавить к этому сообщению. Более поздние версии,
R
кажется,Rscript
несколько похоронили . Для R 3.1.2-1 на OSX загружен в январе 2015 г. Я нашелRscript
вИтак, вместо чего-то вроде
#! /sw/bin/Rscript
этого мне нужно было использовать следующее в верхней части моего скрипта.locate Rscript
Может быть полезным для вас.источник
#!/usr/bin/env Rscript
вместо жестко заданного пути вR
сценариях (и добавить этот длинный путь в свой$PATH
)Возможно, вы захотите использовать модуль python rpy2. Однако «правильный» способ сделать это - использовать R CMD BATCH. Вы можете изменить это так, чтобы записывать в STDOUT, но по умолчанию выполняется запись в файл .Rout. См. Пример ниже:
Примечание: вы захотите попробовать --vanilla и другие параметры, чтобы удалить все беспорядки при запуске.
источник
Попробуйте smallR для написания быстрых сценариев R в командной строке:
http://code.google.com/p/simple-r/
(
r
команда в каталоге)Построение из командной строки с использованием smallR будет выглядеть так:
источник
littler
безусловно, будет предпочтительнее (поскольку он все еще жив); или просто используйтеRscript
(который на самом деле появился после того, какlittler
был создан.)Следующее работает для меня, использующего MSYS bash в Windows - у меня нет R в моем Linux, поэтому я не могу попробовать его там. Вам нужны два файла - первый, называемый runr, выполняет R с параметром файла
Вам нужно сделать этот исполняемый файл с помощью chmod + x runr .
Затем в вашем файле сценария:
Обратите внимание #! В строке runr может потребоваться включить полный путь к runr, в зависимости от того, как вы используете команду, как установлена ваша переменная PATH и т. д.
Не очень красиво, но вроде работает!
источник