Combining data-extract with data-merge
NEST coreDev
2022-05-03
data-extract-merge.RmdCombining data-extract with data-merge
teal.transform provides data_merge_srv
which converts data_extract_srv into R expression to
transform data for analytical purposes. For example, we may wish to
select AGE from ADSL and select
AVAL from ADTTE filtered for rows where
PARAMCD is OS and merge the results (using the
primary keys) to create an analysis dataset ANL to be used
in the module, as this diagram shows:

In the following code block we create a
data_extract_spec object per dataset as illustrated
above.
library(teal.transform)
#> Loading required package: magrittr
library(shiny)
adsl_extract <- teal.transform::data_extract_spec(
dataname = "ADSL",
select = select_spec(
label = "Select variable:",
choices = c("AGE", "BMRKR1"),
selected = "AGE",
multiple = TRUE,
fixed = FALSE
)
)
adtte_extract <- teal.transform::data_extract_spec(
dataname = "ADTTE",
select = select_spec(
choices = c("AVAL", "ASEQ"),
selected = "AVAL",
multiple = TRUE,
fixed = FALSE
),
filter = filter_spec(
vars = "PARAMCD",
choices = c("CRSD", "EFS", "OS", "PFS"),
selected = "OS"
)
)
data_extracts <- list(adsl_extract = adsl_extract, adtte_extract = adtte_extract)Example module
Here, we create the merge_ui and the
merge_srv functions which will be used to create the
ui and the srv components of the shiny app,
respectively.
merge_ui <- function(id, data_extracts) {
ns <- NS(id)
teal.widgets::standard_layout(
output = teal.widgets::white_small_well(
verbatimTextOutput(ns("expr")),
dataTableOutput(ns("data"))
),
encoding = div(
teal.transform::data_extract_ui(
ns("adsl_extract"), # must correspond with data_extracts list names
label = "ADSL extract",
data_extracts[[1]]
),
teal.transform::data_extract_ui(
ns("adtte_extract"), # must correspond with data_extracts list names
label = "ADTTE extract",
data_extracts[[2]]
)
)
)
}
merge_srv <- function(id, datasets, data_extracts) {
moduleServer(id, function(input, output, session) {
selector_list <- teal.transform::data_extract_multiple_srv(data_extracts, datasets)
merged_data <- teal.transform::data_merge_srv(
selector_list = selector_list,
datasets = datasets,
merge_function = "dplyr::left_join"
)
output$expr <- renderText(merged_data()$expr)
output$data <- renderDataTable(merged_data()$data())
})
}Output from data_extract_srv (reactive)
should be passed to data_merge_srv together with
datasets (FilteredData).
data_merge_srv returns a reactive list containing merged
data and information needed to perform the transformation - see more in
data_merge_srv documentation.
Example data
teal.transform functions depend on a
FilteredData object from the teal.slice
package. For example purposes we define a wrapper function to initialize
the necessary object:
sample_filtered_data <- function() {
# create TealData
adsl <- teal.data::cdisc_dataset("ADSL", scda::synthetic_cdisc_data("latest")$adsl)
adtte <- teal.data::cdisc_dataset("ADTTE", scda::synthetic_cdisc_data("latest")$adtte)
data <- teal.data::cdisc_data(adsl, adtte)
# covert TealData to FilteredData
datasets <- teal.slice:::filtered_data_new(data)
teal.slice:::filtered_data_set(data, datasets)
datasets
}
datasets <- sample_filtered_data()