javascript - Rshinydashboard-根据用户输入显示/隐藏多个菜单项

标签 javascript r shiny shinydashboard shinyjs

这个想法是有一个用户输入(访问代码),基于该输入可以访问不同的菜单项。所以基本上我们可以根据用户的要求提供自定义版本的应用程序。

3 个菜单项的工作示例如下:

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 个甚至更多数量的菜单项,因此 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,")'")
    }
})

我还遇到过THIS我正在尝试实现的javascript逻辑。但我不知道如何在 Shiny 中做到这一点。

最佳答案

这里有一个使用 renderUIuiOutput 动态扩展 sidebarMenu 的想法。如果选项卡数量增加,转换为 for 循环也相当简单。


enter image description here

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 - Rshinydashboard-根据用户输入显示/隐藏多个菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51946319/

相关文章:

javascript - 如何转义 JSON 中的反斜杠?

javascript - 转换对象数组

r - 将 libpq.5.dylib 复制到/usr/lib/libpq.5.dylib

r - 具有多个输入的 Shiny 渲染UI

javascript - 使用 JS 库实时编辑模板?

javascript - 如何使用 Javascript 在 createElement 输入上设置表单属性

R代码为 'tidy'离散变量的值

java - rJava 安装错误 "JAVA_HOME cannot be determined from the Registry"

javascript - 向 DT 表的父行添加图标

r - 无法使用 Shinyjs() 禁用 Shiny 的应用程序单选按钮