如何在Shinydashboard中创建使每个选项卡具有其自己的日期输入范围的选项

问题描述

我的闪亮仪表盘中有五个选项卡。这五个选项卡中的四个都有自己的表。这些表中的每个表都彼此不同,并且具有不同的日期范围。我想拥有一个选项,当用户在选项卡之一中输入日期输入时,它不会影响其他表及其输入范围。但是,下面的代码不是这种情况。如果我在第一个标签中选择了日期范围,则会影响其他标签显示的日期。这是我的下面的代码

#ui.R
#----


# Header -----------------------------------------------------------------------|
header<-dashboardHeader( title = "Marketing Dashboard"
  
)


# Sidebar ----------------------------------------------------------------------|

sidebar<-dashboardSidebar(
  sidebarMenu(
    menuItem("Overview",tabName ="overview",icon = icon("dashboard")),menuItem("User",tabName ="user",icon = icon("user")),menuItem("Behavior",tabName ="behavior",icon = icon("people-carry")),menuItem("Finance",tabName ="finance",icon = icon("piggy-bank")),menuItem("Weather",tabName ="weather",icon = icon("bolt"))
  )
)

# Body -------------------------------------------------------------------------|
  
body<-dashboardBody(theme = "solar.css",tabItems(
    tabItem(tabName = "overview",fluidRow(
        daterangeInput("date",label = 'Date range input',start =  range(tib1$start_time)[2] - 7,end =  range(tib1$start_time)[2],min = range(tib1$start_time)[1],max =  range(tib1$start_time)[2]
        )
      ),fluidRow(
        DT::dataTableOutput("overviewtable")
      )
    ),tabItem(tabName = 'user',fluidRow(
              daterangeInput("date",start =  range(tib2$end_time)[2] - 7,end =  range(tib2$end_time)[2],min = range(tib2$end_time)[1],max =  range(tib2$end_time)[2]
              )
            ),fluidRow(
              DT::dataTableOutput("usertable")
            )

    ),tabItem(tabName = 'behavior',start =  range(tib3$start_time)[2] - 7,end =  range(tib3$start_time)[2],min = range(tib3$start_time)[1],max =  range(tib3$start_time)[2]
              )
            ),fluidRow(
              DT::dataTableOutput("behaviortable")
            )
    ),tabItem(tabName = 'finance',start =  range(tib4$start_time)[2] - 7,end =  range(tib4$start_time)[2],min = range(tib4$start_time)[1],max =  range(tib4$start_time)[2]
              )
            ),fluidRow(
              DT::dataTableOutput("financetable")
            )
    ),tabItem(tabName = 'weather',fluidRow(
        tags$iframe(
          seamless = "seamless",src = "personal",height = 800,width = 1400
        )
      )
    )
  )
)



# UI ---------------------------------------------------------------------------|

ui = dashboardPage(
  header,sidebar,body
)

# server.R
#---------


server <- function(input,output){
  #Reactive for daterangeInput in overview
  
  overviewdata<- reactive({
    filter(tib1,between(start_time,input$date[1],input$date[2]))
  })
  
  #Table for overview
  output$overviewtable<- DT::renderDataTable({
    DT::datatable(data =overviewdata(),extensions = 'Buttons',options = list(
                    dom = "Blfrtip",buttons =
                      list("copy",list(
                        extend = "collection",buttons = c("csv","excel","pdf"),text ="Download"
                      ))#End of button customization
                  ))
  })
  #User Section -----------------------------------------------------------------|
  userdata<- reactive({
    filter(tib2,between(end_time,input$date[2]))
  })
  
  #Table for user
  output$usertable<- DT::renderDataTable({
    DT::datatable(data =userdata(),text ="Download"
                      ))#End of button customization
                  ))
  })
  
  #Behavior section -------------------------------------------------------------|
  
  behaviordata<- reactive({
    filter(tib3,input$date[2]))
  })
  
  #Table for overview
  output$behaviortable<- DT::renderDataTable({
    DT::datatable(data = behaviordata(),text ="Download"
                      ))#End of button customization
                  ))
  })
  
  #Finance section -------------------------------------------------------------|
  financedata<- reactive({
    filter(tib4,input$date[2]))
  })
  
  #Table for overview
  output$financetable<- DT::renderDataTable({
    DT::datatable(data = financedata(),text ="Download"
                      ))#End of button customization
                  ))
  })
  
}

我一直在网上寻找答案,并将继续在网上寻找答案,但是我没有看到与该问题完全相关的信息。有没有办法在dateInputerange上放置一个ID,以便服务器端的reactive({})函数将知道dateinpute范围是来自选项卡1、2等。

