Jaki jest najlepszy sposób używania skryptów R w wierszu poleceń (terminalu)?


115

Posiadanie skryptów R do wykonywania prostych wykresów z wiersza poleceń jest bardzo wygodne. Jednak uruchamianie R ze skryptów bash nie jest wcale wygodne. Ideałem może być coś takiego

#!/path/to/R
...

lub

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

ale nie byłem w stanie wykonać żadnej z tych czynności.

Inną opcją jest utrzymywanie skryptów wyłącznie w języku R, np. script.RI wywoływanie ich za pomocą R --file=script.Rlub czegoś podobnego. Jednak czasami skrypt będzie polegał na niejasnych przełącznikach wiersza poleceń, w których część kodu istnieje poza skryptem. Przykład: zakradanie się rzeczy do R z bash przez lokalny .Rprofile, pożądane przełączniki są wtedy wszystkim, --vanillaz wyjątkiem --no-init-file.

Inną opcją jest skrypt bash do przechowywania flag R i bezbolesnego wykonywania, który następnie wywołuje skrypt R. Problem polega na tym, że oznacza to, że pojedynczy program został właśnie podzielony na dwa pliki, które teraz muszą być zsynchronizowane, przesyłane razem na nowe maszyny itp.

Opcją, którą obecnie najmniej gardzę, jest osadzenie R w skrypcie 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

Wszystko jest w jednym pliku. Jest wykonywalny i łatwo obsługuje argumenty. Problem polega na tym, że takie połączenie basha i R prawie eliminuje możliwość, że jakiekolwiek IDE nie zawiedzie na jednym lub drugim, i bardzo mocno boli mnie serce.

Czy brakuje mi lepszego sposobu?

Odpowiedzi:


132

Treść script.r:

#!/usr/bin/env Rscript

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

Pierwsza linia to linia shebang . Najlepszą praktyką jest używanie /usr/bin/env Rscriptzamiast zakodowania ścieżki do instalacji języka R. W przeciwnym razie ryzykujesz złamanie skryptu na innych komputerach.

Następnie uczyń go wykonywalnym (w wierszu poleceń):

chmod +x script.r

Wywołanie z wiersza poleceń:

./script.r world
# Hello world

1
Tak, myślę, że jest to „oficjalny” sposób na zrobienie tego.
Frank

5
Uruchomienie Rscript --helpz wiersza poleceń spowoduje wyświetlenie wielu przydatnych opcji, które można dodać do shebang, takich jak --vanilla.
flodela

8
Wspomnijmy również o commandArgsfunkcji getopti optparsepakietach i do analizowania wiersza poleceń. Dzięki temu argumenty i opcje mogą być również przekazywane do skryptów podczas uruchamiania z wiersza poleceń.
flodela

1
Zauważ, że działa to tylko wtedy, gdy #!/usr/bin/Rscript(co nie jest standardową praktyką w skryptach języka R).
gented

16

