r语言 - 在“闪亮”中呈现带有迷你图的数据表



我想在闪亮的DT中包含迷你图。它在 RStudio 查看器中工作正常,但在 Shiny 中不会渲染迷你图。下面是一个最小的例子。

# dependencies
  require(sparkline)
  require(DT)
  require(shiny)
# create data with sparklines
  spark_data <- data.frame(
    id = c('spark1', 'spark2'),
    spark = c(
      spk_chr(values = 1:3, elementId = 'spark1'),
      spk_chr(values = 3:1, elementId = 'spark2')
    )
  )
# render in RStudio viewer (this works)
  tbl <- datatable(spark_data, escape = FALSE)
  spk_add_deps(tbl)
# render in Shiny (no sparklines rendered in DT)
  ui <- fluidPage(
      sparklineOutput("test_spark"),
      dataTableOutput("tbl")
  )
  server <- function(input, output) {
    # sparkline outside DT (works fine) - also ensures sparkline dependencies are attached
      output$test_spark <- renderSparkline(sparkline(1:3))
    # sparkline inside DT (does not render)
      output$tbl <- renderDataTable(
        expr = spark_data,
        escape = FALSE
      )
  }
  shinyApp(ui = ui, server = server)

我已经修改了您的代码以生成迷你图。我参考了此链接来生成迷你图。

require(sparkline)
require(DT)
require(shiny)
# create data
spark_data1<- data.frame(id = c('spark1', 'spark2'),
                          spark = c("1,2,3", "3,2,1"))

ui <- fluidPage(
  sparklineOutput("test_spark"),
  DT::dataTableOutput("tbl")
)
server <- function(input, output) {
  line_string <- "type: 'line', lineColor: 'black', fillColor: '#ccc', highlightLineColor: 'orange', highlightSpotColor: 'orange'"
  cd <- list(list(targets = 1, render = JS("function(data, type, full){ return '<span class=sparkSamples>' + data + '</span>' }")))
  cb = JS(paste0("function (oSettings, json) {n  $('.sparkSamples:not(:has(canvas))').sparkline('html', { ", 
                 line_string, " });n}"), collapse = "")
  output$tbl <- DT::renderDataTable({
    dt <-  DT::datatable(as.data.frame(spark_data1),  rownames = FALSE, options = list(columnDefs = cd,fnDrawCallback = cb))
  })
}
shinyApp(ui = ui, server = server)

希望对您有所帮助!

我知道

这是一个古老的问题,但根据问题中的信息 向数据表中的迷你图添加标签 我认为解决方案是您最初尝试的加上几行。在这里,我修剪了在查看器中演示它工作的部分,并添加了使迷你图工作所需的内容。

# dependencies
require(sparkline)
require(DT)
require(shiny)
# create data with sparklines
spark_data <- data.frame(
  id = c('spark1', 'spark2'),
  spark = c(
    spk_chr(values = 1:3, elementId = 'spark1'),
    spk_chr(values = 3:1, elementId = 'spark2')
  )
)
###  adding this <------------
cb <- htmlwidgets::JS('function(){debugger;HTMLWidgets.staticRender();}')
ui <- fluidPage(
  ###  and this <------------
  htmlwidgets::getDependency('sparkline'),
  dataTableOutput("tbl")
)
server <- function(input, output) {
  output$tbl <- renderDataTable(
    expr = spark_data,
    escape = FALSE,
    ###  and this <------------
    options = list(
      drawCallback =  cb
    )
  )
}
shinyApp(ui = ui, server = server)

最新更新