3

我整天都在努力让他工作,但我找不到一个简单的解释来解释它是如何工作的。我有一个包含 3 个项目的向量c(file1, file2, file3),我希望能够打开和关闭复选框,当它打开时我希望第一个项目c(file1)位于向量中,但是当它关​​闭时我希望它从向量中删除。这是我的尝试,但我不知道为什么它不起作用:

library(gWidgetRGtk2)
GraphFiles <- FileNamesOrig

w <- gwindow("Tag Density Checkboxes")
g <- ggroup(container = w)
lyt <- glayout(cont = g, horizontal = T)

gcheckbox(FileNamesOrig[1], container=g, checked=TRUE, handler=function(h,...){  
  if(!svalue(h$obj)){GraphFiles[[1]] <- NA}  else {GraphFiles[[1]] <-FileNamesOrig[1]}
})

当我们都在这里时,我正在考虑这样做:

for(i in 1:No.file)
gcheckbox(GraphFiles[i], container=g, handler=function(h,...){
  })

编号文件 = 3

首先,我如何在 GUI 窗口中的单独行上获得复选框。其次,我如何将第一段代码的功能合并到循环中?(问题是每次运行脚本时输入的数量都会有所不同)

4

1 回答 1

2

您可以使用[,请参阅 ?ggwidget

"[" 方法返回盒子上的标签。

然后我改变你的处理函数:

 handler=function(h,...){  
         browser()
         label <- h$obj[]
         if(!svalue(h$obj)) ## I remove the item
            GraphFiles <<- GraphFiles[GraphFiles!=label]   ## note the use of the global 
                                                              operator
         else               ## I add the item
            GraphFiles  <<- c(GraphFiles,FileNamesOrig[FileNamesOrig==label])

 })

最后你在循环中调用它:

library(gWidgetsRGtk2)
FileNamesOrig <- paste('file',1:3,sep='')
GraphFiles <- FileNamesOrig
w <- gwindow("Tag Density Checkboxes")
g <- ggroup(container = w)
lyt <- glayout(cont = g, horizontal = T)
for(x in seq_along(FileNamesOrig)){
  gcheckbox(FileNamesOrig[x], 
            container=g, 
            checked=TRUE, 
            handler=function(h,...){  
                  label <- h$obj[]
                  if(!svalue(h$obj)) GraphFiles <<- GraphFiles[GraphFiles!=label]
                  else GraphFiles  <<- c(GraphFiles,FileNamesOrig[FileNamesOrig==label])
                 print(GraphFiles) ## edit to show the changes
            })
}
于 2013-01-07T18:27:22.603 回答