Как не сбрасывать Shiny dateRange при смене вкладки

У меня есть следующие простые данные в CSV-файле с именем sampledata.csv, который я использую в приложении shinydashboard.

date    category
1/1/2001    1M
1/2/2001    1M
1/3/2001    1M
1/4/2001    1M
1/5/2001    1M
1/1/2002    2M
1/2/2002    2M
1/3/2002    2M
1/4/2002    2M
1/5/2002    2M

У меня есть следующий код shinydashboard в файле app.R:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    sidebarMenu(id='tab',
      menuItem('Tab 1', tabName='tab1'),
      menuItem('Tab 2', tabName='tab2')
    )
  ),
  dashboardBody(
    tabItems(
      tabItem(tabName='tab1',
        uiOutput('daterange')
      ),
      tabItem(tabName='tab2',
        verbatimTextOutput('range')
      )
    )
  )
)

sample <- read.csv('sampledata.csv')
sample$date <- as.Date(sample$date, '%m/%d/%Y')

server <- function(input, output, session) {
  #Observe which tab is selected
  observe({
    print(input$tab)
  })

  subdata <- reactive({
    #Subset to include only sample$category=='1M' when any tab is selected
    if(input$tab=="tab1" | input$tab=="tab2"){
      sample <- sample[which(sample$category=='1M'),]
    }
    return(sample)
  })

  output$daterange <- renderUI({
    #Set daterange to go from min to max of subdata()
    dateRangeInput(inputId='daterange', 
      label='Select Period', 
      min=min(subdata()$date), max=max(subdata()$date)
    )
  })

  output$range <- renderPrint(input$daterange)
}

shinyApp(ui, server)

Моя проблема заключается в том, что при использовании приложения, если я меняю tab1 на tab2, daterange сбрасывается. Поэтому, если tab1 я изменю дату начала или окончания, а затем нажму tab2, выбранные даты больше не будут сохраняться. В приведенном выше коде я знаю, что оператор if в subdata кажется избыточным, и если я избавлюсь от него, моя проблема исчезнет. Но на самом деле у меня более сложное приложение, и подданные будут меняться в зависимости от того, какая вкладка была выбрана. Есть ли способ сохранить оператор if, но не сбрасывать daterange при смене вкладок?


person Gaurav Bansal    schedule 31.08.2016    source источник


Ответы (1)


переместить uiOutput('daterange') в sidebarMenu

sidebarMenu(id='tab',
      menuItem('Tab 1', tabName='tab1'),
      menuItem('Tab 2', tabName='tab2'),
      uiOutput('daterange')
    )

или вы можете использовать изолировать

  output$range <- renderPrint(  isolate({input$daterange })  )
person s.brunel    schedule 31.08.2016
comment
Это устраняет проблему, но затем daterange появляется на боковой панели. Я хочу сохранить его в теле. - person Gaurav Bansal; 31.08.2016
comment
с isolate должно работать, я отредактировал свой первый пост - person s.brunel; 01.09.2016
comment
Это все еще не работает. У меня такая же проблема с isolate. - person Gaurav Bansal; 03.09.2016