gpt4 book ai didi

r - 如何从 gWidgets 和处理程序返回值?

转载 作者:行者123 更新时间:2023-12-04 07:40:01 25 4
gpt4 key购买 nike

我正在尝试为 R 包开发 GUI(使用 gWidgets)。我的计划是构建一个保存数据的主窗口,并使用按钮为每个函数调用小型 gui 包装器。不幸的是,我陷入了一个基本(?)问题——我不知道如何传输数据。

问题:

  • 如何在单独的窗口之间正确发送数据?
  • 如何从另一个窗口的处理程序中发送数据?

  • 我的问题类似于:
    Loading and saving variables in R with gWidgets ,但从我所阅读的内容来看,不推荐使用 .GlobalEnv 。

    我还看到有人使用 <<- 运算符: http://www.mail-archive.com/r-sig-gui@r-project.org/msg00053.html ,但我无法正确复制它(我认为它不适用于我的示例)。

    下面是一个简单的示例,如果按下按钮,我尝试将文本发送到另一个窗口并再次返回。我曾尝试在处理程序中使用 return,但这不起作用(也不确定是否允许)。在处理程序/内部函数可以对数据进行操作之前,子窗口会在函数结束时立即返回其值。我不知道如何从处理程序到达主窗口。
    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

    }

    更新:
    这是我选择作为前进方向的解决方案(如 jverzani 所建议的),使用上面的示例进行了说明。我希望我正确理解了建议的解决方案,并且我以一种“不错”的方式实现了它,在 CRAN 中得到了理想的接受。

    总而言之,我在主窗口环境中创建了一个新环境。我编辑了子窗口以获取通话中的环境。按下子窗口中的按钮 assign将编辑后的文本传递给传递的环境。当子窗口关闭并且主窗口成为焦点时,可以使用 get 从环境中访问已编辑的文本。 .
    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

    }

    最佳答案

    一种更好的方法,但需要对代码进行更大的修改,是将 GUI 存储在引用类中。

    您调用setRefClass带有字段列表(每个小部件一个),并定义创建 GUI 的初始化方法。我通常创建一个函数来包装创建实例的调用。见 setRefClass在代码块的末尾。

    mainGui <- suppressWarnings(setRefClass( #Warnings about local assignment not relevant 
    "mainGui",
    fields = list(
    #widgets
    w = "ANY", #"GWindow"
    txt = "ANY", #"GEdit"
    btn = "ANY" #"GButton"
    ),
    methods = list(
    initialize = function(windowPosition = c(0, 0))
    {
    "Creates the GUI"

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

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

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

    addHandlerChanged(
    btn,
    handler = function(h, ...) {
    subWindow$setText(getText())
    }
    )

    visible(w) <- TRUE
    },
    #other methods to access GUI functionality go here
    getText = function()
    {
    svalue(txt)
    },
    setText = function(newTxt)
    {
    svalue(txt) <- newTxt
    }
    )
    ))

    createMainGui <- function(...)
    {
    invisible(mainGui$new(...))
    }

    关于r - 如何从 gWidgets 和处理程序返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15455692/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com