使用navbarPage更改sidebarPanel闪亮

时间:2015-01-28 10:20:14

标签: r shiny

我正在使用navbarPage使用sidebarPanel。

我想“声明”只有一个小部件(本例中为radioButtons),然后将每个标签链接到“main”sidebarPanel。如您所见,tab2对相对radioButtons没有反应。 我的项目结构更复杂,需要为某些选项卡设置相同的sidebarPanel,并为某些其他选项卡设置特定的sidebarPanel。 这是我正在使用的代码:

library(shiny)

server=function(input, output) {  
  output$plot1 = renderPlot({plot(runif(input$rb))})
  output$plot2 = renderPlot({plot(runif(input$rb))})
}



ui = shinyUI(navbarPage("Test multi page",                        
  tabPanel("tab1",                      
          sidebarLayout(
            sidebarPanel(
              radioButtons("rb","Nr of obs:",choices = c("50 obs"=50,"300 obs"=300))
            ),
            mainPanel(plotOutput("plot1"))
          )
          ),

  tabPanel("tab2",                      
    sidebarLayout(
      sidebarPanel(
        radioButtons("rb","Nr of obs:",choices = c("50 obs"=50,"300 obs"=300))
       ),
      mainPanel(plotOutput("plot2"))
    )
  )

))

shinyApp(ui = ui, server = server)

runApp("app")

2 个答案:

答案 0 :(得分:2)

您无法以您想要的方式重复使用ui元素。你可以得到的最接近的是使用conditionalPanel。在下面的示例中,fixed将是您要在多个页面上输入的输入。条件面板允许您根据活动选项卡添加ui组件,其中tabid是tabsetPanel的id标签。你不必在这里使用renderUI和uiOutput,但如果你有很多标签和ui元素,它可能会让你更容易。要查看示例,请查看this app,然后单击“数据”菜单的选项卡。

sidebarPanel(
  uiOutput("fixed"),
  conditionalPanel("input.tabid == 'tab1'", uiOutput("ui_tab1")),
  ....
)
mainPanel(
  tabsetPanel(id = "tabid",
  ...
)

答案 1 :(得分:0)

问题是您有两个输入小部件,inputId设置为rb。如果您将tab2中的代码更改为:

radioButtons("rb2","Nr of obs:",choices = c("50 obs"=50,"300 obs"=300))

然后将其与output$plot2中的server

相关联
output$plot2 = renderPlot({plot(runif(input$rb2))})

该应用程序将正常运行。

我认为发生这种情况的原因是因为闪亮会记住小部件的值,即使它们不可见。因此,您可以轻松地在rb中使用tab1的一个值,在rb中使用不同的tab2值。在这种情况下,不清楚应该绘制什么,因此第二个rb被忽略。