переключение группы значков в gWidgets

Адаптируя пример, я могу переключить отображение значок такой:

reject <- "D:/Pictures/web/close32.png"
accept <- "D:/Pictures/web/open32.png"
w= gwindow()
g1 <- ggroup(horizontal=TRUE, cont=w)
icon <- gimage(reject,cont=g1)
state <- FALSE # a global
changeState <- function(h,...) {
   if(state) {
     svalue(icon) <- reject
     } else {
       svalue(icon) <- accept
       }
   state <<- !state
}
addHandlerClicked(icon, handler=changeState)

Однако я хотел бы, чтобы это работало с группой значков http://cran.r-project.org/web/packages/gWidgets/vignettes/gWidgets.pdf, чтобы каждый значок можно было переключать, и я мог получить состояние значков в виде вектор. Цель состоит в том, чтобы создать графический селектор для выбора пар наблюдений для выполнения анализа. Вот моя попытка. Отображает корректно, но не реагирует на нажатия на смену состояния. Я признаю, что не понимаю, как обработчик и параметры действия работают вместе, и был бы признателен за любые разъяснения и исправления для этого кода.

reject <- "D:/Pictures/web/close32.png"
accept <- "D:/Pictures/web/open32.png"
w= gwindow()
g1 <- ggroup(horizontal=TRUE, cont=w)
lyt <- glayout(cont=g1, spacing=10)
icon <- rep(reject,times=9)
state <- rep(FALSE, times=9)

changeState <- function(h,...) {
  if(state[index]) {
    svalue(icon[index]) <- reject
  } else {
    svalue(icon[index]) <- accept
  }
  state[index] <<- !state[index]
}

for(i in 1:3){
  for(j in 1:3){
    ind <- (i-1) * 3 +j
    lyt[i,j] <- gimage(icon[ind], cont=lyt)
    addHandlerClicked(lyt[i,j], handler=changeState, action= index <-ind)
  }  
}

1c: https://i.stack.imgur.com/4kbwK.png


person LenPearl    schedule 21.05.2015    source источник


Ответы (1)


Значение index должно быть получено из h$action в вашем обработчике (index <- h$action). Кроме того, этот бит action=index <- ind должен быть только action=ind.

person jverzani    schedule 22.05.2015
comment
Я также понял, что внутри функции изменяется не «svalue (icon [index])», а «svalue (lyt [i, j])», где action = list (ind, i, j). Это ПОЧТИ работает, однако, когда я нажимаю на значок, я получаю сообщение об ошибке Gtk-CRITICAL **: gtk_table_attach: assertion `child-›parent == NULL' failed - person LenPearl; 22.05.2015
comment
Я думаю, это просто предупреждение, а не ошибка. Вероятно, вам следует просто использовать h$obj для объекта, вам не нужно искать по индексу из глобального, поскольку h$obj проходит в приемнике сигнала. - person jverzani; 23.05.2015
comment
Да, использование h$obj для объекта решило проблему. Я очень ценю вашу помощь. - person LenPearl; 23.05.2015