R/shiny.R

Defines functions shinyWithLog logApp

Documented in logApp shinyWithLog

#' Default Logger for Shiny.
#' 
#' Serve a shiny application with default loggers,
#' useful for debugging.
#' 
#' @param ui,server UI definition and server function
#' as passed to [shiny::shinyApp()].
#' @param ... Any other arguments passed to [shiny::shinyApp()].
#' @param inputs Logger to log inputs, set to `NULL` to not log.
#' @param app Shiny application as returned by [shiny::shinyApp()].
#' 
#' @name shiny
#' @export 
logApp <- function(ui, server, ..., inputs = inputLogger){
  checkInstalled("shiny")

  app <- shiny::shinyApp(ui, server, ...)

  shinyWithLog(app, inputs)

}

#' @rdname shiny
#' @export
shinyWithLog <- function(app, inputs = inputLogger){

  if(!is.log(inputs) && !is.null(inputs))
    stop("`inputs` must be a logger", call. = FALSE)

  serverFnSource <- app$serverFuncSource()

  app$serverFuncSource <- function(){
    function(input, output, session){

      # track inputs
      if(!is.null(inputs)){
        session$onInputReceived(function(val){

          for(i in 1:length(val)){
            values <- paste0(val[[i]], collapse = " - ")
            inputs$log(names(val)[i], ": ", values, sep = "")
          }

          return(val)
        })
      }

      # fails if user only uses input and output
      # if fails try without session
      app <- tryCatch(
        serverFnSource(input, output, session), 
        error = function(e) e
      )
      
      if(inherits(app, "error"))
        app <- serverFnSource(input, output)

      app
    }
  }

  app
}

#' Input logger
#' 
#' Default logger used to log inputs in [logApp()].
#' 
#' @export 
inputLogger <- Logger$new("INPUT")$date()$time()

Try the log package in your browser

Any scripts or data that you put into this service are public.

log documentation built on March 18, 2022, 6:02 p.m.