我正在读取 csv 文件,然后创建一个闪亮的仪表板,侧边栏上有一些选项卡,其中一些选项卡是静态的,其他选项卡将根据输入文件进行更改。例如,数据文件的简化版本可能如下所示:
姓名 | 扩展 | 系列 |
---|---|---|
约翰 | 8648 | 工程师 |
吉尔 | 4783 | 分析师 |
戴夫 | 3749 | 销售 |
玛丽 | 3468 | 工程师 |
我不会提前知道csv输入文件有多长,或者“系列”列中可能包含多少个不同的作业系列。在我的仪表板上,我希望在侧边栏上有选项卡,如下所示:
因此,对于这个示例输入文件,我将在侧边栏上显示如下所示的选项卡:
为了简单起见,我更改了数据,也因为实际数据很敏感。我想我已经接近得到我想要的了,但它只有在只有一种类型的员工(系列列)时才有效。如果有多个系列类型,我会收到一条错误消息:
错误:要写入的文本必须是长度为一的字符向量
此外,如果只有一种系列类型,我会在侧栏面板上获得正确的选项卡名称,但如果我单击它,它不会执行任何操作。我对 R 或 Shiny 没有太多的经验,我只在有时间的时候才研究它,所以我确信我在做一些愚蠢的事情。我已经查看了 Stack Overflow 上的许多其他条目,但我认为对于我的具体情况没有任何答案,而且我的知识还不够丰富,无法真正回答类似但不同的问题。
这是我正在使用的最新代码
读入 csv 文件后,我确定要为其创建选项卡的不同唯一系列值:
menu_list <- unique(employee_df$Series)
这是我的 UI 部分的相关部分:
ui <- dashboardPage(
dashboardHeader(title = "Employee Dashboard"),
dashboardSidebar(
sidebarMenu(id = "sidebar_menu",
menuItem("General Info", tabName = "general", icon = icon("dashboard")),
menuItemOutput("dynamic_menu"),
menuItem("Detailed Analysis", tabName = "analysis", icon = icon("dashboard"))
)
这是我的服务器部分的相关部分:
server <- function(input, output, session) {
output$dynamic_menu <- renderMenu({
menuItem(menu_list, icon = icon("dashboard"))
})
试试这个
employee_df <- read.table(text =
"Name Extension Series
John 8648 Engineer
Jill 4783 Analyst
Dave 3749 Sales
Mary 3468 Engineer
John2 8641 Engineer
Jill2 4781 Analyst
Dave2 3741 Sales
Mary2 3461 Engineer", header=T)
ui <- dashboardPage(
dashboardHeader(title = "Employee Dashboard"),
dashboardSidebar(
sidebarMenu(id = "sidebar_menu",
sidebarMenuOutput("dynamic_menu")
)
),
dashboardBody()
)
server <- function(input, output, session) {
menu_list <- unique(employee_df$Series)
output$dynamic_menu <- renderMenu({
menus <- list()
lapply(menu_list, function(tab){
mytab <- sprintf("%s",tab)
print(mytab)
menus <<- list(menus,menuItem(mytab, tabName=mytab, icon = icon("dashboard")))
})
mymenu_list <- list(
menuItem("General Info", tabName = "general", icon = icon("dashboard")),
menus,
menuItem("Detailed Analysis", tabName = "analysis", icon = icon("dashboard"))
)
sidebarMenu(.list = mymenu_list)
})
}
shinyApp(ui, server)