R gWidgets2 не возвращает значения - PullRequest
1 голос
/ 20 апреля 2020

Я пытаюсь создать форму ввода с 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 и fleet = NULL, это выдает ошибку «объект reporter not 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))
}

К сожалению, все еще остаются те же проблемы.

1 Ответ

0 голосов
/ 22 апреля 2020

Вы не можете возвращать значения из обработчика (за исключением модальных диалогов). Вы должны назначить их. Обычно это делается с <<- или с окружением, так что изменения внутри тела функции происходят вне области тела. Например, в обработчике 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))
}

Когда вы взаимодействуете с dialong, среда e обновляется.

...