Как вернуть значения из графического интерфейса gedit динамического цикла в R/gwidgets2RGtk2?

В настоящее время я пишу программу, в которой пользователь может присвоить определенные значения веса определенным чертам животных, чтобы оценить их значимость. Поскольку количество признаков является динамическим, т. е. пользователи могут ввести файл с X количеством животных и Y количеством признаков, я хотел представить этот вариант в виде цикла.

#A simple input
G <- c("Length", "Width", "Size")

#Creating the base structure. I wish to pack the code as a framed element in the GUI.
require(gWidgets2RGtk2) #Load package
W <- gwindow("Weight Values", visible = TRUE)
WW <- ggroup(cont = W, expand = TRUE, horizontal = FALSE)
w <- gframe("Variables", cont = W, expand = TRUE, horizontal = FALSE)
value_list <- list()

#Creating the dynamic gedits.
for (i in 1:(length(G))) {
   g <- gframe(paste("Trait:", i), cont = w, expand = TRUE)
   a <- gedit("1",cont=g)
   addHandlerKeystroke(a, handler=function(...) { 
   value_list[i] <<- svalue(a)

})
}

#After filling in numbers, the call for the list gives only the latest value.    Not the earlier values 
value_list

Возврат value_list дает это. (После заполнения 4, 5, 6 в качестве значений):

 > value_list
 [[1]]
 NULL

 [[2]]
 NULL

 [[3]]
 [1] "6"

Я ожидал, что код вернет 4, 5, 6. Я попытался ввести какой-то динамический список векторов для «а», но это дает только ошибки.

Приветствуются как предложения по улучшению, так и подходы.

Заранее спасибо!

ps: я просмотрел этот вопрос, прежде чем задавать этот вопрос. Тем не менее, циклическая часть, похоже, вызывает проблемы.

РЕДАКТИРОВАТЬ (30 августа 2016 г.):

Я хотел бы поблагодарить Джона за его предложение. Заменив содержимое подзаголовка «#Создание динамических редакторов» на:

sapply(1:length(G), FUN = function(i) {
   g <- gframe(paste("Trait:", i), cont = w, expand = TRUE)
   a <- gedit("1", cont=g)
   addHandlerKeystroke(a, handler=function(...) { 
        value_list[i] <<- svalue(a)
   })
})

Код удалось отработать, не получив ошибок. Большое спасибо! Теперь я могу получить доступ к файлу value_list.


person RvB    schedule 25.08.2016    source источник
comment
Попробуйте sapply, а не цикл for. Значение i при вызове равно 3, а не 1, затем 2, а затем 3. Вам нужно заставить i быть локальным.   -  person jverzani    schedule 29.08.2016
comment
Большое спасибо, Джон! Я отредактировал основной пост, чтобы предоставить решение и функциональный шаблон для людей, размышляющих о подобных проблемах.   -  person RvB    schedule 30.08.2016