2017-06-13 152 views
1

我使用多個選項卡構建了R Shiny應用程序,其中有一些共同的過濾器。現在,所有過濾器都是獨立的,不會跨多個選項卡進行同步。因此,當我將selectInput1從值「a」更改爲值「b」時,我必須在包含selectInput2的下一個選項卡上以相同的選項/含義重複此處理。R在多個選項卡上閃亮的同步過濾器

我考慮過濾器是動態的,因此使用R Shiny的服務器端渲染它們。那麼當然,我總是可以使selectInput2等於selectInput1。但是如果用戶改變了selectInput2而不是selectInput1呢?它在邏輯中創建了一種循環。

我花了一段時間找到解決這個問題的方法,不知何故,我確信我不是第一個遇到這個問題的人。建議或有用的鏈接將非常有幫助!

實施例:

## UI.R 
shinyUI(
    dashboardPage("Dashboard", 

    # Create tabs 
    tabPanel("Start", 
      p("This is the frontpage") 
    ), 
    tabPanel("tab1", 
      uiOutput("selectInput1") 
    ), 
    tabPanel("tab2", 
      uiOutput("selectInput2") 
    ) 
) 
) 

和:

## Server.R 
library(shiny) 

shinyServer(function(input, output,session){ 
    output$selectInput1 <- renderUI({ 
    selectInput(inputId = "id1", 
       label = "select", 
       choices = c("a","b","c"), 
       selected = "a") 
    }) 

    output$selectInput2 <- renderUI({ 
    selectInput(inputId = "id2", 
       label = "select", 
       choices = c("a","b","c"), 
       selected = "a") 
    }) 
}) 
+0

在側邊欄中添加一個selectInput有什麼問題?這就是我要做的事情,因爲您希望用戶在所有選項卡上進行單一選擇。 –

+1

謝謝你的快速回復。在兩個選項卡上添加相同的selectInput元素不起作用,因爲Shiny需要爲每個加載的元素添加不同的ID。當我嘗試使用renderUI(Server)和uiOutput(UI)加載兩個相同的元素時,它無法加載任何元素。 – Dendrobates

+1

sry,那是'renderUI()'錯誤。但是,如果你使用側邊欄,你不必包含它兩次,就像@JorisMeys說的那樣。如果沒有,最好給我們舉個例子,... – BigDataScientist

回答

0

我個人使用單一的輸入控制來控制不同的標籤面板。一種方法是包含在你的標籤,單輸入:

shinyApp(
    fluidPage(
    fluidRow(
     tabsetPanel(
     tabPanel("Tab1", 
       verbatimTextOutput("choice1")), 
     tabPanel("Tab2", 
       verbatimTextOutput("choice2")) 
    ) 
    ), 
    fluidRow(
     selectInput("id1", "Pick something", 
        choices = c("a","b","c"), 
        selected = "a") 
    ) 
), 
    function(input, output, session){ 
    output$choice1 <- renderPrint(input$id1) 
    output$choice2 <- renderPrint({ 
     paste("The choice is:", input$id1) 
    }) 
    } 
) 

或者,當你使用一個shinydashboard,你實際上可以在自己的行添加在側邊欄的控制,可能再次一組選項卡下,如果你必須。

我想不出有多個輸入自動選擇相同的東西的理由。除了減慢你的應用程序,我看不到任何收益。但是,如果您堅持,則使用使選定的選項成爲反應值,並使用例如observeEvent()來更新該反應值。一個小例子使用shinydashboard

library(shinydashboard) 
library(shiny) 
ui <- shinyUI(
    dashboardPage(title = "Dashboard", 
       dashboardHeader(), 
       dashboardSidebar(
        tabsetPanel(
        tabPanel("tab1", 
          uiOutput("selectInput1") 
       ), 
        tabPanel("tab2", 
          uiOutput("selectInput2") 
       ) 
       )), 
       dashboardBody(
        verbatimTextOutput("selected") 
       ) 
) 
) 

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

    thechoice <- reactiveVal("a") 
    output$selectInput1 <- renderUI({ 
    selectInput(inputId = "id1", 
       label = "select", 
       choices = c("a","b","c"), 
       selected = thechoice()) 
    }) 
    output$selectInput2 <- renderUI({ 
    selectInput(inputId = "id2", 
       label = "select", 
       choices = c("a","b","c"), 
       selected = thechoice()) 
    }) 

    observeEvent(input$id2,{ 
    thechoice(input$id2) 
    }) 

    observeEvent(input$id1,{ 
    thechoice(input$id1) 
    }) 

    output$selected <- renderPrint({ 
    c(input$id1, input$id2) 
    }) 
}) 

shinyApp(ui, server) 
+0

非常感謝您發佈解決方案,同時也提供廣泛的解釋。 – Dendrobates