2015-01-28 3 views
4

Я работаю с sidebarPanel, используя navbarPage.изменение боковой панелиPanel с navbarPage в блестящей

Я хотел бы «объявить» только один виджет (radioButtons в этом примере), а затем привязать каждую вкладку к «главной» боковой панелиPanel. Как вы можете видеть, 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") 

ответ

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 игнорируется.

+0

Привет, кажется, мой пример был не очень ясным, извините за это. Мой проект очень «сложный», то есть с большим количеством вкладок. Я хотел бы объявить виджет только один раз, а затем привязать его к моим вкладкам (без повторения команды radioButtons на каждой вкладке). – statadat

1

Вы не можете повторно использовать ui-элементы так, как хотите. Самое близкое, что вы можете получить, это использовать условную панель. В приведенном ниже примере fixed будет вход, который вы хотите иметь на нескольких страницах. Условная панель позволит вам добавлять компоненты ui на основе активной вкладки, где tabid - это идентификатор метки для вашей tabsetPanel. Вам не нужно использовать renderUI и uiOutput здесь, но это, вероятно, облегчит вам работу, если у вас много вкладок и ui-элементов. Чтобы увидеть пример, просмотрите this app и перейдите по вкладкам меню «Данные».

sidebarPanel(
    uiOutput("fixed"), 
    conditionalPanel("input.tabid == 'tab1'", uiOutput("ui_tab1")), 
    .... 
) 
mainPanel(
    tabsetPanel(id = "tabid", 
    ... 
) 
Смежные вопросы