[英]R Shiny Help: Bar plot with 2+ filters
我創建了一個基本的Shiny應用程序,該應用程序使用不同的過濾器將數字輸出繪制為條形圖。 一個允許用戶選擇與該名稱關聯的“名稱”和“類型”的過濾器。 “名稱”過濾器已啟用多選,“類型”過濾器未啟用。 一切工作都很好,除了我意識到我構造代碼的方式不允許我繪制我想要的所有不同組合。
#----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”,“ blue”作為類型。 產生所需的輸出。 知道這里發生了什么嗎? 謝謝大家
由於使用的是單選,因此需要更改過濾器以使用%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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.