【问题标题】:Passing Information Between Output Blocks in Shiny在 Shiny 中的输出块之间传递信息
【发布时间】:2014-07-17 15:36:08
【问题描述】:

我有一个 Shiny 程序可以运行,但是非常缓慢和麻烦,因为我在每个输出块中重复调用计算密集型函数。

虽然这可行,但它需要几分钟才能运行,因为我强制计算机在每次需要时重复计算相同的信息。

如何进行单个函数调用,将结果数据拉入单个列表,然后将其分发到需要不同部分的各种 Shiny 输出块?

这是可以工作的服务器端代码...(我认为ui端还可以...)

library(shiny)
 shinyServer(
  function(input, output) {
  output$table7 <- renderTable({
  inFile <- input$file1   
  if (is.null(inFile))
  return(NULL)   
  WorkingSet <- read.csv(inFile$datapath, header=TRUE, sep=',', 
                      quote='"')  
  TempHolder <- CARTOptimizer(WorkingSet, input$seed, input$k, input$whichcluster)
  TempHolder$v2
})
  output$plot1 <- renderPlot({
  inFile <- input$file1
  if (is.null(inFile))
    return(NULL)
  WorkingSet <- read.csv(inFile$datapath, header=TRUE, sep=',', 
         quote='"')
  TempHolder <- CARTOptimizer(WorkingSet, input$seed, input$k, input$whichcluster)
  clustertree = rpart(badcluster ~ ., data=TempHolder$v3, method="class",
         control=rpart.control(cp=TempHolder$v1))
  prp(clustertree)
})
  output$table1 <- renderTable({
  inFile <- input$file1
  if (is.null(inFile))
  return(NULL)
  WorkingSet <- read.csv(inFile$datapath, header=TRUE, sep=',', 
             quote='"')
  SingleClusterHolder <- SingleCluster(WorkingSet, input$seed, input$k,
    input$whichcluster)
  SingleClusterHolder$v1
 })
})

闪亮输出的屏幕截图:

请注意,CARTOptimizer 和 SingleCluster 是用户定义的函数,它们各自返回三个不同的值:

  • CARTOptimizer$v1 = 用于 CART 分析的最佳 cp 值
  • CARTOptimizer$v2 = 混淆矩阵
  • CARTOptimizer$v3 = 带有用于后续分析的附加列的优化数据集
  • SingleCluster$v1 = 集群详细信息矩阵
  • SingleCluster$v2 = 优化的工作数据集(去除因素)
  • SingleCluster$v3 = 完善的持有数据集(存在因素)

如您所见,其中一些是单个值,一些是矩阵,还有一些是数据框。

非常欢迎您提出如何提高效率的建议。

谢谢。

【问题讨论】:

    标签: r shiny reactive-programming


    【解决方案1】:

    在我看来,您有 3 个实体需要更新:table7、table1 和 plot1。我认为您可以在这里做的最好的事情是从分配这些代码的函数中删除尽可能多的代码。例如,看起来您加载相同的 csv 文件 3 次,每次输出一次。您应该有一个单独的反应性代码块来读取文件并从该文件中组装它需要的任何信息,而不会生成任何图形。为防止它导致其他函数执行,请在每个输出中使用return(NULL) 条件,以防止在未设置其他参数时显示。如果同一函数的结果在多个输出中使用,则将该函数作为单独的反应对象。然后,只要在 UI 中更改参数,该函数就会执行一次。结果发生变化的事实会触发相关的输出发生变化。

    一般来说,如果您将相同的计算密集型代码多次放入您的server.R 文件中,那么您正在创建一个较慢的程序。找到一种方法让更新像多米诺骨牌一样发生,以便响应输入变化而更新的每个变量都保存在其自己的反应对象中并存储在变量中。然后仅在输出定义中必要时使用这些变量。

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多