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.R
I wywoływanie ich za pomocą R --file=script.R
lub 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, --vanilla
z 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?
Rscript --help
z wiersza poleceń spowoduje wyświetlenie wielu przydatnych opcji, które można dodać do shebang, takich jak--vanilla
.commandArgs
funkcjigetopt
ioptparse
pakietach i do analizowania wiersza poleceń. Dzięki temu argumenty i opcje mogą być również przekazywane do skryptów podczas uruchamiania z wiersza poleceń.#!/usr/bin/Rscript
(co nie jest standardową praktyką w skryptach języka R).Spróbuj mniej .
littler
zapewnia 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.źródło
Odpowiedź Miguela Sancheza jest taka, jaka powinna być. Innym sposobem wykonania Rscript może być polecenie „env” uruchamiające systemowy RScript.
źródło
env
pozwoliłby na uruchomienie pierwszegoRscript
znalezionego we własnym$PATH
, pozwalając w ten sposób faktycznie uruchomić coś innego niż systemowy / domyślnyRscript
(który może nie być zainstalowany/usr/whatever
). Polecałbym używaćenv
forR
iRscript
rzeczy, ponieważ te w szczególności mogą nie być instalowane w standardowych miejscach. (Zwykłebash
skrypty można jednak bezpiecznie zawsze używać#!/bin/bash
.)/bin/sh
. Wszystko inne musi używaćenv
wyszukiwania. W szczególności Bash jest często przestarzały w klastrach obliczeniowych, a użytkownicy mają własne niestandardowe instalacje (zwykle w~/.local/bin
lub współdzielone w czymś takim jak/software
montowanie NFS). Podobnie w systemie macOS/bin/bash
jest 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)./bin/sh
w żadnych okolicznościach nie jest również „niebezpieczne”, to trzeba przyznać, że można to samo powiedzieć/bin/bash
. Używanieenv
jest bardziej nieprzewidywalne ze względu na niezawodne / niespójnePATH
ustawienia dla różnych użytkowników, ale każdy użytkownik języka R może faktycznie chcieć takiego zachowania, podczas gdybash
skrypty 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 myscript
lub jawnie ustaw ścieżkę i wywołaj za pomocąenv script
. EOT#!/path/to/R
nie zadziała, ponieważ sam R jest skryptem, więcexecve
jest nieszczęśliwy.używam
R --slave -f script
źródło
Rscript
(ilittler
), jeśli się zastanawiasz.Jeśli jesteś zainteresowany analizowaniem argumentów wiersza poleceń do skryptu R, wypróbuj RScript, który jest dołączony do R od wersji 2.5.x
http://stat.ethz.ch/R-manual/R-patched/library/utils/html/Rscript.html
źródło
To działa,
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
mówi tłumaczowi, aby użył tego, co R pojawi się jako pierwsze na twojej ścieżce.
źródło
Jeśli program, którego używasz do wykonywania skryptu, potrzebuje parametrów, możesz je umieścić na końcu ciągu #! linia:
Nie znając R, nie mogę poprawnie przetestować, ale wydaje się, że działa:
źródło
Tylko uwaga do dodania do tego postu. Późniejsze wersje
R
wydawały sięRscript
nieco pogrzebane . Dla wersji R 3.1.2-1 na OSX pobranej w styczniu 2015 r. ZnalazłemRscript
wWięc zamiast czegoś podobnego
#! /sw/bin/Rscript
musiałem użyć następującego na początku mojego skryptu.locate Rscript
Może być pomocne dla Ciebie.źródło
#!/usr/bin/env Rscript
zamiast zakodowanej ścieżki wR
skryptach (i dodać tę długą ścieżkę do swojej$PATH
)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:
Uwaga: będziesz chciał wypróbować --vanilla i inne opcje, aby usunąć całe okrucieństwo startowe.
źródło
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ódło
littler
z pewnością byłby preferowany (ponieważ wciąż żyje); lub po prostu użyjRscript
(który faktycznie wyszedł polittler
utworzeniu).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
Musisz stworzyć ten plik wykonywalny za pomocą chmod + x runr .
Następnie w pliku skryptu:
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!
źródło