在shinyapp

时间:2018-03-22 05:09:17

标签: r shiny shinydashboard

在我的闪亮应用程序中,我有以下几个标签。

enter image description here

我在这个应用程序中运行的函数很少。我认为在任何选项卡中完成任何操作时,服务器函数中的所有observe函数都会运行。因此,我只需要为相关选项卡运行相关的观察功能。例如,当我在Summary选项卡中时,只应运行相关的观察函数,并且不应运行所有其他观察函数。我有一个代码。

server <- function(input, output) {
  summary <- observe({....})
  occupancy<- observe({....})
  Bookings<- observe({....})
  Maps<- observe({....})
}

上述代码是否有任何修改只能运行与应用程序中打开的选项卡相关的相关观察功能。?

1 个答案:

答案 0 :(得分:0)

有些方法浮现在脑海中。但首先;你想在观察者中做些什么?如果您只是创建要显示给用户的输出,请不要忘记使用无功元素。只有在输出用于向用户显示内容时,它们才会自动失效。因此,如果反应X使用输入Y用于构造选项卡A的输出,并且在我们查看选项卡B时输入Y更改,则反应X将不会失效。

如果您使用观察者仅创建副作用,例如更新输入或显示modalDialogs,您可以:

  • 使用observeEvent代替observe仅收听特定输入或条件的更改。
  • 使用isolate隔离某些依赖项。
  • observer中构建一个if语句,用于检查选中的选项卡。你可以通过提供sidebarMenu个ID(下面的例子中为my_sidebarmenu)来做到这一点,并通过调用input$my_sidebarmenu来检查观察者中选择了哪个标签。

下面给出了一些例子,这有什么帮助〜

#UI.R
#loading shiny library
library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    sidebarMenu(id='my_sidebarmenu',
                menuItem('Tab 1', tabName='tab1'),
                menuItem('Tab 2', tabName='tab2'),
                actionButton(inputId = 'btn','Press me!')
    )
  ),
  dashboardBody(
    tabItems(
      tabItem('tab1',
              p('Tab 1'),
              actionButton('btn_tab1','Show message!')),

      tabItem('tab2',
              p('Tab 2'),
              actionButton('btn_tab2','Show message!'))
    )
  )
)

server <- function(input, output,session)
{

  observeEvent(input$btn,
               {
                 if(input$my_sidebarmenu=='tab1')
                 {
                   updateTabItems(session,'my_sidebarmenu',selected='tab2')
                 }
                 if(input$my_sidebarmenu=='tab2')
                 {
                   updateTabItems(session,'my_sidebarmenu',selected='tab1')
                 }
               })

  observeEvent(input$btn_tab1,
               {
                 showModal(modalDialog(
                   title = "One.",
                   "You are viewing tab 1!",
                   easyClose = TRUE,
                   footer = NULL
                 ))
               })


  observeEvent(input$btn_tab2,
               {
                 showModal(modalDialog(
                   title = "Two.",
                   "You are viewing tab 2!",
                   easyClose = TRUE,
                   footer = NULL
                 ))
               })
}

shinyApp(ui,server)