Как вы обновляете содержимое 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"