2011-01-24 38 views
16

Tôi có một chương trình giám sát các tệp nhất định để thay đổi. Ngay khi tệp được cập nhật, tệp được xử lý. Cho đến nay tôi đã đưa ra cách tiếp cận chung này về phân tích "phân tích thời gian thực" trong R. Tôi hy vọng các bạn có cách tiếp cận khác. Có lẽ chúng ta có thể thảo luận về ưu điểm/nhược điểm của chúng.theo dõi các thay đổi trong (các) tệp trong thời gian thực

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

Nói chung, điều này có thể là tốt, nhưng nó sẽ hog vòng lặp sự kiện R cho đến khi bạn giết vòng lặp while. Nó sẽ không chạy trong nền, ví dụ, cho phép bạn để có được về với công việc. Đó là tốt nếu bạn có thể để lại quá trình chạy, nhưng tôi thích câu trả lời cron công việc cron cung cấp dưới đây. –

+2

Bạn có thể không thực hiện cuộc gọi để chạy tập lệnh R trong bất kỳ nội dung nào đang cập nhật tệp không? – James

+0

@ James, có thể là doable, nhưng tôi sẽ phải kiểm tra. –

Trả lời

7

Tương tự như đề xuất sử dụng API hệ thống, điều này cũng có thể được thực hiện bằng qtbase (https://r-forge.r-project.org/R/?group_id=454), đây sẽ là nền tảng đa nền tảng có nghĩa là từ trong 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

Nếu hệ thống của bạn cung cấp API để theo dõi thay đổi hệ thống tệp thì bạn nên sử dụng. Tôi tin rằng Mac đi kèm với điều này. Không chắc chắn về các nền tảng khác mặc dù.

Edit: Một goog nhanh chóng đưa cho tôi:

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

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

Rõ ràng, các API này sẽ loại bỏ bất kỳ bỏ phiếu mà bạn yêu cầu. Mặt khác, chúng có thể không luôn luôn có sẵn.

Java có này: http://jnotify.sourceforge.net/http://java.sun.com/developer/technicalArticles/javase/nio/#6

+4

Trên Linux, 'gamin' và' inotify' có thể thực hiện thủ thuật. http://www.noah.org/wiki/FAM,_Gamin,_inotify – aL3xa

+0

Những trang này có vẻ mới hơn và được hỗ trợ tốt hơn. Cảm ơn aL3xa. – jetru

+1

'git status --porcelain' cũng kiểm tra băm để xem tệp nào đã bị thay đổi, với đầu ra ở dạng có thể phân tích cú pháp bằng tập lệnh. Bạn sẽ cần phải thiết lập các tập tin để họ được theo dõi bởi git mặc dù. –

6

Tôi có một hack ý: bạn có thể thiết lập một cron công việc/nhiệm vụ theo lịch trình để chạy kịch bản R mỗi n giây (hoặc bất kỳ). Kịch bản lệnh R kiểm tra băm tệp và nếu băm không khớp, hãy chạy phân tích. Bạn có thể sử dụng chức năng digest::digest, chỉ cần xem hướng dẫn sử dụng.

3

Nếu bạn có nhiều tệp mà bạn muốn theo dõi, thì R có thể quá chậm cho mục đích này. Truy cập vào số c: hoặc / dir của bạn và xem phải mất bao lâu để thực hiện file.info(dir(recursive = TRUE)). Tập lệnh dos hoặc bash có thể nhanh hơn.

Nếu không, mã sẽ ổn.

+0

Tôi luôn luôn có R trong tâm trí, đó là vấn đề ... =) Bash script có thể kiểm tra các tập tin băm và chạy kịch bản R nếu cần thiết. Đó chắc chắn là một giải pháp tốt hơn. – aL3xa

+0

Tôi sẽ chỉ giám sát một vài tệp. –

3

Bạn có thể sử dụng chức năng tclTaskSchedule trong gói tcltk2 để thiết lập chức năng kiểm tra cập nhật và chạy mã của bạn. Điều này sau đó sẽ được chạy một cách thường xuyên (bạn đặt thời gian) nhưng vẫn sẽ cho phép bạn sử dụng phiên R của bạn.

Các vấn đề liên quan