如果一个闪亮的仪表盘框是由renderUI生成的,如何查看它是否折叠?

How to see if a shiny dashboard box is collapsed if it is produced by renderUI?

提问人:Hannah 提问时间:10/31/2023 最后编辑:ismirsehregalHannah 更新时间:11/1/2023 访问量:33

问:

我的 R 闪亮应用程序中有(不同)数量的可折叠框,由 renderUI/uiOutput 生成,我想看看它们是否从服务器折叠。当框在这里的 ui 中定义时,有一个关于如何做到这一点的问题和答案,但是当我在 server-function 中创建框时,这不起作用。但是,以编程方式折叠它们仍然可以正常工作。这是它现在的样子:

library(shiny)
library(shinydashboard)
library(shinyjs)

jscode <- "
shinyjs.collapse = function(boxid) {
$('#' + boxid).closest('.box').find('[data-widget=collapse]').click();
}
"
collapseInput <- function(inputId, boxId) {
  tags$script(
    sprintf(
      "$('#%s').closest('.box').on('hidden.bs.collapse', function () {Shiny.onInputChange('%s', true);})",
      boxId, inputId
    ),
    sprintf(
      "$('#%s').closest('.box').on('shown.bs.collapse', function () {Shiny.onInputChange('%s', false);})",
      boxId, inputId
    )
  )
}

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    useShinyjs(),
    extendShinyjs(text = jscode, functions = c("collapse")),
    actionButton("bt1", "Collapse box1"),
    actionButton("bt2", "Collapse box2"),
    br(), br(),
    # This is where the boxes were defined in the original question & answer
    # box(id = "box1", collapsible = TRUE, p("Box 1")),
    # box(id = "box2", collapsible = TRUE, p("Box 2")),
    uiOutput("boxes"), # This does not exist in the original
    collapseInput(inputId = "iscollapsebox1", boxId = "box1"),
    verbatimTextOutput(outputId = "res")
  )
)

server <- function(input, output) {
  output$boxes <- renderUI({ # This does not exist in the original
    do.call(tagList, 
            list(box(id = "box1", collapsible = TRUE, p("Box 1")),
            box(id = "box2", collapsible = TRUE, p("Box 2")))
            )
  })
  observeEvent(input$bt1, {
    js$collapse("box1")
  })
  observeEvent(input$bt2, {
    js$collapse("box2")
  })
  
  output$res <- renderPrint({
    input$iscollapsebox1
  })
}

shinyApp(ui, server) 

我对 javascript 的经验很少,所以我不太确定这里会发生什么。我尝试移动对collapseInput()的调用,但这似乎没有改变任何事情。

R 亮闪 亮仪表板

评论

2赞 Limey 10/31/2023
嗯,我可能遗漏了一些明显的东西,但是当您在每个框中都有具有相同功能的“+”或“-”控件时,为什么还需要折叠操作按钮?
0赞 Hannah 10/31/2023
对不起,如果不清楚。我实际上对通过actionButtons折叠框不感兴趣。这只是原始帖子的一部分,我认为在这种情况下,通过标签访问盒子仍然有效,这可能值得注意。但我真的只对获取盒子的状态感兴趣(无论它们当前是否折叠)
2赞 ismirsehregal 11/1/2023
与其重新发明轮子,不如检查 shinydashboardPlus::box()。
1赞 Hannah 11/1/2023
谢谢,这确实使它变得简单得多:)

答: 暂无答案