2012-02-29 101 views
0

快速的問題 - 我在graphics=TRUE中使用R中的menu函數。 對我來說,因爲我在linux上,所以會顯示一個tcltk對話框。 (你知道在你做什麼時install.packages('some_package') R彈出一個窗口,告訴你選擇你想刪除哪個CRAN鏡像?這就是我的意思)。R關閉菜單窗口(tcltk)? (相當於tcltk的graphics.off?)

有時,在我做出選擇後,窗口會拒絕消失或響應任何點擊 - 我可以像平常一樣繼續我的R會話,但這個窗口仍會繼續運行,儘管我努力關閉(通過轉角處的關閉'x'按鈕,或通過對話本身上的'OK'和'Cancel'按鈕)。

有沒有一種方法可以銷燬這個窗口,因爲我沒有處理它? 我正在尋找tcltk的等效graphics.off

此外,我注意到,當使用menu(..,graphics=TRUE)時,我經常會遇到錯誤[tcl] grab failed: window not viewable.,所以這可能是相關的。

歡呼聲。

+0

順便說一下,這種煩惱在我的Ubuntu機器R 2.14上可靠地發生,但不在我的Fedora機器上,並且當'graphcs = TRUE'時這些都使用tcltk接口。 – 2012-02-29 00:41:46

回答

5

只有時會發生的東西很難再現,而且通常是由於缺陷,並且很難在沒有完整的機器規格的情況下弄清楚。不過,我可以可靠地獲得類似的行爲,我能解決這個問題:

> library(tcltk) 
Loading Tcl/Tk interface ... done 
> menu(letters[1:5],graphics=TRUE) 
^C 

通過按Control-C在這一點上,我得到我的[R提示背部和無響應的對話框,這是我沒有在手柄上的。使用它的窗口管理器控件什麼也不做,調整它不會更新窗口。所以...

> tclServiceMode(TRUE) 
[1] FALSE 

然後它醒了。然後,我可以按常規關閉對話框,也可以:

> tkdestroy(".1") 
Error: $ operator is invalid for atomic vectors 

它會拋出一個錯誤,我不明白。 「.1」是窗口路徑,與默認窗口標題相同 - 但如果您在菜單上設置了名稱,則不會。在這種情況下...嗯,可能有一種方法可以從名稱中查找它,但無論如何,一旦將服務模式設置爲TRUE,您可以單擊返回到桌面整潔的方式。

+1

診斷:Tcl/Tk事件循環未被服務。這很關鍵,因爲事件是OS/X11/WM如何與Tk進行通信。 (從技術上講,他們發送文件描述符上的消息,將「事件循環」轉換爲可分派事件。) – 2012-02-29 10:54:46

+0

非常感謝!我確實命名了我的菜單,但我肯定會用'tclServiceMode(TRUE)'得到我自己關閉的窗口。我想知道這個'[tcl]:失敗'意味着什麼(我認爲這是問題的原因),但是我可以可靠地再現它的情況有點奇怪,我需要縮小它們在此之前我可以提問。 – 2012-02-29 10:59:03