Apa cara terbaik untuk menggunakan skrip R pada baris perintah (terminal)?

115

Sangat mudah memiliki skrip R untuk melakukan plot sederhana dari baris perintah. Namun, menjalankan R dari skrip bash sama sekali tidak nyaman. Idealnya mungkin seperti itu

#!/path/to/R
...

atau

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

tapi saya belum bisa melakukan salah satu dari itu.

Pilihan lainnya adalah mempertahankan skrip murni di R, misalnya script.R, dan menjalankannya dengan R --file=script.Ratau serupa. Namun, terkadang skrip akan mengandalkan sakelar baris perintah yang tidak jelas di mana bagian titik kode berada di luar skrip. Contoh: menyelinap ke R dari bash melalui profil .R lokal, sakelar yang diinginkan kemudian semuanya --vanillatersirat kecuali --no-init-file.

Pilihan lainnya adalah skrip bash untuk menyimpan bendera R dan dapat dieksekusi tanpa rasa sakit, yang kemudian memanggil skrip R. Masalahnya adalah ini berarti satu program baru saja dipecah menjadi dua file yang sekarang harus tetap sinkron, ditransfer ke mesin baru bersama-sama, dll.

Opsi yang paling tidak saya benci saat ini adalah menyematkan R dalam skrip 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

Semuanya ada dalam satu file. Ini dapat dieksekusi dan dengan mudah menangani argumen. Masalahnya adalah bahwa menggabungkan bash dan R seperti ini cukup banyak menghilangkan kemungkinan IDE tidak gagal di satu atau yang lain, dan membuat hati saya sangat sakit.

Adakah cara yang lebih baik yang saya lewatkan?

bla bla
sumber

Jawaban:

132

Isi dari script.r:

#!/usr/bin/env Rscript

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

Baris pertama adalah baris shebang . Ini praktik terbaik untuk digunakan /usr/bin/env Rscriptalih-alih melakukan hard-coding jalur ke instalasi R. Anda. Jika tidak, Anda berisiko skrip Anda rusak di komputer lain.

Selanjutnya, buat itu dapat dieksekusi (pada baris perintah):

chmod +x script.r

Panggilan dari baris perintah:

./script.r world
# Hello world
Konrad Rudolph
sumber
1
Ya, saya pikir ini adalah cara "resmi" untuk melakukannya.
Frank
5
Dan menjalankan Rscript --helpdari baris perintah akan mencantumkan banyak opsi berguna yang dapat ditambahkan ke shebang, seperti --vanilla.
flodel
8
Mari kita juga menyebutkan commandArgsfungsi getoptdan optparsepaket dan untuk mengurai baris perintah. Sehingga argumen dan opsi juga dapat diteruskan ke skrip Anda saat dijalankan dari baris perintah.
flodel
1
Perhatikan bahwa ini hanya berfungsi jika #!/usr/bin/Rscript(yang bukan merupakan praktik standar untuk skrip R).
Tuan
16

