gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:25:48 25 4
gpt4 key购买 nike

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

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 个甚至更多的 menuItem,所以总的来说 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 - R shinydashboard - 根据用户输入显示/隐藏多个菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51946319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com