The shiny app builder provides a way to combine different ohdsi shiny modules into a single app. For example, if you have a characterization study, a cohort method study and a prediction study that are related as they all use the same cohorts, then you may want to view the results in a single shiny app. This can be done by using OhdsiShinyAppBuilder
to combine the characterization, cohort method and prediction shiny modules in OhdsiShinyModules
. The main source of shiny modules is the OhdsiShinyModules
R package, however, it is possible to add modules from other R packages or use local functions.
In this vignette we provide examples on how to use the OhdsiShinyAppBuilder
to create flexible shiny apps for exploring OHDSI results.
The OhdsiShinyAppBuilder
requires that all results to be explored by the shiny app are saved into a single database (i.e., all results for the different shiny modules in an app are saved into the same result database), as a single database connection is shared across shiny modules.
To create a shiny app config that contains four shiny modules:
All of these are available as shiny modules in OhdsiShinyModules
.
To create the shiny app via OhdsiShinyAppBuilder
we first need to create a config specification for all the shiny modules we wish to include into the single shiny app. A config can be created using createModuleConfig
.
Inputs | Description |
---|---|
moduleId | a unique id for the shiny app |
tabName | The menu text for the module |
shinyModulePackage | The R package that contains the shiny module or NULL if using a local function |
shinyModulePackageVersion | The minimum version of shinyModulePackage that is require or NULL |
moduleUiFunction | The name of the module’s UI function |
moduleServerFunction | The name of the module’s server function |
moduleInfoBoxFile | The function in the shinyModulePackage package that contains the helper information |
moduleIcon | An icon to use in the menu for this module |
installSource | The Repo (CRAN or github) where users can install shinyModulePackage |
gitHubRepo | If shinyModulePackage is available from github, this is the github repo you can find it |
Note: it is possible to add shiny modules from any R package by setting shinyModulePackage
to the R package with the UI and server functions and then specifying the UI function as moduleUiFunction
and server function as moduleServerFunction
. If you wish to use local functions for the UI and server, set shinyModulePackage
to NULL. However, the server function must take as input id
(the module id as standard for shiny server modules) and resultDatabaseSettings
(a list containing the database result details required when extracting the results from the database that can be created using OhdsiShinyAppBuilder::createDefaultResultDatabaseSettings
).
For the about module we will specify in the config to use the about shiny modules in OhdsiShinyModules
. The UI is named aboutViewer
, the server is named aboutServer
and the about helper function is called aboutHelperFile()
. As the about module provides information about the shiny app, the ‘info’ icon seems appropriate. The inputs into createModuleConfig
for an about module are:
aboutModule <- createModuleConfig(
moduleId = 'about',
tabName = "About",
shinyModulePackage = "OhdsiShinyModules",
moduleUiFunction = 'aboutViewer',
moduleServerFunction = 'aboutServer',
moduleInfoBoxFile = "aboutHelperFile()",
moduleIcon = 'info',
installSource = 'github',
gitHubRepo = 'ohdsi'
)
For simplicity, the OhdsiShinyAppBuilder
contains a function called createDefaultAboutConfig
with these default about settings into createModuleConfig
, this is quicker to use than createModuleConfig
if you are using a standard about module. Alternatively, you could just run:
aboutModule <- createDefaultAboutConfig()
To add a prediction module you can specify the OhdsiShinyModule
functions: aboutPrediction
for the module UI, aboutPrediction
for the module server and aboutPredictionFile()
for the about helper function. A suitable icon is chart-line
. For the prediction module, results in the database format created by the PatientLevelPrediction
package must be in a database that will be connected to when viewing the shiny app.
predictionModule <- createModuleConfig(
moduleId = 'prediction',
tabName = "Prediction",
shinyModulePackage = 'OhdsiShinyModules',
moduleUiFunction = "predictionViewer",
moduleServerFunction = "predictionServer",
moduleInfoBoxFile = "predictionHelperFile()",
moduleIcon = "chart-line",
installSource = 'github',
gitHubRepo = 'ohdsi'
)
For simplicity, the OhdsiShinyAppBuilder
contains a function called createDefaultPredictionConfig
with these default prediction settings. Atlernatively, you could just run:
predictionModule <- createDefaultPredictionConfig()
We have default config creation for cohort method and cohort generation using UI and server functions found in OhdsiShinyAppBuilder
:
cohortMethodModule <- createDefaultEstimationConfig()
cohortGeneratorModule <- createDefaultCohortGeneratorConfig()
Next step is to combine the module config settings into a shiny app config. First we use initializeModuleConfig()
to create an empty shiny app config and then we use addModuleConfig()
to add each of the module configs we previously created:
library(dplyr)
shinyAppConfig <- initializeModuleConfig() %>%
addModuleConfig(aboutModule) %>%
addModuleConfig(cohortGeneratorModule) %>%
addModuleConfig(cohortMethodModule) %>%
addModuleConfig(predictionModule)
It is possible to save the shiny app config using saveConfig(shinyAppConfig, 'save location')
and load a previously saved shiny app config shinyAppConfig <- loadConfig('save location')
To create the shiny
app you need to first create the shinyAppConfig, then specify the connectionDetails where the results are stored and finally you can call createShinyApp
.
To run the shiny app on a shiny server you need to create an app.R file with the config the connection correctly specified. For example, your app.R could contain the following lines of code:
# save this as app.R and upload it to a shiny server
# create the config using existing UI and server functions
# in OhdsiShinyModules or by creating the UI and server functions
fooModuleUi <- function (id = "foo") {
shiny::fluidPage(title = "foo")
}
fooModule <- function(
id = 'foo',
connectionHandler = NULL,
resultDatabaseSettings = NULL,
config
) {
shiny::moduleServer(id, function(input, output, session) { })
}
fooHelpInfo <- function() {
'NA'
}
moduleConfig <- createModuleConfig(
moduleId = 'foo',
tabName = "foo",
shinyModulePackage = NULL,
moduleUiFunction = fooModuleUi,
moduleServerFunction = fooModule,
moduleInfoBoxFile = "fooHelpInfo()",
moduleIcon = "info"
)
shinyAppConfig <- initializeModuleConfig()
shinyAppConfig <- addModuleConfig(shinyAppConfig, moduleConfig)
# create a connection to the result database
# in this example it is an empty sql database
connectionDetails <- DatabaseConnector::createConnectionDetails(
dbms = 'sqlite',
server = './madeup.sql'
)
# Create the app
createShinyApp(
config = shinyAppConfig,
connectionDetails = connectionDetails,
resultDatabaseSettings = createDefaultResultDatabaseSettings()
)
Note: if you specify a package dependency via the ‘shinyModulePackage’ value in the config that was not previously installed, you will be asked whether you want to install the required package when you run createShinyApp
or viewShiny
.
To just view the shiny app locally, you need to specify the config and connection details to the result database and then run the following lines of code in R:
# create the config using existing UI and server functions
# in OhdsiShinyModules or by creating the UI and server functions
fooModuleUi <- function (id = "foo") {
shiny::fluidPage(title = "foo")
}
fooModule <- function(
id = 'foo',
connectionHandler = NULL,
resultDatabaseSettings = NULL,
config
) {
shiny::moduleServer(id, function(input, output, session) { })
}
fooHelpInfo <- function() {
file.path(tempdir(), 'help.html')
}
moduleConfig <- createModuleConfig(
moduleId = 'foo',
tabName = "foo",
shinyModulePackage = NULL,
moduleUiFunction = fooModuleUi,
moduleServerFunction = fooModule,
moduleInfoBoxFile = "fooHelpInfo()",
moduleIcon = "info"
)
shinyAppConfig <- initializeModuleConfig()
shinyAppConfig <- addModuleConfig(shinyAppConfig, moduleConfig)
# create a connection to the result database
# in this example it is an empty sql database
connectionDetails <- DatabaseConnector::createConnectionDetails(
dbms = 'sqlite',
server = './madeup.sql'
)
# specify the app title
appTitle <- 'Example Foo App'
# provide a short paragraph to described the study
# that the is exploring the results of.
studyDescription <- "An empty made up study for the vignette demo. The shiny app with show one menu option called 'foo' that will not do anything."
# specify whether you want to use a pooled connection
usePooledConnection <- F
# open a shiny app that lets you explore results
viewShiny(
config = shinyAppConfig,
connectionDetails = connectionDetails,
resultDatabaseSettings = createDefaultResultDatabaseSettings(),
title = appTitle,
usePooledConnection = usePooledConnection,
studyDescription = studyDescription
)
You can specify the title for the app and a short description of the study via the inputs title
and studyDescription
into the viewShiny
and createShinyApp
functions.