2017-03-12 11 views
0

Shiny Appにフィルタを入れる方法はありますか?Shinyは、すべてのデータを表示するように選択されていないと知っていますか?R - Shiny Filter for 'All'の値

次のようになりますアプリ生成
library(ggplot2) 
library(shiny) 
library(dplyr) 
diamonds <- diamonds 

#Unique cut dropdown 
cut <- sort(unique(diamonds$cut)) 

#Unique color 
color <- sort(unique(diamonds$color)) 

#Unique clarity 
clarity <- sort(unique(diamonds$clarity)) 

#Shiny App 

ui <- fluidPage(
    titlePanel("diamonds"), 
    fluidRow(
    column(3, 
     selectizeInput("CutSelect", "Cut", cut, selected = NULL, multiple = TRUE), 
     br(), 
     selectInput("ColorSelect", "Color", color), 
     br(), 
     selectInput("ClaritySelect", "Clarity", clarity) 
), 
tableOutput("results") 
) 
) 
server <- function(input, output) { 
output$results <- renderTable({ 
filtered <- 
    diamonds %>% 
    filter(cut == input$CutSelect, 
     color == input$ColorSelect, 
     clarity == input$ClaritySelect) 
filtered 
}) 
} 

shinyApp(ui = ui, server = server) 

:たとえば、ggplot2diamondsデータを使用して、私は次のように構築したデータを掃除しないと

enter image description here

を、方法があります「All」演算子をフィルタに追加すると、そのディメンションのフィルタがあるにもかかわらず、「All」が便利なインスタンスがあることがアプリに分かります。

カットの場合は、具体的には、selectizeInputを空白のままにしておくと、「すべて」または「フィルタなし」のタイプの取引として動作させることができます。

さらに役立つ情報を提供していただき、幸いです。

ありがとうございました。

答えて

0

selectInput戻りNULLので、あなたはselectInput(すなわち1つ以上の値が選択されています)NULLない場合にのみフィルタリングを行うことができます:

server <- function(input, output) { 
    output$results <- renderTable({ 
    filtered <- diamonds 
    if (!is.null(input$CutSelect)) { 
     filtered <- filtered %>% filter(cut == input$CutSelect) 
    } 
    if (!is.null(input$ColorSelect)) { 
     filtered <- filtered %>% filter(color == input$ColorSelect) 
    } 
    if (!is.null(input$ClaritySelect)) { 
     filtered <- filtered %>% filter(clarity == input$ClaritySelect) 
    } 
    filtered 
    }) 
} 

その方法selectInputが空の場合(NULL)そのディメンションに対してフィルタリングは実行されません。

+0

これは素晴らしいスタートです.Kristoffer!さらに一歩進めていくために、もう少し停滞した入力が増え、計算の選択が必要な場合はどうすればよいでしょうか?たとえば、入力を必要とする 'carat'の数値入力を追加し、' carat> =# 'のみを返すと、' numericInput'はすでに持っているものとどのように動作するのでしょうか? – gav

+0

Shiny [sliderInput](https://shiny.rstudio.com/reference/shiny/latest/sliderInput.html)を使用して、その入力から最大値と最小値をフィルタリングすることができます。 –

+0

上記のコードには、どのようなコードが追加されていますか?今、別の入力を追加したい場合に問題に遭遇しています。 IF文の後にコードが終了するため、これらのフィルタが認識されないことに注意してください。 – gav

2

データを表示/フィルタリングする場合は、DTを使用することをおすすめします。 DTにはフィルタオプションが組み込まれています。このオプションを使用すると、テーブル内の値の1つまたは複数の値をフィルタリングできます。フィルターをテーブルの上部または下部に置くことができます。あなたの目的に合ったコードは次のとおりです。

library(ggplot2) 
library(shiny) 
library(DT) 
diamonds <- diamonds 

#Shiny App 

ui <- fluidPage(
      titlePanel("diamonds"), 
     fluidRow(
      dataTableOutput("results") 
     ) 
    ) 
server <- function(input, output) { 
    output$results <- DT::renderDataTable(filter='top',{ 
     diamonds 
    }) 
} 

shinyApp(ui = ui, server = server) 
+0

ああ、これは面白い!ありがとう、Hrant。メトリックのフィルタリングをオフにしてディメンションに対してのみ使用する方法はありますか?または、この例では、列フィルタリングのためのすべてまたは何もタイプの取引でなければならないのでしょうか? – gav

+0

フィルタの領域を選択した列から完全に隠すことはできませんが、[ここ](http://rstudio.github.io/DT/009-searchable.html)に記載されているように、 。あなたの場合、次のコードが動作します: DT :: renderDataTable(** options = list(columnDefs = list(searchable = FALSE、targets = 5)))**、filter = 'top'、{ diamond }) ここで、5はフィルタリングオプションを無効にする列番号です。 –