将反应值添加到数据框-Rshiny

时间:2019-10-15 12:06:32

标签: r dataframe shiny reactive-programming

目前,我正在尝试以下操作:在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())

此处为空的反应性数据。

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的先前值与新值附加在一起。但这不起作用

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

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

shinyApp(ui, server)

任何建议都将受到欢迎

1 个答案:

答案 0 :(得分:0)

您似乎希望每次单击“下一个文件”按钮时都发生反应。每次单击“下一个文件”按钮时,我都会使用“ ObserveEvent”重写您的代码以仅响应一次。第二个挑战是允许值在每个反应性事件发生时保持不变。尽管有多种方法可以解决此问题,但我还是选择了权宜之计,即<<-赋值语句,以允许变量“输出数据”持久存在(这通常不是一种好的编程技术)。由于变量'outputdata'在所有环境中都存在,因此每次运行该程序时都需要擦除环境。

这是我使用您创建的相同ui进行的重写:

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)