В настоящее время я пишу программу, в которой пользователь может присвоить определенные значения веса определенным чертам животных, чтобы оценить их значимость. Поскольку количество признаков является динамическим, т. е. пользователи могут ввести файл с 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.
sapply
, а не цикл for. Значениеi
при вызове равно 3, а не 1, затем 2, а затем 3. Вам нужно заставить i быть локальным. - person jverzani   schedule 29.08.2016