闪亮 - 不同标签的功能在第一次加载时执行

时间:2017-06-20 03:21:54

标签: r shiny shinydashboard

Shiny正在执行首次加载时在其他选项卡中使用的功能。有关最小示例,请查看从wch here采用的以下应用程序。此应用程序有两个菜单项。如果单击侧栏菜单项A,它应该执行renderUI功能,该功能将通过output$A_panel生成一个菜单项。这个应用程序完美。但是,如果您查看R控制台,则会看到同时打印Inside A PanelInside 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)

1 个答案:

答案 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