r - 在 Shiny 应用程序的数据表单元格中包含迷你图 htmlwidget,无需求助于(很多)JavaScript

标签 r shiny dt htmlwidgets sparklines

我正在使用 sparkline用于生成条形图以放置在 datatable 的单元格中的包在一个 Shiny 的应用程序中。我已经设法在独立的 datatable 中产生所需的输出,但是当我将它放入 Shiny 应用程序时,它不起作用。可能和怎么做有关spk_add_deps()标识 htmlwidgets。我试过移动 spk_add_deps()功能相当多,并向它传递各种标识符,但没有任何效果。

我确实在这里找到了基本相同的问题 Render datatable with sparklines in Shiny
但是给定的解决方案 (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))

datatable showing sparkline bar charts

但是,如果我将相同的内容嵌入到 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)

enter image description here

最佳答案

找到了解决方案,使用 htmlwidgets包裹。

library(htmlwidgets)

然后代替 spk_add_deps()使用 getDependency()在 Shiny UI 函数中加载迷你图依赖项:
ui <- shinyUI(fluidPage(
  getDependency('sparkline'),
  dataTableOutput('myTable')
))

出于我不完全理解的原因,在 renderDataTable() 中添加回调到 HTML 小部件 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 应用程序中呈现的全部内容。

关于r - 在 Shiny 应用程序的数据表单元格中包含迷你图 htmlwidget,无需求助于(很多)JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47041415/

相关文章:

r - 如何在r中重新采样LDA?

R Shiny rCharts https 服务器无法加载 fonts.googleapis.com

R Shiny : How to select a DataTable page based on a selected row when the row order has changed?

DT 数据表标题超链接

r - 如何在 Shiny 中将数据表列标题向左对齐?

r - 在 POSIXct 上附加日期时间对象

r - 在两个或多个变量上使用 Melt() 时,如何保留串联变量的两个部分? (数据.表::熔化())

r - 错误: could not find function … in R

r - Highcharter R 对数轴自定义按钮

javascript - 单击 Shiny 数据表中的按钮后如何滚动到底部