2010-04-21 6 views
6

Sto creando una GUI in R utilizzando gWidgets (in particolare gWidgetstcltk). Mi piacerebbe sapere come aggiornare i contenuti dei widget di selezione, come ad esempio gdroplist e gtable. Al momento ho un metodo piuttosto abile di eliminare il widget e ricrearlo. Sono sicuro che c'è un modo migliore.Come si aggiorna il contenuto di un R gWidget?

Questo semplice esempio mostra tutte le variabili nell'ambiente globale.

library(gWidgets) 
library(gWidgetstcltk) 

create.widgets <- function() 
{ 
    grp <- ggroup(container = win) 
    ddl <- gdroplist(ls(envir = globalenv()), 
    container = grp) 
    refresh <- gimage("refresh", 
    dirname = "stock", 
    container = grp, 
    handler = function(h, ...) 
    { 
     if(exists("grp") && !is.null(grp)) 
     { 
     delete(win, grp) 
     } 
     create.widgets() 
    } 
) 
} 

win <- gwindow() 
create.widgets() 

risposta

2

AFAIK quegli eventi di aggiornamento sono spesso di proprietà del gestore di finestre, quindi questo può essere difficile.

+0

In tal caso, quanto in basso devo andare per ottenere l'accesso a questo tipo di funzionalità? I pacchetti 'tcltk' /' tcltk2' faranno il trucco? È possibile accedere direttamente al window manager da R? –

+0

Ok, sto ammettendo la sconfitta su questo. –

+1

Non esiste una cosa come la sconfitta - ma per questo potrebbe essere necessario rinunciare a _portability_ in quanto dipende dal gestore di finestre. Un possibile raggio di speranza potrebbe essere il legame con Qt a cui Deepayan e Michael hanno lavorato. Un giorno questi potrebbero migrare da R-Forge a CRAN e offrirti un'alternativa. –

4

Ho parlato con John Verzani, creatore dei pacchetti gWidgets * e la risposta è incredibilmente semplice (anche se non del tutto intuitiva). Si accede ai contenuti dei widget di tipo elenco con widget_name[].

library(gWidgets) 
library(gWidgetstcltk) 

get_list_content <- function() ls(envir = globalenv()) # or whatever 

win <- gwindow() 
grp <- ggroup(container = win) 
ddl <- gdroplist(get_list_content(), container = grp) 
refresh <- gimage("refresh", 
    dirname = "stock", 
    container = grp, 
    handler = function(h, ...) ddl[] <- get_list_content() 
) 

Si noti che esistono alcune restrizioni: gli elenchi dei pulsanti di opzione devono rimanere della stessa lunghezza.

win <- gwindow() 
rb <- gradio(1:10, cont = win) 
rb[] <- 2:11  # OK 
rb[] <- 1:5  # Throws an error; can't change length. 
1

Mentre il titolo della domanda è ambiguo se il parlare di forzare l'aggiornamento visivo o semplicemente modificarne il contenuto, Recentemente ho avuto problema simile con l'aggiornamento gstatusbar prima e dopo l'operazione lunga. Mentre esiste un'alternativa a REPL denominata REventLoop, ho trovato abbastanza utile l'utilizzo del timer tcl.

tcl("after", 300, my_long_operation) 

Così ho aggiornare gstatusbar prima operazione lunga, quindi impostare il timer che in meno di un secondo scatta la mia funzione che prende un po ', e alla fine di quella funzione aggiorno gstatusbar usando qualcosa come

svalue(sb) <- "Ready" 
Problemi correlati