Как вы обновляете содержимое R gWidget?

Я создаю графический интерфейс в R, используя gWidgets (более конкретно gWidgetstcltk). Я хотел бы знать, как обновить содержимое виджетов типа выбора, таких как gdroplist а также gtable, В настоящее время у меня есть довольно хакерский метод удаления виджета и его повторного создания. Я уверен, что есть лучший способ.

Этот простой пример отображает все переменные в глобальной среде.

library(gWidgets)
library(gWidgetstcltk)

create.widgets <- function()
{
  grp <- ggroup(container = win)
  ddl <- gdroplist(ls(envir = globalenv()), 
    container = grp)
  refresh <- gimage("refresh", 
    dirname   = "stock",
    container = grp,
    handler   = function(h, ...)
    {
      if(exists("grp") && !is.null(grp)) 
      {
        delete(win, grp)
      }
      create.widgets()   
    }
  )
}

win <- gwindow()
create.widgets()

3 ответа

Решение

AFAIK Эти события обновления часто принадлежат оконному менеджеру, так что это может быть сложно.

Я говорил с Джоном Верзани, создателем пакетов gWidgets*, и ответ невероятно прост (хотя и не совсем интуитивен). Вы получаете доступ к содержимому виджетов списка с помощью widget_name[],

library(gWidgets)
library(gWidgetstcltk)

get_list_content <- function() ls(envir = globalenv())  # or whatever

win <- gwindow()
grp <- ggroup(container = win)
ddl <- gdroplist(get_list_content(), container = grp)
refresh <- gimage("refresh", 
  dirname   = "stock",
  container = grp,
  handler   = function(h, ...) ddl[] <- get_list_content()   
)

Обратите внимание, что существуют некоторые ограничения: списки переключателей должны оставаться одинаковой длины.

win <- gwindow()
rb <- gradio(1:10, cont = win)
rb[] <- 2:11     # OK
rb[] <- 1:5      # Throws an error; can't change length.

Хотя название вопроса неоднозначно, говорите ли вы о принудительном визуальном обновлении или просто об изменении содержимого, у меня недавно была похожая проблема с обновлением gstatusbar до и после длительной работы. Хотя существует альтернатива REPL с именем REventLoop, я нашел использование tcl timer весьма удобным.

tcl("after", 300, my_long_operation)

Поэтому я обновляю gstatusbar перед продолжительной работой, затем устанавливаю таймер, который менее чем за секунду запускает мою функцию, которая занимает некоторое время, и в конце этой функции я обновляю gstatusbar, используя что-то вроде

svalue(sb) <- "Ready"
Другие вопросы по тегам