2014-11-02 51 views
2

借此简单的Python脚本例如:捕获和处理输出来自R

#!/usr/bin/env python3 

# /tmp/xxx.py 

import time 

for i in range(1000): 
    print(i) 
    time.sleep(1) 

它连续地输出的数字。我可以这样从R调用它:

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

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

+0

任何意见我的答案,将不胜感激。你知道SO的工作原理......我花了近一个小时。 – flodel 2014-11-12 14:03:15

回答

1

不是专家,但我有一些工作。

首先,我用下面的/tmp/xxx.R可执行RSCRIPT而不是你的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) 

其中一些从该启发:https://stackoverflow.com/a/5561188/1201032

希望它回答你的问题。

+0

对不起,我迟迟没有回应,我随意想出了这个问题,然后忘了它,你知道,这些事情发生了。这在Linux和osx上运行得非常好。可能不会在Windows上工作? – qed 2014-11-12 14:23:52

+0

可能不是,确实如此。感谢您的投票。 – flodel 2014-11-12 14:26:39

+0

非常感谢您的指示,我学到了很多东西。 – qed 2014-11-12 14:37:45