CUBR-CORE et visualisation de séquences

La vidéo suivante montre CUBR-CORE, la brique technologique développée par CUBR, en pleine action pour la visualisation de séquences.

Elle montre d’une part l’utilisation de l’API R permettant d’utiliser CUBR-CORE au travers d’une interface R Shiny, et d’autre part illustre la puissance de traitement de CUBR-CORE pour générer des visualisations de séquences, de la même manière que le font les outils TraMineR et EventFlow.

On y voit notamment la capacité de CUBR-CORE à gérer des volumétries de données importantes que les autres outils ne permettent pas d’atteindre, et cela en des temps de traitement très rapides.

Et voici le code R nécessaire pour cette application R Shiny.

On observera notamment (en vert dans le code) les appels aux web services CUBR qui sont effectués dans la partie serveur de l’application.

library(shiny)
library(shinyWidgets)
library(cubr)

###############################################################################
# UI
###############################################################################
ui = fluidPage (

    titlePanel ("CUBR-CORE : integration with R Shiny for sequences visualization"),

    sidebarPanel (width = 2,

        uiOutput ("sources"),

        pickerInput ("selectVariables", 
            h3("variables"), 
            choices  = c(), 
            options  = list(`actions-box` = TRUE), 
            multiple = T
        ),

        radioButtons ("visumode", 
            h3("visualization mode"), 
            selected="traminer", 
            c("TraMineR" = "traminer", "EventFlow" = "eventflow" )
        ),

        verbatimTextOutput ("logs"),
    ),

    mainPanel (width = 6, imageOutput("graphic") )
)

###############################################################################
# SERVER
###############################################################################
buildImage = function(input, output, cubr, variables)
{
    # we update the image
    renderImage (
    {
        width  = 1500
        height = 1000
        svg    = paste ("<svg width='", width, "px' height='", height, "'></svg>")

       # we call the required CUBR function ('traminer' or 'eventflow')
        result = cubr$seqviz (
            mode      = input$visumode, 
            variables = variables, 
            width     = width, 
            height    = height, 
            output    = "svg"
        )

        # the svg is received encoded in base64, so we decode it now
        svg = jsonlite::base64_dec (result$svg)

        # we display some information about the execution 
        output$logs = renderText (
            jsonlite::toJSON(result$stats,auto_unbox=TRUE,pretty=TRUE)
        )

        # we create a temporary file for the svg 
        outfile <- tempfile(fileext='.svg')

        # we save the svg into a file
        writeBin (svg, con = outfile)

        list (src = normalizePath(outfile), 
            contentType = 'image/svg+xml', 
            width       = width, 
            height      = height
        )
    },
    deleteFile=TRUE)
}

server = function(input, output, session)
{
    # we instanciate the Cubr class
    cubr = Cubr$new (server="http://someaddress:7080")

    # we update the SelectInput with the found databases
    output$sources <- renderUI (
    {   
        selectInput('sourcesSelect', 
            label   = h3('input'),  
            choices = cubr$databases)   
    })

    observe(
    {
        source <- input$sourcesSelect

        if (is.null(source)==FALSE && source!="")
        {
            # we open the selected data source
            result = cubr$open (source)

            # we update the variables selectInput with the found variables
            updatePickerInput (
                session, 
                "selectVariables", 
                choices  = result$variables, 
                selected = result$variables
            )

            # we update the image
            output$graphic = buildImage (
                input, 
                output, 
                cubr, 
                result$variables
            )
        }
    })

    observe(
    {
        if (is.null(input$selectVariables)==FALSE)   
        {  
            output$graphic = buildImage (
                input, 
                output, 
                cubr, 
                input$selectVariables
            )  
        }
    })
}


###############################################################################
# RUN
###############################################################################
runApp (shinyApp(ui = ui, server = server), port=7575);