Ответ 1
Это не происходит, если вы явно открываете соединение stdin.
#!/usr/bin/env Rscript
f <- file("stdin")
open(f)
while(length(line <- readLines(f,n=1)) > 0) {
write(line, stderr())
# process line
}
У меня возникли проблемы с подключением stdin к R script.
Вот моя игрушка script test.R
:
#!/usr/bin/env Rscript
while(length(line <- readLines('stdin', n=1, warn=FALSE)) > 0) {
write(line, stderr())
# process line
}
Я бы хотел пройти через каждую строку и выполнить некоторую обработку. Вот мой входной файл с именем input
:
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
ffffff
Если я делаю
cat input | test.R
Я получаю только:
aaaaaa
Есть ли что-то, что я пропустил?
Это не происходит, если вы явно открываете соединение stdin.
#!/usr/bin/env Rscript
f <- file("stdin")
open(f)
while(length(line <- readLines(f,n=1)) > 0) {
write(line, stderr())
# process line
}
Джефф и я написал littler, чтобы сделать это (и несколько других вещей). Из-за littler я никогда не смотрел так близко к Rscript, но это должно в принципе работать нормально.
Вот один из наших ранних примеров, используя вывод /bin/ls
(и быстрый фильтр awk
) для суммирования размера файла:
[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$
Здесь script fsizes.r
- всего три строки:
[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$
Это самый легкий, который я нашел (при условии ввода цифр):
x <- scan(file="stdin", quiet=TRUE)
вы можете протестировать его с помощью:
$ 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