Used in Shiny server
it will record all inputs and
output changes and errors that occurs through an output.
Usage
track_usage(
storage_mode,
what = c("session", "input", "output", "error"),
exclude_input_regex = NULL,
exclude_input_id = NULL,
on_unload = FALSE,
app_name = NULL,
exclude_users = NULL,
get_user = NULL,
dependencies = TRUE,
session = getDefaultReactiveDomain()
)
Arguments
- storage_mode
Storage mode to use :
store_json()
,store_rds()
,store_sqlite()
orstore_null()
.- what
Elements to record between
"session"
,"input"
,"output"
and"error"
.- exclude_input_regex
Regular expression to exclude inputs from tracking.
- exclude_input_id
Vector of
inputId
to exclude from tracking.- on_unload
Logical, save log when user close the browser window or tab, if
TRUE
it prevent to createshinylogs
input during normal use of the application, there will be created only on close, downside is that a popup will appear asking to close the page.- app_name
Name of the app as a character string. If
NULL
,basename(getwd())
(name of the folder where application is located) is used.- exclude_users
Character vectors of user for whom it is not necessary to save the log.
- get_user
A
function
to get user name, it should return a character and take one argument: the Shiny session.- dependencies
Load dependencies in client, can be set to
FALSE
ifuse_tracking()
has been called in UI.- session
The shiny session.
Note
The following input
s will be accessible in the server:
.shinylogs_lastInput : last
input
used by the user.shinylogs_input : all
input
s send from the browser to the server.shinylogs_error : all errors generated by
output
s elements.shinylogs_output : all
output
s generated from the server.shinylogs_browserData : information about the browser where application is displayed.
Examples
# Save logs on disk ----------------------------------
if (interactive()) {
# temporary directory for writing logs
tmp <- tempdir()
# when app stop,
# navigate to the directory containing logs
onStop(function() {
browseURL(url = tmp)
})
# Classic Iris clustering with Shiny
ui <- fluidPage(
headerPanel("Iris k-means clustering"),
sidebarLayout(
sidebarPanel(
selectInput(
inputId = "xcol",
label = "X Variable",
choices = names(iris)
),
selectInput(
inputId = "ycol",
label = "Y Variable",
choices = names(iris),
selected = names(iris)[[2]]
),
numericInput(
inputId = "clusters",
label = "Cluster count",
value = 3,
min = 1,
max = 9
)
),
mainPanel(
plotOutput("plot1")
)
)
)
server <- function(input, output, session) {
# Store JSON with logs in the temp dir
track_usage(
storage_mode = store_json(path = tmp)
)
# classic server logic
selectedData <- reactive({
iris[, c(input$xcol, input$ycol)]
})
clusters <- reactive({
kmeans(selectedData(), input$clusters)
})
output$plot1 <- renderPlot({
palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3",
"#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999"))
par(mar = c(5.1, 4.1, 0, 1))
plot(selectedData(),
col = clusters()$cluster,
pch = 20, cex = 3)
points(clusters()$centers, pch = 4, cex = 4, lwd = 4)
})
}
shinyApp(ui, server)
}
# Logs in console & special inputs ------------------------
if (interactive()) {
library(shiny)
library(shinylogs)
ui <- fluidPage(
tags$h2("Record inputs change"),
fluidRow(
column(
width = 3,
selectInput(
inputId = "select",
label = "Select input",
choices = month.name
),
numericInput(
inputId = "numeric",
label = "Numerci input",
value = 4,
min = 0, max = 20
),
checkboxGroupInput(
inputId = "checkboxGroup",
label = "Checkbox group input",
choices = LETTERS[1:5]
),
sliderInput(
inputId = "slider",
label = "Slider input",
min = 0, max = 100, value = 50
)
),
column(
width = 9,
tags$b("Last input triggered:"),
verbatimTextOutput(outputId = "last_input"),
tags$b("All inputs:"),
verbatimTextOutput(outputId = "all_inputs")
)
)
)
server <- function(input, output, session) {
# dont store on disk, just show in R console
track_usage(
storage_mode = store_null()
)
# last input triggered
output$last_input <- renderPrint({
input$.shinylogs_lastInput
})
# all inputs that have changed
output$all_inputs <- renderPrint({
input$.shinylogs_input
})
}
shinyApp(ui, server)
}