[英]R gWidgets2 doesn't return values
我正在尝试用 gWidgets2 制作一个输入表单来写你的名字,select 一个时间段,select 一个汽车。 这些输入值被保存到一个列表中。 数据如下:
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)
不知何故,它返回一个空列表。 如果我没有设置报告者、周期和车队 = NULL,它会给出错误“找不到对象报告者”。 如果我写这个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))
}
不幸的是仍然是同样的问题。
您不能从处理程序返回值(模式对话框除外)。 您需要分配它们。 通常这是通过<<-
或环境来完成的,因此 function 主体内的修改发生在主体的 scope 之外。 例如,在list.timeinterval
处理程序中,您可以编写e$period =...
其中 e 是您在显示 GUI 之前初始化的某个环境。
您的回报价值会立即发生。 相反,您需要将处理程序中的值分配给持久的东西。 这是一种模式:
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
环境会更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.