R Shiny - 如何通过 checkboxGroupInput 进行过滤
R Shiny - How to filter by checkboxGroupInput
我设置了以下 Shiny 代码:
global.R:
library(shiny)
library(gapminder)
library(tidyverse)
library(scales)
ui.R:
fluidPage(
titlePanel("Gapminder Hierarchical Clustering of Countries"),
sidebarLayout(
sidebarPanel(
sliderInput("numCluster", "Choose number of clusters:", 2, 6, 2),
checkboxGroupInput("ContinentSelect", "Select which continents to include in the cluster analysis:",
choices = levels(gapminder$continent), selected = levels(gapminder$continent)),
sliderInput("numYear", "Select years to include in the cluster analysis:", min(gapminder$year), max(gapminder$year),
c(min(gapminder$year), max(gapminder$year)), step = 5, ticks = FALSE, sep = "")
),
mainPanel(
plotOutput("Chart"),
br(),br(),
tableOutput("SummaryClusters")
)
)
)
和server.R:
function(input, output){
gapcluster <- function(df, numCluster){
df_scaled <- df %>% mutate(scale_lifeExp = scale(lifeExp),
scale_pop = scale(pop),
scale_gdpPercap = scale(gdpPercap))
gapclusters <- df_scaled[,c("scale_lifeExp", "scale_pop", "scale_gdpPercap")] %>% dist() %>% hclust()
Clustercut <- cutree(gapclusters, numCluster)
return(Clustercut)
}
#Creating a data frame based on inputs
filtered_gap <- reactive({ #If no continents are selected
if (is.null(input$ContinentSelect)) {
return(NULL)
}
gapminder %>%
filter(year >= input$numYear[1],
year <= input$numYear[2],
continent == input$ContinentSelect)
})
filtered_gap2 <- reactive({
filtered_gap() %>% mutate(cluster_group = gapcluster(filtered_gap(), input$numCluster),
country = reorder(country, -1 * pop)) %>%
arrange(year, country)
})
SummaryTable <- reactive({
if (is.null(input$ContinentSelect)) {
return(NULL)
}
filtered_gap2() %>% group_by(cluster_group) %>% summarise(`Number of countries` = n(),
`Life expectancy` = mean(lifeExp),
`Population size` = prettyNum(mean(pop), big.mark = ","),
`GDP per capita` = prettyNum(mean(gdpPercap), big.mark = ",")) %>%
rename(`Cluster Group` = cluster_group)
})
output$Chart <- renderPlot({
if (is.null(filtered_gap2())) {
return()
}
filtered_gap2() %>% ggplot(aes(x = gdpPercap, y = lifeExp, fill = country)) +
scale_fill_manual(values = country_colors) +
facet_wrap(~ cluster_group) +
geom_point(aes(size = pop), pch = 21, show.legend = FALSE) +
scale_x_log10(limits = c(230, 115000), labels = comma) +
scale_size_continuous(range = c(1,40)) + ylim(c(20, 87)) +
labs(x = "GDP per capita", y = "Life Expectancy")
})
output$SummaryClusters <- renderTable({
SummaryTable()
})
}
大陆的过滤方式存在问题。在默认设置下,我们可以看到 table 中共有 344 个国家。但如果我取消选中大洋洲,这个数字就会上升(?)到 420 个国家/地区。到底是怎么回事?我相当确定问题与 server.R 文件中的 filter(continent == input$ContinentSelect)
行有关,但我不知道如何解决它。
当我将 filter(continent == input$ContinentSelect)
更改为 filter(continent %in% input$ContinentSelect)
时它起作用了。菜鸟错误。
我设置了以下 Shiny 代码:
global.R:
library(shiny)
library(gapminder)
library(tidyverse)
library(scales)
ui.R:
fluidPage(
titlePanel("Gapminder Hierarchical Clustering of Countries"),
sidebarLayout(
sidebarPanel(
sliderInput("numCluster", "Choose number of clusters:", 2, 6, 2),
checkboxGroupInput("ContinentSelect", "Select which continents to include in the cluster analysis:",
choices = levels(gapminder$continent), selected = levels(gapminder$continent)),
sliderInput("numYear", "Select years to include in the cluster analysis:", min(gapminder$year), max(gapminder$year),
c(min(gapminder$year), max(gapminder$year)), step = 5, ticks = FALSE, sep = "")
),
mainPanel(
plotOutput("Chart"),
br(),br(),
tableOutput("SummaryClusters")
)
)
)
和server.R:
function(input, output){
gapcluster <- function(df, numCluster){
df_scaled <- df %>% mutate(scale_lifeExp = scale(lifeExp),
scale_pop = scale(pop),
scale_gdpPercap = scale(gdpPercap))
gapclusters <- df_scaled[,c("scale_lifeExp", "scale_pop", "scale_gdpPercap")] %>% dist() %>% hclust()
Clustercut <- cutree(gapclusters, numCluster)
return(Clustercut)
}
#Creating a data frame based on inputs
filtered_gap <- reactive({ #If no continents are selected
if (is.null(input$ContinentSelect)) {
return(NULL)
}
gapminder %>%
filter(year >= input$numYear[1],
year <= input$numYear[2],
continent == input$ContinentSelect)
})
filtered_gap2 <- reactive({
filtered_gap() %>% mutate(cluster_group = gapcluster(filtered_gap(), input$numCluster),
country = reorder(country, -1 * pop)) %>%
arrange(year, country)
})
SummaryTable <- reactive({
if (is.null(input$ContinentSelect)) {
return(NULL)
}
filtered_gap2() %>% group_by(cluster_group) %>% summarise(`Number of countries` = n(),
`Life expectancy` = mean(lifeExp),
`Population size` = prettyNum(mean(pop), big.mark = ","),
`GDP per capita` = prettyNum(mean(gdpPercap), big.mark = ",")) %>%
rename(`Cluster Group` = cluster_group)
})
output$Chart <- renderPlot({
if (is.null(filtered_gap2())) {
return()
}
filtered_gap2() %>% ggplot(aes(x = gdpPercap, y = lifeExp, fill = country)) +
scale_fill_manual(values = country_colors) +
facet_wrap(~ cluster_group) +
geom_point(aes(size = pop), pch = 21, show.legend = FALSE) +
scale_x_log10(limits = c(230, 115000), labels = comma) +
scale_size_continuous(range = c(1,40)) + ylim(c(20, 87)) +
labs(x = "GDP per capita", y = "Life Expectancy")
})
output$SummaryClusters <- renderTable({
SummaryTable()
})
}
大陆的过滤方式存在问题。在默认设置下,我们可以看到 table 中共有 344 个国家。但如果我取消选中大洋洲,这个数字就会上升(?)到 420 个国家/地区。到底是怎么回事?我相当确定问题与 server.R 文件中的 filter(continent == input$ContinentSelect)
行有关,但我不知道如何解决它。
当我将 filter(continent == input$ContinentSelect)
更改为 filter(continent %in% input$ContinentSelect)
时它起作用了。菜鸟错误。