R Shiny Help: Барный график с 2+ фильтрами - PullRequest
0 голосов
/ 20 декабря 2018

Я создал простое приложение Shiny, которое выводит числовой вывод на гистограмму, используя различные фильтры;фильтр, который позволяет пользователю выбирать «имя» и «тип», связанные с этим именем.Фильтр «name» включает множественный выбор, фильтр «type» - нет.Все работает отлично, за исключением того, что я понимаю, что то, как я структурировал свой код, не позволяет мне отображать все различные комбинации, которые я хотел бы.

#----df creation
name<-c("a","a","b","b","c","c")
type<-c("red","blue","blue","green","green","orange")
number<-c(30,20,42,16,23,62)
cbind(name,type,number)->df
as.data.frame(df)->df
unique(df$name)->name
unique(df$type)->type

#----shiny app
library(shiny)
library(dplyr)
library(ggplot2)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput(
        inputId = "name",
        label = "Name Selection",
        choices = name,
        selected = "a",
        multiple = TRUE
      ),
      radioButtons(
        inputId = "type",
        label = "Type Select",
        choices = type,
        selected = "red"
      )
    ),
    mainPanel(
      plotOutput(
        outputId = "graph"
      )
    )
  )

)

server <- function(input, output) {

  output$graph <- renderPlot({

    filtered <- 
      df %>%
      filter(name == input$name) %>%
      filter(type == input$type)

    ggplot(filtered,aes(x=name,y=number)) + geom_bar(stat = "identity")

  })


 }

 shinyApp(ui = ui, server = server)

Приведенный выше код позволяет мне выбрать несколько имен и разных типов, однако он отображается в зависимости от порядка.Например, попробуйте выбрать «a», затем «b», а затем «blue» в качестве типа.Нет графика.Теперь попробуйте то же самое в обратном порядке: «b», затем «a», «синий» как тип.Желаемый вывод производится.Есть идеи, что здесь происходит?Спасибо всем.

1 Ответ

0 голосов
/ 20 декабря 2018

Поскольку вы используете множественный выбор, вам нужно изменить фильтр, чтобы использовать оператор %in%:

Проверка на равенство между двумя векторами приводит к парному сравнению, рециркулируя более короткий вектор, еслинеобходимо.Обратите внимание на предупреждение, приведенное ниже, о том, что более короткий вектор не делится красиво на более крупный:

a <- c(2,1)
b <- c(1,2,3)

a == b # [1] FALSE FALSE FALSE
       # Warning message:
       # In a == b : longer object length is not a multiple of shorter 
       # object length

a %in% b # [1] TRUE TRUE

Кроме того, ваше назначение справа (->) в строках 5-8, хотя и не так, как правило, осуждают, хотя я уверен, что люди будут защищать его использование.

Я считаю, что это то, что вы ищете:

#----df creation
name<-c("a","a","b","b","c","c")
type<-c("red","blue","blue","green","green","orange")
number<-c(30,20,42,16,23,62)
cbind(name,type,number)->df
as.data.frame(df)->df
unique(df$name)->name
unique(df$type)->type

#----shiny app
library(shiny)
library(dplyr)
library(ggplot2)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput(
        inputId = "name",
        label = "Name Selection",
        choices = name,
        selected = "a",
        multiple = TRUE
      ),
      radioButtons(
        inputId = "type",
        label = "Type Select",
        choices = type,
        selected = "red"
      )
    ),
    mainPanel(
      plotOutput(
        outputId = "graph"
      )
    )
  )

)

server <- function(input, output) {

  output$graph <- renderPlot({

    filtered <- 
      df %>%
      filter(name %in% input$name) %>%
      filter(type == input$type)

    ggplot(filtered,aes(x=name,y=number)) + geom_bar(stat = "identity")

  })


}

shinyApp(ui = ui, server = server)
...