shell 管道标准至R

xurqigkl  于 2023-02-24  发布在  Shell
关注(0)|答案(3)|浏览(143)

我在将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

有什么我错过的吗?

xienkqul

xienkqul1#

如果显式打开stdin连接,则不会发生这种情况。

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

e3bfsja22#

Jeff和我编写littler就是为了完成这一任务(以及其他一些任务),因为littler,我从来没有仔细研究过Rscript --但原则上讲,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$
vpfxa7rd

vpfxa7rd3#

如果输入的是数字,您可以用途:

x <- scan("stdin")

您可以使用以下工具进行测试:

$ echo -e "1\n2\n3" | R -s -e 'x <- scan("stdin"); summary(x)'
Read 3 items
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    1.0     1.5     2.0     2.0     2.5     3.0

改编自此answer并在R 4.2.2中测试。

相关问题