Я недавно начал использовать R и оказался заблокирован при попытке построить графический интерфейс пользователя.
Моя цель - написать код GUI для проведения опроса .По сути, я хотел бы открыть окно, состоящее из вопроса, ответа и кнопки Далее .После нажатия на Далее Я хочу сохранить ответ и перейти к следующему окну / вопросу .
Поскольку у меня были проблемы с открытием нескольких окон, я выглядел здесь и обнаружил, что можно открывать окна одно за другим с помощью обработчика:
addHandlerChanged() #upon the Next button
Поэтому я попытался ввести код (см. Ниже) для двух вопросов / окон,Я думал сохранить результаты в to_return : матрица 2 строки (1, 2) и 3 столбца (номер вопроса, вопрос, ответ).[Я сейчас пытаюсь записать ответы вопрос за вопросом в файл Excel]
Моя проблема заключается в следующем:
Мне не удается закрыть первое окно после открытия второго (я попытался добавить dispose (h $ obj) или visible (win1) = FALSE в первый обработчик кнопки Windows, но он не работает)
Я не могу "добавить" данные к моей матрице (матрица to_return обновляется с каждым окном)
# calling GUI library
library(gWidgets)
options(guiToolkit="tcltk")
Q1 <- function(){
# creating first window
win1 <- gwindow("I) Q1.", visible=TRUE)
group <- ggroup(horizontal = FALSE, container=win1)
# creating question
question <- glabel("Do you have a driving license?", container = group)
# creating answer
answer <- gradio(c("Yes","No"), container=group)
# creating next button
nextQuestion <- gbutton("Next",container=group)
# handler
addHandlerChanged(nextQuestion, handler = function(h, ...) {
# answer to save in matrix
to_return <- rbind(to_return,c(svalue(win1),svalue(question),svalue(answer)))
#opening next question
Q2()
print(to_return)
} )
}
Q2<- function(){
# creating second window
win2 <- gwindow("I) Q2.", visible=TRUE)
group <- ggroup(horizontal = FALSE, container=win2)
# creating question
question <- glabel("What is your gender?", container = group)
# creating answer
answer <- gradio(c("Female","Male"), container=group)
# finish button
nextQuestion <- gbutton("Finish",container=group, handler = function(h,...) {
# answer to save in matrix
to_return <- rbind(to_return,c(svalue(win2),svalue(question),svalue(answer)))
print(to_return)
# finish and close
dispose(h$obj)
})
}
Если я запускаю Q1 () , я получаю следующие результаты, где to_return не хранит данные...
[,1] [,2] [,3]
[1,] "I) Q1." "Do you have a driving license?" "Yes"
[,1] [,2] [,3]
[1,] "I) Q2." "What is your gender?" "Female"
Буду очень признателен за любую помощь или понимание!
Спасибо!
Октава
РЕДАКТИРОВАТЬ: После ответаjverzani, вот возможный код для двух вопросов с сохранением данных в CSV-файле.
## calling GUI library
library(gWidgets)
options(guiToolkit="tcltk")
setwd("Your\\Path\\Here")
w <- gwindow(title="Survey")
g <- ggroup(cont=w)
state = new.env()
pages <- list()
pages[[1]] = function(cont, state) {
group <- ggroup(horizontal = FALSE, container=cont)
## creating question
question <- glabel("Do you have a driving license?", container = group)
## creating answer
answer <- gradio(c("Yes","No"), container=group)
## creating next button
nextQuestion <- gbutton("Next",container=group)
## handler
addHandlerChanged(nextQuestion, handler = function(h, ...) {
## answer to save in matrix
assign("A", c(svalue(question),svalue(answer)), state)
delete(cont, group)
pages[[2]](cont, state)
})
}
pages[[2]] = function(cont, state) {
group <- ggroup(horizontal = FALSE, container=cont)
## creating question
question <- glabel("What is your gender?", container = group)
## creating answer
answer <- gradio(c("Male","Female", "Other"), container=group)
## creating next button
nextQuestion <- gbutton("Next",container=group)
## handler
addHandlerChanged(nextQuestion, handler = function(h, ...) {
## answer to save in matrix
assign("B", c(svalue(question),svalue(answer)), state)
delete(cont, group)
pages[[3]](cont, state)
})
}
pages[[3]] = function(cont, state) {
group <- ggroup(horizontal=FALSE, container=cont)
## result matrix for csv
to_return=matrix(nrow=0,ncol=2)
colnames(to_return) <- c("Question", "Answer")
for (k in 1:length(names(state))) {
a = get(names(state)[k], state)
to_return <- rbind(to_return,a)
rownames(to_return)[k] <- paste("Q",k,sep = "")
g = ggroup(cont=group, horizontal=TRUE)
glabel(a[1], cont=g)
glabel(" ", cont=g)
glabel(a[2], cont=g)
}
btn <- gbutton("Finish", container=group, handler = function(h,...) {
write.csv(to_return, "survey.csv", row.names=TRUE, col.names=TRUE)
dispose(h$obj)})
}
## start it off
pages[[1]](g, state)
РЕДАКТИРОВАТЬ 2: строка назначения ("один", c (svalue (вопрос), svalue (ответ)), штат) следует использовать alphabetical буквы («A», «B» ...) или цифры в правильном порядке, в противном случае ответы путаются при использовании для k в именах (состояние).