解决方法

您的dateRangeInput将inputId作为参数。您可以分配不同的ID,例如date_user,date_finance等,而不只是“ date”。然后,在该选项卡中进行过滤时,您将引用每个单独的date_id。另外,您可以使用ns函数构建一个可以多次调用的module

#ui.R
#----


# Header -----------------------------------------------------------------------|
header<-dashboardHeader( title = "Marketing Dashboard"
                         
)


# Sidebar ----------------------------------------------------------------------|

sidebar<-dashboardSidebar(
  sidebarMenu(
    menuItem("Overview",tabName ="overview",icon = icon("dashboard")),menuItem("User",tabName ="user",icon = icon("user")),menuItem("Behavior",tabName ="behavior",icon = icon("people-carry")),menuItem("Finance",tabName ="finance",icon = icon("piggy-bank")),menuItem("Weather",tabName ="weather",icon = icon("bolt"))
  )
)

# Body -------------------------------------------------------------------------|

body<-dashboardBody(theme = "solar.css",tabItems(
                      tabItem(tabName = "overview",fluidRow(
                                dateRangeInput("date_overview",label = 'Date range input',start =  range(tib1$start_time)[2] - 7,end =  range(tib1$start_time)[2],min = range(tib1$start_time)[1],max =  range(tib1$start_time)[2]
                                )
                              ),fluidRow(
                                DT::dataTableOutput("overviewtable")
                              )
                      ),tabItem(tabName = 'user',fluidRow(
                                dateRangeInput("date_user",start =  range(tib2$end_time)[2] - 7,end =  range(tib2$end_time)[2],min = range(tib2$end_time)[1],max =  range(tib2$end_time)[2]
                                )
                              ),fluidRow(
                                DT::dataTableOutput("usertable")
                              )
                              
                      ),tabItem(tabName = 'behavior',fluidRow(
                                dateRangeInput("date_behaviour",start =  range(tib3$start_time)[2] - 7,end =  range(tib3$start_time)[2],min = range(tib3$start_time)[1],max =  range(tib3$start_time)[2]
                                )
                              ),fluidRow(
                                DT::dataTableOutput("behaviortable")
                              )
                      ),tabItem(tabName = 'finance',fluidRow(
                                dateRangeInput("date_finance",start =  range(tib4$start_time)[2] - 7,end =  range(tib4$start_time)[2],min = range(tib4$start_time)[1],max =  range(tib4$start_time)[2]
                                )
                              ),fluidRow(
                                DT::dataTableOutput("financetable")
                              )
                      ),tabItem(tabName = 'weather',fluidRow(
                                tags$iframe(
                                  seamless = "seamless",src = "personal",height = 800,width = 1400
                                )
                              )
                      )
                    )
)



# UI ---------------------------------------------------------------------------|

ui = dashboardPage(
  header,sidebar,body
)

# server.R
#---------


server <- function(input,output){
  #Reactive for dateRangeInput in overview
  
  overviewdata<- reactive({
    filter(tib1,between(start_time,input$date_overview[1],input$date_overview[2]))
  })
  
  #Table for overview
  output$overviewtable<- DT::renderDataTable({
    DT::datatable(data =overviewdata(),extensions = 'Buttons',options = list(
                    dom = "Blfrtip",buttons =
                      list("copy",list(
                        extend = "collection",buttons = c("csv","excel","pdf"),text ="Download"
                      ))#End of button customization
                  ))
  })
  #User Section -----------------------------------------------------------------|
  userdata<- reactive({
    filter(tib2,between(end_time,input$date_user[1],input$date_user[2]))
  })
  
  #Table for user
  output$usertable<- DT::renderDataTable({
    DT::datatable(data =userdata(),text ="Download"
                      ))#End of button customization
                  ))
  })
  
  #Behavior section -------------------------------------------------------------|
  
  behaviordata<- reactive({
    filter(tib3,input$date_behaviour[1],input$date_behaviour[2]))
  })
  
  #Table for overview
  output$behaviortable<- DT::renderDataTable({
    DT::datatable(data = behaviordata(),text ="Download"
                      ))#End of button customization
                  ))
  })
  
  #Finance section -------------------------------------------------------------|
  financedata<- reactive({
    filter(tib4,input$date_finance[1],input$date_finance[2]))
  })
  
  #Table for overview
  output$financetable<- DT::renderDataTable({
    DT::datatable(data = financedata(),text ="Download"
                      ))#End of button customization
                  ))
  })
  
}