【问题标题】:Plotting the same output in two tabPanels in shiny在闪亮的两个 tabPanel 中绘制相同的输出
【发布时间】:2017-10-27 13:23:27
【问题描述】:

我正在尝试在闪亮的 tabBox 内的两个单独的选项卡面板中绘制相同的直方图。我可以在其中一个选项卡中绘制数据,但是当我为另一个选项卡添加代码时,它似乎破坏了应用程序。下面是我正在尝试做的一个例子:

    library(shiny)
     library(dplyr)

data(mtcars)

body <- dashboardBody(
  fluidRow(
    tabBox(
      title = "miles per gallon",

      id = "tabset1", height = "250px",
      tabPanel("Tab1", plotOutput("plot1")),
      tabPanel("Tab2", plotOutput("plot1"), "test") # the app 'breaks' when I add in the **plotOutput("plot1")** here... however it works when I remove it
    )
    )
  )

shinyApp(
  ui = dashboardPage(
    dashboardHeader(title = "Test"),
    dashboardSidebar(),
    body
  ),
  server = function(input, output) {


      output$plot1 <- renderPlot({hist(mtcars$mpg)})

  }
)

在这个特定的例子中,我可以像这样在服务器中添加另一行

 output$plot2 <- renderPlot({hist(mtcars$mpg)})

然后调用plot2,但我的实际应用程序比上面的例子要复杂一些,所以我想在两个选项卡中绘制plot1。

【问题讨论】:

    标签: r shiny shinydashboard


    【解决方案1】:

    当您创建一个闪亮的应用程序时,您正在创建一个 HTML 站点,并且输出位于带有 id 的 div 容器中。所以你在不知道的情况下尝试的是创建两个具有相同 id 的 div 容器。这行不通。有关讨论,请参见此处:Can multiple different HTML elements have the same ID if they're different elements?

    您可以做的是将服务器代码包装在lapply()函数中并生成两个id:

    lapply(1:2, function(nr){
      output[[paste0("plot", nr)]] <- renderPlot({hist(mtcars$mpg)})      
    })
    

    然后调用plotOutput("plot1")plotOutput("plot2")。还有其他可能只使用一个输出与conditionalPanels() 组合,但我认为这种方式应该更适合你。

    【讨论】:

      【解决方案2】:

      BigDataScientist 的回答很棒,而且非常可扩展。

      但是对于只有一两个输出要重复的情况,我认为最简单和最易读的解决方案是将它们全部分配给同一个渲染函数。例如,这将是:

      output$plot1 <- output$plot2 <- renderPlot({ hist(mtcars$mpg) })
      

      这是使用此解决方案的完整应用程序:

      library(shiny)
      
      body <- dashboardBody(
        fluidRow(
          tabBox(title = "miles per gallon", id = "tabset1", height = "250px",
            tabPanel("Tab1", plotOutput("plot1")),
            tabPanel("Tab2", plotOutput("plot2"), "test")
          )
        )
      )
      
      shinyApp(
        ui = dashboardPage(
          dashboardHeader(title = "Test"),
          dashboardSidebar(),
          body
        ),
        server = function(input, output) {
          output$plot1 <- output$plot2 <- renderPlot({ hist(mtcars$mpg) })
        }
      )
      

      【讨论】:

        猜你喜欢
        • 2017-05-15
        • 1970-01-01
        • 1970-01-01
        • 2018-01-24
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        相关资源
        最近更新 更多