Komut satırında (terminal) R betiklerini kullanmanın en iyi yolu nedir?


115

Komut satırından basit çizimler yapmak için R betiklerine sahip olmak çok uygundur. Ancak, R'yi bash betiklerinden çalıştırmak hiç uygun değildir. İdeal şöyle bir şey olabilir

#!/path/to/R
...

veya

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

ama ben bunların ikisini de yapamadım.

Başka bir seçenek, örneğin R, içinde tamamen komut dosyalarını tutuyor script.Rve onu çağırma R --file=script.Rveya benzer. Bununla birlikte, bazen bir komut dosyası, kodun bir kısmının komut dosyasının dışında bulunduğu belirsiz komut satırı anahtarlarına güvenir. Örnek: yerel bir .Rprofile aracılığıyla bash'dan R'ye bir şeyler gizlice girildiğinde, istenen anahtarlar --vanillahariç her şeyin ima ettiği olur --no-init-file.

Diğer bir seçenek, R bayraklarını depolamak ve ağrısız bir şekilde yürütülebilir olmak için bir bash betiğidir, bu da daha sonra R betiğini çağırır. Sorun şu ki, bu, tek bir programın şimdi senkronize tutulması, birlikte yeni makinelere aktarılması vb. Gereken iki dosyaya bölündüğü anlamına geliyor.

Şu anda en az küçümsediğim seçenek, R'yi bir bash betiğine gömmek:

#!/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

Her şey tek bir dosyada. Çalıştırılabilir ve argümanları kolayca yönetir. Sorun şu ki, bash ve R'yi bu şekilde birleştirmek, herhangi bir IDE'nin birinde veya diğerinde başarısız olma olasılığını ortadan kaldırıyor ve kalbimi çok kötü acıtıyor.

Kaçırmamın daha iyi bir yolu var mı?

Yanıtlar:


132

İçeriği script.r:

#!/usr/bin/env Rscript

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

İlk satır, shebang satırıdır . /usr/bin/env RscriptR kurulumunuza giden yolu sabit kodlamak yerine kullanmak en iyi uygulamadır . Aksi takdirde, betiğinizin diğer bilgisayarlarda kırılma riskini alırsınız.

Ardından, onu çalıştırılabilir hale getirin (komut satırında):

chmod +x script.r

Komut satırından çağrı:

./script.r world
# Hello world

1
Evet, bunu yapmanın "resmi" yolu bu.
Frank

5
Ve Rscript --helpkomut satırından çalıştırmak , shebang'a eklenebilecek pek çok kullanışlı seçeneği listeleyecektir --vanilla.
flodel

8
En de söz edelim commandArgsfonksiyonu ve getoptve optparsekomut satırı ayrıştırma için paketler. Böylece, komut satırından çalıştırılırken bağımsız değişkenler ve seçenekler komut dosyalarınıza da aktarılabilir.
flodel

1
Bunun yalnızca şu durumlarda işe yaradığına dikkat edin #!/usr/bin/Rscript( R betikleri için standart uygulama bu değildir ).
gented

16

Little'ı dene . littlerGNU R için hash-bang (yani #! / bir / yol ile başlayan betik) yeteneği ve ayrıca basit komut satırı ve boru kullanımı sağlar.


10

Miguel Sanchez'in yanıtı olması gerektiği gibi. Rscript'i çalıştırmanın diğer yolu, sistem genelinde RScript çalıştırmak için 'env' komutu olabilir.

#!/usr/bin/env Rscript

1
Değil "sistem genelinde" değil, envilk çalışmasını sağlayacak Rscriptkendi bulundu $PATHböylelikle biri gerçekten bir şeyler çalışmasına izin veren diğer bir sistem genelinde / varsayılan dışında Rscript(in yüklenmemiş olabilir /usr/whatever). envFor Rand Rscriptstuff'ı kullanmanızı tavsiye ederim , çünkü bunlar özellikle standart yerlere kurulmayabilir. ( bashAncak sıradan komut dosyaları genellikle her zaman güvenle kullanılabilir #!/bin/bash.)
michael

@michael Hayır, Bash konusunda yanılıyorsunuz ve bu tehlikeli bir tavsiye. Güvenli bir şekilde kodlanabilecek tek şey /bin/sh. Diğer her şey envaramayı kullanmalıdır . Özellikle, çoğu zaman Bash işlem kümelerinde güncelliğini yitirmiştir ve kullanıcıların kendi özel kurulumları vardır (genellikle NFS montajı ~/.local/bingibi bir şey içinde veya paylaşılır /software). Aynı şekilde, MacOS üzerinde, /bin/bashbir zaman nedeniyle sorunlar lisans için modası geçmiş ve Bash daha yaygın bulunmaktadır güncel bir yukarı /usr/local/bin/bash(Senin yorumuna 3 yaşında ama bu oldukça önemli olduğunu biliyoruz.)
Konrad Rudolph

