2017-06-22 68 views
0

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

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

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

由于提前,

彼得

回答

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创建的观察者会在其依赖项更改时立即触发,因此如果要在应用程序中获得良好性能,请小心。

+0

谢谢你的回答Gregor,但是这个解决方案的问题是,当renderUI必须渲染一个非常复杂的ui(比如说包含多个图表和过滤器的多个页面)时,它将需要很长时间。我的第一个解决方案也是这样,但是这有时需要10秒才能渲染......任何想法如何改进? – Peter