2012-05-13 10 views
5

Ho uno script R che emette VERO o FALSO. In R, viene utilizzato un/F tipo di dati bona fide T, ma quando faccio eco il valore restituito per colpire, sembra essere una stringa, dicendo:Emettere un valore booleano da un Rscript in una variabile Bash

"[1] TRUE"

o

"[1] FALSE"

Entrambi sono preceduti da [1]. Né è [0], non è un errore di battitura. Ad ogni modo, il risultato di questo è ciò che quando provo a testare l'output di questo Rscript per eseguire uno script successivo, devo fare il confronto tra stringhe su "[1] TRUE" come sotto, invece di confrontarlo con "TRUE" o " 1 "che sembra più pulito e migliore.

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

Come posso fare R sia uscita una vera booleana, o Bash accettare la stringa di output e convertirlo in 0/1 per il confronto? Cioè, preferirei prova per ...

if [ $A == TRUE ]; 

di

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

E 'questo possibile, o dovrei essere contento di questo, come è, che funziona?

* UPDATE *

Ecco la versione minimizzato del rscript che genera questo ...

myinput <- TRUE #or FALSE 

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

FunctionName(myinput) 
+2

Cordiali saluti, il [1] sta dicendo questo è il primo elemento di un vettore. Se si stampa un vettore che contiene più di un elemento in modo tale che la stampa si estenda su più di una riga, R stamperà utile [11], [21], [31] ecc. In modo che si sappia (per esempio) la sua stampa 10 valori per riga. Se stampi una matrice, etichetta le righe e le colonne come [, 1] e [1,] per te. – Spacedman

+1

Oltre alle buone soluzioni fornite di seguito, credo che si possa usare q (status = val) in Rscript per dire quale valore viene restituito alla shell da Rscript. Fai attenzione a questo però se lavori con i collaboratori - il valore di ritorno viene spesso utilizzato per codificare i messaggi di errore in modo che possano assumere un valore di ritorno diverso da zero come qualcosa di cui preoccuparsi piuttosto che una semplice risposta. – mweylandt

risposta

9

Invece di utilizzare sia print() o la stampa implicita() - ing che si verifica quando un nome oggetto viene offerto all'interprete R, è necessario utilizzare cat() che non anteponerà "[1]" davanti a TRUE o FALSE. Se si desidera 0/1, quindi utilizzare cat(as.numeric(.)). Prova a modificare:

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

Se avete bisogno che il valore per l'ulteriore elaborazione si potrebbe anche usare questo:

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

Questo ha funzionato perfettamente. Grazie per avermi presentato anche a invisible(). – Mittenchops

0

corto di cambiare ciò che lo script R fa, si può fare una delle seguenti operazioni sul lato bash:

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

o

if [[ $A =~ TRUE ]] 

Nel secondo caso, con la corrispondenza regex, è normalmente raccomandato che il pattern essere messo in una variabile:

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

ma in casi ovviamente semplici come questo non è necessario.

0

È possibile anche definire una funzione in bash che converte l'uscita R in VERO/FALSO:

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

Ora è possibile utilizzarlo come:

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

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

Problemi correlati