【发布时间】:2018-12-18 07:53:25
【问题描述】:
TL;DR:如何在数据表处于非活动选项卡但其输入发生变化时强制绘制数据表?
有一个闪亮的应用程序,看起来像这样:
library(shiny)
library(DT)
shinyApp(
ui = fluidPage(
sidebarLayout(
sidebarPanel(
numericInput(
inputId = "random_val",
label = "pick random value",
value = 1
)
),
mainPanel(
tabsetPanel(
id = "tabset",
tabPanel(
title = "some_other_tab",
"Some other stuff"
),
tabPanel(
title = "test_render",
textOutput("echo_test"),
DTOutput("dt_test")
)
)
)
)
),
server = function(input, output) {
output$echo_test <- renderText({
cat("renderText called \n")
input$random_val
})
outputOptions(output, "echo_test", suspendWhenHidden = FALSE)
output$dt_test <- renderDT({
cat("renderDT called \n")
df <- data.frame(
a = 1:10^6,
b = rep(input$random_val, 10^6)
)
datatable(df)
})
outputOptions(output, "dt_test", suspendWhenHidden = FALSE)
}
)
我的问题如下:当标签test_render(即带有DT的标签)打开时输入(input$random_value)发生变化,一切正常。但是,当包含DT 的选项卡在用户更改其输入时未处于活动状态时,DT 不会更新,即使设置了suspendWhenHidden = FALSE 并且似乎调用了renderDT。
我发现一个open issue 抱怨类似的问题,但没有提供解决方案。
我也找到了这个question 并尝试将其调整为我的问题。到目前为止,我通过从浏览器控制台运行$("#dt_test table").DataTable().draw(); 成功更新了DT。 DT 在被点击时也会更新(例如,在排序按钮上)。
我正在寻找一种方法来更新DT 立即 输入更改(或其初始化),无论它是否在活动面板上。这个问题的一个特别麻烦的情况是应用程序启动时——DT 没有立即呈现。似乎绘图仅在它所在的选项卡打开时才开始(它显示 Processing...)。在我的实际应用中,这会导致几秒钟的延迟——这就是为什么我想在用户查看其他标签时强制处理DT。
我尝试包含一个在各种 events 上运行 $("#dt_test table").DataTable().draw(); 的 javascript 文件,但到目前为止没有成功。
有没有办法通过上述事件或任何其他方法来实现我正在寻找的东西?
【问题讨论】:
标签: javascript jquery r shiny dt