Shiny正在执行首次加载时在其他选项卡中使用的功能。有关最小示例,请查看从wch here采用的以下应用程序。此应用程序有两个菜单项。如果单击侧栏菜单项A,它应该执行renderUI
功能,该功能将通过output$A_panel
生成一个菜单项。这个应用程序完美。但是,如果您查看R控制台,则会看到同时打印Inside A Panel
和Inside B Panel
。这意味着当应用程序首次加载时,renderUI
函数都被执行,除非用户点击菜单项B,否则闪亮只是隐藏它们。
我有一个使用类似技术的应用程序但执行的函数使用SQL查询和一些我不想在第一次加载时进行的计算。它严重减慢了我的应用程序。有没有办法防止这种自动执行发生?
library(shiny)
library(shinydashboard)
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
sidebarMenu(id = "sidebarmenu",
menuItem("A", tabName = "a", icon = icon("group", lib="font-awesome")),
menuItem("B", tabName = "b", icon = icon("check-circle", lib = "font-awesome")),
conditionalPanel("input.sidebarmenu === 'a'",
uiOutput('A_panel')
),
conditionalPanel("input.sidebarmenu === 'b'",
uiOutput('B_panel')
)
),
sliderInput("x", "Outside of menu", 1, 100, 50)
),
dashboardBody()
)
server <- function(input, output) {
output$A_panel <- renderUI({
cat('Inside A Panel \n')
sliderInput("b", "Under A", 1, 100, 50)
})
output$B_panel <- renderUI({
cat('Inside B Panel \n')
sliderInput("b", "Under B", 1, 100, 50)
})
}
shinyApp(ui, server)
答案 0 :(得分:1)
ConditionalPanel
控制UI的可见性,而不是执行。
在这种情况下,快速解决方法是根据sidebarmenu
的值从函数中退出,如下所示
在实现中,仅当菜单为“b”时才执行“{”}输出的“{1}}”。
renderUI
但是,在此实现中,每次切换菜单时都会进行计算,因为library(shiny)
library(shinydashboard)
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
sidebarMenu(id = "sidebarmenu",
menuItem("A", tabName = "a", icon = icon("group", lib="font-awesome")),
menuItem("B", tabName = "b", icon = icon("check-circle", lib = "font-awesome")),
conditionalPanel("input.sidebarmenu == 'a'",
uiOutput('A_panel')
),
conditionalPanel("input.sidebarmenu == 'b'",
uiOutput('B_panel')
)
),
sliderInput("x", "Outside of menu", 1, 100, 50)
),
dashboardBody()
)
server <- function(input, output) {
output$A_panel <- renderUI({
if(input$sidebarmenu != "a") return()
cat('Inside A Panel \n')
sliderInput("b", "Under A", 1, 100, 50)
})
output$B_panel <- renderUI({
if(input$sidebarmenu != "b") return()
cat('Inside B Panel \n')
sliderInput("b", "Under B", 1, 100, 50)
})
}
shinyApp(ui, server)
中的更改会触发sidebarmenu
。
这可能不是您想要的,因为您在加载菜单“b”时担心要求的计算。您可能希望只有在选择“b”菜单后才会进行计算,但不会再次。
为此,您可以让应用记住输出B是否已使用renderUI
呈现,如果已经呈现则终止reactiveValues
。
在下面的实现中,您将看到仅打印一次的消息。
renderUI