Який найкращий спосіб використовувати R-скрипти в командному рядку (терміналі)?


115

Дуже зручно мати сценарії R для виконання простих сюжетів з командного рядка. Однак запустити R з bash-скриптів зовсім не зручно. Ідеал може бути чимось на кшталт

#!/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 у баш-скрипт:

#!/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 не вийти з ладу на той чи інший, і змушує моє серце боліти справді сильно.

Чи є якийсь кращий спосіб, який я пропускаю?

Відповіді:


132

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

8
Згадаємо також commandArgsфункцію getoptта optparseпакети для розбору командного рядка. Так що аргументи та параметри також можуть передаватися вашим сценаріям під час запуску з командного рядка.
flodel

1
Зауважте, що це працює лише в тому випадку, якщо #!/usr/bin/Rscript(що не є стандартною практикою для R-сценаріїв).
покладено

16

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


10

Відповідь Мігеля Санчеса така, яка повинна бути. Іншим способом виконання Rscript може бути команда 'env' для запуску загальносистемного RScript.

#!/usr/bin/env Rscript

1
Не "загальносистемний", а скоріше envдозволить запустити перше Rscriptзнайдене у власному $PATH, тим самим дозволяючи реально запустити щось інше, ніж загальносистемний / за замовчуванням Rscript(який може бути не встановлений у /usr/whatever). Я б рекомендував використовувати envдля Rі Rscriptречей, так як вони , зокрема , не можуть бути встановлені в стандартних місцях. (Звичайні bashсценарії, однак, зазвичай завжди можна безпечно використовувати #!/bin/bash.)
michael

@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
michael

9

#!/path/to/Rне буде працювати, тому що R сам по собі сценарій, тому execveнещасний.

я використовую R --slave -f script


4
Fyi випадковим читачам: багато цих відповідей заздалегідь Rscriptlittler), якщо вам цікаво.
Майкл

@michael Жодна з відповідей тут не передує Rscript, який був випущений у 2007 році з R 2.5.0.
Конрад Рудольф


4

Це працює,

#!/usr/bin/Rscript

але я не знаю, що станеться, якщо у вас на машині встановлена ​​більше 1 версії 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) відноситься ОП. Трохи переробляючи (подивіться відформатувати код і видаліть вибачливий початок), це було б хорошим доповненням до відповідей тут.
BenBarnes

2
Це ще одна причина використовувати #!/usr/bin/env Rscriptзамість жорстко закодованого шляху в Rсценаріях (і додати цей довгий шлях до свого $PATH)
michael

0

Можливо, ви хочете використовувати модуль rpy2 python. Однак "правильний" спосіб це зробити за допомогою 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

Примітка. Ви хочете спробувати - ваніль та інші варіанти, щоб видалити всі початкові програми.


0

Спробуйте smallR для написання швидких сценаріїв R у командному рядку:

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

(r команда в каталозі)

Графікування з командного рядка за допомогою smallR виглядатиме так:

r -p file.txt

2
Замість цього (що здається мертвим), littlerбезумовно , було б кращим (оскільки воно ще живе); або, просто використовувати Rscript(яке фактично вийшло після того, як littlerбуло створено)
michael

-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.