¿Cómo devolver valores desde gWidgets y manejadores?

Estoy tratando de desarrollar una GUI (usando gWidgets) para un paquete R. Mi plan era construir una ventana principal que contenga los datos, y con botones que llamen envoltorios de gui pequeños para cada función. Desafortunadamente, estoy atascado en un problema básico (?), No sé cómo transferir los datos.

Questons:

¿Cómo enviar correctamente los datos entre ventanas separadas?¿Cómo enviar datos desde un manejador en otra ventana?

Mi problema es similar a:Cargar y guardar variables en R con gWidgets, pero de lo que he leído no se recomienda el uso de .GlobalEnv.

También he visto a alguien usando el operador << -:http://www.mail-archive.com/[email protected]/msg00053.html, pero no puedo reproducirlo correctamente (y creo que no funcionará con mi ejemplo).

A continuación se muestra un ejemplo sencillo, en el que trato de enviar un texto a otra ventana y viceversa si se presiona el botón. He intentado con el retorno dentro del controlador, pero eso no funciona (tampoco estoy seguro de si está permitido). La subventana devuelve inmediatamente su valor al final de la función, antes de que el controlador / función interna pueda actuar sobre los datos. No sé cómo llegar desde el controlador a la ventana principal.

main <- function(){

  library(gWidgets)
  options(guiToolkit="RGtk2")

  w <- gwindow(title="Main window",
               visible=FALSE)

  txt <- gtext(text="Initial text in main window.",
               container=w)

  btn <- gbutton("Send to sub window", container=w)

  addHandlerChanged(btn, handler = function(h, ...) {
    shouldbenew <- subwindow(svalue(txt))
    svalue(txt) <- paste("The sub window immediately returns 'TRUE', before pushing 'Return to main':", shouldbenew )
  } )

  visible(w) <- TRUE

}

subwindow<- function(text){

  library(gWidgets)
  options(guiToolkit="RGtk2")

  sw <- gwindow(title="Sub window",
                visible=FALSE)

  editedtxt <- gtext(text=paste(text, "- Text is transferred to the sub window, but I don't know how to send it back to the main window"),
                     container=sw)

  btn <- gbutton("Send to main window", container=sw)

  addHandlerChanged(btn, handler = function(h, ...) {
    newtxt <- svalue(editedtxt)
    return(newtxt)

  } )

  visible(sw) <- TRUE

}

Actualizar: Aquí está la solución que escogí como el camino a seguir (como lo sugirió jverzani), ilustrada con el ejemplo anterior. Espero haber entendido correctamente la solución sugerida y haberla implementado de una manera "agradable", idealmente aceptada en CRAN.

Para resumir, creé un nuevo entorno dentro del entorno de la ventana principal. Edité la ventana secundaria para tomar el entorno de la llamada. Presionando el botón en la sub ventana.assign El texto editado al entorno pasado. Cuando se cierra la ventana secundaria y se enfoca la ventana principal, se puede acceder al texto editado desde el entorno usandoget.

main <- function(){

  library(gWidgets)
  options(guiToolkit="RGtk2")
  # Create a new environment for passing data.
  .mainGlobal <- new.env()

  w <- gwindow(title="Main window", visible=FALSE)

  txt <- gtext(text="Initial text in main window.",
               container=w)

  btn <- gbutton("Send to sub window", container=w)

  addHandlerChanged(btn, handler = function(h, ...) {
    # Call sub widget passing text and environment.
    subwindow(text=svalue(txt), env=.mainGlobal)
  } )

  visible(w) <- TRUE

  addHandlerFocus(w, handler = function (h, ...) {

    if(exists("myText", envir=.mainGlobal)){
      # Retrieve text and update.
      svalue(txt) <- get("myText", envir=.mainGlobal)
    }    
  })

}

subwindow<- function(text, env=NULL){

  library(gWidgets)
  options(guiToolkit="RGtk2")

  sw <- gwindow(title="Sub window", visible=FALSE)

  editedtxt <- gtext(text=text, container=sw)

  btn <- gbutton("Send to main window", container=sw)

  addHandlerChanged(btn, handler = function(h, ...) {
    newtxt <- svalue(editedtxt)
    assign("myText", newtxt, envir=env)
  } )

  visible(sw) <- TRUE

}

Respuestas a la pregunta(3)

Su respuesta a la pregunta