2012-05-13 17 views
5

TRUE veya FALSE çıkaran bir R komut dosyası var. R olarak, iyi niyetli bir T/F veri türünü kullanarak, ama ben vurmayı dönüş değerini yankı zaman, diyerek bir dize gibi görünüyor:Bir Rscript'den bir Bash değişkenine bir boolean çıktısı

"[1] TRUE"

veya

"[1] FALSE"

Her ikisi de önce [1]. Hiçbiri [0], bu bir yazım hatası değil. Her neyse, bunun sonucu, bu Rscript'in çıktısını takip eden bir betiği çalıştırmak için test etmeye çalıştığım zaman, "TRUE" ya da "TRUE" ile karşılaştırmak yerine "[1] TRUE" ile dize karşılaştırması yapmak zorunda kaldım. 1 "daha temiz ve daha iyi hisseder.

A=$(Rscript ~/MyR.r) 
echo $A 
if [ "$A" == "[1] TRUE" ]; then 
    bash SecondScript.sh 
fi 

nasıl R ya çıkış gerçek bir Boole veya Bash çıktı dizesini kabul etmek ve karşılaştırma için 0/1 dönüştürmek yapabilir? İşler bu hangi nasıl, için ...

if [ $A == TRUE ]; 

if [ "$A" == "[1] TRUE" ]; 

daha olması mümkün mü, yoksa bu mutlu olmalı doğrusu sınamak istiyorum, nedir?

* GÜNCELLEME *

İşte bu üretir Rscript ait minimalized versiyonu ...

myinput <- TRUE #or FALSE 

FunctionName <- function(test){ 
if (test == TRUE){ 
val <- TRUE 
} else { 
val <- FALSE 
} 
return(val) 
} 

FunctionName(myinput) 
+2

Bilginize, [1] anlatıyor:

r_to_bash() { echo "$1" | cut -d' ' -f2 } 

Şimdi sizin gibi kullanabilirsiniz Bu bir vektörün ilk elemanıdır. Birden fazla elemanı olan bir çıktıyı, çıktıların bir satırdan fazla uzayacağı şekilde yazdırırsanız, R, yazdıracağınız [11], [21], [31] vb. satır başına değerler. Bir matris yazdırırsanız, satırları ve sütunları sizin için [, 1] ve [1,] olarak etiketler. – Spacedman

+1

Aşağıda verilen iyi çözümlere ek olarak, Rscript'den kabuk değerine hangi değerin döndüğünü söylemek için Rscript dosyasındaki q (status = val) değerini kullanabileceğinizi düşünüyorum. Bu konuda dikkatli olun, ancak ortak çalışanlarla çalışıyorsanız, dönüş değeri genellikle hata mesajlarını kodlamak için kullanılır; böylece, değirmen cevabının yalnızca bir koşulu yerine, endişelenmeye değer bir şey olarak sıfır olmayan bir dönüş değeri alabilirler. – mweylandt

cevap

9

yerine print() veya örtülü baskı kullanarak var() - oluştuğunda ing R yorumlayıcısına bir nesne adı sunulduğunda, "[1]" i DOĞRU veya YANLIŞ'ın önüne eklemeyecek olan cat() kullanıyor olmalısınız. 0/1 istiyorsanız, cat(as.numeric(.)) kullanın. Bunun yerine bu deneyin:

sizin R komut ne yaptığını değişen
cat(as.numeric(val)); invisible(val) 
+0

Bu mükemmel bir şekilde çalıştı. Beni görünmez kılındığın için teşekkürler(). – Mittenchops

0

Kısa, sen aşağıdakilerden birini yapabilirsiniz: Eğer daha fazla işlem için bu değeri Gerekirse

myinput <- TRUE #or FALSE 
FunctionName <- function(test){ 
    if (test == TRUE){ 
       val <- TRUE 
        } else { 
       val <- FALSE 
      } 
    cat(as.numeric(val)) 
} 
FunctionName(myinput) 

ayrıca bu kullanabilirsiniz Bash tarafı:

if [[ $A == *TRUE* ]] 

veya

if [[ $A =~ TRUE ]] 
İkinci durumda

normal ifade eşleme ile, normal desen bir değişkende koymak önerilir: gerekli değil

pattern=TRUE 
if [[ $A =~ $pattern ]] 

ama belli ki basit vakalarda

bu gibi.

Ayrıca içine R çıkışını dönüştürür bash bir işlev tanımlayabilirsiniz
0

YANLIŞ/DOĞRU:

A=$(r_to_bash "$A") 
if [ $A == TRUE ]; 
+0

Veya 'r_to_bash() {echo" $ {1 # *} "; } ' –

İlgili konular