2010-04-21 61 views
6

我使用gWidgets(更具体地说是gWidgetstcltk)在R中创建GUI。我想知道如何更新选择类型小部件的内容,例如gdroplistgtable。我现在有一个相当黑客的方法来删除小部件并重新创建它。我确定有更好的方法。如何刷新R gWidget的内容?

这个简单的例子显示了全局环境中的所有变量。

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() 

回答

2

AFAIK这些刷新事件通常由窗口管理器拥有,所以这可能会非常棘手。

+0

在这种情况下,我有多少访问这种功能? 'tcltk' /'tcltk2'软件包会诀窍吗?是否有可能直接从R访问窗口管理器? – 2010-04-22 08:54:07

+0

好吧,我承认在这个失败。 – 2010-04-30 13:46:01

+1

有没有这样的事情失败 - 但为此,你可能不得不放弃_portability_,因为它是如此依赖窗口管理器。 一个可能的希望之光可能是Deepayan和Michael一直在努力的对Qt的绑定。有一天,这些可能会从R-Forge迁移到CRAN,并为您提供另一种选择。 – 2010-04-30 13:58:04

4

我与gVidgets *软件包的创建者John Verzani交谈过,答案非常简单(尽管不完全直观)。您可以使用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. 
1

尽管问题的标题是模棱两可是否要讲迫使视觉刷新或只是改变了内容,我最近曾与gstatusbar更新类似的问题前,长时间操作后。虽然REPL的替代品名为REventLoop,但我发现使用tcl定时器非常方便。

tcl("after", 300, my_long_operation) 

所以我长时间操作之前更新gstatusbar,然后设置定时器,在不到一秒钟就会触发我的功能需要一段时间,并在该函数我使用类似

更新gstatusbar结束
svalue(sb) <- "Ready"