Трубопроводный ввод к R - PullRequest
       11

Трубопроводный ввод к R

25 голосов
/ 21 февраля 2012

У меня проблемы с передачей stdin в сценарий R.

Вот мой игрушечный скрипт 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

Есть что-нибудь, что я пропустил?

Ответы [ 3 ]

42 голосов
/ 21 февраля 2012

Этого не происходит, если вы явно открываете соединение stdin.

#!/usr/bin/env Rscript
f <- file("stdin")
open(f)
while(length(line <- readLines(f,n=1)) > 0) {
  write(line, stderr())
  # process line
}
12 голосов
/ 21 февраля 2012

Джефф и я написали littler , чтобы сделать именно это (и несколько других вещей).Из-за littler я никогда не смотрел так пристально на Rscript - но это должно в принципе работать просто отлично.

Вот один из наших ранних примеров, использующих выводиз /bin/ls (и быстрого фильтра по awk) для суммирования размера файла:

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$ 

Здесь сценарий fsizes.r состоит из трех строк:

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$ 
3 голосов
/ 18 августа 2017

Это самое простое, что я нашел (при условии ввода числового значения):

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 
...