r-如何在一个闪亮的flexdashboard的反应函数中使其中一个过滤函数成为条件函数



我有一个数据集,正在用多个用户输入构建一个闪亮的flexdashboard,将数据过滤到一个子集。我正在努力解决其中一个过滤器,如果用户在selectInput中选择"ALL",我希望该过滤器功能不做任何事情,只按原样返回数据。以下是我的一个尝试:

library(flexdashboard)
library(DT)
library(lubridate)
library(readr)
library(tidyverse)
...
qry <- read_file("some_query.sql")
Data_df  <- con %>% tbl(sql(qry)) %>% collect()
doctors_to_choose <- unique(pull(Data_df, 'Doctor')) %>%append('ALL')

Column {data-width=200 .sidebar}
-----------------------------------------------------------------------
```{r}
checkboxGroupInput("drug_classes",
label = "Choose the classes of drugs",
choices = c("II", "III", "IV", "V"),
selected = c("V"),
)

selectInput(
inputId="chosen_doctor",
label="Choose Doctor",
choices=doctors_to_choose,
selected = "ALL",
multiple = FALSE,
size = NULL
)

show_data_df <- reactive({
Data_df %>% 
filter(`Drug Class` %in% input$drug_classes) %>%
{if (input$chosen_doctor != "ALL") filter(Doctor == input$chosen_doctor ) 
else filter(`Drug Class` %in% input$drug_classes) }
} )
``` 

我尝试使用上面的if-else语句,但失败了。因为在最初的代码中,我有一长串应用的过滤器,所以理想情况下,我想使用一些不需要像上面其他部分那样重新键入所有以前的过滤器/操作的东西。

@TimTeaFan给了你一个非常好的答案。我并不是建议你改变对他的回答的接受。

为了回答你在评论中关于占位符的问题,这里有一个技术演示。我使用了Shiny而不是flexdashboard,因为它更容易看到操作中的变化,但原理将直接传递到dashboards中。此外,因为我无法访问您的输入数据,所以我使用了mtcars作为数据源。

我演示的方法适用于任何数量的潜在过滤器,而无需重新键入任何过滤器代码。

为了回答你的直接问题:是的,我的意思是""。这是我在使用不熟悉的键盘时没有注意到的。

library(shiny)
library(tidyverse)
cylChoices <- c("", sort(unique(mtcars$cyl)))
names(cylChoices) <- c("- All -", sort(unique(mtcars$cyl)))
gearChoices <- c("", sort(unique(mtcars$gear)))
names(gearChoices) <- c("- All -", sort(unique(mtcars$gear)))
ui <- fluidPage(
selectInput(
"cylCount", 
"Cylinder count:", 
multiple=TRUE,
selected="- All -",
choices=cylChoices
),
selectInput(
"gearCount", 
"Gear count:", 
multiple=TRUE,
selected="- All -",
choices=gearChoices
),
tableOutput("table")
)
server <- function(input, output, session) {
filteredData <- reactive({
df <- as_tibble(mtcars, rownames="Model")
if (!is.null(input$gearCount)) df <- df %>% filter(gear %in% input$gearCount)
if (!is.null(input$cylCount)) df <- df %>% filter(cyl %in% input$cylCount)
df
})

output$table <- renderTable({ filteredData() })
}
shinyApp(ui, server)

一个选项是使用purrr::whendata.frame的管道逻辑中应用类似case_when的语句:

library(dplyr)
library(purrr)
Data_df %>% 
filter(`Drug Class` %in% input$drug_classes) %>% 
when(input$chosen_doctor != "ALL" ~ filter(., Doctor == input$chosen_doctor),
TRUE                         ~ filter(., `Drug Class` %in% input$drug_classes))

最新更新