我试图建立一个GUI(使用gWidgets)有关R包。 我的计划是建立一个主窗口中保存数据,并用按钮调用每个函数小贵的包装。 不幸的是,我被困在一个基本问题(?) - 我不知道如何将数据传输。
Questons:
- 如何单独的窗口之间正确地发送数据?
- 如何从另一个窗口中处理程序中发送的数据?
我的问题是相似的: 加载并与gWidgets r保存变量 ,但是从我已阅读使用.GlobalEnv不推荐。
我也看到有人使用<< -运营商: http://www.mail-archive.com/r-sig-gui@r-project.org/msg00053.html ,但我不能正确地再现它(和它不会与我的工作,例如,我认为)。
下面是一个简单的例子,当我尝试将文本发送到另一个窗口,然后再返回如果按下了按钮。 我曾尝试与处理器中的回报,但不起作用(也不知道是否是允许的)。 子窗口立即在函数的末尾返回其值,前处理程序/内功能可以对数据起作用。 我不知道如何从处理器到主窗口伸手。
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
}