На данный момент я пытаюсь сделать следующее: импортировать файл в Rshiny, присвоить ему номер (интерактивно), а затем перейти к следующему файлу. Эта часть работает нормально. Однако я также хотел бы сохранять данные каждой итерации, а затем отображать их в пользовательском интерфейсе. Однако это не работает. Итак, я предполагаю, что что-то не так с реактивностью, но я не уверен, как это исправить.

ui<-fluidPage(
    mainPanel(
        radioButtons(inputId="score",label="Give a score",choices=c(1:9),selected=1),
        actionButton(inputId="new","Next file"),
        tableOutput("savdat")
        )
    )
server<-function(input,output){

NoFiles<-length(list.files())

Здесь пустой реактивный data.frame

outputdata<-reactive(data.frame("file"="file","score"="score"))

filename<-eventReactive(input$new,{ 
            WhichFile<-sample(1:NoFiles,1)
            filename<-list.files()[WhichFile]
            return(filename)
 })

scores<-eventReactive(input$new,{
            return(input$score)
            })

Затем я хотел бы добавить предыдущие значения выходных данных с новыми значениями. Но это не работает

outputdata<-eventReactive(input$new,{
            rbind(outputdata(),filename(),scores())
            })

output$savdat<-renderTable(outputdata())
}

shinyApp(ui, server)

Любой совет приветствуется

0
TwanK 15 Окт 2019 в 15:06

1 ответ

Лучший ответ

Похоже, вы хотите, чтобы реактивность происходила каждый раз, когда вы нажимаете кнопку «Следующий файл». Я переписал ваш код, чтобы он отвечал только один раз, используя ObserveEvent при каждом нажатии кнопки «Следующий файл». Вторая задача - позволить значениям сохраняться при каждом реактивном событии. Хотя есть несколько способов справиться с этим, я выбрал целесообразный метод, оператор присваивания «<< -», чтобы разрешить сохранение «выходных данных» переменной (как правило, это не очень хорошая методика программирования). Поскольку переменная outputdata существует во всех средах, вам необходимо очищать среду каждый раз, когда вы хотите запустить эту программу.

Вот мой вариант перезаписи с использованием того же пользовательского интерфейса, который вы создали:

ui<-fluidPage(
  mainPanel(
    radioButtons(inputId="score",label="Give a score",choices=c(1:9),selected=1),
    actionButton(inputId="new","Next file"),
    tableOutput("savdat")
  )
)
server<-function(input,output){

  NoFiles<-length(list.files())

  setupData <- function(filename,score) {
    data <- data.frame(filename,score,stringsAsFactors = FALSE)
    return(data)
  }

  observeEvent (input$new, {
    WhichFile<-sample(1:NoFiles,1)
    filename<-list.files()[WhichFile]

    if (!exists(c('outputdata'))) {
      score <- input$score
      outputdata <<- data.frame (filename,score,stringsAsFactors = FALSE)
    }
    else { 
      outputdata <<- rbind(outputdata,setupData(filename,input$score))
    }

    # Show the table
    output$savdat<-renderTable(outputdata)
  })
}

shinyApp(ui, server)
0
S Novogoratz 15 Окт 2019 в 17:26