首页 > 解决方案 > selectInput R Shiny中的动态组数

问题描述

我需要帮助完成一项任务。我有数据框:

df <- data.frame(
  UserGroup = c("UserGroup1", "UserGroup2", "UserGroup2", "UserGroup3", "UserGroup3", "UserGroup3", NA, NA, NA, NA),
  User = c("User1", "User2", "User3", "User4", "User5", "User6", "User7", "User8", "User9", "User10")
)

我想获得如下图所示的 selectInput 版本。

在此处输入图像描述

我找到了代码:

    selectInput("state", "Choose a state:",
       list(
          `East Coast` = list("NY", "NJ", "CT"),
          `West Coast` = list("WA", "OR", "CA"),
          `Midwest` = list("MN", "WI", "IA") 
       )
    )

手动操作很容易,但问题是 df 是来自数据库的数据框,它可以包含随机数量的组和用户。有谁知道如何编写 selectInput 的代码或如何在自动获得预期效果之前准备数据?

标签: shinyselectinput

解决方案


这里所说,您可以使用split(). 显然,当一个组包含单个观察时,它不会很好地工作,所以我添加User1 bis了给你看。此外,您需要为组为的人创建一个类别NA(我在此处放置“无组”,以便它按字母顺序排列在输入列表的末尾)。

library(shiny)
library(dplyr)

df <- data.frame(
  UserGroup = c("UserGroup1", "UserGroup1", "UserGroup2", "UserGroup2", "UserGroup3", "UserGroup3", "UserGroup3", NA, NA, NA, NA),
  User = c("User1", "User1 bis", "User2", "User3", "User4", "User5", "User6", "User7", "User8", "User9", "User10")
)

df_2 <- df %>%
  mutate(UserGroup = ifelse(is.na(UserGroup), "Without Group", UserGroup)) 

ui <- fluidPage(
  selectInput("state", "Choose a state:",
              choices = split(df_2$User, df_2$UserGroup),
              selected = "User 1"
  )

)

server <- function(input, output, session) {}

shinyApp(ui, server)

推荐阅读