Changelog
Source:NEWS.md
teal 0.15.1
CRAN release: 2024-02-22
teal 0.15.0
CRAN release: 2024-02-08
New features
- Added
landing_popup_module
function which creates a module that will display a popup when the app starts. The popup will block access to the app until it is dismissed. - Filter state snapshots can now be uploaded from file. See
?snapshot
. - Added
as_tdata
function to facilitate migration of modules to the newteal_data
class. - Added
build_app_title
function to facilitate adding favicons to app title.
Breaking changes
-
data
argument ininit
now accepts onlyteal_data
andteal_data_module
. -
tdata
has been deprecated and replaced withteal_data
. Support fortdata
passed to thedata
argument inmodule(server)
will be removed in the next release. -
module(ui)
argument no longer acceptsdata
anddatasets
arguments. All data dependent logic should be set in the server function. -
module(server)
argument deprecateddatasets
argument.teal_module
s’ server functions should acceptdata
(teal_data
) instead. - Changed the order of formal arguments in
init
.filter
now comes directly aftermodules
, beforetitle
.
Miscellaneous
- Enhanced a
module
validation checks so that it won’t throw messages aboutdata
argument unnecessarily. - Added argument to
teal_slices
and made modifications toinit
to enable taggingteal_slices
with an app id to safely upload snapshots from disk. -
FilteredData
no longer stores pre-processing code in specific slots. Code is now attached as attribute. Adjusted appropriately.
teal 0.14.0
New features
- Enabled module specific filter panel. See
module_specific
inteal::teal_slices
documentation. - Enabled capturing and resetting application filter state with snapshots. See
?snapshot
. - Enabled
reporter_previewer_module
to customize default values throughsrv_args
. - Enabled passing own
reporter_previewer_module
in a list of modules to override default one.
Breaking changes
- Specifying
filter
argument inteal::init
requiresteal_slices
object now. Details in documentation ofteal::init
. - Soft deprecated
filters
argument inmodule
and replaced it withdatanames
. Details in documentation ofteal::module
teal 0.13.0
Breaking changes
- The use of
datasets
argument inmodules
has been deprecated and will be removed in a future release. Please usedata
argument instead.data
is of typetdata
; see “Creating custom modules” vignettes and function documentation ofteal::new_tdata
for further details. - Due to deprecation of
chunks
inteal.code
, theteal
framework now uses their replacement (qenv
) instead. The documentation inteal
has been updated to reflect this and custom modules written withchunks
should be updated to useqenv
. - Due to deprecation of
chunks
inteal.code
,get_rcode
,get_rcode_srv
, andget_rcode_ui
have been removed.
New features
- Added the
validate_inputs
function that transfers input validation messages to app output. -
modules
argument ofinit
acceptsteal_module
type of object. There is no need to wrap up a single module inmodules()
orlist()
. - Updated
module_nested_tabs
so that only active modules are calculated in ateal
app.
Miscellaneous
- Updated examples to use
scda.2022
. - Added R session information into a link in the footer of
teal
applications. - Added data hashing step using
rlang
instead ofdigest
package to calculate the hash (which has been moved fromteal.data
andteal.slice
). There is now an explicit hashing check in the reproducible code output. - Removed deprecated functions:
root_modules
,default_filter
,bookmarkableShinyApp
, as well as deprecated logging mechanism, including the functionslog_app_usage
and.log
. - Updated the “Teal and Bootstrap Themes” vignette to provide more details customizing a
teal
app withbslib::run_with_themer
. - Removed outdated diagram from
srv_nested_tabs
documentation. - Changed default values of
header
andfooter
arguments ininit
to empty text.
teal 0.12.0
New features
- Added the support for custom
bslib
bootstrap themes inteal::init
apps, please read more in the newteal-bs-themes
vignette.
Enhancements
- Added the option to choose which variables can be filtered in the filter panel by using the
filterable
attributes for the per-dataset lists in thefilter
argument ofinit
. - Updated
teal_module
to havedata
argument which receives a list of reactive filter data with"code"
and"join_keys"
attributes. - Updated
teal_module
to havefilter_panel_api
argument which receives aFilterPanelAPI
object. - Updated the internals of
module_teal
to reflect changes inteal.slice
.
Breaking changes
- Updated
teal_module
to no longer receivedatasets
object in the...
argument. In order to usedatasets
in theteal_module
please specifydatasets
explicitly. - Deprecated
merge_expression
argument inget_rcode_srv
function and removed it inget_rcode
function. - Deprecated
session
argument inget_rcode
function.
teal 0.11.1
Enhancements
- Added new function
reporter_previewer_module
to wrap theteal.reporter
package previewer functionality as ateal
module. - Updated
teal
to supportmodules
which include reporting. If anymodule
which supports reporting is included then areporter_previewer_module
is included. - Added default arguments to
module()
and the server argument is now a function where the second argument can be...
ordatasets
.
Breaking changes
- Deprecated
bookmarkableShinyApp
. In future releases theteal
framework will stop supportingshiny
bookmarking (which has not officially been supported); it may be officially supported in the future. Note the filter panel inteal.slice
retains its ability to save and restore its state if used in a standaloneshiny
app with bookmarking.
teal 0.11.0
-
teal.data
: creating and loading the data needed forteal
applications. -
teal.widgets
:shiny
components used withinteal
. -
teal.slice
: provides a filtering panel to allow filtering of data. -
teal.code
: handles reproducibility of outputs. -
teal.transform
: standardizes extracting and merging data. -
teal.logger
: standardizes logging withinteal
framework.
The teal
package contains the code to create apps (teal::init
), to create a module (teal::module
) and to group modules in the app (teal::modules
). teal
depends on teal.transform
and teal.data
which contain the functions that teal
app creators are likely to need. The other package teal
only imports from and therefore teal
module creators should either fully specify functions from these packages when required or import them into custom packages as library(teal)
will not load them.
Breaking changes
-
teal
package has been split into multiple smaller packages, see above. - Deprecated
root_modules
function, users should usemodules
directly insideinit
. - Due to deprecation of
root_modules
anylabel
argument tomodules
must be explicitly named. For examplemodules("lab", mod1, mod2)
should be replaced withmodules(label = "lab", mod1, mod2)
.
Miscellaneous
- Minor changes to internals of
teal
: main module panel now has fixedshiny
nameroot
and the active tab is namedactive_tab
notActive_tab
. -
MultiAssayExperiment
is now suggested packages, not required. Objects dependent onMultiAssayExperiment
are changed to lazy-load this now suggested package.
teal 0.10.1
Breaking changes
- Changed the
HTML
identifiers ofteal
modules - now each nested module receives its ownshiny
namespace. - Deprecated all functions related to connectors that have been moved to their own separate packages.
- Removed
raw_dataset
,raw_dataset_connector
,named_dataset
,named_dataset_file
,named_dataset_connector
,relational_dataset
,relational_dataset_file
,relational_dataset_connector
,key
,as_cdisc
,as_cdisc_relational
. - Removed
rcd_connection
andrcd_data
;scda_dataset_connectors
can be passed intocdisc_data
andteal_data
directly. - Replaced
rcd_dataset_connector
andrcd_cdisc_dataset_connector
withscda_dataset_connector
andscda_cdisc_dataset_connector
respectively. - Renamed
teal_show_js_log
option intoteal.show_js_log
to match options naming convention. - Removed
%is_in%
andstop_shiny
internal utility functions.
New features
Logging
- Added support for logging using the
logger
package. - Added a new function
register_logger
, which registers a logger in a given namespace. - Added trace and info levels log messages to the
teal
framework. - Added
pid
andshiny
session token into footnote so app developers can identify logs for apps.
Other
Added print methods to the
DatasetConnector
,RelationalData
,RelationalDataconnector
andJoinKeys
classes and added input validation to the implementation of the print method that was already in theDataset
object.Added public facing constructor functions for
CDISCDataConnector
,RelationalDataConnector
, andDataConnection
classes.Modified
data_extract_spec
to allow both thefilter
andselect
parameters to beNULL
, which results in thedata_extract_ui
acting as if afilter_spec
with all variables as possible choices had been supplied as thefilter
argument and aselect_spec
with themultiple
parameter set toTRUE
had been supplied as theselect
argument.Added support of the full screen for a
module
when thefilters
argument is equalNULL
.Added support for
shiny::moduleServer
passed to the server parameter ofteal::module
.Added
teal.threshold_slider_vs_checkboxgroup
as an R option: if a categorical variable has more than this number of unique values, the filter panel uses a drop-down select input instead of a checkbox group.Extended the
FilteredData
API to allow managing filter states programmatically and not only from the UI of ateal
application.Hid the buttons to remove filters from all datasets and each dataset when there are no active filters.
Updated
init
to acceptRelationalData
,data.frame
,MultiAssayExperiment
,Dataset
,DatasetConnector
,list
or a function returning a named list as data input.
Bug fixes
-
choices_selected
now correctly removes duplicates from the array passed to itschoices
parameter. - Fixed call returned by
FilterState
in case of usingMultiAssayExperiment::subsetByColData
. Now single condition for variable containingNA
values is!is.na(var) & var == <condition>
. - Fixed data loading of
DatasetConnector
being dependent on otherDataset
orDatasetConnector
objects. - Fixed restoring a bookmarked filter state of
teal
application. - Refactored
module_nested_tabs
to fix the issue with the filter panel not reacting to an input change in a nested module. -
updateOptionalSelectInput
no longer sets input toNULL
whenlogical
value is passed toselected
. - Fixed setting
JoinKeys
when key name between twoDataset
object differs. - Fixed printing of the
JavaScript
console logs to theR
console whenteal.show_js_log = TRUE
.
Miscellaneous
- Soft-deprecate
mae_dataset()
in favor of more generaldataset()
constructor. - Added a vignette describing the modifications to
teal
applications users can apply usingR
options. - Added default values to the
label
argument ofselect_spec
andfilter_spec
. - Added validation to
FilteredDataset::get_data
to accept logical input only. - Changed references to outdated functions of
teal.devel
in the documentation. - Introduced a
Teal
prefix to all publicR6
classes to avoid name collisions with other packages. - Removed dependency on
utils.nest
and replaced its functionality inteal
with equivalents from thecheckmate
package and baseR
. - Replaced the old
shiny
server functions ofDataConnection
,RelationalDataConnector
,DatasetConnector
, andRelationalData
with theshiny::moduleServer
equivalents. - Running a
teal
application viaui_teal_with_splash
andsrv_teal_with_splash
is now no longer recommended because it doesn’t support new features (e.g. logging, bookmarking). Useinit
instead. - Updated the R version requirement to >= 4.0.
- Updated the “filter panel collapse” icon to remove warnings when using
shiny
version >= 1.7. - Removed some of the non-exported, debugging modules.
- Updated the footer tag style to be less visible.
teal 0.10.0
New features
- Allow passing
MultiAssayExperiment
to theteal::init
usingmae_dataset
function or through the connectors. - Refactored filter panel to use
MultiAssayExperiment
objects. Filters can be set on a subject level (colData
ofMAE
object) and on a experiment level (colData
androwData
of an assay). - Added
cdse_dataset_connector
to create delayed data objects fromCDSE
. - Added
datasetdb_dataset_connector
to create delayed data objects fromDataSetDB
. - Added
ricepass_connection
to create delayed data objects fromentimICE
viaricepass
. - Refactor of the filter panel:
- Simplified setting of initial filter state without need to specify “choices” or “range” named list element depending on the variable class.
-
Dataset
type determines an appearance and a functionality of related filters and filters summary. -
Datasets
are passed (by reference) fromDDL
toFilteredData
skipping extracting data and their attributes. - Redesigned variable filter labels in “Active Filter Variables” panel.
- Fully testable server functions.
Bug fixes
- Fixed the bug caused by calling
mutate_dataset
multiple times on the sameDatasetConnector
orDataset
object. - Fixed a bug that caused the output of
get_code
function to not reproduce its raw data set. - Changed
filter_spec
to allow no variable selection upon app initialization, where the first possible value was previously selected.
Enhancements
-
modules
parameter ofteal::init
function can also receive alist
exceptroot_modules
function call. - Added
split
andmerge
methods to theJoinKeys
object. - Added
all_choices()
as a possible argument to theselected
parameter offilter_spec
,select_spec
andchoices_selected
indicating that all choices are selected. - The
append
method of aCodeClass
object has been modified to print a warning message when the argument does not result in any code being added because it is duplicated. - Implemented delayed functionality to the mutate method of the
Dataset
andDatasetConnector
objects. - Modified
teal_data
to return aCDISCData
object whenever any of its arguments is a type ofCDISCData
object. - Updated filters to show both levels of a logical variable TRUE/FALSE even if one is missing from the original array.
Miscellaneous
- Updated
LICENCE
andREADME
with new package references. - Added a method
get_hash
to theDataset
class returning the MD5 hash of the object stored inside theDataset
object. - Replaced
random.cdisc.data
withscda
in examples and tests. - Implemented functionality to store
JoinKeys
inDataset
andDatasetConnector
classes. - Added
error_on_lintr: TRUE
to.lintr
- The pipe operator
%>%
is now exported such that downstream code and packages can use it. - Removed hyperlinks to the
rice
package from the documentation.
teal 0.9.5
Enhancements
- Added informational stop message when using
mutate_data
withRelationalDataConnector
. - Modified
as_cdisc
to behave similarly tocdisc_dataset
when called on aDataset
object. - Changed the displayed format of the data name and the column name in
data_extract_spec
UI elements. Both are now compressed to<data name>.<column name>
if they don’t change during runtime of the app. - Added
ADSAFTTE
to the list of recognizedADaM
dataset names. - Added another example to
data_extract_spec
’s doc string showcasing app users can choose a variable used for filtering in the encoding panel. - Added CSS styling to tool tips in
teal
modules.
teal 0.9.4
Enhancements
- Released
snowflake
connection and connectors. - Changed ordering of datasets to be more intuitive (topologically first for CDISC datasets only and then according to input datasets order).
- When closing a
teal
app (ending a usershiny
session), allDataConnection
s will now try to close their connections. - Added
ADHY
keys to configuration file. - Extended the
filter_spec
function: the parameterchoices
is no longer mandatory (the function will take all possible choices by default) and thevars
parameter additionally accepts thechoices_selected
and allows to change the variables for filtering using the UI elements in the encoding panel.
teal 0.9.3
New Features
- Support for data-standard independent input and filtering. That includes refactor of the all data and dataset structures together with refactor of
FilteredData
class. - New
JoinKeys
class (withjoin_keys()
constructors andjoin_key()
constructor for its elements) to store joining key columns between datasets. - Refactored the most basic
dataset()
constructor, addedcdisc_dataset()
constructor andas_cdisc()
conversion function. - Soft-deprecate removed class constructors and obsolete functions (e.g.
keys()
). - Added
get_keys()
andset_keys()
functions to extract and manipulate datasets primary keys respectively. - Unexported
filtered_data_new
,filtered_data_set
andfiltered_data_set_filters
.
Bug fixes
- Duplicated lines of code passed to
teal::cdisc_dataset
and otherteal::RelationalDataset
constructors should now be shown when getting the code fromteal::cdisc_data
objects and otherteal::RelationalData
objects. - Added ability to press “Enter” key without having to set focus to the Submit button for delayed data loading.
- Allow
variable_choices
to use datasets with missing labels. - Fixed bug that ignores input of
NULL
toselected
argument ofselect_spec
function.
teal 0.9.2
New Features
- Added
python_dataset_connector
to create delayed data objects from python scripts or directly from python code. - NOTE:
python_dataset_connector
is not yet ready to be deployed onRSConnect
because it does not containnumpy
andpandas
, which arePython
libraries used inpython_dataset_connector
. - Added support for filtering on
Date
andDatetime
variables in the Filter Panel. - Added buttons for
date
anddatetime
filter widgets to reset the value to the original. - Added new function
check_key_duplicates
, which creates a short summary about rows with duplicated primary key (row numbers and the number of duplicates)
Enhancements
- Fixed lack of labels for
character
andfactor
variables in the Filter Panel. - All variables are now displayed in
module_filter_panel
, not only those of typesnumeric
,logical
,factor
,character
andDate
- Fixed
mutate_data
to accept the whole scope of objects forvars
. - Clarified
teal::init
function documentation to state that customCSS
loading code withhtmltools::htmlDependency
should be included in theheader
argument rather than inside UI arguments of modules. - Enabled empty select field inside
data_extract_spec
. - Added new argument
drop_keys
tofilter_spec
to decide whether to drop or keep keys columns on single filter on those columns. - Added a new optional argument
keys
tovariable_choices
.keys
specifies the names of the variables, which should have the new key icon shown next to them in the variable drop down menus in the left-hand side encoding panels instead of the icon appropriate for their original R variable type.variable_choices
now also works withRelationalDataset
andRelationalDatasetConnector
objects.
teal 0.9.1
- Adds method to resolve nested lists containing delayed data objects, which can be used for
arm_ref_comp
objects. - Nested tabs module now has better alignment with the filter panel on the page.
- Allow
width
argument inoptionalSelectInput
. - Added
lifecycle
badges to all exported functions. - Added new
code_dataset_connector
andcode_cdisc_dataset_connector
functions which enable the creation of new delayed data objects given a string of code. - Added new functions
csv_dataset_connector
andcsv_cdisc_dataset_connector
. - Updated
set_ui_input
method ofRawDatasetConnector
andNamedDatasetConnector
to handle user definedshiny
inputs. - Include
Keep Inf
checkbox for numerical filter items.Keep NA
andKeep Inf
checkbox doesn’t appear if there are no missing or infinite values. - Replace existing
RelationalData
class with abstract classRelationalDataCollection
and renameRelationalDataList
class asRelationalData
. Thedata
argument toteal::init
is now always aRelationalData
object. - Added
fun_cdisc_dataset_connector
to enable providing a custom function which returning a dataset. - Removed
code
andscript
arguments fromas_relational
wrapper. This is intended to be done withmutate_dataset
functionality. -
filer
argument ininit
has added a validation step to ensure compatibility with the rest of the app. Variables inherited fromADSL
have to be specified only forADSL
dataset. - Fixes the issue with connection close code not being present in
get_code
results. - Fixes the issue of occasional incorrect ordering of bar charts on the filter panel.
- More informative error displayed when
pull_fun
ofDataConnection
produces an error.
teal 0.9.0
cdisc_dataset
anddataset
now return R6 class objects (RelationalDataset
).A new
teal_data
function to include datasets and connectors intoteal
application.cdisc_data
function to include datasets and connectors intoteal
application where acheck
argument still could be used and other consistency tests are performed.get_raw_data
can be used to derive raw data from R6 objects e.g. (RelationalDataset
).RawDatasetConnector
,NamedDatasetConnector
andRelationalDatasetConnector
to execute custom function call in order to get data from connection.CodeClass
to manage reproducibility of the data and relationships between datasets. Not directly exposed to the public interface.mutate_dataset
allows to modify dataset or connector viacode
argument or an R script.mutate_data
allows to change any dataset inRelationalData
,RelationalDataConnector
orRelationalDataList
.New wrapper functions to manipulate
RelationalDatasetConnector
andRelationalDataset
such asget_dataset
,load_dataset
,as_relational
.New wrapper functions to manipulate
RelationalDataConnector
,RelationalData
andRelationalDataList
such asget_datasets
,load_datasets
.choices_labeled
,filter_spec
,select_spec
,data_extract_spec
,value_choices
,variable_choices
as S3 class applied ondata.frame
and also on delayed data.You can no longer modify the
app$datasets
, but must instead use argumentfilter
in theinit
function.New modules were created to create a module of nested
teal
modules, then another one that adds the right filter pane to each tab. Theteal::init
function stays unchanged.The
teal::init
function now returns a UI function with an optionalid
argument. This allows to embed it into other applications. A split view of twoteal
applications side-by-side is one such example and shown in a vignette.teal::init
was turned into a wrapper function aroundmodule_teal_with_splash.R
and developers that want to embedteal
as ashiny
module should directly work with these functions (ui_teal_with_splash
andsrv_teal_with_splash
) instead ofteal::init
.The
teal::init
function now has a title parameter to set the title of the browser window.Missing data
NA
is now explicitly addressed in the filter panel:NA
s are excluded by default and a checkbox to include them was added.Statistics of the data are visually depicted in terms of histograms or bar charts overlayed onto the
shiny
input elements.Added buttons to remove all filters applied to a dataset.
Restored the functionality to hide the filter panel for a module when it was constructed with
filters = NULL
.Moved helper functions into
utils.nest
and removed unused functionsset_labels_df
andget_labels_df
.optionalSelectInput
now allows for grouped choices.
Refactor of FilteredData
(for developers)
-
FilteredData
is now fully reactive. Now filtered data is lazy evaluated as per need. This further opens the door to bookmarkingteal
apps (bookmarking currently works for the right filtering panel, but we will make this feature more sophisticated in a future release, each module must be reviewed and adapted if it containsreactiveValues
). - Datasets and materialized connectors are provided to
FilteredData
byset_datasets_data
function located ininit_datasets.R
file. - Renamed
get_dataset()
method toget_data()
. - Renamed
get_filter_call()
method toget_filter_expr()
; returns an expression rather than a list. - Removed argument
isolate
fromget_data()
method and similar methods. You mustisolate
it yourself as needed. If you want to temporarily deactivateshiny
errors due to missing errors, you can setoptions(shiny.suppressMissingContextError = TRUE)
. In general, avoidisolate
as this breaks reactivity. - We added a development module to add several filters at once, e.g. safety filters. This is to be evaluated before it is converted into a proper module and made available to end-users.
teal 0.8.4
- Progress bar for UI creation in delayed loading module.
- Change output of
keys
function tokeys
object. - Delayed version of
choices_selected
. - Fix an error in
choices_selected
whenselected
is not inchoices
. - Fix
pickerInput
not to display column name as label if it’s missing.
teal 0.8.3
- Enable
teal
app to initialize without data. The data are then loaded from within theteal
app. - New classes (
DatasetConnector
,DataConnector
) to connect to various data sources, including: * connector torice
API -rice_data
andrice_dataset_connector
* connector toRDS
files -rds_data
andrds_dataset_connector
- Message appears at bottom right of
shiny
app whenshiny
is busy to update the views. - Remove
labels
argument ofcdisc_data
function. Labels should now already be present in the data passed to thecdisc_data
function. This can be achieved using thevar_relabel
function.
teal 0.8.2
- Fixed several BUGS in
optionalSelectInput
and improved inputs look. - Added
get_data_labels
function toFilteredData
class. - Improved
sep
passing withindata_extract_spec
.
teal 0.8.0
- Added
cdisc_dataset
(and more generaldataset
) functions to properly handle dataset keys while merging. - Possibility to load custom
.css
and.js
files. - Renamed
columns_spec
toselect_spec
. - Show number of observations on filter panel.
- Add labeling functions
variable_choices
andvalue_choices
.
teal 0.7.0
- Added functions
cdisc_data
andget_code
to deal with preprocessing and moving a step towards data standard independent teal. - Moved
teal.utils
functions toteal
:log_app_usage
,stop_shiny
. - Added
*_spec
functions. - Improvements on usage of
PickerInput
andSelectInput
.
teal 0.6.0
- Removed deprecated functions
tab*
. - Removed data generation functions including
generate_sample_data
. - Incorporate
shinyjs
package. - Added “Copy R code to clipboard” button.
teal 0.0.5
- Added limit to data_table with scrolling, preventing overlap of UI elements.
- Boolean filtering.
teal 0.0.4
- Bug fix where
teal
crashes when a filter variable gets added that has many decimal places.
teal 0.0.3
- Note version 0.0.3 is not backwards compatible. Reading the changes and studying the example app should, however, clarify most the changes.
Changes
- All
tabs
arguments were renamed tomodules
. -
tab_item
function is now calledmodule
. -
tab_items
function is now calledmodules
. -
tabs
function was removed. -
variable_browser_item
is now calledtm_variable_browser
. -
data_table_item
is now calledtm_data_table
. -
datasets
argument is automatically added to the server functions specified withmodule
. Henceteal_datasets
has been removed as aserver_args
element.