捕获并处理来自R的外部命令的输出

捕获并处理来自R的外部命令的输出,r,io,stdout,R,Io,Stdout,以这个简单的python脚本为例: #!/usr/bin/env python3 # /tmp/xxx.py import time for i in range(1000): print(i) time.sleep(1) 它连续输出数字。我可以这样称呼它: system2("/tmp/xxx.py", stdin=?) 其中stdin可以设置为NULL、“、TRUE或文件名。但我正在寻找一种实时处理这些数字的方法。例如,每当从这个python脚本打印一个数字时,我都想

以这个简单的python脚本为例:

#!/usr/bin/env python3

# /tmp/xxx.py

import time

for i in range(1000):
    print(i)
    time.sleep(1)
它连续输出数字。我可以这样称呼它:

system2("/tmp/xxx.py", stdin=?)

其中stdin可以设置为NULL、“、TRUE或文件名。但我正在寻找一种实时处理这些数字的方法。例如,每当从这个python脚本打印一个数字时,我都想将该数字乘以Pi,然后将其打印到控制台。有没有办法在R中做到这一点?

不是专家,但我有办法

首先,我使用了以下
/tmp/xxx.R
可执行Rscript而不是python脚本,因为我发现python正在缓冲其输出(而不是一次打印一行),这使得测试变得很困难:

#!/usr/bin/env Rscript

for (i in 1:5) {
   cat(i, "\n")
   Sys.sleep(1)
}
然后R代码:

system('mkfifo /tmp/xxx.fifo')
f <- fifo("/tmp/xxx.fifo", 'r')
p <- pipe('/tmp/xxx.R > /tmp/xxx.fifo; echo OVER > /tmp/xxx.fifo', 'w')

while(TRUE) {
   line <- readLines(f, n = 1)
   if (length(line) > 0) {
      if (line == "OVER") break
      cat(pi * as.numeric(line), "\n")
   }
   Sys.sleep(0.1)
}
close(f)
close(p)
系统('mkfifo/tmp/xxx.fifo')

如果您对我的回答有任何反馈,我们将不胜感激。你知道这是怎么回事。。。我花了将近一个小时的时间在这上面。很抱歉,我在一个随机的想法中提出了这个问题,然后忘记了,你知道,这些事情发生了。这在Linux和osx上非常有效。可能无法在windows上工作?