Поскольку вы используете множественный выбор, вам нужно изменить фильтр, чтобы использовать оператор %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)