r - 如何在 R Shiny 应用程序中使相关的服务器端选择 UI 元素?
问题描述
我有带有两个 UI 选择器的 R Shiny 应用程序,每个选择器都有一个很大的项目列表。我知道如何为一个元素制作服务器端元素。但是如何制作两个相关的服务器端'selectInput'元素。因此,当一个元素发生变化时 - 另一个应该适当反映。
例子。
第一个列表有 97,310 个元素。
第二个列表应该有:
2.1。对于第一个元素“Aaban” - 2 个相关值 (10, 11)
2.2. 对于第二个元素“Aabha” - 1 个相关值 (12)
2.3. 对于第三个元素“Aabid” - 3 个相关值(13、14、15)
这是R代码。
library(shiny)
library(dplyr)
library(babynames)
# 1. Data sets
# 1.1. First data set (list)
list_names <- babynames::babynames %>%
distinct(name) %>%
pull(name) %>%
sort()
# 1.2. Second data set (data frame) for 3 first 'names' elements
df_ages <- data.frame(
name = c("Aaban", "Aaban", "Aabha", "Aabid", "Aabid", "Aabid"),
age = c(10, 11, 12, 13, 14, 15))
# 2. UI
ui <- fluidPage(
fluidRow(selectInput("si_name", "Name", multiple = FALSE, choices = character(0))),
fluidRow(selectInput("si_age", "Age", multiple = FALSE, choices = character(0))))
# 3. Server
server <- function(input, output, session) {
updateSelectizeInput(session, "si_name", choices = list_names, server = TRUE)
updateSelectizeInput(session, "si_age", choices = df_ages$age, server = TRUE)
}
# 4. App
shinyApp(ui, server)
谢谢!
解决方案
我想你想要:
# 2. UI
ui <- fluidPage(
fluidRow(selectInput("si_name", "Name", multiple = FALSE,
choices = unique(df_ages$name))),
fluidRow(selectInput("si_age", "Age", multiple = FALSE, choices = character(0)))
)
# 3. Server
server <- function(input, output, session) {
observeEvent(input$si_name, {
ages <- df_ages[df_ages$name == input$si_name, "age"]
updateSelectizeInput(session, "si_age", choices = ages, server = TRUE)
})
}
推荐阅读
- javascript - 如何以编程方式将新子代添加到深度嵌套的对象中
- python - 在张量流中处理一批不同形状的张量
- excel - Excel VBA - 网页抓取 - 跟踪包裹 - 处理跟踪号不正确的错误
- typescript - 映射类型后的方括号表达式有什么作用?
- python - 在python中的字符串时间和int数据类型之间传递空格
- swift - 未使用传递给 Swift 闭包的参数
- ios - Xcode 12:test.a(dataCollectKey.o),为 iOS 模拟器构建,但在为 macOS 构建的目标文件中链接,用于架构 x86_64
- javascript - 如何 v-for 检查值
- sql - 在 SQL 中合并 csv 文件,然后更新到现有表
- amazon-web-services - git-diff 代码推送后对 CodeCommit 存储库的操作以使用 AWS Lambda 获取 diff 文件