Я пытаюсь разработать графический интерфейс (используя gWidgets) для пакета R. Мой план состоял в том, чтобы создать главное окно, содержащее данные, и с кнопками, вызывающими небольшие графические оболочки для каждой функции. К сожалению, я застрял на основной(?) проблеме - я не знаю, как передать данные.
Вопросы:
- Как правильно отправлять данные между отдельными окнами?
- Как отправить данные из обработчика в другое окно?
Моя проблема похожа на: Загрузка и сохранение переменных в R с помощью gWidgets, но из того, что я читал, использование .GlobalEnv не рекомендуется.
Я также видел, как кто-то использовал оператор ‹‹-: http://www.mail-archive.com/[email protected]/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
}