Sto creando una GUI in R utilizzando gWidgets. Fino ad ora ho passato i valori da una finestra all'altra attraverso l'ambiente globale. L'utilizzo dell'ambiente globale è semplice da implementare ma non ideale. Un problema è che R CMD check
si lamenta della mancanza di collegamenti visibili per le variabili globali.Uso delle classi di riferimento R per passare valori da una finestra all'altra in una GUI
Come soluzione a questo problema, le classi di riferimento sono state citate da diversi programmatori R. Ma per capire come funzionano le classi di riferimento in questo contesto, sarebbe davvero utile avere un semplice esempio.
Lasciami dare un'interfaccia grafica stupida con cui lavorare. Quando l'utente preme il pulsante della prima finestra, inserisce il modello m
nell'ambiente globale. Il secondo pulsante riceve m
dall'ambiente globale e fornisce un'uscita. Quando si preme di nuovo il primo pulsante, si crea un nuovo modello m
e si modifica l'output del secondo pulsante. Se chiudi la prima finestra, il pulsante nella seconda finestra funzionerà ancora, perché m
si trova nell'ambiente globale.
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)
Come utilizzare le classi di riferimento in questo esempio?
Grande esempio. Il codice fornisce un avvertimento: In .checkFieldsInMethod (def, fieldNames, allMethods): L'assegnazione locale al nome campo non cambierà il campo: modelData <- data.frame (x = runif (10), y = runif (10)); visible (win1) <- TRUE; visible (win2) <- TRUE Intendevi usare "<< -"? (nel metodo "inizializza" per la classe "SillyGui") – JacobVanEtten
@JacobVanEtten Grazie. Ho corretto la riga 'modelData <-'. Le righe 'visible <-' dovrebbero essere assegnate localmente. Termina la chiamata a 'setRefClass' in' sopprimi avvisi 'se ti infastidisce. –
Grazie! Anche se seguirò prima il suggerimento di John, è bello avere questo esempio online. – JacobVanEtten