Manages filtering of all datasets in the application or module.
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 thisFilteredDataobjectvarname: 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())Arguments
data_objects(
named list) List of data objects. Names of the list will be used asdatanamefor respective datasets.join_keys(
join_keys) optional joining keys, seeteal.data::join_keys().
Method datanames()
Gets datanames.
Method set_available_teal_slices()
Set list of external filter states available for activation.
Details
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 object,
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_available_teal_slices()
Get list of filter states available for this object.
Method get_call()
Gets a call to filter the dataset according to the filter state.
Details
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_filter_overview()
Creates filter overview table to be displayed in the application.
One row is created per dataset, according to the get_filter_overview methods
of the contained FilteredDataset objects.
Method set_dataset()
Adds a dataset to this FilteredData.
Arguments
data(
data.frameorMultiAssayExperiment) data to be filtered.dataname(
character(1)) the name of thedatasetto be added to this object.
Details
set_dataset creates a FilteredDataset object which keeps dataset for the filtering purpose.
If this data has a parent specified in the join_keys 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 DataframeFilteredDataset constructor.
Method set_join_keys()
Set the join_keys.
Arguments
join_keys(
join_keys), seeteal.data::join_keys().
Method get_filter_state()
Gets states of all contained 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.
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 ui_filter_panel()
top-level shiny module for the filter panel in the teal app.
Contains 1) filter overview panel, 2) filter active panel, and 3) add filters panel.
Method srv_filter_panel()
Server function for filter panel.
Arguments
id(
character(1))shinymodule instance id.active_datanames(
functionorreactive) returningdatanamesthat should be shown on the filter panel. Must be a subset of thedatanamesin thisFilteredData. 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_overview()
Creates the UI definition for the module showing counts for each dataset contrasting the filtered to the full unfiltered dataset.
Per dataset, it displays the number of rows/observations in each dataset, the number of unique subjects.
Method srv_overview()
Server function to display the number of records in the filtered and unfiltered data.
Arguments
id(
character(1))shinymodule instance id.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.
Examples
# use non-exported function from teal.slice
FilteredData <- getFromNamespace("FilteredData", "teal.slice")
library(shiny)
datasets <- FilteredData$new(list(iris = iris, mtcars = mtcars))
# get datanames
datasets$datanames()
#> [1] "iris" "mtcars"
datasets$set_filter_state(
teal_slices(teal_slice(dataname = "iris", varname = "Species", selected = "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)
#>
### set_filter_state
library(shiny)
data(miniACC, package = "MultiAssayExperiment")
datasets <- FilteredData$new(list(iris = iris, mae = 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, experiment = "RPPAArray", arg = "subset"
)
)
datasets$set_filter_state(state = fs)
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
#> },
#> {
#> "dataname" : "mae",
#> "varname" : "ARRAY_TYPE",
#> "id" : "mae ARRAY_TYPE RPPAArray subset..
#> "choices" : ["", "protein_level"],
#> "selected" : [""],
#> "keep_na" : true,
#> "fixed" : false,
#> "anchored" : false,
#> "multiple" : true,
#> "arg" : "subset",
#> "experiment" : "RPPAArray"
#> }
#> ],
#> "attributes": {
#> "include_varnames" : {
#> "iris" : ["Sepal.Length", "Sepal.Width", ...
#> "mae" : ["patientID", "years_to_birth", ...
#> },
#> "count_type" : "none",
#> "allow_add" : true
#> }
#> }