mutate - Piping stdin a R
in r (3)
Esto es lo más fácil que he found (asumiendo una entrada numérica):
x <- scan(file="stdin", quiet=TRUE)
Puedes probarlo 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
Estoy teniendo problemas para canalizar stdin a un script R
Aquí está mi test.R
script de test.R
:
#!/usr/bin/env Rscript
while(length(line <- readLines(''stdin'', n=1, warn=FALSE)) > 0) {
write(line, stderr())
# process line
}
Me gustaría pasar por cada línea y hacer un poco de procesamiento. Aquí está mi archivo de input
llamado input
:
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
ffffff
Si lo hago
cat input | test.R
Solo me sale
aaaaaa
¿Hay algo que me perdí?
Esto no sucede si abres explícitamente la conexión estándar.
#!/usr/bin/env Rscript
f <- file("stdin")
open(f)
while(length(line <- readLines(f,n=1)) > 0) {
write(line, stderr())
# process line
}
Jeff y yo escribimos littler para hacer solo esto (y algunas otras cosas). Debido a littler , nunca miré de cerca a Rscript, pero en principio esto debería funcionar bien.
Aquí está uno de nuestros primeros ejemplos, utilizando la salida de /bin/ls
(y un filtro rápido por awk
) para resumir el tamaño del archivo:
edd@max:~/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
edd@max:~/svn/littler/examples$
Aquí el script fsizes.r
es solo tres líneas:
edd@max:~/svn/littler/examples$ cat fsizes.r
#!/usr/bin/r -i
fsizes <- as.integer(readLines())
print(summary(fsizes))
stem(fsizes)
edd@max:~/svn/littler/examples$