在Shiny Server中呈现UI元素

时间:2017-06-22 08:50:01

标签: r shiny shiny-server

我在Shiny Server Pro中运行多个闪亮的应用程序。每个应用程序由多种类型的用户使用,显示不同的UI。我发现通过renderUI渲染复杂的ui元素 - 即在开始会话时 - 在使用Shiny Server时非常慢(对于有此问题的更多用户,请参阅https://github.com/rstudio/shiny/issues/1175)。本地 - 来自RStudio - renderUI运行得更快。

替代方案是在启动进程时直接加载所有ui元素 - 因此在会话开始之前。由于在实际会话启动之前我无法知道哪个用户将连接到某个进程,因此每个进程都必须包含所有类型用户的所有ui元素。

你可以想象这种行为不是优选的(虽然这是我暂时“解决”它的方式)。是否有另一种加载我缺少的元素的方法?或者我只是不按照它应该使用的方式使用Shiny(服务器)?

提前致谢,

彼得

1 个答案:

答案 0 :(得分:0)

您可以使用嵌套的uiOutput调用来仅加载实际显示的ui元素。例如

server = function( input, output, session ){
  output$mainUI = renderUI({
    condition = input$showFirstUi
    if( condition )
      uiOutput( "firstUI" )
    else
      uiOutput( "secondUI" )
  })

  output$firstUI = renderUI({
    cat( "rendering first UI\n" )
    div( "first" )
  })

  output$secondUI = renderUI({
    cat( "rendering second UI\n" )
    div( "second" )
  })
}

ui = fluidPage(
  checkboxInput( "showFirstUi", "show first UI?" ),
  uiOutput( "mainUI" )
)

shinyApp( ui, server )

启动应用程序后,您将在控制台中看到第一个UI仅在复选框更改后才会呈现。这是因为output元素(以及无效值)使用懒惰评估,这意味着只有在实际需要时才会计算和更新它们。

另一方面,使用shiny::observe创建的观察者会在其依赖项发生变化时立即触发,因此如果您希望在应用中获得良好的性能,请小心使用它们。