我在Shiny Server Pro中运行多个闪亮的应用程序。每个应用程序由多种类型的用户使用,显示不同的UI。我发现通过renderUI渲染复杂的ui元素 - 即在开始会话时 - 在使用Shiny Server时非常慢(对于有此问题的更多用户,请参阅https://github.com/rstudio/shiny/issues/1175)。本地 - 来自RStudio - renderUI运行得更快。
替代方案是在启动进程时直接加载所有ui元素 - 因此在会话开始之前。由于在实际会话启动之前我无法知道哪个用户将连接到某个进程,因此每个进程都必须包含所有类型用户的所有ui元素。
你可以想象这种行为不是优选的(虽然这是我暂时“解决”它的方式)。是否有另一种加载我缺少的元素的方法?或者我只是不按照它应该使用的方式使用Shiny(服务器)?
提前致谢,
彼得
答案 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
创建的观察者会在其依赖项发生变化时立即触发,因此如果您希望在应用中获得良好的性能,请小心使用它们。