我使用gWidgets在R中製作GUI。直到現在,我一直通過全球環境將價值從一個窗口傳遞到另一個窗口。使用全球環境很容易實現,但並不理想。一個問題是R CMD check
抱怨缺少全局變量的可見綁定。使用R引用類在GUI中將值從一個窗口傳遞到另一個窗口
作爲這個問題的解決方案,參考類已被幾個R程序員提到。但要理解參考類在這種情況下如何工作,這將有一個簡單的例子。
讓我給一個愚蠢的圖形用戶界面工作。當用戶點擊第一個窗口的按鈕時,它將模型m
置於全局環境中。第二個按鈕從全球環境獲得m
並提供輸出。當您再次點擊第一個按鈕時,它將創建一個新模型m
並更改第二個按鈕的輸出。如果關閉第一個窗口,則第二個窗口中的按鈕仍然有效,因爲m
位於全局環境中。
library(gWidgets)
options(guiToolkit = "tcltk")
h1 <- function(h, ...){
d1 <- data.frame(x=runif(10), y=runif(10))
.GlobalEnv$m <- lm(x ~ y, data=d1)
}
g1 <- gbutton("1. Make model",
container=gwindow(), handler=h1)
h2 <- function(h, ...){
d2 <- data.frame(y=(1:10)/10)
p <- predict(.GlobalEnv$m, newdata=d2)
print(p)
}
g2 <- gbutton("2. Make prediction",
container=gwindow(), handler=h2)
如何在本例中使用引用類?
很好的例子。代碼會給出警告:在.checkFieldsInMethod(def,fieldNames,allMethods)中: 本地賦值給字段名稱不會改變字段: modelData < - data.frame(x = runif(10),y = runif(10) );可見(win1)< - TRUE; visible(win2)< - TRUE 您的意思是使用「<< - 」? (在類「SillyGui」的初始化方法中) – JacobVanEtten
@JacobVanEtten謝謝。我已經修復了'modelData <-'行。 '可見的<-'行應該是本地分配。如果它使你煩惱,將'setRefClass'的調用封裝在'suppressWarnings'中。 –
謝謝!儘管我會首先關注約翰的建議,但在線提供這個例子真是太棒了。 – JacobVanEtten