2012-05-13 5 views
5

Ich habe ein R-Skript, das TRUE oder FALSE ausgibt. In R, ist es mit einem bona fide T/F-Datentyp, aber wenn ich den Rückgabewert Echo einzuschlagen, so scheint es, eine Zeichenfolge zu sein, zu sagen:Ausgabe eines Boolean von einem Rscript in eine Bash-Variable

"[1] TRUE"

oder

"[1] FALSE"

Sie sind beide von [1] vorangegangen. Weder ist [0], das ist kein Tippfehler. Wie auch immer, das Ergebnis davon ist, dass, wenn ich versuche, die Ausgabe dieses Rscript zu testen, um ein nachfolgendes Skript auszuführen, ich String-Vergleich zu "[1] TRUE" wie folgt machen muss, anstatt mit "TRUE" oder " 1 "das fühlt sich sauberer und besser an.

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

Wie kann ich R entweder Ausgang ein true Boolean oder Bash die Ausgabezeichenfolge akzeptieren und zu 0/1 zum Vergleich konvertieren? Das heißt, ich würde lieber testen ...

if [ $A == TRUE ]; 

als

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

Ist das möglich, oder soll ich mit diesem glücklich sein, wie es ist, das funktioniert?

* UPDATE *

Hier ist die minimalisierte Version des Rscript, die diese erzeugt ...

myinput <- TRUE #or FALSE 

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

FunctionName(myinput) 
+2

FYI, die [1] ist zu sagen Du bist das erste Element eines Vektors. Wenn Sie einen Vektor drucken, der mehr als ein Element enthält, so dass der Ausdruck sich über mehr als eine Zeile erstreckt, druckt R hilfreicherweise [11], [21], [31] usw., so dass Sie zB seine gedruckten 10 kennen Werte pro Zeile. Wenn Sie eine Matrix drucken, beschriftet sie die Zeilen und Spalten als [, 1] und [1,] für Sie. – Spacedman

+1

Zusätzlich zu den guten Lösungen, die unten gegeben werden, glaube ich, dass Sie q (status = val) im Rscript verwenden können, um zu sagen, welcher Wert von Rscript an die Shell zurückgegeben wird. Seien Sie jedoch vorsichtig, wenn Sie mit Mitbearbeitern arbeiten - der Rückgabewert wird oft verwendet, um Fehlermeldungen zu kodieren, so dass sie einen Rückgabewert von ungleich Null annehmen können, den Sie sich lieber merken sollten, als nur eine Antwort aus der Mühle. – mweylandt

Antwort

9

Statt entweder Druck von() oder die implizite print() - ing, das auftritt, Wenn dem R-Interpreter ein Objektname angeboten wird, sollten Sie cat() verwenden, das nicht vor "TRUE" oder "FALSE" dem "[1]" vorangestellt wird. Wenn Sie 0/1 möchten, verwenden Sie cat(as.numeric(.)). Versuchen Sie stattdessen:

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

Wenn Sie diesen Wert für die weitere Verarbeitung benötigt man auch diese verwenden:

cat(as.numeric(val)); invisible(val) 
+0

Das hat perfekt funktioniert. Danke, dass du mich auch mit dem Unsichtbaren() bekannt gemacht hast. – Mittenchops

0

Kurz ändern, was Ihr R Skript tut, Sie eine der folgenden auf das tun können Schlag-Seite:

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

oder

if [[ $A =~ TRUE ]] 

Im zweiten Fall, mit Regex Matching, ist es in der Regel empfohlen, dass das Muster in einer Variablen gesetzt werden:

es ist nicht notwendig,
pattern=TRUE 
if [[ $A =~ $pattern ]] 

aber in offensichtlich einfachen Fällen wie diese.

0

Sie auch eine Funktion in bash definieren können, die die R-Ausgabe in WAHR/FALSCH konvertiert:

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

Jetzt können Sie es mögen:

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

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

Verwandte Themen