Неспособность управлять несколькими окнами и сохранять данные в графическом интерфейсе опроса с помощью R и gWidgets - PullRequest
0 голосов
/ 12 сентября 2018

Я недавно начал использовать R и оказался заблокирован при попытке построить графический интерфейс пользователя.

Моя цель - написать код GUI для проведения опроса .По сути, я хотел бы открыть окно, состоящее из вопроса, ответа и кнопки Далее .После нажатия на Далее Я хочу сохранить ответ и перейти к следующему окну / вопросу .


Поскольку у меня были проблемы с открытием нескольких окон, я выглядел здесь и обнаружил, что можно открывать окна одно за другим с помощью обработчика:

addHandlerChanged() #upon the Next button

Поэтому я попытался ввести код (см. Ниже) для двух вопросов / окон,Я думал сохранить результаты в to_return : матрица 2 строки (1, 2) и 3 столбца (номер вопроса, вопрос, ответ).[Я сейчас пытаюсь записать ответы вопрос за вопросом в файл Excel]

Моя проблема заключается в следующем:

  1. Мне не удается закрыть первое окно после открытия второго (я попытался добавить dispose (h $ obj) или visible (win1) = FALSE в первый обработчик кнопки Windows, но он не работает)

  2. Я не могу "добавить" данные к моей матрице (матрица 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 в именах (состояние).

1 Ответ

0 голосов
/ 12 сентября 2018

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

# calling GUI library
library(gWidgets2)
options(guiToolkit="tcltk")


w <- gwindow()
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("one", 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("two", c(svalue(question),svalue(answer)), state)
        delete(cont, group)
        pages[[3]](cont, state)
    })
}

pages[[3]] = function(cont, state) {
    group <- ggroup(horizontal=FALSE, container=cont)
    for (k in names(state)) {
        g = ggroup(cont=group, horizontal=TRUE)
        a = get(k, state)
        glabel(a[1], cont=g)
        glabel(" ", cont=g)
        glabel(a[2], cont=g)
    }
}

## start it off
pages[[1]](g, state)
...