2017-08-22 22 views
1

私はShinyアプリリアクティブ関数でdplyrを使用しています。私はUIにインタラクティブなウィジェットを持っており、ユーザはステータスを選択することができ、選択されたステータスに基づいてデータが表示されます。しかし、私はまた、すべてを表示するオプションを与えたいと思っています。これは私が「All」と呼んだ状態です。Shinyのリアクティブ関数でdplyr条件付きフィルタを使用

私は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フィルタ機能を特定の条件でフィルタリングしない方法はありますか?

ありがとうございます!

答えて

1

私はそれが可能ではないと思います。

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) %>% 
    ..... %>% 
    ..... 

は、この情報がお役に立てば幸いです。

+1

ありがとうございました。あなたが投稿した最初の例はelseを必要とし、それ以外の場合はオプション 'All'を使って空のテーブルを表示しました - 私はそれを反映するためにあなたの投稿を編集しました。 投稿した2番目の例が気に入っています。 –

関連する問題