Piping stdin a R

Sto avendo problemi a convogliare lo stdin con uno script R.

Ecco il mio test.R script giocattolo. test.R :

 #!/usr/bin/env Rscript while(length(line  0) { write(line, stderr()) # process line } 

Mi piacerebbe passare attraverso ogni riga e fare un po ‘di elaborazione. Ecco il mio input file chiamato input :

 aaaaaa bbbbbb cccccc dddddd eeeeee ffffff 

Se lo faccio

 cat input | test.R 

Ho solo ricevuto:

 aaaaaa 

C’è qualcosa che mi è mancato?

Questo non succede se apri esplicitamente la connessione stdin.

 #!/usr/bin/env Rscript f <- file("stdin") open(f) while(length(line <- readLines(f,n=1)) > 0) { write(line, stderr()) # process line } 

Jeff e io scrivemmo più piccolo per fare solo questo (e alcune altre cose). Per via del più piccolo, non ho mai guardato da vicino a Rscript, ma in linea di principio questo dovrebbe funzionare bene.

Ecco uno dei nostri primi esempi, utilizzando l’output di /bin/ls (e un filtro rapido di awk ) per riepilogare la dimensione del file:

 [email protected]:~/svn/littler/examples$ ls -l /boot/ | \ awk '!/^total/ {print $5}' | ./fsizes.r Min. 1st Qu. Median Mean 3rd Qu. Max. 24 130300 730700 3336000 4527000 14670000 The decimal point is 6 digit(s) to the right of the | 0 | 0000000000000011111111122777777777 2 | 777777777 4 | 555577777 6 | 8 | 10 | 12 | 5 14 | 24466677 [email protected]:~/svn/littler/examples$ 

Qui lo script fsizes.r solo tre righe:

 [email protected]:~/svn/littler/examples$ cat fsizes.r #!/usr/bin/r -i fsizes <- as.integer(readLines()) print(summary(fsizes)) stem(fsizes) [email protected]:~/svn/littler/examples$ 

Questo è il più semplice che ho trovato (assumendo un input numerico):

 x <- scan(file="stdin", quiet=TRUE) 

puoi provarlo con:

 $ echo -e "1\n2\n3" | R --slave -e 'x <- scan(file="stdin", quiet=TRUE); summary(x)' Min. 1st Qu. Median Mean 3rd Qu. Max. 1.0 1.5 2.0 2.0 2.5 3.0