Spróbuj mniej . littlerzapewnia funkcję hash-bang (tj. skrypt zaczynający się od #! / some / path) dla GNU R, a także proste użycie linii poleceń i potoków.


10

Odpowiedź Miguela Sancheza jest taka, jaka powinna być. Innym sposobem wykonania Rscript może być polecenie „env” uruchamiające systemowy RScript.

#!/usr/bin/env Rscript

1
Nie „dla całego systemu”, ale raczej envpozwoliłby na uruchomienie pierwszego Rscriptznalezionego we własnym $PATH, pozwalając w ten sposób faktycznie uruchomić coś innego niż systemowy / domyślny Rscript(który może nie być zainstalowany /usr/whatever). Polecałbym używać envfor Ri Rscriptrzeczy, ponieważ te w szczególności mogą nie być instalowane w standardowych miejscach. (Zwykłe bashskrypty można jednak bezpiecznie zawsze używać #!/bin/bash.)
michael

@michael Nie, mylisz się co do Basha, a to jest niebezpieczna rada. Jedyną rzeczą, którą można bezpiecznie zakodować na stałe, jest /bin/sh. Wszystko inne musi używać envwyszukiwania. W szczególności Bash jest często przestarzały w klastrach obliczeniowych, a użytkownicy mają własne niestandardowe instalacje (zwykle w ~/.local/binlub współdzielone w czymś takim jak /softwaremontowanie NFS). Podobnie w systemie macOS /bin/bashjest zawsze przestarzały z powodu problemów licencyjnych, a aktualny Bash jest częściej dostępny pod adresem /usr/local/bin/bash(zdaję sobie sprawę, że twój komentarz ma 3 lata, ale jest to dość ważne).
Konrad Rudolph

Nie, przepraszam, to po prostu nieprawda. Masz jednak mocne zdanie w tej sprawie, więc nie będę o tym debatować. Jeśli używanie /bin/shw żadnych okolicznościach nie jest również „niebezpieczne”, to trzeba przyznać, że można to samo powiedzieć /bin/bash. Używanie envjest bardziej nieprzewidywalne ze względu na niezawodne / niespójne PATHustawienia dla różnych użytkowników, ale każdy użytkownik języka R może faktycznie chcieć takiego zachowania, podczas gdy bashskrypty nie. Wreszcie, w przypadku wywoływania nowszych skryptów bash za pomocą CI / chmury, po prostu wywołaj je za pomocą /path/to/my/bash myscriptlub jawnie ustaw ścieżkę i wywołaj za pomocą env script. EOT
michael

9

#!/path/to/R nie zadziała, ponieważ sam R jest skryptem, więc execve jest nieszczęśliwy.

używam R --slave -f script


4
Fyi dla zwykłych czytelników: wiele z tych odpowiedzi pochodzi sprzed daty Rscript(i littler), jeśli się zastanawiasz.
michael

@michael Żadna z odpowiedzi tutaj nie poprzedza Rscript, który został wydany w 2007 roku z wersją R 2.5.0.
Konrad Rudolph


4

To działa,

#!/usr/bin/Rscript

ale nie wiem, co się stanie, jeśli masz więcej niż jedną wersję R zainstalowaną na swoim komputerze.

Jeśli robisz to w ten sposób

#!/usr/bin/env Rscript

mówi tłumaczowi, aby użył tego, co R pojawi się jako pierwsze na twojej ścieżce.


2

Jeśli program, którego używasz do wykonywania skryptu, potrzebuje parametrów, możesz je umieścić na końcu ciągu #! linia:

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

Nie znając R, nie mogę poprawnie przetestować, ale wydaje się, że działa:

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

Tylko uwaga do dodania do tego postu. Późniejsze wersje Rwydawały się Rscriptnieco pogrzebane . Dla wersji R 3.1.2-1 na OSX pobranej w styczniu 2015 r. Znalazłem Rscriptw

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

Więc zamiast czegoś podobnego #! /sw/bin/Rscriptmusiałem użyć następującego na początku mojego skryptu.

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

locate RscriptMoże być pomocne dla Ciebie.


Ta odpowiedź jest potencjalnie pomocna, ponieważ nie jest jasne, do której platformy (* nix lub Mac OS) odnosi się OP. Po niewielkiej przeróbce (poszukaj sformatowania kodu i usunięcia przepraszającego początku), byłoby to dobrym dodatkiem do odpowiedzi tutaj.
BenBarnes

2
To kolejny powód, aby używać #!/usr/bin/env Rscriptzamiast zakodowanej ścieżki w Rskryptach (i dodać tę długą ścieżkę do swojej $PATH)
michael

0

Możesz chcieć użyć modułu rpy2 Pythona. Jednak „właściwym” sposobem jest użycie programu R CMD BATCH. Możesz to zmodyfikować, aby zapisywać w STDOUT, ale domyślnie zapisuje się do pliku .Rout. Zobacz przykład poniżej:

[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

Uwaga: będziesz chciał wypróbować --vanilla i inne opcje, aby usunąć całe okrucieństwo startowe.


0

Wypróbuj smallR do pisania szybkich skryptów R w wierszu poleceń:

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

(r polecenie w katalogu)

Drukowanie z wiersza poleceń przy użyciu smallR wyglądałoby następująco:

r -p file.txt

2
Zamiast tego (który wydaje się martwy), littlerz pewnością byłby preferowany (ponieważ wciąż żyje); lub po prostu użyj Rscript(który faktycznie wyszedł po littlerutworzeniu).
michael

-1

Poniższe działa dla mnie podczas korzystania z MSYS bash w systemie Windows - nie mam R na moim Linuksie, więc nie mogę go tam wypróbować. Potrzebujesz dwóch plików - pierwszy o nazwie runr wykonuje R z parametrem pliku

# this is runr
# following is path to R on my Windows machine
# plus any R params you need
c:/r/bin/r --file=$1

Musisz stworzyć ten plik wykonywalny za pomocą chmod + x runr .

Następnie w pliku skryptu:

#!runr
# some R commands
x = 1
x

Zanotuj #! runr może wymagać podania pełnej ścieżki do runr, w zależności od tego, jak używasz polecenia, jak ustawiona jest zmienna PATH itp.

Niezbyt ładne, ale wydaje się, że działa!


1
A co z różnymi skryptami języka R wymagającymi różnych parametrów? A co z przekazywaniem argumentów do skryptów języka R z wiersza poleceń?
blahdiblah
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.