library(shiny)
## allowed_databases stores the names of the allowable databases
<- c('test', 'production', 'uploadtest')
allowed_databases
## default database names for interactive and server modes
<- 'test'
dafault_interactive <- 'production'
dafault_server
## override database defaults for interactive mode
## to override the default database set override_default_database to TRUE and
## override_use_database to the database name
<- FALSE
override_default_database <- 'production'
override_use_database
<- function(input, output, session) {
server
<- reactiveValues(db = NULL)
val
<- function(name) {
db_set_database $db <- name
val
}
## set database
observe({
if(Sys.getenv('SHINY_PORT') == "") {
## if running locally then use test database unless override set
if (override_default_database) {
## run against specified instance
if (!override_use_database %in% allowed_databases) override_use_database <- dafault_interactive
db_set_database(override_use_database)
else {
} ## run against default interactive instance
db_set_database(dafault_interactive)
}else {
} ## if running on server then look for database in url
<- parseQueryString(session$clientData$url_search)
query if (!is.null(query[['database']])) {
## get database name from url and check that it is in the list of allowed database names
<- tolower(query[['database']])
my_database if (!my_database %in% allowed_databases) my_database <- dafault_server
## run against selected instance
db_set_database(my_database)
else {
} ## default - run against default server instance
db_set_database(dafault_server)
}
}
})
$txt1 <- renderPrint(paste0('Using database ', val$db))
output
}
<- fluidPage(
ui verbatimTextOutput('txt1')
)
shinyApp(ui, server)
Using parseQueryString
in conjunction with session$clientData$url_search
can be used to pass variables to a shiny app from the url address. It can also be used with Sys.getenv('SHINY_PORT')
to follow programming paths based on variable values and execution environment. In the example below, the code points to different instances of a database, depending on user-specification and execution environment. Running locally or on the server points to different default databases and includes the ability to override. This code is useful when placed at the top of an app during development.