繁体   English   中英

在 Shiny/R 中如何同步两组标签面板?

[英]In Shiny/R how to synchronize two sets of tab panels?

我需要单击选项卡面板 label “面板 2”,右侧会显示“面板右侧图表 2”上的 plot(带有绿线的图表)。

贝娄是我的代码:

library(shiny)

ui <- fluidPage(
  
  column(
    width = 6,
    
    tabsetPanel(
      
      tabPanel(
        strong("Panel 1")
      ),
      
      tabPanel(
        strong("Panel 2")
      ),
      
      tabPanel(
        strong("Panel 3")
      ))),
  
  column(
    width = 6,
    
    tabsetPanel(
      
      tabPanel(
        strong("Panel Right Chart 1"),
        plotOutput("chart1")
      ),
      
      tabPanel(
        strong("Panel Right Chart 2"),
        plotOutput("chart2")
      ),
      
      tabPanel(
        strong("Panel Right Chart 3"),
        plotOutput("chart3")
      )))
  
  
    
    

)

server <- function(input, output, session) {
  
  output$chart1 <- renderPlot({
    ggplot(mtcars,aes(cyl,mpg)) + geom_line(color = 'red')
  })
  
  output$chart2 <- renderPlot({
    ggplot(mtcars,aes(cyl,mpg)) + geom_line(color = 'green')
  })
  
  output$chart3 <- renderPlot({
    ggplot(mtcars,aes(cyl,mpg)) + geom_line(color = 'blue')
  })
  
}

shinyApp(ui, server)

对 Silentdveildoll 的答案进行了一个小调整 - 我刚刚修改了observeEvent调用,以便更新面板的逻辑没有任何if语句,而只是更新到input$FirstTabs中选择的任何内容。 这简化了代码,如果有多个选项卡,则可以更好地扩展。

library(shiny)
library(ggplot2)

ui <- fluidPage(
  
  column(
    width = 6,
    
    tabsetPanel(id = "FirstTabs",
                
                tabPanel(value = 1,
                         strong("Panel 1")
                ),
                
                tabPanel(value = 2,
                         strong("Panel 2")
                ),
                
                tabPanel(value = 3,
                         strong("Panel 3")
                ))),
  
  column(
    width = 6,
    tabsetPanel(id = "SecondTabs",
                
                tabPanel(value = "1",
                         strong("Panel Right Chart 1"),
                         plotOutput("chart1")
                ),
                
                tabPanel(value = "2",
                         strong("Panel Right Chart 2"),
                         plotOutput("chart2")
                ),
                
                tabPanel(value = "3",
                         strong("Panel Right Chart 3"),
                         plotOutput("chart3")
                ))) 
)

server <- function(input, output, session) {
  
  output$chart1 <- renderPlot({
    ggplot(mtcars,aes(cyl,mpg)) + geom_line(color = 'red')
  })
  
  output$chart2 <- renderPlot({
    ggplot(mtcars,aes(cyl,mpg)) + geom_line(color = 'green')
  })
  
  output$chart3 <- renderPlot({
    ggplot(mtcars,aes(cyl,mpg)) + geom_line(color = 'blue')
  })
  
  observeEvent(input$FirstTabs, {
      updateTabsetPanel(session, "SecondTabs",
                        selected = input$FirstTabs)
  })
  
}

shinyApp(ui, server)

正如@DanAdams 指出的那样,你用劳拉回应, updateTabsetPanel是关键。 当我过去这样做时,我会使用observeEvent ,只要选择了第一组选项卡上的选项卡,它就会使用相应的选择更新第二组选项卡。 这是您的代码:

library(shiny)
library(ggplot2)

ui <- fluidPage(
  
  column(
    width = 6,
    
    tabsetPanel(id = "FirstTabs",
      
      tabPanel(value = 1,
        strong("Panel 1")
      ),
      
      tabPanel(value = 2,
        strong("Panel 2")
      ),
      
      tabPanel(value = 3,
        strong("Panel 3")
      ))),
  
  column(
    width = 6,
    
    tabsetPanel(id = "SecondTabs",
      
      tabPanel(value = "1",
        strong("Panel Right Chart 1"),
        plotOutput("chart1")
      ),
      
      tabPanel(value = "2",
        strong("Panel Right Chart 2"),
        plotOutput("chart2")
      ),
      
      tabPanel(value = "3",
        strong("Panel Right Chart 3"),
        plotOutput("chart3")
      )))
  
  
  
  
  
)

server <- function(input, output, session) {
  
  output$chart1 <- renderPlot({
    ggplot(mtcars,aes(cyl,mpg)) + geom_line(color = 'red')
  })
  
  output$chart2 <- renderPlot({
    ggplot(mtcars,aes(cyl,mpg)) + geom_line(color = 'green')
  })
  
  output$chart3 <- renderPlot({
    ggplot(mtcars,aes(cyl,mpg)) + geom_line(color = 'blue')
  })
  
  observeEvent(input$FirstTabs, {
    if(input$FirstTabs == "1") {
      updateTabsetPanel(session, "SecondTabs",
                        selected = "1")
      
    }
    if(input$FirstTabs == "2") {
      updateTabsetPanel(session, "SecondTabs",
                        selected = "2")
      
    }
    if(input$FirstTabs == "3") {
      updateTabsetPanel(session, "SecondTabs",
                        selected = "3")
      
    }

  })
  
}

shinyApp(ui, server)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM