Class to encapsulate filtered datasets
FilteredData.RdClass to encapsulate filtered datasets
Class to encapsulate filtered datasets
Details
The main purpose of this class is to provide a collection of reactive datasets, each dataset having a filter state that determines how it is filtered.
For each dataset, get_filter_expr returns the call to filter the dataset according
to the filter state. The data itself can be obtained through get_data.
The datasets are filtered lazily, i.e. only when requested / needed in a Shiny app.
By design, any dataname set through set_dataset cannot be removed because
other code may already depend on it. As a workaround, the underlying
data can be set to NULL.
The class currently supports variables of the following types within datasets:
choices: variable of typefactor, e.g.ADSL$COUNTRY,iris$Specieszero or more options can be selected, when the variable is a factorlogical: variable of typelogical, e.g.ADSL$TRT_FLAGexactly one option must be selected,TRUEorFALSEranges: variable of typenumeric, e.g.ADSL$AGE,iris$Sepal.Lengthnumerical range, a range within this range can be selecteddates: variable of typeDate,POSIXltOther variables cannot be used for filtering the data in this class.
Common arguments are:
filtered: whether to return a filtered result or notdataname: the name of one of the datasets in thisFilteredDatavarname: one of the columns in a dataset
Methods
Method new()
Initialize a FilteredData object
Usage
FilteredData$new(
data_objects,
join_keys = teal.data::join_keys(),
code = NULL,
check = FALSE
)Arguments
data_objects(
list) should named elements containingdata.frameorMultiAssayExperiment. Names of the list will serve asdataname.join_keys(
JoinKeysor NULL) seeteal.data::join_keys().code(
CodeClassorNULL) seeteal.data::CodeClass.check(
logical(1)) whether data has been check against reproducibility.
Method datanames()
Gets datanames
The datanames are returned in the order in which they must be
evaluated (in case of dependencies).
Method get_datalabel()
Returns
(character) keys of dataset
Set list of external filter states available for activation.
Unlike adding new filter from the column, these filters can come with some prespecified settings.
teal_slices are wrapped in a reactive so they can be updated from elsewhere in the app.
Filters passed in x are limited to those that can be set for this FilteredData,
i.e. they have the correct dataname and varname (waived teal_slice_fixed as they do not have varname).
List is accessible in ui/srv_active through ui/srv_available_filters.
Method get_call()
Gets a call to filter the dataset according to the filter state.
It returns a call to filter the dataset only, assuming the
other (filtered) datasets it depends on are available.
Together with self$datanames() which returns the datasets in the correct
evaluation order, this generates the whole filter code, see the function
FilteredData$get_filter_code.
For the return type, note that rlang::is_expression returns TRUE on the
return type, both for base R expressions and calls (single expression,
capturing a function call).
The filtered dataset has the name given by self$filtered_dataname(dataname)
This can be used for the Show R Code generation.
Method get_data()
Gets filtered or unfiltered dataset.
For filtered = FALSE, the original data set with
set_data is returned including all attributes.
Method get_check()
Returns whether the datasets in the object has undergone a reproducibility check.
Method get_filter_overview()
Get filter overview table in form of X (filtered) / Y (non-filtered).
This is intended to be presented in the application.
The content for each of the data names is defined in get_filter_overview_info method.
Method set_dataset()
Adds a dataset to this FilteredData.
Arguments
data(
data.frame,MultiAssayExperiment)
data to be filtered.dataname(
string)
the name of thedatasetto be added to this objectmetadata(named
listorNULL)
Field containing metadata about the dataset. Each element of the list should be atomic and length one.label(
character(1))
Label to describe the dataset
Details
set_dataset creates a FilteredDataset object which keeps dataset for the filtering purpose.
If this data has a parent specified in the JoinKeys object stored in private$join_keys
then created FilteredDataset (child) gets linked with other FilteredDataset (parent).
"Child" dataset return filtered data then dependent on the reactive filtered data of the
"parent". See more in documentation of parent argument in FilteredDatasetDefault constructor.
Method set_code()
Sets the R preprocessing code for single dataset.
Method get_filter_state()
Gets states of all active FilterState objects.
Method format()
Returns a formatted string representing this FilteredData object.
Method print()
Prints this FilteredData object.
Method set_filter_state()
Sets active filter states.
Arguments
stateeither a
named listlist of filter selections or ateal_slicesobject
specification by list will be deprecated soon
Examples
utils::data(miniACC, package = "MultiAssayExperiment")
datasets <- teal.slice:::FilteredData$new(
list(iris = list(dataset = iris),
mae = list(dataset = miniACC)
)
)
fs <-
teal_slices(
teal_slice(dataname = "iris", varname = "Sepal.Length", selected = c(5.1, 6.4),
keep_na = TRUE, keep_inf = FALSE),
teal_slice(dataname = "iris", varname = "Species", selected = c("setosa", "versicolor"),
keep_na = FALSE),
teal_slice(dataname = "mae", varname = "years_to_birth", selected = c(30, 50),
keep_na = TRUE, keep_inf = FALSE),
teal_slice(dataname = "mae", varname = "vital_status", selected = "1", keep_na = FALSE),
teal_slice(dataname = "mae", varname = "gender", selected = "female", keep_na = TRUE),
teal_slice(dataname = "mae", varname = "ARRAY_TYPE",
selected = "", keep_na = TRUE, datalabel = "RPPAArray", arg = "subset")
)
datasets$set_filter_state(state = fs)
shiny::isolate(datasets$get_filter_state())
Method remove_filter_state()
Removes one or more FilterState from a FilteredData object.
Method clear_filter_states()
Remove all FilterStates of a FilteredDataset or all FilterStates
of a FilteredData object.
Method srv_filter_panel()
Arguments
id(
character(1))
an ID string that corresponds with the ID used to call the module's UI function.active_datanamesfunction / reactivereturningdatanamesthat should be shown on the filter panel, must be a subset of thedatanamesargument provided toui_filter_panel; if the function returnsNULL(as opposed tocharacter(0)), the filter panel will be hidden
Method ui_active()
Server module responsible for displaying active filters.
Method srv_active()
Server module responsible for displaying active filters.
Method ui_add()
Server module responsible for displaying drop-downs with variables to add a filter.
Method srv_add()
Server module responsible for displaying drop-downs with variables to add a filter.
Usage
FilteredData$srv_add(id, active_datanames = reactive(self$datanames()))Method srv_overview()
Arguments
id(
character(1))
an ID string that corresponds with the ID used to call the module's UI function.active_datanames(
reactive)
returningdatanamesthat should be shown on the filter panel, must be a subset of thedatanamesargument provided toui_filter_panel; if the function returnsNULL(as opposed tocharacter(0)), the filter panel will be hidden.
Method handle_active_datanames()
Method is deprecated. Provide resolved active_datanames to srv_filter_panel
Method get_varnames()
Method is deprecated, Please extract variable names directly from the data instead
Method get_filterable_varnames()
Method is deprecated, please use self$get_filter_state() and retain attr(, "filterable_varnames") instead.
Method set_filterable_varnames()
Method is deprecated, please use self$set_filter_state and teal_slices() with include_varnames instead.
Method get_formatted_filter_state()
Method is deprecated, please use format.teal_slices on object returned from self$get_filter_state()
Examples
library(shiny)
datasets <- teal.slice:::FilteredData$new(
list(
iris = list(dataset = iris),
mtcars = list(dataset = mtcars)
)
)
# get datanames
datasets$datanames()
#> [1] "iris" "mtcars"
datasets$set_filter_state(
teal_slices(teal_slice(dataname = "iris", varname = "Species", selected = "virginica"))
)
isolate(datasets$get_call("iris"))
#> $filter
#> iris <- dplyr::filter(iris, Species == "virginica")
#>
datasets$set_filter_state(
teal_slices(teal_slice(dataname = "mtcars", varname = "mpg", selected = c(15, 20)))
)
isolate(datasets$get_filter_state())
#> {
#> "slices": [
#> {
#> "dataname" : "iris",
#> "varname" : "Species",
#> "id" : "iris Species",
#> "choices" : ["setosa", "versicolor", "virgin...
#> "selected" : ["virginica"],
#> "fixed" : false,
#> "anchored" : false,
#> "multiple" : true
#> },
#> {
#> "dataname" : "mtcars",
#> "varname" : "mpg",
#> "id" : "mtcars mpg",
#> "choices" : [10.4, 34],
#> "selected" : [15, 20],
#> "fixed" : false,
#> "anchored" : false,
#> "multiple" : true
#> }
#> ],
#> "attributes": {
#> "include_varnames" : {
#> "iris" : ["Sepal.Length", "Sepal.Width", ...
#> "mtcars" : ["mpg", "cyl", "disp", "hp", "dr...
#> },
#> "count_type" : "none",
#> "allow_add" : true
#> }
#> }
isolate(datasets$get_call("iris"))
#> $filter
#> iris <- dplyr::filter(iris, Species == "virginica")
#>
isolate(datasets$get_call("mtcars"))
#> $filter
#> mtcars <- dplyr::filter(mtcars, mpg >= 15 & mpg <= 20)
#>
## ------------------------------------------------
## Method `FilteredData$set_filter_state`
## ------------------------------------------------
utils::data(miniACC, package = "MultiAssayExperiment")
datasets <- teal.slice:::FilteredData$new(
list(iris = list(dataset = iris),
mae = list(dataset = miniACC)
)
)
#> Loading required package: MultiAssayExperiment
#> Loading required package: SummarizedExperiment
#> Loading required package: MatrixGenerics
#> Loading required package: matrixStats
#>
#> Attaching package: ‘MatrixGenerics’
#> The following objects are masked from ‘package:matrixStats’:
#>
#> colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
#> colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
#> colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
#> colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
#> colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
#> colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
#> colWeightedMeans, colWeightedMedians, colWeightedSds,
#> colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
#> rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
#> rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
#> rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
#> rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
#> rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
#> rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
#> rowWeightedSds, rowWeightedVars
#> Loading required package: GenomicRanges
#> Loading required package: stats4
#> Loading required package: BiocGenerics
#>
#> Attaching package: ‘BiocGenerics’
#> The following objects are masked from ‘package:stats’:
#>
#> IQR, mad, sd, var, xtabs
#> The following objects are masked from ‘package:base’:
#>
#> Filter, Find, Map, Position, Reduce, anyDuplicated, aperm, append,
#> as.data.frame, basename, cbind, colnames, dirname, do.call,
#> duplicated, eval, evalq, get, grep, grepl, intersect, is.unsorted,
#> lapply, mapply, match, mget, order, paste, pmax, pmax.int, pmin,
#> pmin.int, rank, rbind, rownames, sapply, setdiff, sort, table,
#> tapply, union, unique, unsplit, which.max, which.min
#> Loading required package: S4Vectors
#>
#> Attaching package: ‘S4Vectors’
#> The following object is masked from ‘package:utils’:
#>
#> findMatches
#> The following objects are masked from ‘package:base’:
#>
#> I, expand.grid, unname
#> Loading required package: IRanges
#> Loading required package: GenomeInfoDb
#> Loading required package: Biobase
#> Welcome to Bioconductor
#>
#> Vignettes contain introductory material; view with
#> 'browseVignettes()'. To cite Bioconductor, see
#> 'citation("Biobase")', and for packages 'citation("pkgname")'.
#>
#> Attaching package: ‘Biobase’
#> The following object is masked from ‘package:MatrixGenerics’:
#>
#> rowMedians
#> The following objects are masked from ‘package:matrixStats’:
#>
#> anyMissing, rowMedians
fs <-
teal_slices(
teal_slice(dataname = "iris", varname = "Sepal.Length", selected = c(5.1, 6.4),
keep_na = TRUE, keep_inf = FALSE),
teal_slice(dataname = "iris", varname = "Species", selected = c("setosa", "versicolor"),
keep_na = FALSE),
teal_slice(dataname = "mae", varname = "years_to_birth", selected = c(30, 50),
keep_na = TRUE, keep_inf = FALSE),
teal_slice(dataname = "mae", varname = "vital_status", selected = "1", keep_na = FALSE),
teal_slice(dataname = "mae", varname = "gender", selected = "female", keep_na = TRUE),
teal_slice(dataname = "mae", varname = "ARRAY_TYPE",
selected = "", keep_na = TRUE, datalabel = "RPPAArray", arg = "subset")
)
datasets$set_filter_state(state = fs)
#> [WARN] 2023-08-14 13:45:19.3671 pid:646 token:[] teal.slice filters for columns: ARRAY_TYPE excluded from mae
shiny::isolate(datasets$get_filter_state())
#> {
#> "slices": [
#> {
#> "dataname" : "iris",
#> "varname" : "Sepal.Length",
#> "id" : "iris Sepal.Length",
#> "choices" : [4.2999999999999998, 7.900000000...
#> "selected" : [5.0999999999999996, 6.400000000...
#> "keep_na" : true,
#> "keep_inf" : false,
#> "fixed" : false,
#> "anchored" : false,
#> "multiple" : true
#> },
#> {
#> "dataname" : "iris",
#> "varname" : "Species",
#> "id" : "iris Species",
#> "choices" : ["setosa", "versicolor", "virgin...
#> "selected" : ["setosa", "versicolor"],
#> "keep_na" : false,
#> "fixed" : false,
#> "anchored" : false,
#> "multiple" : true
#> },
#> {
#> "dataname" : "mae",
#> "varname" : "years_to_birth",
#> "id" : "mae years_to_birth",
#> "choices" : [14, 83],
#> "selected" : [30, 50],
#> "keep_na" : true,
#> "keep_inf" : false,
#> "fixed" : false,
#> "anchored" : false,
#> "multiple" : true
#> },
#> {
#> "dataname" : "mae",
#> "varname" : "vital_status",
#> "id" : "mae vital_status",
#> "choices" : ["0", "1"],
#> "selected" : ["1"],
#> "keep_na" : false,
#> "fixed" : false,
#> "anchored" : false,
#> "multiple" : true
#> },
#> {
#> "dataname" : "mae",
#> "varname" : "gender",
#> "id" : "mae gender",
#> "choices" : ["female", "male"],
#> "selected" : ["female"],
#> "keep_na" : true,
#> "fixed" : false,
#> "anchored" : false,
#> "multiple" : true
#> }
#> ],
#> "attributes": {
#> "include_varnames" : {
#> "iris" : ["Sepal.Length", "Sepal.Width", ...
#> "mae" : ["patientID", "years_to_birth", ...
#> },
#> "count_type" : "none",
#> "allow_add" : true
#> }
#> }