在 Shiny 应用程序的数据表单元格中包含 sparkline htmlwidget,无需诉诸(很多)JavaScript
Include sparkline htmlwidget in datatable cells in a Shiny app, without resorting to (much) JavaScript
我正在使用 sparkline
包生成条形图,以将其放入 Shiny 应用程序中 datatable
的单元格中。我已经设法在独立 datatable
中生成所需的输出,但是当我将它放入 Shiny 应用程序时它不起作用。它可能与 spk_add_deps()
如何识别 htmlwidgets 有关。我试过多次移动 spk_add_deps()
函数并向其传递各种标识符,但没有任何效果。
我确实在这里找到了基本相同的问题
但给定的解决方案 (1) 依赖于在回调函数中为迷你图编写 JavaScript 代码(违背了使用 R sparkline()
函数的目的)和 (2) 似乎如果迷你图呈现在查看器中,那么我们就可以让它们在 Shiny 应用程序中呈现,而不必编写所有 JavaScript.
这是演示:
# Preliminary, load packages and build a demo table with the sparkline code merged in
library(shiny)
library(DT)
library(data.table)
library(sparkline)
## Create demo data sets
my_mtcars <- data.table(mtcars, keep.rownames = TRUE)
names(my_mtcars)[1] <- 'car_id'
set.seed(0)
data_for_sparklines <- data.table(car_id = rep(my_mtcars$car_id, 5),
category = 1:5,
value = runif(160))
sparkline_html <- data_for_sparklines[, .(sparkbar = spk_chr(value, type = 'bar')), by = 'car_id']
my_mtcars <- merge(my_mtcars, sparkline_html, by = 'car_id')
现在,如果我单独呈现数据表,迷你图条形图就会出现:
spk_add_deps(datatable(my_mtcars, escape = FALSE))
但如果我将其嵌入到 Shiny 应用程序中,该列为空白:
ui <- shinyUI(fluidPage(
dataTableOutput('myTable')
))
server <- shinyServer(function(input, output, session) {
output$myTable <- renderDataTable(spk_add_deps(datatable(my_mtcars, escape = FALSE)))
})
shinyApp(ui = ui, server = server)
找到解决方案,使用 htmlwidgets
包。
library(htmlwidgets)
然后使用 getDependency()
而不是 spk_add_deps()
在 Shiny UI 函数中加载迷你图依赖项:
ui <- shinyUI(fluidPage(
getDependency('sparkline'),
dataTableOutput('myTable')
))
由于我不完全理解的原因,在 renderDataTable()
中添加回调到 HTMLwidgets staticRender()
函数:
server <- shinyServer(function(input, output, session) {
staticRender_cb <- JS('function(){debugger;HTMLWidgets.staticRender();}')
output$myTable <- renderDataTable(my_mtcars,
escape = FALSE,
options = list(drawCallback = staticRender_cb))
})
但仅此而已,这就是让它们在 Shiny 应用程序中呈现所需的全部内容。
仅供遇到问题中的初始代码并想使用它的人参考没有闪亮(就像我所做的那样),该代码仅创建迷你图在table.的第一页你需要添加
options = list(
fnDrawCallback = htmlwidgets::JS(
'
function(){
HTMLWidgets.staticRender();
}
'
)
在 DT::datatable() 代码中,如果您想要 table.
所有页面上的迷你图
我正在使用 sparkline
包生成条形图,以将其放入 Shiny 应用程序中 datatable
的单元格中。我已经设法在独立 datatable
中生成所需的输出,但是当我将它放入 Shiny 应用程序时它不起作用。它可能与 spk_add_deps()
如何识别 htmlwidgets 有关。我试过多次移动 spk_add_deps()
函数并向其传递各种标识符,但没有任何效果。
我确实在这里找到了基本相同的问题 sparkline()
函数的目的)和 (2) 似乎如果迷你图呈现在查看器中,那么我们就可以让它们在 Shiny 应用程序中呈现,而不必编写所有 JavaScript.
这是演示:
# Preliminary, load packages and build a demo table with the sparkline code merged in
library(shiny)
library(DT)
library(data.table)
library(sparkline)
## Create demo data sets
my_mtcars <- data.table(mtcars, keep.rownames = TRUE)
names(my_mtcars)[1] <- 'car_id'
set.seed(0)
data_for_sparklines <- data.table(car_id = rep(my_mtcars$car_id, 5),
category = 1:5,
value = runif(160))
sparkline_html <- data_for_sparklines[, .(sparkbar = spk_chr(value, type = 'bar')), by = 'car_id']
my_mtcars <- merge(my_mtcars, sparkline_html, by = 'car_id')
现在,如果我单独呈现数据表,迷你图条形图就会出现:
spk_add_deps(datatable(my_mtcars, escape = FALSE))
但如果我将其嵌入到 Shiny 应用程序中,该列为空白:
ui <- shinyUI(fluidPage(
dataTableOutput('myTable')
))
server <- shinyServer(function(input, output, session) {
output$myTable <- renderDataTable(spk_add_deps(datatable(my_mtcars, escape = FALSE)))
})
shinyApp(ui = ui, server = server)
找到解决方案,使用 htmlwidgets
包。
library(htmlwidgets)
然后使用 getDependency()
而不是 spk_add_deps()
在 Shiny UI 函数中加载迷你图依赖项:
ui <- shinyUI(fluidPage(
getDependency('sparkline'),
dataTableOutput('myTable')
))
由于我不完全理解的原因,在 renderDataTable()
中添加回调到 HTMLwidgets staticRender()
函数:
server <- shinyServer(function(input, output, session) {
staticRender_cb <- JS('function(){debugger;HTMLWidgets.staticRender();}')
output$myTable <- renderDataTable(my_mtcars,
escape = FALSE,
options = list(drawCallback = staticRender_cb))
})
但仅此而已,这就是让它们在 Shiny 应用程序中呈现所需的全部内容。
仅供遇到问题中的初始代码并想使用它的人参考没有闪亮(就像我所做的那样),该代码仅创建迷你图在table.的第一页你需要添加
options = list(
fnDrawCallback = htmlwidgets::JS(
'
function(){
HTMLWidgets.staticRender();
}
'
)
在 DT::datatable() 代码中,如果您想要 table.
所有页面上的迷你图