目前,我正在尝试以下操作:在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)
任何建议都将受到欢迎
答案 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)