我迷失在Shiny的反应,导体和观察者的概念之间。 我遵循this关于反应性的示例和this关于持久数据存储的示例。
我正在使用两个(或更多)tabPanel构建一个闪亮的应用程序。第一个选项卡允许用户上传一些csv文件,然后将其分析并显示为图表。在第二个面板中,我想让用户探索在同一步骤中计算的dataTable。
但是,dataTable输出仅在第一次打开此视图时更新。这意味着,如果用户在进行计算之前点击此选项卡,他就不会看到任何内容,因为还没有结果。如果他在计算完成后再回来,表格仍然是空的。如果他先进行计算,然后点击结果 - 标签,他将看到正确的输出。但如果他决定返回并重新计算,则dataTable输出也不再被更新。
更准确地说,输出$ results 仅在第一次打开视图时执行完全一次,无论将来是否对表进行任何更改显示出来。
shinyServer(function(input, output) {
createPlots <- reactive ({
numberOfFiles <- length(input$files$datapath)
for (i in 1:numberOfFiles) {
local({
my_i <- i
plotname <- paste("plot", my_i, sep="")
File <- read.csv(input$files$datapath[my_i])
output[[plotname]] <- renderPlot({
result <- runDensity(File, f)
saveData(result$counts)
plot(result$data, main=id, pch=19,cex=0.2, col= ColoursUsed[result$clusters])
})
})
}
})
output$densityPlot <- renderUI({
inFile <- input$files
if (is.null(inFile))
return(NULL)
createPlots()
numberOfFiles <- length(inFile$datapath)
plot_output_list <- lapply(1:numberOfFiles, function(i) {
plotname <- paste("plot", i, sep="")
plotOutput(plotname)
})
do.call(tagList, plot_output_list)
})
output$results <- renderDataTable({
loadData()
})
saveData <- function(data) {
data <- as.data.frame(t(data))
if (exists("responses")) {
responses <<- rbind(responses, data)
} else {
responses <<- data
}
}
loadData <- function() {
if (exists("responses")) {
responses
}
}
我尝试将变量响应置于代码中的不同位置,但没有成功。如果我是全局的,在shinyServer函数之外,我创建一个无限循环的 createPlots()
responses <<- NULL
makeReactiveBinding("responses")
shinyServer(function(input, output) {
...
})
在输出或 loadData 功能中,它根本没有效果。我怎么能触发输出功能的更新?
修改
Here是关于shinyapps.io
的最小工作示例