2011-09-03 11 views
8

在R控制檯中工作時,我想設置一個後臺任務來監視特定的連接,並在事件發生時執行另一個函數(警報)。另外,我可以進行設置,以便外部函數只是向R發送一個警報,但這似乎是同樣的問題:有必要設置一個偵聽器。R控制檯是否可以支持後臺任務或中斷(事件處理)?

我可以在R的專用工藝做到這一點,但我不知道這是可行的,從一個控制檯中。另外,如果它正在計算一個函數,我不打算中斷R,但是如果控制檯僅僅是等待輸入,就會提醒或中斷。

這裏有三個用例:

  1. 最簡單的例子是看文件。假設我有一個名爲「latestData.csv」的文件,我想監視它的更改;當它改變時,執行myAlert()。 (可以擴展它做不同的事情,但只是彈出一個文件已經改變的說明是有用的。)

  2. 一種不同類型的監視器會監視給定的機器是否在RAM上運行低並且可能執行save.image()並終止。再次,這可能是一個簡單的問題,觀看由外部監視器產生的文件,該文件可以保存top或其他命令的輸出。

  3. 一個不同的例子是像另一個最近SO問題,約:have R halt the EC2 machine it's running on。如果來自另一臺機器或進程的警報告訴程序保存終止,則能夠聽取該警報會很好。

此刻,我懷疑有處理這兩種方式:通過Rserve並可能通過fork。如果有人有例子說明如何使用包或者通過其他方法來做到這一點,那就太好了。我認爲解決這三個用例中的任何一個都可以解決所有這些問題,以一些外部代碼爲模。


注1:我知道,per this answer to another SO question R是單線程的,這就是爲什麼我懷疑fork和Rserve可能工作。但是,如果與R終端連接,我不確定可行性。儘管R的REPL被連接到控制檯的輸入,但我試圖繞過這個或者模仿它,這就是forkRserve可能的答案。

注2:對於那些熟悉事件處理/事件的方法,這將解決一切,太。我只是沒有發現這事在R.


更新1:我發現,手冊編寫R附加has a section referencing event handling,其中提到使用R_PolledEvents。這看起來有希望。

回答

3

這取決於你是否要中斷空轉或工作R.如果第一個,你能想到的一些事件偵聽器將排隊進入的事件,並評估他們繞過R默認值REPL循環。常用選項是使用tcl/tk或gtk循環;在我的triggr包中,我在libev中做了這樣的事情,這使R摘要請求來自套接字。

後一種情況大多是沒有希望的,除非你手動進行計算代碼定期執行if(evenOccured) processIt代碼。

多線程是不是一個真正的選擇,因爲你知道在一個進程中的兩名口譯將使用相同的全局變量,而派生的進程將有獨立的內存內容突破自己。

+0

你能澄清你的第二段嗎?我很高興能夠定期檢查一個狀態。對於tcl/tk和gtk的建議+1。我一定會看'triggr',看看我能否適應它或想法。 – Iterator

+0

我看了'triggr',但我想我需要看看tcl/tk或gtk方法,正如你所建議的那樣。 – Iterator

0

幾個想法:

  1. 運行R.從另一種語言的腳本中(這是可能的,例如,在使用RSPerl的Perl),並使用包裝腳本來啓動監聽器。

  2. 另一種選擇是從R內部運行外部(非R)命令(使用system()),該命令將在後臺啓動監聽器。

  3. 在後臺以批處理模式運行R 之前啓動R或在單獨的窗口中。

    例如:

    ř--no保存< listener.R> output.out &

    偵聽當事件發生時可以發送電子郵件approraite。

1

事實證明,在封裝Rdsm支持這一點。

有了這個包,一個可設置的R不同的實例之間的服務器/客戶端的關係,各是一個基本的R端子,並且服務器可以發送消息,其中包括的功能,給客戶端。

轉化到我所描述的使用情況下,服務器進程可以做任何的監控是必要的,然後將消息發送到客戶端。不幸的是,文檔有點簡潔,但功能似乎很簡單。

如果服務器進程,也就是說,監測定期的連接(文件,管道,網址等),遇到一個觸發器,它可以發送一條消息給客戶端。

雖然包的主要目的是共享內存(這是我碰到它怎麼來的),這個消息非常有效用於其他用途,太。


更新1:當然對於消息傳遞,不能忽略MPI和Rmpi包。這可能會訣竅,但Rdsm包啓動/使用R控制檯,這是我想要的接口類型。我還不確定什麼Rmpi支持。

9

還有一個選項是svSocket package。它是非阻塞的。

下面是一個8 minute video使用它,它具有超過3000的意見。它演示瞭如何將R會話轉換爲服務器以及如何向其發送命令並接收數據。即使在服務器繁忙的情況下,也可以證明這一點。例如,假設你開始一個長時間運行的進程並忘記保存中間結果,你可以連接到服務器並從結果中獲取結果(在結束之前)。

+0

+1謝謝!它看起來就是我正在尋找的東西。我想知道我以前是否使用過它,因爲它的行爲看起來像我想的那樣。我會給它一個旋轉,看看它是否成功。 – Iterator

相關問題