With teal
, app developers can open up their
applications to users, allowing them to decide exactly which app data to
analyze within the module.
A teal
module can leverage the use of
data_extract_spec
objects to handle and process the user
input. Examples can be found in the modules
from the teal.modules.clinical
package.
data_extract_spec
The role of data_extract_spec
is twofold: to create a UI
component in a shiny
application and to pass user input
from the UI to a custom server logic that can use this input to
transform the data. Let’s delve into how it fulfills both of these
responsibilities.
library(teal.transform)
library(teal.data)
library(shiny)
# Define data.frame objects
ADSL <- teal.data::rADSL
ADTTE <- teal.data::rADTTE
# create a list of reactive data.frame objects
datasets <- list(
ADSL = reactive(ADSL),
ADTTE = reactive(ADTTE)
)
# create join_keys
join_keys <- join_keys(
join_key("ADSL", "ADSL", c("STUDYID", "USUBJID")),
join_key("ADSL", "ADTTE", c("STUDYID", "USUBJID")),
join_key("ADTTE", "ADTTE", c("STUDYID", "USUBJID", "PARAMCD"))
)
data_extract_spec
ObjectConsider the following example, where we create two UI elements, one
to filter on a specific level from SEX
variable, and a
second one to select a variable from c("BMRKR1", "AGE")
.
data_extract_spec
object is handed over to the
shiny
app and gives instructions to generate UI
components.
shiny
UI and Server
ModulesTo demonstrate different initialization options of
data_extract_spec
, let’s first define a shiny
module that utilizes data_extract_ui
and
data_extract_srv
to handle data_extract_spec
objects. This module creates a UI component for a single
data_extract_spec
and prints a list of values returned from
the data_extract_srv
module. For more information about
data_extract_ui
and data_extract_srv
, please
refer to the package documentation.
extract_ui <- function(id, data_extract) {
ns <- NS(id)
sidebarLayout(
sidebarPanel(
h3("Encoding"),
data_extract_ui(ns("data_extract"), label = "variable", data_extract)
),
mainPanel(
h3("Output"),
verbatimTextOutput(ns("output"))
)
)
}
extract_srv <- function(id, datasets, data_extract, join_keys) {
moduleServer(id, function(input, output, session) {
reactive_extract_input <- data_extract_srv("data_extract", datasets, data_extract, join_keys)
s <- reactive({
format_data_extract(reactive_extract_input())
})
output$output <- renderPrint({
cat(s())
})
})
}
shiny
AppFinally, we include extract_ui
in the UI of the
shinyApp
, and utilize extract_srv
in the
server function of the shinyApp
: