2017-01-05 6 views
3

Ich möchte Sparklines in einem glänzenden DT enthalten. Es funktioniert gut im RStudio-Viewer, aber in Shiny werden die Sparklines nicht gerendert. Hier ist ein minimales Beispiel.Render Datatable mit 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

Siehe diesen [link] (https://leonawicz.github.io/HtmlWidgetExamples/ex_dt_sparkline.html) für Sparklines in glänzenden Datentabelle zu bekommen. – SBista

+0

Danke, ja, ich habe einige Zeit auf dieser Seite verbracht. Es deckt meinen 1. Fall ab (d. H. Render in RStudio Viewer), mit dem ich kein Problem habe. Der Link deckt jedoch nicht den zweiten Fall ab (warum er in Shiny nicht gerendert wird). Ich vermute, dass das Problem mit den Abhängigkeiten zusammenhängen könnte. Es ist mir nicht klar, wie man 'spk_add_deps' in einer glänzenden App benutzt, daher mein Trick, eine Dummy-Sparkline außerhalb des DT zu rendern, um die Abhängigkeiten anzuhängen. – Grant

+0

Ich Reposting eine Version dieser Frage hier https://stackoverflow.com/questions/47041415/include-sparkline-htmlwidget-in-datatable-celles-in-ashiny-app-without-resortin, weil es scheint, die Lösung sollte keine manuelle Eingabe des JavaScript erfordern. Wenn es im Viewer funktioniert, warum nicht in Shiny? –

Antwort

3

Ich habe Ihren Code geändert, um Sparklines zu generieren. Ich habe auf diese link verwiesen, um die Sparklines zu erzeugen.

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) 

Hoffe es hilft!

+0

Funktioniert wie ein Charme! Danke – Grant

1

Old-ish Frage, ich weiß, aber basierend auf Informationen in der Frage Add label to sparkline plot in datatable Ich denke, die Lösung ist, was Sie ursprünglich versucht und nur ein paar Zeilen. Hier habe ich die Teile der Demo getrimmt, die im Viewer funktionieren, und genau das hinzugefügt, was nötig ist, um die Sparklines zum Laufen zu bringen.

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