2017-01-05 2 views
3

Я хочу включить искровые линии в блестящий DT. Он отлично работает в средстве просмотра RStudio, но в Shiny искровые линии не отображаются. Вот минимальный пример.Render datatable with sparklines in 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) 
+0

Обратитесь к этой ссылке [] (https://leonawicz.github.io/HtmlWidgetExamples/ex_dt_sparkline.html) для получения искрографики в блестящей DataTable. – SBista

+0

Спасибо, да, я потратил некоторое время на эту страницу. Он охватывает мой 1-й случай (т. Е. Рендер в RStudio Viewer), с которым у меня нет проблем. Ссылка не охватывает второй случай (почему это не удается сделать в Shiny). Я подозреваю, что проблема может быть связана с зависимостями. Мне непонятно, как использовать «spk_add_deps» в блестящем приложении, отсюда и мой взлом рендеринга фиктивной световой линии снаружи DT, чтобы привязать зависимости. – Grant

+0

Я перепробовал версию этого вопроса здесь https://stackoverflow.com/questions/47041415/include-sparkline-htmlwidget-in-datatable-cells-in-a-shiny-app-without-resortin, потому что кажется, что решение не требует ручного ввода JavaScript. Если это работает в телезрителе, почему бы и нет в Shiny? –

ответ

3

Я изменил код для создания искровых линий. Я ссылался на это link для генерации световых линий.

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) 

Надеюсь, это поможет!

+0

Работает как очарование! Спасибо – Grant

1

Старый вопрос, я знаю, но на основе информации в вопросе Add label to sparkline plot in datatable Я думаю, что решение - это то, что вы пробовали изначально, и всего несколько строк. Здесь я урезал части, демонстрирующие, что он работает в телезрителе, и добавил, что нужно, чтобы заставить искровые линии работать.

# 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)