首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R gWidgets2不返回值

R gWidgets2不返回值
EN

Stack Overflow用户
提问于 2020-04-20 17:02:03
回答 1查看 78关注 0票数 2

我正在尝试用gWidgets2做一个输入表单,写下你的名字,选择一个时间段,然后选择一辆车。这些输入值被保存到列表中。数据如下:

代码语言:javascript
复制
list.timeinterval = c("last month", "last year", "Specific Period")
list.vehicle = c("car1", "car2", "car3")

这是我的代码:

代码语言:javascript
复制
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)),它将返回默认值

代码语言:javascript
复制
[[1]]
[1] "write your name"

[[2]]
[1] "last month"

[[3]]
[1] "car1"

如何返回此输入值?

编辑:我对@jverzani建议的解决方案的解释如下:

代码语言:javascript
复制
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))
}

和/或:

代码语言:javascript
复制
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))
}

不幸的是,仍然是同样的问题。

EN

回答 1

Stack Overflow用户

发布于 2020-04-23 00:08:05

您不能从处理程序返回值(模式对话框除外)。您需要分配它们。通常,这是通过<<-或环境完成的,因此函数体中的修改发生在函数体的范围之外。例如,在list.timeinterval处理程序中,您可以编写e$period = ...,其中e是在显示图形用户界面之前初始化的某个环境。

你的返回值会立即发生。相反,您需要将处理程序中的值分配给持久化对象。以下是一种模式:

代码语言:javascript
复制
      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环境会更新。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61318694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档