Coba lebih kecil . littlermenyediakan kemampuan hash-bang (yaitu skrip yang dimulai dengan #! / some / path) untuk GNU R, serta penggunaan baris perintah dan perpipaan sederhana.

Jouni K. Seppänen
sumber
10

Tanggapan Miguel Sanchez adalah sebagaimana mestinya. Cara lain menjalankan Rscript bisa menjadi perintah 'env' untuk menjalankan RScript seluruh sistem.

#!/usr/bin/env Rscript
The_Cute_Hedgehog
sumber
1
Tidak "seluruh sistem", melainkan envakan memungkinkan Anda untuk menjalankan pertama Rscriptditemukan di Anda sendiri $PATH, sehingga memungkinkan satu untuk benar-benar menjalankan sesuatu yang lain daripada sistem-lebar / default Rscript(yang mungkin tidak dipasang di /usr/whatever). Saya akan merekomendasikan penggunaan envfor Rand Rscriptstuff, karena ini khususnya mungkin tidak dipasang di tempat standar. ( bashNamun skrip biasa biasanya dapat selalu digunakan dengan aman #!/bin/bash.)
michael
@ michael Tidak, Anda salah tentang Bash, dan ini nasihat berbahaya. Satu-satunya hal yang dapat dengan aman di-hardcode adalah /bin/sh. Yang lainnya harus menggunakan envpencarian. Secara khusus, lebih sering daripada tidak Bash ketinggalan zaman pada cluster komputasi dan pengguna memiliki instalasi khusus mereka sendiri (biasanya dalam ~/.local/bin, atau dibagikan dalam sesuatu seperti /softwaremount NFS). Demikian juga, di MacOS, /bin/bashyang selalu ketinggalan jaman karena lisensi masalah, dan up to date Bash lebih sering berada di /usr/local/bin/bash(saya menyadari komentar Anda berusia 3 tahun tapi ini cukup penting.)
Konrad Rudolph
Tidak, maaf, itu tidak benar. Anda memiliki pendapat yang kuat tentang masalah ini, jadi saya tidak akan memperdebatkan masalah tersebut. Jika menggunakan /bin/sh, dalam keadaan apapun, tidak juga "berbahaya", maka Anda harus mengakui hal yang sama bisa dikatakan /bin/bash. Penggunaan envlebih tidak dapat diprediksi, karena PATHpengaturan yang dapat diandalkan / tidak konsisten untuk pengguna yang berbeda, tetapi setiap pengguna R mungkin benar-benar menginginkan perilaku ini, sedangkan bashskrip tidak. Terakhir, untuk CI / cloud yang menjalankan skrip bash yang lebih baru, cukup panggil mereka menggunakan /path/to/my/bash myscriptatau setel jalurnya secara eksplisit & panggil mereka menggunakan env script. EOT
michael
9

#!/path/to/Rtidak akan berfungsi karena R itu sendiri adalah skrip, jadi execvetidak bahagia.

saya menggunakan R --slave -f script


sumber
4
Untuk pembaca biasa: banyak dari jawaban ini sebelum tanggal Rscript(dan littler), jika Anda bertanya-tanya.
michael
@michael Tidak ada jawaban di sini sebelum Rscript, yang dirilis pada 2007 dengan R 2.5.0.
Konrad Rudolph
4

Ini bekerja,

#!/usr/bin/Rscript

tetapi saya tidak tahu apa yang terjadi jika Anda memiliki lebih dari 1 versi R yang diinstal pada mesin Anda.

Jika Anda melakukannya seperti ini

#!/usr/bin/env Rscript

itu memberitahu penerjemah untuk hanya menggunakan apapun R muncul pertama kali di jalan Anda.

hernamesbarbara.dll
sumber
2

Jika program yang Anda gunakan untuk menjalankan skrip Anda membutuhkan parameter, Anda dapat meletakkannya di akhir #! baris:

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

Tidak mengetahui R, saya tidak dapat menguji dengan benar, tetapi ini sepertinya berhasil:

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:~$
Andrew Aylett
sumber
2

Hanya sebuah catatan untuk ditambahkan ke posting ini. Versi yang lebih baru Rtampaknya Rscriptagak terkubur . Untuk R 3.1.2-1 di OSX yang diunduh Jan 2015 saya temukan Rscriptdi

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

Jadi, alih-alih sesuatu seperti #! /sw/bin/Rscript, saya perlu menggunakan yang berikut di bagian atas skrip saya.

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

The locate Rscriptmungkin membantu Anda.

John
sumber
Jawaban ini berpotensi membantu, karena tidak jelas platform mana (* nix atau Mac OS) yang dirujuk OP. Dengan sedikit pengerjaan ulang (lihat kode format dan hapus permulaan maaf), ini akan menjadi tambahan yang bagus untuk jawaban di sini.
BenBarnes
2
Ini adalah alasan lain untuk menggunakan #!/usr/bin/env Rscriptalih-alih jalur kode keras dalam Rskrip (dan menambahkan jalur panjang itu ke Anda $PATH)
michael
0

Anda mungkin ingin menggunakan modul rpy2 python. Namun, cara yang "benar" untuk melakukannya adalah dengan R CMD BATCH. Anda dapat memodifikasi ini untuk menulis ke STDOUT, tetapi defaultnya adalah menulis ke file .Rout. Lihat contoh di bawah ini:

[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

Catatan: Anda akan ingin mencoba --vanilla dan opsi lain untuk menghapus semua cruft startup.

ramanujan
sumber
0

Coba smallR untuk menulis skrip R cepat di baris perintah:

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

( rperintah di direktori)

Membuat plot dari baris perintah menggunakan smallR akan terlihat seperti ini:

r -p file.txt
Tom
sumber
2
Daripada ini (yang sepertinya mati), littlerpasti lebih disukai (karena masih hidup); atau, cukup gunakan Rscript(yang benar-benar keluar setelah littlerdibuat.)
michael
-1

Berikut ini adalah cara bekerja untuk saya menggunakan MSYS bash di Windows - Saya tidak memiliki R di kotak Linux saya jadi tidak dapat mencobanya di sana. Anda membutuhkan dua file - yang pertama disebut runr mengeksekusi R dengan parameter file

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

Anda perlu membuat ini dapat dieksekusi dengan chmod + x runr .

Kemudian di file skrip Anda:

#!runr
# some R commands
x = 1
x

Perhatikan #! runr line mungkin perlu menyertakan path lengkap ke runr, bergantung pada bagaimana Anda menggunakan perintah, bagaimana variabel PATH Anda diatur, dll.

Tidak cantik, tapi sepertinya berhasil!


sumber
1
Bagaimana dengan skrip R berbeda yang membutuhkan parameter berbeda? Bagaimana dengan menyampaikan argumen ke skrip R dari baris perintah?
bla bla