DT 列过滤器破坏了闪亮的导航栏输入元素

问题描述 投票:0回答:1

我有一个闪亮的应用程序,其中通过单击按钮即可创建带有输入元素的新选项卡面板。还有一个 DT 对象,它显示全局信息,并且可以使用另一个按钮选择和修改元素(在示例中不相关)。

重点是:当我激活 DT 对象中的列过滤器时,创建的选项卡面板中的输入元素会以某种方式被破坏。

我的应用程序已经有多个层,解决这个问题并不容易,也许有人对此有答案。

example of added tab without filter in DT-object

example of added tab with filter in DT-object

示例:

library(shiny)
library(DT)


ui <- shinyUI(
  navbarPage(title = "Test"
             , id = "tabs"
             , tabPanel("test_panel",
                        mainPanel(
                          actionButton("button_new_tab", "New tab", width = "20%"))
                        , DT::DTOutput("testtable", width = "100%"),
                        width = "100%"
             )
  )
  
  
  
)

server <- function(input, output, session) {
  
  data <- data.frame(a = c(1,2,3), b = c("a","B","c"))
  

  
  observeEvent(input$button_new_tab, {
    
    appendTab(inputId = "tabs", tab = tabPanel("added_tab",
                                               
                                               sidebarLayout(
                                                 sidebarPanel(
                                                   tabPanel("test tab",
                                                            selectizeInput("inp_field", "Test data"
                                                                           , choices = c(a = "a", b = "b", c = "c")
                                                                           , multiple = TRUE))),
                                               
                                                   mainPanel()
                                                 )
                                               )
              )
    
    updateTabsetPanel(session, "tabs",
                      selected = "added_tab")
  })
  
  
  
  output$testtable <- renderDT({
    datatable(data
             # , filter = 'top'    #### comment or uncomment here
              )
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

此示例中的解决方法是在observeEvent() 外部创建appendTab 并将其隐藏。单击按钮时,可以通过 showTab() “激活”它。这适用于这个用例,但这只是一个最小的例子,我的应用程序更复杂

r filter shiny navbar dt
1个回答
0
投票

您看到此行为是由于 Javascript 错误

Error: Unable to find "selectize-plugin-a11y" plugin
,如果您将 DT 与
filter
选项一起使用,则可能会发生这种情况。

这至少与当前在 GitHub 上列为“开放问题”的已知问题类似。但是,正如那里所讨论的(请参阅链接),解决方法是将 htmltools::findDependencies 上的

selectizeInput
包含到
ui
中。下面是最小的例子。

library(shiny) library(DT) ui <- shinyUI(navbarPage( title = "Test" , id = "tabs" , tabPanel( "test_panel", mainPanel( htmltools::findDependencies(selectizeInput( "inp_field", "Test data" , choices = c(a = "a", b = "b", c = "c") )), actionButton("button_new_tab", "New tab", width = "20%") ) , DT::DTOutput("testtable", width = "100%"), width = "100%" ) )) server <- function(input, output, session) { data <- data.frame(a = c(1, 2, 3), b = c("a", "B", "c")) observeEvent(input$button_new_tab, { appendTab(inputId = "tabs", tab = tabPanel( "added_tab", sidebarLayout(sidebarPanel( tabPanel( "test tab", selectizeInput( "inp_field", "Test data" , choices = c(a = "a", b = "b", c = "c") , multiple = TRUE, ) ) ), mainPanel()) )) updateTabsetPanel(session, "tabs", selected = "added_tab") }) output$testtable <- renderDT({ datatable(data , filter = 'top') }) } # Run the application shinyApp(ui = ui, server = server)

© www.soinside.com 2019 - 2024. All rights reserved.