2016-04-03 62 views
0

我寫的R函數在EC2實例上運行時導致我遇到問題。它使用tcltk2包創建進度條來監視功能進度。什麼工作以及在桌面實例在EC2上返回以下錯誤:R tcltk2虛擬機上的進度條錯誤(AWS EC2實例)

Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : 
    [tcl] invalid command name "toplevel". 
In addition: Warning message: 
In fun(libname, pkgname) : couldn't connect to display ":0" 

我想這個問題是EC2沒有「顯示」,因此不知道如何處理進度條窗口彈出。我想知道是否有辦法解決這個問題,而不必完全禁用進度條。

+0

好的,如果沒有顯示,那麼你想在哪裏顯示進度條? – helloV

+0

我想在桌面實例上啓用tcltk,並在服務器實例上禁用它。 –

回答

1

如果您不需要與顯示屏上的任何內容進行交互,但只需讓應用程序代碼顯示其進度欄,最簡單的方法就是在EC2實例上放置一個無頭X服務器(可能爲Xvfb)。這將允許Tcl端的Tk包自行初始化,而這又會使事情在R端工作。否則,如果您通過ssh訪問EC2實例,則可以使用X轉發來允許進度條在本地系統上運行。顯然,爲了實現這個目標,你需要運行一個本地的X服務器,這在某些平臺上很容易,而在其他平臺上很容易,而且在其他地方必須有更好的回答。您可能也可以通過VNCRemote Desktop獲得此工作,但我與他們合作的經驗較少。

如果這些都不起作用,並且GUI部分實際上只是一個進度條和其他雜項位,則必須進入並編輯代碼以擺脫GUI部分。這是你可以在本地工作的東西。第一步可能是禁用加載tcltk包(找到library("tcltk")並將其刪除),然後通過並修復(可能通過策略刪除)所有打破的部分。希望這不會太多!還要記住,你可能很幸運,發現你正在使用的代碼只是一個GUI包裝器,只是設置參數並提供監控;對於無頭工作,您可以不進行監控,也可以將「I'm not dead yet」消息打印到控制檯。

+0

謝謝你的幫助Donal!問題是這個函數是我的軟件包「bdrift」的基石,在執行時它不應該需要最終用戶的進一步關注。 我知道許多軟件包用戶都在EC2上的標準Rstudio服務器上,或者使用閃亮的軟件,而且我希望無論如何都能部署軟件包。 我可能會在下一個軟件包版本中刪除進度條,因爲它沒有真正達到目的 - 除了看起來很漂亮:P 但是,無論如何,也許我會創建分支,只有我會使用並嘗試您的建議。 –