Shiny: Как сохранить входные данные с нескольких страниц? - PullRequest
0 голосов
/ 22 мая 2018

Относительно Shiny:

Я хочу, чтобы несколько человек-кодировщиков оценили 100 различных текстов.На каждой странице должно быть просто выпадающее меню с доступными оценками.Я могу реализовать это для одной страницы / текста с помощью простой кнопки «Отправить», и ответ сохраняется в одном CSV-файле.

Но теперь я хочу обобщить это для всех 100 текстов - так, чтобына каждой странице отображается новый текст (я бы реализовал это как цикл for?) и хочу сохранить все 100 ответов в одном .csv-файле.

Я новичок в Shiny (но не так уж плохо)в R), но не может найти функциональность, которая обеспечивает как - несколько страниц и несколько сохраненных входов.

Мой текущий код выглядит так для одной страницы (в основном вдохновленный https://deanattali.com/2015/06/14/mimicking-google-form-shiny):


humanTime <- function() format(Sys.time(), "%Y%m%d-%H%M%OS")

fieldsMandatory <- c("new_info", "agreement", "rating")

fieldsAll <- c("new_info", "agreement", "rating")
responsesDir <- file.path("responses")
epochTime <- function() {
  as.integer(Sys.time())
}

shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(),

    titlePanel("Kommentarbewertungen Spiegel Online - Pre-Test"),
    mainPanel("This is the main panel"), 
    br(),
    code(text[1]),
    br(),
    div(
      id = "form", align="center",
      selectInput("new_info", "Bringt der Kommentar neue Informationen ein?",
                  c("","0 - nein", "1 - ja", "2 - unentschlossen")),
      selectInput("agreement", "Stimmen Sie dem Kommentar zu?",
                  c("","0 - nein", "1 - ja", "2 - unentschlossen")),
      selectInput("rating", "Bewerten Sie die Qualitaet des Kommentars auf einer Skala von 1 bis 5",
                  c("","1 - sehr schlecht", "2 - schlecht", "3 - mittel", "4 - gut", "5 - sehr gut")),
      actionButton("submit", "Submit", class = "btn-primary")
    ),
    br(),
    actionButton("prevBtn", "< Previous"),
    actionButton("nextBtn", "Next >")


  ),
  server = function(input, output, session) {
    observe({
    # check if all mandatory fields have a value
    mandatoryFilled <-
      vapply(fieldsMandatory,
             function(x) {
               !is.null(input[[x]]) && input[[x]] != ""
             },
             logical(1))
    mandatoryFilled <- all(mandatoryFilled)

    # enable/disable the submit button
    shinyjs::toggleState(id = "submit", condition = mandatoryFilled)
  })

    formData <- reactive({
      data <- sapply(fieldsAll, function(x) input[[x]])
      data <- c(data, timestamp = epochTime())
      data <- t(data)
      data
    })

    saveData <- function(data) {
      fileName <- sprintf("%s_%s.csv",
                          humanTime(),
                          digest::digest(data))

      write.csv(x = data, file = file.path(responsesDir, fileName),
                row.names = FALSE, quote = TRUE)
    }

    # action to take when submit button is pressed
    observeEvent(input$submit, {
      saveData(formData())
    })
  }
)

Большое спасибо.

1 Ответ

0 голосов
/ 22 мая 2018

Я бы использовал кнопку отправки в качестве события.Как вы сказали после нажатия этой кнопки, пользовательские входы сохраняются в CSV-файл, почему бы не продолжить добавление того же CSV-файла?

 observeEvent(input$SubmitButton, {

 Test<-c(input$rating, input$blah, input$blah)

 write.table(Test, "Test.csv", row.names=F, sep=",",col.names=F,append=T)

 #code to advance to next text
 }

После того, как пользователь нажмет кнопку отправки, автоматически переместится на следующую страницу,когда пользователь снова вводит данные и нажимает «Отправить», CSV будет автоматически открыт и добавлен с новыми входами.Если порядок отображения текстов соответствует, все ответы должны быть сохранены в одном CSV.

Примечание: я использую таблицу записи для .csv, поэтому я могу легко открыть ее в Excel.(Надеюсь, это поможет)

...