我有一个闪亮的应用程序,其中通过单击按钮即可创建带有输入元素的新选项卡面板。还有一个 DT 对象,它显示全局信息,并且可以使用另一个按钮选择和修改元素(在示例中不相关)。
重点是:当我激活 DT 对象中的列过滤器时,创建的选项卡面板中的输入元素会以某种方式被破坏。
我的应用程序已经有多个层,解决这个问题并不容易,也许有人对此有答案。
示例:
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() “激活”它。这适用于这个用例,但这只是一个最小的例子,我的应用程序更复杂
您看到此行为是由于 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)