javascript - R shinydashboard - 根据用户输入显示/隐藏多个菜单项
问题描述
这个想法是有一个用户输入(访问代码),基于它可以访问不同的菜单项。所以基本上我们有一个基于用户需求的定制版本的应用程序。
3 个 menuItems 的工作示例如下:
library(shiny)
library(shinydashboard)
library(shinyjs)
ui <- dashboardPage(
dashboardHeader(title = "SHOW/HIDE MULTIPLE MENU ITEMS"),
dashboardSidebar(
useShinyjs(),
sidebarMenu(
id = "tabs",
hidden(
menuItem("MENU ITEM 1", tabName = "mi1"),
menuItem("MENU ITEM 2", tabName = "mi2"),
menuItem("MENU ITEM 3", tabName = "mi3")
),
textInput(inputId = "accessToken", label = "Access Code", value = "Show/Hide Menu Items.")
)
),
dashboardBody()
)
server <- function (input, output, session){
observeEvent(input$accessToken,{
if(input$accessToken == "001"){
hide(selector = "ul li:eq(0)")
hide(selector = "ul li:eq(1)")
show(selector = "ul li:eq(2)")
} else if (input$accessToken == "010"){
hide(selector = "ul li:eq(0)")
show(selector = "ul li:eq(1)")
hide(selector = "ul li:eq(2)")
} else if (input$accessToken == "011"){
hide(selector = "ul li:eq(0)")
show(selector = "ul li:eq(1)")
show(selector = "ul li:eq(2)")
} else if (input$accessToken == "100"){
show(selector = "ul li:eq(0)")
hide(selector = "ul li:eq(1)")
hide(selector = "ul li:eq(2)")
} else if (input$accessToken == "101"){
show(selector = "ul li:eq(0)")
hide(selector = "ul li:eq(1)")
show(selector = "ul li:eq(2)")
} else if (input$accessToken == "110"){
show(selector = "ul li:eq(0)")
show(selector = "ul li:eq(1)")
hide(selector = "ul li:eq(2)")
} else if (input$accessToken == "111"){
show(selector = "ul li:eq(0)")
show(selector = "ul li:eq(1)")
show(selector = "ul li:eq(2)")
} else{
hide(selector = "ul li")
}
})
}
shinyApp(ui, server)
对于唯一访问代码可见的 3 个菜单项的所有组合,这都非常有效。
但是正如您所看到的,这是用于访问 3 个菜单项的大量重复代码。
实际上,我有 10 个甚至更多的 menuItems,因此总体上 if else 语句的数量将呈指数增长。
我尝试过的:
我想到了这个逻辑:对于 10 个菜单项,有一个 10 位的访问代码,其中每个数字的值可以是 0(隐藏)或 1(显示)。
observeEvent(input$accessToken, {
tokenStr <- input$accessToken
tokenStrShow <- which(strsplit(tokenStr, "")[[1]]=="1")
tokenStrHide <- which(strsplit(tokenStr, "")[[1]]=="0")
for (i in tokenStrShow){
# some logic to show all menuItems with value 1
# FOLLOWING DOESNOT WORK
# paste0("show(selector='ul li:eq(",i,")'")
}
})
我还遇到了我正在尝试实现的这个javascript 逻辑。但我不知道如何在 Shiny 中做到这一点。
解决方案
sidebarMenu
这是一个动态使用renderUI
和增长的想法uiOutput
。如果选项卡数量增加,转换为 for 循环也相当简单。
library(shiny)
library(shinydashboard)
library(shinyjs)
ui <- dashboardPage(
dashboardHeader(title = "SHOW/HIDE MULTIPLE MENU ITEMS"),
dashboardSidebar(
useShinyjs(),
uiOutput('sidebar'),
textInput(inputId = "accessToken", label = "Access Code", placeholder = "Show/Hide Menu Items.")
),
dashboardBody()
)
server <- function (input, output, session){
output$sidebar <- renderUI({
menu_items = list()
if(substr(input$accessToken,1,1)=='1')
menu_items[[length(menu_items)+1]] = menuItem("MENU ITEM 1", tabName = "mi1")
if(substr(input$accessToken,2,2)=='1')
menu_items[[length(menu_items)+1]] = menuItem("MENU ITEM 2", tabName = "mi2")
if(substr(input$accessToken,3,3)=='1')
menu_items[[length(menu_items)+1]] = menuItem("MENU ITEM 3", tabName = "mi3")
print(menu_items)
sidebarMenu(id = "tabs",menu_items)
})
}
shinyApp(ui, server)
希望这可以帮助!
推荐阅读
- javascript - 如何将数百个 JS 对象属性放入数组中以用作 chart.js 轴/数据
- sql - SQL 完整性检查在更新和插入时不同
- javascript - 使用 getElementsByClassName() 方法获取匹配类的前 x 个元素
- java - 当条件为真时将元素从一个数组插入另一个数组
- javascript - 使用AngularJS显示php读取的mongodb数据
- java - 使用分布式计数器提高性能,寻找库
- sql - 从 Excel 文件生成 SQL 脚本(带有多个工作表)
- c# - 如何在私有存储中存储 SSL/TLS 证书
- svg - 置换贴图过滤器不适用于旋转对象
- php - 删除 PHPexcel 中的空第一行