在shinydashboard中动态创建可排序的menuSubItems [英] Dynamically create sortable menuSubItems in shinydashboard
本文介绍了在shinydashboard中动态创建可排序的menuSubItems的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
shinydashboard
包,其中我在sidebarMenu
的sidebarMenu
中动态创建menuSubItem
。子项的创建由一个actionButton触发。我可以在服务器端很好地创建menuSubItem
,但我也希望使用sortable
包和sortable_js
函数使它们可排序。不过,我似乎就是想不出应该把sortable_js
函数放在哪里才能让它真正起作用。
这是我的MRE:
library(shiny)
library(shinydashboard)
library(sortable)
# Define UI for shinydashboard
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
sidebarMenu(
menuItem("tab_one", tabName = "test_body"),
menuItemOutput("test"),
id = "sidebar"
)
),
dashboardBody(
tabItem("test_body",
actionButton("click_me", "Click Me"))
)
)
# Define server logic to dynamically create menuSubItems
server <- function(input, output) {
observeEvent(input$click_me, {
tabs_list <-
lapply(1:5, function(x) {
menuSubItem(text = paste("tab", x))
})
output$test <- renderMenu({
menuItem("test_tabs", do.call(tagList, tabs_list))
})
sortable_js("test_tabs")
})
}
# Run the application
shinyApp(ui = ui, server = server)
非常感谢您的帮助
HTML
sortable_js()
函数生成推荐答案,因此需要将其包含在UI中。但是,您还必须确保它包含在应用它的元素已经存在之后;否则它将不起作用。在这里,我们可以将其添加到renderMenu()
调用的输出中,作为使用menuItem()
:
output$test <- renderMenu({
menu <- menuItem("test_tabs", do.call(tagList, tabs_list))
tagAppendChildren(menu, sortable_js("test_tabs"))
})
现在,您提供给sortable_js()
的id必须是要使其子项可排序的元素的css id。在本例中,它是menuItem()
中的ul
元素,它包含所有子项。遗憾的是,在创建菜单项时无法直接设置此id,因此我们必须在创建菜单项后注入它。快速查看menuItem()
源代码就会发现,ul
标记是菜单项标记的第二个子标记:
output$test <- renderMenu({
menu <- menuItem("test_tabs", do.call(tagList, tabs_list))
menu$children[[2]] <- tagAppendAttributes(menu$children[[2]], id = "test_tabs")
tagAppendChildren(menu, sortable_js("test_tabs"))
})
通过这些修改,您的示例将启动并运行:
library(shiny)
library(shinydashboard)
library(sortable)
# Define UI for shinydashboard
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
sidebarMenu(
menuItem("tab_one", tabName = "test_body"),
menuItemOutput("test")
)
),
dashboardBody(
tabItem("test_body", actionButton("click_me", "Click Me"))
)
)
# Define server logic to dynamically create menuSubItems
server <- function(input, output) {
observeEvent(input$click_me, {
tabs_list <- lapply(1:5, function(x) {
menuSubItem(text = paste("tab", x))
})
output$test <- renderMenu({
menu <- menuItem("test_tabs", do.call(tagList, tabs_list))
menu$children[[2]] <- tagAppendAttributes(menu$children[[2]], id = "test_tabs")
tagAppendChildren(menu, sortable_js("test_tabs"))
})
})
}
# Run the application
shinyApp(ui = ui, server = server)
创建于2019-10-16reprex package(v0.3.0)
这篇关于在shinydashboard中动态创建可排序的menuSubItems的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文