# Use processanimateR selection as Shiny inputs

#### Felix Mannhardt

#### 2021-10-11

Selections made in the processanimateR animation be used as input by Shiny applications. Here a simple example in which a Shiny module is created that renders the case identifiers of selected tokens and the identifiers and names of selected activities:

    library(shiny)
    library(processanimateR)
    library(eventdataR)
    library(jsonlite)

    shinyAnimation <- function(eventlog, min.time = 30, max.time = 600, default.time = 60) {

      # Define Shiny Module
      animationUI <- function(id, title) {
        ns <- NS(id)
        tagList(
          h2(title),
          processanimaterOutput(ns("process")),
          h4("Selected cases"),
          textOutput(ns("token_selection")),
          h4("Selected activities"),
          textOutput(ns("activity_selection")),
          h4("Current time"),
          textOutput(ns("activity_time"))
        )
      }

      animation <- function(input, output, session, ...) {

        output$token_selection <- renderText({
          if (is.null(input$process_tokens)) {
            "None"
          } else {
            paste0(input$process_tokens, collapse = ",")
          }
        })

        output$activity_selection <- renderText({
          if (is.null(input$process_activities)) {
            "None"
          } else {
            activities <- jsonlite::fromJSON(input$process_activities)
            paste0("(", activities$id, ",", activities$activity, ")", collapse = ",")
          }
        })

        output$activity_time <- renderText({
          if (is.null(input$process_time)) {
            "0"
          } else {
            input$process_time
          }
        })

        output$process <- renderProcessanimater(expr = {
          animate_process(eventlog, ...)
        })

      }

      ui <- fluidPage(
        animationUI("module1", "Relative"),
        animationUI("module2", "Absolute")
      )

      # Two animations
      server <- function(input, output, session) {
        callModule(animation, "module1", mode = "relative")
        callModule(animation, "module2")
      }

      shinyApp(ui, server, options = list(height = 500))

    }

    shinyAnimation(patients)