将日期过滤器添加到 Flexdashboard

Adding Date Filter to Flexdashboard

我希望用户能够 select 他们感兴趣的数据的日期范围。这是我第一次使用 flexdashboard 和 Rshiny,如果这是一个简单的问题,请原谅。我了解用户输入要求您使用反应式表达式...

我尝试在 Whosebug 上搜索了一段时间,但仍然找不到可以帮助我的答案。这是我到目前为止编写的代码。

---
title: "title"
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: fill
    theme: lumen
    runtime: shiny
---
library(flexdashboard)
library(dplyr)
library(lubridate)
setwd("...")
data = readxl::read_excel("Resignation Data.xlsx")
Column {.sidebar}
-----------------------------------------------------------------------

Please choose the date range of interest.

```{r}
DateSeq = seq(as.Date("2020-07-13"), Sys.Date(), "day")
dateRangeInput("dateRange", "Date Select", format = "yyyy-mm-dd", start=min(DateSeq), end=max(DateSeq))
Row {data-width=150}
-----------------------------------------------------------------------

### ESS Utilization this month

```{r}
data_filter = renderTable({
    x = data[data$`Termination Date` >= input$dateRange[1] & data$`Termination Date` <= input$dateRange[2] | 
               is.na(data$`Termination Date`) & data$`Termination Initiation Date (HR)` >= input$dateRange[1] |
               is.na(data$`Termination Date`) & data$`Termination Initiation Date (ESS)` >= input$dateRange[1], ]
  })

renderGauge({
  utilization = round(length(which(!is.na(data_filter()$`Termination Initiation Date (ESS)`))) / length(data_filter()$`Employee ID`) * 100, 1)
  gauge(utilization, min = 0, max = 100, gaugeSectors(success = c(80, 100), warning = c(30, 79), danger = c(0, 29)))
  })

这会导致警告:$ 中的错误:$ 运算符对于原子向量无效。并且仪表不会填充。

我无法理解如何访问反应函数中的过滤数据。我尝试根据这个 Whosebug 响应 使用 data_filter()$。感谢您的帮助。

正如@stefan 已经在评论中指出的那样,您只能访问反应式表达式中的反应式数据。

问题似乎是 utilization 仍然是“反应性”的,但您在调用 gauge.

时在 non-reactive 上下文中使用它

在看不到整个仪表板和数据的情况下,我建议将 gauge 包装在 renderGauge 调用中。

renderGauge({
  gauge(utilization, min = 0, max = 100, gaugeSectors(
    success = c(80, 100), warning = c(30, 79), danger = c(0, 29)))
})

另见 here:

To include a gauge within a Shiny flexdashboard you need to be sure to wrap the gauge output in renderGauge (so that it is updated when inputs it depends on change).

这个有用吗?

感谢您提供的所有帮助。最后一个问题(有很多)通过使用 reactive({}) 而不是 renderTable({}) 来解决。仪表已填充。

# Utilization Percentage for ESS since it started
data_filter = reactive({
    x = data[data$`Termination Date` >= input$dateRange[1] & data$`Termination Date` <= input$dateRange[2] | 
               is.na(data$`Termination Date`) & data$`Termination Initiation Date (HR)` >= input$dateRange[1] & data$`Termination Date` <= input$dateRange[2] |
               is.na(data$`Termination Date`) & data$`Termination Initiation Date (ESS)` >= input$dateRange[1] & data$`Termination Date` <= input$dateRange[2], ]
  })

renderGauge({
  utilization = round(length(which(!is.na(data_filter()$`Termination Initiation Date (ESS)`))) / length(data_filter()$`Employee ID`), 3) * 100
  gauge(utilization, min = 0, max = 100, gaugeSectors(success = c(80, 100), warning = c(30, 79), danger = c(0, 29)))
  })