2017-08-22 1 views
1

Ich verwende dplyr in einer Shiny App reaktive Funktion. Ich habe ein interaktives Widget in der Benutzeroberfläche, mit dem Benutzer den Status auswählen können. Daten werden basierend auf dem ausgewählten Status angezeigt. Ich möchte jedoch auch die Möglichkeit geben, alles anzuzeigen, was ein Status ist, den ich "Alle" genannt habe.Verwenden Sie dplyr bedingten Filter in reaktive Funktion in Shiny

Ich weiß, wie dies ohne dplyr zu erreichen:

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) 

jedoch, würde ich mit dem Rest meines Codes konsistent sein mögen und verwenden dplyr. Gibt es eine Möglichkeit, etwas wie das Folgende zu tun?

Mit anderen Worten, gibt es eine Möglichkeit, innerhalb der Filterfunktion zu verwenden, um nicht unter einer bestimmten Bedingung zu filtern?

Danke!

Antwort

1

Ich glaube nicht, dass das möglich ist. Sie könnten folgendermaßen vorgehen:

Sie filtern nur, wenn der Eingang nicht "All" ist. Wenn Sie eine sehr lange dplyr Kette haben, und Sie wollen es nicht in Stücke zu brechen, können Sie auch tun:

if(input$status=="All") 
    my_filter=unique(test_data$status) 
else 
    my_filter = input$status 

test_data %>% 
    filter(status %in% my_filter) %>% 
    ..... %>% 
    ..... 

Hoffnung, das hilft.

+1

Danke. Das erste Beispiel, das Sie gepostet haben, benötigte ein anderes, ansonsten wurde eine leere Tabelle mit der Option "Alle" gedruckt. Ich habe Ihren Beitrag bearbeitet, um das zu berücksichtigen. Ich mag das zweite Beispiel, das Sie gepostet haben. –

Verwandte Themen