如何触发Shiny的dataTable输出

时间:2015-08-17 18:55:16

标签: r shiny-server shiny

我迷失在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

的最小工作示例

0 个答案:

没有答案