Hayır, üzgünüm, bu doğru değil. Yine de konu hakkında güçlü bir fikriniz var, bu yüzden konuyu tartışmayacağım. Kullanmak /bin/sh, herhangi bir koşulda, aynı zamanda "tehlikeli" değilse, aynı şeyin söylenebileceğini kabul etmelisiniz /bin/bash. Kullanımı envnedeniyle güvenilir / tutarsız, daha tahmin edilemez PATHfarklı kullanıcılar için ayarlarda ancak oysa her R kullanıcı Bu davranışı istemek aslında olabilir bashkomut yok. Son olarak, daha yeni bash komut dosyalarını çağıran CI / bulut için, basitçe /path/to/my/bash myscriptyolu kullanarak onları çağırın veya açıkça yolu ayarlayın ve kullanarak onları çağırın env script. EOT
michael

9

#!/path/to/Rişe yaramaz çünkü R'nin kendisi bir betiktir, dolayısıyla execvemutsuzdur.

kullanırım R --slave -f script


4
Sıradan okuyucular için: merak ediyorsanız , bu cevapların çoğu önceden Rscript(ve littler) önceden .
michael

@michael Buradaki yanıtların hiçbiri, 2007'de R 2.5.0 ile piyasaya sürülen Rscript'ten öncesine ait değil.
Konrad Rudolph


4

Bu çalışıyor,

#!/usr/bin/Rscript

ancak makinenizde 1'den fazla R sürümü kuruluysa ne olacağını bilmiyorum.

Eğer böyle yaparsan

#!/usr/bin/env Rscript

yorumlayıcıya yolunuzda ilk görünen R'yi kullanmasını söyler.


2

Komut dosyanızı çalıştırmak için kullandığınız programın parametrelere ihtiyacı varsa, bunları #! hat:

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

R'yi bilmeden, düzgün bir şekilde test edemiyorum, ancak bu işe yarıyor gibi görünüyor:

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

Bu gönderiye eklenecek bir not. Daha sonraki versiyonları biraz Rgömülü görünüyor Rscript. Ocak 2015'te indirilen OSX üzerinde R 3.1.2-1 için şunu buldum Rscript:

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

Bu nedenle, bunun gibi bir şey yerine, #! /sw/bin/Rscriptsenaryomun üstünde aşağıdakileri kullanmam gerekiyordu.

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

locate RscriptSize yardımcı olabilir.


OP'nin hangi platforma (* nix veya Mac OS) atıfta bulunduğu belirsiz olduğundan, bu cevap potansiyel olarak yararlıdır. Biraz yeniden çalışarak (kodu biçimlendirmeye bakın ve özür dileyen başlangıcı kaldırın), bu, buradaki yanıtlara iyi bir katkı olacaktır.
BenBarnes

2
Bu, komut dosyalarında #!/usr/bin/env Rscriptsabit kodlanmış bir yol yerine kullanmak için başka bir nedendir R(ve bu uzun yolu sizin için ekleyin $PATH)
michael

0

Python'un rpy2 modülünü kullanmak isteyebilirsiniz. Ancak, bunu yapmanın "doğru" yolu R CMD BATCH ile yapılır. STDOUT'a yazmak için bunu değiştirebilirsiniz, ancak varsayılan değer bir .Rout dosyasına yazmaktır. Aşağıdaki örneğe bakın:

[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

Not: Tüm başlangıç ​​sorunlarını kaldırmak için --vanilla ve diğer seçenekleri denemek isteyeceksiniz.


0

Komut satırında hızlı R betikleri yazmak için smallR'yi deneyin:

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

( rdizindeki komut)

SmallR kullanarak komut satırından çizim şu şekilde görünür:

r -p file.txt

2
Bundan ziyade (ölü gibi görünen), littlerkesinlikle tercih edilir (çünkü hala yaşıyor); veya Rscript(aslında littleroluşturulduktan sonra ortaya çıkan ) kullanın
michael

-1

Aşağıdakiler benim için Windows'ta MSYS bash kullanarak çalışıyor - Linux kutumda R yok, bu yüzden orada deneyemiyorum. İki dosyaya ihtiyacınız var - birincisi runr, R'yi bir dosya parametresiyle çalıştırı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

Bunu chmod + x runr ile çalıştırılabilir yapmanız gerekir .

Ardından komut dosyanızda:

#!runr
# some R commands
x = 1
x

#! komutu nasıl kullandığınıza, PATH değişkeninizin nasıl ayarlandığına vb. bağlı olarak runr satırının runr'ye giden tam yolu içermesi gerekebilir.

Hoş değil ama işe yarıyor gibi görünüyor!


1
Peki ya farklı parametrelere ihtiyaç duyan farklı R betikleri? Komut satırından R betiklerine argümanlar iletmeye ne dersiniz?
blahdiblah
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.