2011-01-24 112 views
16

我有一個程序監視某些文件以進行更改。只要文件被更新,文件就會被處理。到目前爲止,我已經提出了在R中實施「實時分析」的一般方法。我希望你們有其他方法。也許我們可以討論他們的優點/缺點。實時監控文件更改

monitor <- TRUE 
start.state <- file.info$mtime # modification time of the file when initiating 

while(monitor) { 
    change.state <- file.info$mtime 
    if(start.state < change.state) { 
    #process 
    } else { 
    print("Nothing new.") 
    } 
    Sys.sleep(sleep.time) 
} 
+0

一般來說,這可能沒什麼問題,但它會使R事件循環直到殺死while循環。它不會在後臺運行,例如,讓您繼續工作。如果你可以讓程序繼續運行,那很好,但我喜歡下面提供的cron job RScript答案。 – 2011-01-24 12:09:00

+2

你不能在任何更新文件中打電話來運行R腳本嗎? – James 2011-01-24 13:03:17

+0

@詹姆斯,這可能是可行的,但我將不得不檢查。 – 2011-01-24 16:36:00

回答

7

與使用系統API的建議類似,這也可以使用qtbase(https://r-forge.r-project.org/R/?group_id=454)來完成,它將是一個跨平臺從R內部表示:

dir_to_watch <- "/tmp" 

library(qtbase) 
fsw <- Qt$QFileSystemWatcher() 
fsw$addPath(dir_to_watch) 

id <- qconnect(fsw, "directoryChanged", function(path) { 
    message(sprintf("directory %s has changed", path)) 
}) 

cat("abc", file="/tmp/deleteme.txt") 
6

如果您的系統提供了用於監視文件系統更改的API,那麼您應該使用它。我相信Mac帶着這個來。不知道其他平臺。

編輯: 快速goog遞給我:

的Linux - http://wiki.linuxquestions.org/wiki/FAM

的Win32 - http://msdn.microsoft.com/en-us/library/aa364417(VS.85).aspx

顯然,這些API將消除您所需要的任何投票。另一方面,它們可能並不總是可用的。

Java有這個:http://jnotify.sourceforge.net/http://java.sun.com/developer/technicalArticles/javase/nio/#6

6

我心裏有一個黑客:你可以設置一個cron作業/計劃任務運行[R腳本每ñ秒(或其他)。 R腳本檢查文件散列,如果散列不匹配,則運行分析。您可以使用digest::digest功能,只需查看手冊。

3

如果你有很多想要監視的文件,那麼爲此目的R可能會太慢。轉到c:/目錄並查看需要多長時間才能完成file.info(dir(recursive = TRUE))。 dos或bash腳本可能會更快。

否則,代碼看起來很好。

3

您可以使用tclTask​​Schedule功能在tcltk2包設置一個檢查更新並運行你的代碼的功能。然後這將定期運行(您設置時間),但仍然允許您使用您的R會話。