R Shiny 中的 SelectizeInput 过滤
SelectizeInput filtering in R Shiny
我有两个问题:
1)我想知道是否可以根据先前的输入进行一列选择。
请看代码,我会解释我的意思:
library(shiny)
Country <- c("USA", "Mexico", "Canada", "China", "Vietnam", "India", "France", "Germany", "Poland")
Region <- c("Americas", "Americas", "Americas", "Asia", "Asia", "Asia", "Europe", "Europe", "Europe")
Product <- c(11, 22, 33, 44, 55, 66, 77, 88, 99)
Date <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
DF <- cbind(Region, Country, Product, Date)
DF <- as.data.frame(DF)
Region <- as.factor(sort(unique(DF$Region)))
Country <- as.factor(sort(unique(DF$Country)))
ui <- fluidPage(titlePanel("Filtering experiments"),
sidebarLayout(
# Sidebar panel for inputs ----
sidebarPanel(width = 3,
selectizeInput("RegionSelect", "Region", Region, selected = NULL, multiple = TRUE),
selectizeInput("CountrySelect", "Country", Country, selected = NULL, multiple = TRUE)),
# Main panel for displaying outputs ----
mainPanel( fluidPage( box(width = 12, tableOutput("table")) ) ) ) )server <- function(input, output) {
output$table <- renderTable({
filtered <- DF
if (!is.null(input$RegionSelect)) {filtered <- filtered %>% filter(Region == input$RegionSelect)}
if (!is.null(input$CountrySelect)) {filtered <- filtered %>% filter(Country == input$CountrySelect)}
Total <- data.frame(filtered$Product)
ShowTable <- data.frame(cbind(Total))
ShowTable
})}shinyApp(ui, server)
无论何时将区域选择为 "Americas",用户仍会看到所有国家/地区,而不仅仅是美国、加拿大和墨西哥。
我尝试通过如下过滤来修复它:
selectizeInput("CountrySelect", "Country", as.factor(sort(unique(filtered$Country %>% filter(Region == input$RegionSelect)}))), selected = NULL, multiple = TRUE))
但是没有成功,所以我希望你有一些想法。
2) 即使“multiple = TRUE”,只要在同一输入行中选择了 2 个或更多输入,应用程序就会停止工作。
提前致谢!
您可以添加一个 updateSelectInput
,像这样:
observe({
region <- input$RegionSelect
req(region)
updateSelectInput(session, "CountrySelect",
choices = filter(DF, Region == !!region)$Country)
})
此外,请修复您的(几乎)工作示例:您需要一个 library(dplyr)
,并删除 box
(因为它仅来自 shinydashboard
,您没有使用它) .
您可以使用updateSelectizeInput
根据另一个输入的值更新selectizeInput
的内容。
请注意,使用 observeEvent
比 observe
语句更好(有关详细信息,请参阅 here)。
library(shiny)
library(dplyr)
Country <- c("USA", "Mexico", "Canada", "China", "Vietnam", "India", "France", "Germany", "Poland")
Region <- c("Americas", "Americas", "Americas", "Asia", "Asia", "Asia", "Europe", "Europe", "Europe")
Product <- c(11, 22, 33, 44, 55, 66, 77, 88, 99)
Date <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
DF <- cbind(Region, Country, Product, Date)
DF <- as.data.frame(DF)
Region <- as.factor(sort(unique(DF$Region)))
Country <- as.factor(sort(unique(DF$Country)))
ui <- fluidPage(titlePanel("Filtering experiments"),
sidebarLayout(
# Sidebar panel for inputs ----
sidebarPanel(
width = 3,
selectizeInput(
"RegionSelect",
"Region",
Region,
selected = NULL,
multiple = TRUE
),
selectizeInput(
"CountrySelect",
"Country",
Country,
selected = NULL,
multiple = TRUE
)
),
# Main panel for displaying outputs ----
mainPanel(fluidPage(
width = 12, tableOutput("table")
))
))
server <- function(input, output, session) {
observeEvent(input$RegionSelect, {
req(input$RegionSelect)
test <- DF %>%
filter(Region %in% input$RegionSelect) %>%
select(Country)
updateSelectizeInput(session,
inputId = "CountrySelect",
choices = test)
})
output$table <- renderTable({
# Uncomment the two lines with comments if you want to make it mandatory to chose a continent to show the table
# req(input$RegionSelect)
req(input$CountrySelect)
DF %>%
# filter(Region %in% input$RegionSelect) %>%
filter(Country %in% input$CountrySelect)
})}
shinyApp(ui, server)
我有两个问题: 1)我想知道是否可以根据先前的输入进行一列选择。 请看代码,我会解释我的意思:
library(shiny)
Country <- c("USA", "Mexico", "Canada", "China", "Vietnam", "India", "France", "Germany", "Poland")
Region <- c("Americas", "Americas", "Americas", "Asia", "Asia", "Asia", "Europe", "Europe", "Europe")
Product <- c(11, 22, 33, 44, 55, 66, 77, 88, 99)
Date <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
DF <- cbind(Region, Country, Product, Date)
DF <- as.data.frame(DF)
Region <- as.factor(sort(unique(DF$Region)))
Country <- as.factor(sort(unique(DF$Country)))
ui <- fluidPage(titlePanel("Filtering experiments"),
sidebarLayout(
# Sidebar panel for inputs ----
sidebarPanel(width = 3,
selectizeInput("RegionSelect", "Region", Region, selected = NULL, multiple = TRUE),
selectizeInput("CountrySelect", "Country", Country, selected = NULL, multiple = TRUE)),
# Main panel for displaying outputs ----
mainPanel( fluidPage( box(width = 12, tableOutput("table")) ) ) ) )server <- function(input, output) {
output$table <- renderTable({
filtered <- DF
if (!is.null(input$RegionSelect)) {filtered <- filtered %>% filter(Region == input$RegionSelect)}
if (!is.null(input$CountrySelect)) {filtered <- filtered %>% filter(Country == input$CountrySelect)}
Total <- data.frame(filtered$Product)
ShowTable <- data.frame(cbind(Total))
ShowTable
})}shinyApp(ui, server)
无论何时将区域选择为 "Americas",用户仍会看到所有国家/地区,而不仅仅是美国、加拿大和墨西哥。
我尝试通过如下过滤来修复它:
selectizeInput("CountrySelect", "Country", as.factor(sort(unique(filtered$Country %>% filter(Region == input$RegionSelect)}))), selected = NULL, multiple = TRUE))
但是没有成功,所以我希望你有一些想法。
2) 即使“multiple = TRUE”,只要在同一输入行中选择了 2 个或更多输入,应用程序就会停止工作。
提前致谢!
您可以添加一个 updateSelectInput
,像这样:
observe({
region <- input$RegionSelect
req(region)
updateSelectInput(session, "CountrySelect",
choices = filter(DF, Region == !!region)$Country)
})
此外,请修复您的(几乎)工作示例:您需要一个 library(dplyr)
,并删除 box
(因为它仅来自 shinydashboard
,您没有使用它) .
您可以使用updateSelectizeInput
根据另一个输入的值更新selectizeInput
的内容。
请注意,使用 observeEvent
比 observe
语句更好(有关详细信息,请参阅 here)。
library(shiny)
library(dplyr)
Country <- c("USA", "Mexico", "Canada", "China", "Vietnam", "India", "France", "Germany", "Poland")
Region <- c("Americas", "Americas", "Americas", "Asia", "Asia", "Asia", "Europe", "Europe", "Europe")
Product <- c(11, 22, 33, 44, 55, 66, 77, 88, 99)
Date <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
DF <- cbind(Region, Country, Product, Date)
DF <- as.data.frame(DF)
Region <- as.factor(sort(unique(DF$Region)))
Country <- as.factor(sort(unique(DF$Country)))
ui <- fluidPage(titlePanel("Filtering experiments"),
sidebarLayout(
# Sidebar panel for inputs ----
sidebarPanel(
width = 3,
selectizeInput(
"RegionSelect",
"Region",
Region,
selected = NULL,
multiple = TRUE
),
selectizeInput(
"CountrySelect",
"Country",
Country,
selected = NULL,
multiple = TRUE
)
),
# Main panel for displaying outputs ----
mainPanel(fluidPage(
width = 12, tableOutput("table")
))
))
server <- function(input, output, session) {
observeEvent(input$RegionSelect, {
req(input$RegionSelect)
test <- DF %>%
filter(Region %in% input$RegionSelect) %>%
select(Country)
updateSelectizeInput(session,
inputId = "CountrySelect",
choices = test)
})
output$table <- renderTable({
# Uncomment the two lines with comments if you want to make it mandatory to chose a continent to show the table
# req(input$RegionSelect)
req(input$CountrySelect)
DF %>%
# filter(Region %in% input$RegionSelect) %>%
filter(Country %in% input$CountrySelect)
})}
shinyApp(ui, server)