Saya punya skrip R yang ingin saya berikan beberapa parameter baris perintah (daripada nilai parameter hardcode dalam kode itu sendiri). Script berjalan pada Windows.
Saya tidak dapat menemukan info tentang cara membaca parameter yang disediakan pada command-line ke dalam skrip R. Saya akan terkejut jika itu tidak dapat dilakukan, jadi mungkin saya tidak menggunakan kata kunci terbaik di pencarian Google saya ...
Adakah petunjuk atau rekomendasi?
command-line
r
parameters
monch1962
sumber
sumber
Jawaban:
Jawaban Dirk di sini adalah semua yang Anda butuhkan. Berikut adalah contoh minimal yang dapat direproduksi.
Saya membuat dua file:
exmpl.bat
danexmpl.R
.exmpl.bat
:Atau, gunakan
Rterm.exe
:exmpl.R
:Simpan kedua file di direktori yang sama dan mulai
exmpl.bat
. Dalam hasilnya Anda akan mendapatkan:example.png
dengan beberapa plotexmpl.batch
dengan semua yang dilakukanAnda juga bisa menambahkan variabel lingkungan
%R_Script%
:dan menggunakannya dalam skrip batch Anda sebagai
%R_Script% <filename.r> <arguments>
Perbedaan antara
RScript
danRterm
:Rscript
memiliki sintaksis yang lebih sederhanaRscript
secara otomatis memilih arsitektur pada x64 (lihat R Instalasi dan Administrasi, 2.6 Sub-arsitektur untuk perincian)Rscript
perluoptions(echo=TRUE)
dalam file .R jika Anda ingin menulis perintah ke file outputsumber
Beberapa poin:
Parameter baris perintah dapat diakses melalui
commandArgs()
, jadi lihathelp(commandArgs)
ikhtisar.Anda dapat menggunakan
Rscript.exe
semua platform, termasuk Windows. Itu akan mendukungcommandArgs()
. littler dapat di-porting ke Windows tetapi sekarang hanya hidup di OS X dan LinuxAda dua paket tambahan pada CRAN - getopt dan optparse - yang keduanya ditulis untuk penguraian baris perintah.
Edit pada Nov 2015: Alternatif baru telah muncul dan saya dengan sepenuh hati merekomendasikan docopt .
sumber
Tambahkan ini ke bagian atas skrip Anda:
Kemudian Anda bisa merujuk ke argumen yang diteruskan sebagai
args[1]
,args[2]
dll.Lalu lari
Jika argumen Anda adalah string dengan spasi di dalamnya, sertakan dalam tanda kutip ganda.
sumber
Coba pustaka (getopt) ... jika Anda ingin sesuatu menjadi lebih baik. Sebagai contoh:
sumber
Anda membutuhkan littler (dilafalkan 'little r')
Dirk akan selesai sekitar 15 menit untuk menguraikan;)
sumber
Karena
optparse
telah disebutkan beberapa kali dalam jawaban, dan ini memberikan kit yang komprehensif untuk pemrosesan baris perintah, berikut adalah contoh singkat yang disederhanakan tentang bagaimana Anda dapat menggunakannya, dengan asumsi file input ada:script.R:
Diberikan file sewenang-wenang
blah.txt
dengan 23 baris.Di baris perintah:
Rscript script.R -h
outputRscript script.R -n blah.txt
output[1] "69"
Rscript script.R -n -f 5 blah.txt
output[1] "115"
sumber
Di bash, Anda bisa membuat baris perintah seperti berikut:
Anda dapat melihat bahwa variabel
$z
diganti oleh bash shell dengan "10" dan nilai ini diambil olehcommandArgs
dan dimasukkan ke dalamargs[2]
, dan perintah rentangx=1:10
dieksekusi oleh R berhasil, dll.sumber
FYI: ada fungsi args (), yang mengambil argumen fungsi R, jangan dikacaukan dengan vektor argumen bernama args
sumber
Jika Anda perlu menentukan opsi dengan flag, (seperti -h, --help, --number = 42, dll) Anda dapat menggunakan paket R optparse (terinspirasi dari Python): http://cran.r-project.org /web/packages/optparse/vignettes/optparse.pdf .
Setidaknya begini bagaimana saya memahami pertanyaan Anda, karena saya menemukan posting ini ketika mencari yang setara dengan bash getopt, atau perl Getopt, atau python argparse dan optparse.
sumber
Saya hanya mengumpulkan struktur data yang bagus dan rantai pemrosesan untuk menghasilkan perilaku switching ini, tidak perlu perpustakaan. Saya yakin itu akan diimplementasikan berkali-kali, dan menemukan utas ini mencari contoh - pikir saya akan ikut campur.
Saya bahkan tidak terlalu membutuhkan flag (satu-satunya flag di sini adalah mode debug, membuat variabel yang saya periksa sebagai syarat untuk memulai fungsi hilir
if (!exists(debug.mode)) {...} else {print(variables)})
.lapply
Pernyataan pemeriksaan bendera di bawah ini menghasilkan yang sama dengan:di mana
args
variabel dibaca dari argumen baris perintah (vektor karakter, setara denganc('--debug','--help')
ketika Anda memasok ini misalnya)Ini dapat digunakan kembali untuk bendera lain dan Anda menghindari semua pengulangan, dan tidak ada perpustakaan sehingga tidak ada ketergantungan:
Perhatikan bahwa di
flag.details
sini perintah disimpan sebagai string, kemudian dievaluasi denganeval(parse(text = '...'))
. Optparse jelas diinginkan untuk skrip serius, tetapi kode fungsionalitas minimal juga baik.Output sampel:
sumber