r语言 - 在 Shiny 中的响应函数中使用 dplyr 条件滤波器



我在Shiny应用程序反应函数中使用dplyr。我在 UI 中有一个交互式小部件,用户可以使用它来选择状态,数据将根据所选状态显示。但是,我还想提供显示所有内容的选项,这是我称为"全部"的状态。

我知道如何在没有 dplyr 的情况下实现这一目标:

library(tibble)
library(shiny)
# Test Data -----
test_data <- tribble(
~id, ~status,
1, 'active',
2, 'inactive',
3, 'test'
)
# Ui ----
ui = fluidPage(
selectInput("status", "Choose a status:",
choices = list("All","active","inactive","test")
),
tableOutput('result')
)
# Server ----
server = function(input, output) {
table <- reactive({
if(input$status != 'All')
{
test_data <- test_data[test_data$status == input$status,]
} else {
test_data
}
})
output$result <- renderTable(table(), rownames = FALSE)
}
# App ---
shinyApp(ui = ui, server = server)

但是,我希望与我的其余代码保持一致并使用 dplyr。有没有办法做下面这样的事情?

library(tibble)
library(dplyr)
library(shiny)
# Test Data -----
test_data <- tribble(
~id, ~status,
1, 'active',
2, 'inactive',
3, 'test'
)
# Ui ----
ui = fluidPage(
selectInput("status", "Choose a status:",
choices = list("All","active","inactive","test")
),
tableOutput('result')
)
# Server ----
server = function(input, output) {
table <- reactive({
test_data %>%
filter(ifelse(input$status != 'All', status == input$status, status == ***pass***))
})
output$result <- renderTable(table(), rownames = FALSE)
}
# App ---
shinyApp(ui = ui, server = server)

换句话说,有没有办法在过滤函数中使用ifelse在一定条件下不过滤?

谢谢!

如果您希望根据外部值有条件地应用 filter,则可以尝试使用语法:

TRUE

table <- reactive({
test_data %>%
filter(if(input$status != 'All')  (status == input$status) else TRUE)
}) 

TRUE作为条件传递不会筛选任何行。

{}

替代方法使用{}并返回未触及的数据集:else .

table <- reactive({
test_data %>%
{if(input$status != 'All') filter(status == input$status) else .}
}) 

%<>%

最后,您可以考虑断开管道并使用magrittr包中可用的%<>%运算符:

if(input$status != 'All') test_data %<>% filter(status == input$status)

我认为这是不可能的。您可以执行以下操作:

if(input$status!="All")
test_data %>% filter(status %in% input$status)
else
test_data

因此,仅当输入不是"全部"时,您才会进行过滤。如果你有一个很长的dplyr链,并且你不想把它分成几块,你也可以这样做:

if(input$status=="All")
my_filter=unique(test_data$status)
else
my_filter = input$status
test_data %>%
filter(status %in% my_filter) %>%
..... %>%
.....

希望这有帮助。

怎么样:

table <- reactive({
test_data %>%
filter(status == input$status | input$status == 'All')
}) 

最新更新