我正在尝试用gWidgets2做一个输入表单,写下你的名字,选择一个时间段,然后选择一辆车。这些输入值被保存到列表中。数据如下:
list.timeinterval = c("last month", "last year", "Specific Period")
list.vehicle = c("car1", "car2", "car3")这是我的代码:
choose.specs <- function(list.timeinterval, list.vehicle){
library(gWidgets2)
library(gWidgets2tcltk)
options(guiToolkit = "tcltk")
reporter <- NULL
period <- NULL
vehicle <- NULL
w <- gwindow("Choose report specification")
g <- ggroup(horizontal = FALSE, cont = w)
tmp <- gframe("Reporter name", cont = g, expand = TRUE)
rep <- gedit("write your name",
cont = tmp,
handler = function(...)
reporter = svalue(rep))
tmp <- gframe("Choose time intervall", cont = g, expand = TRUE)
per <- gcombobox(list.timeinterval,
label = "Select time period",
editable = FALSE,
cont = tmp,
handler = function(...)
period = svalue(per))
tmp <- gframe("Choose car", cont = g, expand = TRUE)
car <- gcombobox(list.vehicle,
label = "Select car:",
editable = FALSE,
cont = tmp,
handler = function(...)
vehicle = svalue(car))
visible(tmp, set = TRUE)
btn <- gbutton("confirm", cont = g)
addHandlerClicked(btn, handler = function(h,...) {
dispose(w)
})
return(list(reporter,
period,
vehicle))
}
list.specs <- choose.specs(list.timeinterval, list.vehicle)不知何故,它返回一个空列表。如果我没有设置reporter,period and fleet = NULL,它会给出一个错误"object reporter found“。如果我编写此return(list(svalue(rep), svalue(per), svalue(car)))而不是return(list(reporter, period, vehicle)),它将返回默认值
[[1]]
[1] "write your name"
[[2]]
[1] "last month"
[[3]]
[1] "car1"如何返回此输入值?
编辑:我对@jverzani建议的解决方案的解释如下:
choose.specs <- function(list.timeinterval, list.vehicle){
library(gWidgets2)
library(gWidgets2tcltk)
options(guiToolkit = "tcltk")
reporter <- NULL
period <- NULL
fleets <- NULL
e <- new.env()
e$reporter <- reporter
e$period <- period
e$fleets <- fleets
w <- gwindow("Choose report specification")
g <- ggroup(horizontal = FALSE, cont = w)
tmp <- gframe("Reporter name", cont = g, expand = TRUE)
rep <- gedit("write your name",
cont = tmp,
handler = function(...)
e$reporter <- svalue(rep))
tmp <- gframe("Choose time intervall", cont = g, expand = TRUE)
per <- gcombobox(list.timeinterval,
label = "Select time period",
editable = FALSE,
cont = tmp,
handler = function(...)
e$period <- svalue(per))
tmp <- gframe("Choose car", cont = g, expand = TRUE)
car <- gcombobox(list.vehicle,
label = "Select car:",
editable = FALSE,
cont = tmp,
handler = function(...)
e$fleets <- svalue(car))
visible(tmp, set = TRUE)
btn <- gbutton("confirm", cont = g)
addHandlerClicked(btn, handler = function(h,...) {
dispose(w)
})
return(list(e$reporter,
e$period,
e$vehicle))
}和/或:
choose.specs <- function(list.timeinterval, list.vehicle){
library(gWidgets2)
library(gWidgets2tcltk)
options(guiToolkit = "tcltk")
reporter <- NULL
period <- NULL
vehicle <- NULL
w <- gwindow("Choose report specification")
g <- ggroup(horizontal = FALSE, cont = w)
tmp <- gframe("Reporter name", cont = g, expand = TRUE)
rep <- gedit("write your name",
cont = tmp,
handler = function(...)
reporter <<- svalue(rep))
tmp <- gframe("Choose time intervall", cont = g, expand = TRUE)
per <- gcombobox(list.timeinterval,
label = "Select time period",
editable = FALSE,
cont = tmp,
handler = function(...)
period <<- svalue(per))
tmp <- gframe("Choose car", cont = g, expand = TRUE)
car <- gcombobox(list.vehicle,
label = "Select car:",
editable = FALSE,
cont = tmp,
handler = function(...)
vehicle <<- svalue(car))
visible(tmp, set = TRUE)
btn <- gbutton("confirm", cont = g)
addHandlerClicked(btn, handler = function(h,...) {
dispose(w)
})
return(list(reporter,
period,
vehicle))
}不幸的是,仍然是同样的问题。
发布于 2020-04-23 00:08:05
您不能从处理程序返回值(模式对话框除外)。您需要分配它们。通常,这是通过<<-或环境完成的,因此函数体中的修改发生在函数体的范围之外。例如,在list.timeinterval处理程序中,您可以编写e$period = ...,其中e是在显示图形用户界面之前初始化的某个环境。
你的返回值会立即发生。相反,您需要将处理程序中的值分配给持久化对象。以下是一种模式:
library(gWidgets2)
library(gWidgets2tcltk)
options(guiToolkit = "tcltk")
e = new.env()
choose.specs <- function(e, list.timeinterval, list.vehicle){
e$reporter <- NULL
e$period <- NULL
e$vehicle <- NULL
w <- gwindow("Choose report specification")
g <- ggroup(horizontal = FALSE, cont = w)
tmp <- gframe("Reporter name", cont = g, expand = TRUE)
rep <- gedit("write your name",
cont = tmp,
handler = function(...)
e$reporter <<- svalue(rep))
tmp <- gframe("Choose time intervall", cont = g, expand = TRUE)
per <- gcombobox(list.timeinterval,
label = "Select time period",
editable = FALSE,
cont = tmp,
handler = function(...)
e$period <<- svalue(per))
tmp <- gframe("Choose car", cont = g, expand = TRUE)
car <- gcombobox(list.vehicle,
label = "Select car:",
editable = FALSE,
cont = tmp,
handler = function(...)
e$vehicle <<- svalue(car))
visible(tmp, set = TRUE)
btn <- gbutton("confirm", cont = g)
addHandlerClicked(btn, handler = function(h,...) {
dispose(w)
})
# return(list(reporter,
# period,
# vehicle))
}当您与拨号交互时,e环境会更新。
https://stackoverflow.com/questions/61318694
复制相似问题