2014-11-02 86 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