diff --git a/404.html b/404.html index 930f5b7e9d..bc770d49e1 100644 --- a/404.html +++ b/404.html @@ -62,6 +62,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions
diff --git a/CODE_OF_CONDUCT.html b/CODE_OF_CONDUCT.html index 5395c58964..200197a187 100644 --- a/CODE_OF_CONDUCT.html +++ b/CODE_OF_CONDUCT.html @@ -46,6 +46,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/CONTRIBUTING.html b/CONTRIBUTING.html index 41e8e475fe..3a2bd711ad 100644 --- a/CONTRIBUTING.html +++ b/CONTRIBUTING.html @@ -46,6 +46,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/LICENSE-text.html b/LICENSE-text.html index b39da29e30..e44d2b3d34 100644 --- a/LICENSE-text.html +++ b/LICENSE-text.html @@ -46,6 +46,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/SECURITY.html b/SECURITY.html index 38a9689b32..9da3c9c8ff 100644 --- a/SECURITY.html +++ b/SECURITY.html @@ -46,6 +46,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/articles/adding-support-for-reporting.html b/articles/adding-support-for-reporting.html index c56e305b83..2c77a2f950 100644 --- a/articles/adding-support-for-reporting.html +++ b/articles/adding-support-for-reporting.html @@ -64,6 +64,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/articles/creating-custom-modules.html b/articles/creating-custom-modules.html index 78b28b4d1a..c4ed01fa25 100644 --- a/articles/creating-custom-modules.html +++ b/articles/creating-custom-modules.html @@ -64,6 +64,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/articles/including-adam-data-in-teal.html b/articles/including-adam-data-in-teal.html index 051e3eb779..0b03dacc40 100644 --- a/articles/including-adam-data-in-teal.html +++ b/articles/including-adam-data-in-teal.html @@ -64,6 +64,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/articles/including-general-data-in-teal.html b/articles/including-general-data-in-teal.html index 4e3015072f..9909cad08e 100644 --- a/articles/including-general-data-in-teal.html +++ b/articles/including-general-data-in-teal.html @@ -64,6 +64,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/articles/including-mae-data-in-teal.html b/articles/including-mae-data-in-teal.html index cff6342221..ab8aa864cd 100644 --- a/articles/including-mae-data-in-teal.html +++ b/articles/including-mae-data-in-teal.html @@ -64,6 +64,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/articles/index.html b/articles/index.html index 9d85f4ce8b..1c9c4e9202 100644 --- a/articles/index.html +++ b/articles/index.html @@ -46,6 +46,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/articles/join-keys.html b/articles/join-keys.html index 7eb07b2ba8..b252624da2 100644 --- a/articles/join-keys.html +++ b/articles/join-keys.html @@ -64,6 +64,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/articles/preprocessing-data.html b/articles/preprocessing-data.html index ff4914ac10..3aa39aedbb 100644 --- a/articles/preprocessing-data.html +++ b/articles/preprocessing-data.html @@ -64,6 +64,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/articles/teal-options.html b/articles/teal-options.html index bc2e300a23..bf07a1c0ad 100644 --- a/articles/teal-options.html +++ b/articles/teal-options.html @@ -64,6 +64,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/articles/teal.html b/articles/teal.html index b6759b7da8..a1fc2a7920 100644 --- a/articles/teal.html +++ b/articles/teal.html @@ -64,6 +64,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/authors.html b/authors.html index 7160e7e5ba..4bf2db9e79 100644 --- a/authors.html +++ b/authors.html @@ -46,6 +46,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/404.html b/latest-tag/404.html index 700cc23861..3b8defcef9 100644 --- a/latest-tag/404.html +++ b/latest-tag/404.html @@ -63,6 +63,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/CODE_OF_CONDUCT.html b/latest-tag/CODE_OF_CONDUCT.html index e1eb7c0ff4..1173c3f095 100644 --- a/latest-tag/CODE_OF_CONDUCT.html +++ b/latest-tag/CODE_OF_CONDUCT.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/CONTRIBUTING.html b/latest-tag/CONTRIBUTING.html index 826e52a7df..5d9b8ae145 100644 --- a/latest-tag/CONTRIBUTING.html +++ b/latest-tag/CONTRIBUTING.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/LICENSE-text.html b/latest-tag/LICENSE-text.html index baa944ad7a..3b76611be0 100644 --- a/latest-tag/LICENSE-text.html +++ b/latest-tag/LICENSE-text.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/SECURITY.html b/latest-tag/SECURITY.html index 812df8c9c0..c9552fcb72 100644 --- a/latest-tag/SECURITY.html +++ b/latest-tag/SECURITY.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/adding-support-for-reporting.html b/latest-tag/articles/adding-support-for-reporting.html index 806dfcd82b..a39cfd74d8 100644 --- a/latest-tag/articles/adding-support-for-reporting.html +++ b/latest-tag/articles/adding-support-for-reporting.html @@ -65,6 +65,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/creating-custom-modules.html b/latest-tag/articles/creating-custom-modules.html index 6328191d72..9ac2675796 100644 --- a/latest-tag/articles/creating-custom-modules.html +++ b/latest-tag/articles/creating-custom-modules.html @@ -65,6 +65,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/filter-panel.html b/latest-tag/articles/filter-panel.html index 6d44261112..55f6353005 100644 --- a/latest-tag/articles/filter-panel.html +++ b/latest-tag/articles/filter-panel.html @@ -65,6 +65,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/including-adam-data-in-teal.html b/latest-tag/articles/including-adam-data-in-teal.html index 5347b3c1ba..cc45106490 100644 --- a/latest-tag/articles/including-adam-data-in-teal.html +++ b/latest-tag/articles/including-adam-data-in-teal.html @@ -65,6 +65,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/including-general-data-in-teal.html b/latest-tag/articles/including-general-data-in-teal.html index 7066045868..550a28f2b7 100644 --- a/latest-tag/articles/including-general-data-in-teal.html +++ b/latest-tag/articles/including-general-data-in-teal.html @@ -65,6 +65,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/including-mae-data-in-teal.html b/latest-tag/articles/including-mae-data-in-teal.html index 3d31e3d6d9..1fcf42b923 100644 --- a/latest-tag/articles/including-mae-data-in-teal.html +++ b/latest-tag/articles/including-mae-data-in-teal.html @@ -65,6 +65,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/index.html b/latest-tag/articles/index.html index 4b162eb4c8..a44135ab0f 100644 --- a/latest-tag/articles/index.html +++ b/latest-tag/articles/index.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/preprocessing-data.html b/latest-tag/articles/preprocessing-data.html index d816828676..c885712fde 100644 --- a/latest-tag/articles/preprocessing-data.html +++ b/latest-tag/articles/preprocessing-data.html @@ -65,6 +65,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/teal-bs-themes.html b/latest-tag/articles/teal-bs-themes.html index a98e4e8f17..92b6c62ace 100644 --- a/latest-tag/articles/teal-bs-themes.html +++ b/latest-tag/articles/teal-bs-themes.html @@ -65,6 +65,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/teal-options.html b/latest-tag/articles/teal-options.html index 7d4b71180c..a261b66815 100644 --- a/latest-tag/articles/teal-options.html +++ b/latest-tag/articles/teal-options.html @@ -65,6 +65,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/articles/teal.html b/latest-tag/articles/teal.html index 7b2a3b0143..1bdc71abb5 100644 --- a/latest-tag/articles/teal.html +++ b/latest-tag/articles/teal.html @@ -65,6 +65,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/authors.html b/latest-tag/authors.html index 26de2f5546..8a520f7dc5 100644 --- a/latest-tag/authors.html +++ b/latest-tag/authors.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/index.html b/latest-tag/index.html index bc031a3b34..fde9a8c64a 100644 --- a/latest-tag/index.html +++ b/latest-tag/index.html @@ -71,6 +71,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/news/index.html b/latest-tag/news/index.html index b78c1e102f..c2e0e47750 100644 --- a/latest-tag/news/index.html +++ b/latest-tag/news/index.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/pull_request_template.html b/latest-tag/pull_request_template.html index 7204cbc8e4..afed4f5177 100644 --- a/latest-tag/pull_request_template.html +++ b/latest-tag/pull_request_template.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/TealReportCard.html b/latest-tag/reference/TealReportCard.html index e51f9d7b6b..bb6a7392f0 100644 --- a/latest-tag/reference/TealReportCard.html +++ b/latest-tag/reference/TealReportCard.html @@ -55,6 +55,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/TealSlicesBlock.html b/latest-tag/reference/TealSlicesBlock.html index b5a5c60285..b44181988b 100644 --- a/latest-tag/reference/TealSlicesBlock.html +++ b/latest-tag/reference/TealSlicesBlock.html @@ -49,6 +49,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/append_module.html b/latest-tag/reference/append_module.html index 7a81585d3f..3a7ef09fb0 100644 --- a/latest-tag/reference/append_module.html +++ b/latest-tag/reference/append_module.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/calculate_hashes.html b/latest-tag/reference/calculate_hashes.html index a57012d7e1..4a5d501e02 100644 --- a/latest-tag/reference/calculate_hashes.html +++ b/latest-tag/reference/calculate_hashes.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/deep_copy_filter.html b/latest-tag/reference/deep_copy_filter.html index 79a50980aa..16d88a09fd 100644 --- a/latest-tag/reference/deep_copy_filter.html +++ b/latest-tag/reference/deep_copy_filter.html @@ -53,6 +53,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/dot-datasets_to_data.html b/latest-tag/reference/dot-datasets_to_data.html index 224c981b1c..1cd7a53bb4 100644 --- a/latest-tag/reference/dot-datasets_to_data.html +++ b/latest-tag/reference/dot-datasets_to_data.html @@ -51,6 +51,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/example_cdisc_data.html b/latest-tag/reference/example_cdisc_data.html index 0f7db35a43..dd9334bc9d 100644 --- a/latest-tag/reference/example_cdisc_data.html +++ b/latest-tag/reference/example_cdisc_data.html @@ -49,6 +49,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/example_datasets.html b/latest-tag/reference/example_datasets.html index c955667dc2..e85df9c2e1 100644 --- a/latest-tag/reference/example_datasets.html +++ b/latest-tag/reference/example_datasets.html @@ -49,6 +49,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/example_module.html b/latest-tag/reference/example_module.html index b549088ff8..44c72dce6d 100644 --- a/latest-tag/reference/example_module.html +++ b/latest-tag/reference/example_module.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/example_modules.html b/latest-tag/reference/example_modules.html index 13a606a76e..11b5f94603 100644 --- a/latest-tag/reference/example_modules.html +++ b/latest-tag/reference/example_modules.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/filter_calls_module.html b/latest-tag/reference/filter_calls_module.html index 4d6fb092b9..c58314ea3b 100644 --- a/latest-tag/reference/filter_calls_module.html +++ b/latest-tag/reference/filter_calls_module.html @@ -51,6 +51,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/filter_manager_module_srv.html b/latest-tag/reference/filter_manager_module_srv.html index ff4019f4e4..29df38ec84 100644 --- a/latest-tag/reference/filter_manager_module_srv.html +++ b/latest-tag/reference/filter_manager_module_srv.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/get_client_timezone.html b/latest-tag/reference/get_client_timezone.html index 1ba9538e1d..ccda4bbf3d 100644 --- a/latest-tag/reference/get_client_timezone.html +++ b/latest-tag/reference/get_client_timezone.html @@ -51,6 +51,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/get_code_tdata.html b/latest-tag/reference/get_code_tdata.html index ee92850d20..c64012d4a6 100644 --- a/latest-tag/reference/get_code_tdata.html +++ b/latest-tag/reference/get_code_tdata.html @@ -51,6 +51,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/get_datasets_code.html b/latest-tag/reference/get_datasets_code.html index 6c675e0999..5f3d708736 100644 --- a/latest-tag/reference/get_datasets_code.html +++ b/latest-tag/reference/get_datasets_code.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/get_join_keys.html b/latest-tag/reference/get_join_keys.html index 256b491bdd..31e8d52866 100644 --- a/latest-tag/reference/get_join_keys.html +++ b/latest-tag/reference/get_join_keys.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/get_metadata.html b/latest-tag/reference/get_metadata.html index 2d7dbc0119..c3055fc94f 100644 --- a/latest-tag/reference/get_metadata.html +++ b/latest-tag/reference/get_metadata.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/get_rcode_libraries.html b/latest-tag/reference/get_rcode_libraries.html index d4f4ca6a65..0217bc5e97 100644 --- a/latest-tag/reference/get_rcode_libraries.html +++ b/latest-tag/reference/get_rcode_libraries.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/get_teal_bs_theme.html b/latest-tag/reference/get_teal_bs_theme.html index b3dd3c1fe9..92de09e84f 100644 --- a/latest-tag/reference/get_teal_bs_theme.html +++ b/latest-tag/reference/get_teal_bs_theme.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/include_css_files.html b/latest-tag/reference/include_css_files.html index 61b3af230c..5408b36867 100644 --- a/latest-tag/reference/include_css_files.html +++ b/latest-tag/reference/include_css_files.html @@ -51,6 +51,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/include_js_files.html b/latest-tag/reference/include_js_files.html index e6ab44166d..86e99b5913 100644 --- a/latest-tag/reference/include_js_files.html +++ b/latest-tag/reference/include_js_files.html @@ -51,6 +51,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/include_teal_css_js.html b/latest-tag/reference/include_teal_css_js.html index b30e72d22c..c3599f723c 100644 --- a/latest-tag/reference/include_teal_css_js.html +++ b/latest-tag/reference/include_teal_css_js.html @@ -55,6 +55,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/index.html b/latest-tag/reference/index.html index f00bd39765..ca883892c1 100644 --- a/latest-tag/reference/index.html +++ b/latest-tag/reference/index.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/init.html b/latest-tag/reference/init.html index 4cb8049799..e6ec61eb8c 100644 --- a/latest-tag/reference/init.html +++ b/latest-tag/reference/init.html @@ -57,6 +57,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/is_arg_used.html b/latest-tag/reference/is_arg_used.html index 5304ba2448..afb6f403b8 100644 --- a/latest-tag/reference/is_arg_used.html +++ b/latest-tag/reference/is_arg_used.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/matrix_to_mapping.html b/latest-tag/reference/matrix_to_mapping.html index d9e50aab16..3c7ac089be 100644 --- a/latest-tag/reference/matrix_to_mapping.html +++ b/latest-tag/reference/matrix_to_mapping.html @@ -53,6 +53,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/module.html b/latest-tag/reference/module.html index 029bd61f0b..2cadce1fae 100644 --- a/latest-tag/reference/module.html +++ b/latest-tag/reference/module.html @@ -49,6 +49,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/module_filter_manager.html b/latest-tag/reference/module_filter_manager.html index 15c482a9f8..e72e68b541 100644 --- a/latest-tag/reference/module_filter_manager.html +++ b/latest-tag/reference/module_filter_manager.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/module_filter_manager_modal.html b/latest-tag/reference/module_filter_manager_modal.html index f3ac7b2e1a..7546ffd47f 100644 --- a/latest-tag/reference/module_filter_manager_modal.html +++ b/latest-tag/reference/module_filter_manager_modal.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/module_nested_tabs.html b/latest-tag/reference/module_nested_tabs.html index 478558d277..942a3f7bdc 100644 --- a/latest-tag/reference/module_nested_tabs.html +++ b/latest-tag/reference/module_nested_tabs.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/module_tabs_with_filters.html b/latest-tag/reference/module_tabs_with_filters.html index 6cfb182d9c..7ae06bcdce 100644 --- a/latest-tag/reference/module_tabs_with_filters.html +++ b/latest-tag/reference/module_tabs_with_filters.html @@ -51,6 +51,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/module_teal.html b/latest-tag/reference/module_teal.html index 26378fc1cd..2f1d7fdfa4 100644 --- a/latest-tag/reference/module_teal.html +++ b/latest-tag/reference/module_teal.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/modules.html b/latest-tag/reference/modules.html index e959a470fe..f6aa97ad38 100644 --- a/latest-tag/reference/modules.html +++ b/latest-tag/reference/modules.html @@ -55,6 +55,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/modules_depth.html b/latest-tag/reference/modules_depth.html index 941394b004..f9f54c8cb0 100644 --- a/latest-tag/reference/modules_depth.html +++ b/latest-tag/reference/modules_depth.html @@ -49,6 +49,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/reexports.html b/latest-tag/reference/reexports.html index daa4d3de00..b39957933b 100644 --- a/latest-tag/reference/reexports.html +++ b/latest-tag/reference/reexports.html @@ -69,6 +69,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/reporter_previewer_module.html b/latest-tag/reference/reporter_previewer_module.html index 9679e2b97d..d5e82233e0 100644 --- a/latest-tag/reference/reporter_previewer_module.html +++ b/latest-tag/reference/reporter_previewer_module.html @@ -59,6 +59,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/run_js_files.html b/latest-tag/reference/run_js_files.html index cbb29276d2..11a6e843b8 100644 --- a/latest-tag/reference/run_js_files.html +++ b/latest-tag/reference/run_js_files.html @@ -53,6 +53,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/show_rcode_modal.html b/latest-tag/reference/show_rcode_modal.html index 96c7795864..4c12473692 100644 --- a/latest-tag/reference/show_rcode_modal.html +++ b/latest-tag/reference/show_rcode_modal.html @@ -49,6 +49,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/snapshot_manager_module.html b/latest-tag/reference/snapshot_manager_module.html index bc1a4b7820..2db604104d 100644 --- a/latest-tag/reference/snapshot_manager_module.html +++ b/latest-tag/reference/snapshot_manager_module.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/srv_teal_with_splash.html b/latest-tag/reference/srv_teal_with_splash.html index 10ed728282..b3a26ed7a8 100644 --- a/latest-tag/reference/srv_teal_with_splash.html +++ b/latest-tag/reference/srv_teal_with_splash.html @@ -51,6 +51,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/tdata.html b/latest-tag/reference/tdata.html index c7574e1ab6..c0dec3fac3 100644 --- a/latest-tag/reference/tdata.html +++ b/latest-tag/reference/tdata.html @@ -59,6 +59,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/tdata2env.html b/latest-tag/reference/tdata2env.html index 5a8435c09e..b8fb1efbdf 100644 --- a/latest-tag/reference/tdata2env.html +++ b/latest-tag/reference/tdata2env.html @@ -51,6 +51,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/teal-package.html b/latest-tag/reference/teal-package.html index df375c2551..cf6033b3d6 100644 --- a/latest-tag/reference/teal-package.html +++ b/latest-tag/reference/teal-package.html @@ -49,6 +49,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/teal_slices.html b/latest-tag/reference/teal_slices.html index f830fcd79d..ca0c45a02b 100644 --- a/latest-tag/reference/teal_slices.html +++ b/latest-tag/reference/teal_slices.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/ui_teal_with_splash.html b/latest-tag/reference/ui_teal_with_splash.html index ca0d6dbe81..96135c786a 100644 --- a/latest-tag/reference/ui_teal_with_splash.html +++ b/latest-tag/reference/ui_teal_with_splash.html @@ -61,6 +61,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/unfold_mapping.html b/latest-tag/reference/unfold_mapping.html index 028421537e..8db420e8b7 100644 --- a/latest-tag/reference/unfold_mapping.html +++ b/latest-tag/reference/unfold_mapping.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/validate_has_data.html b/latest-tag/reference/validate_has_data.html index 81c04ab6fb..d480fed625 100644 --- a/latest-tag/reference/validate_has_data.html +++ b/latest-tag/reference/validate_has_data.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/validate_has_elements.html b/latest-tag/reference/validate_has_elements.html index 4fe8d3b9c5..64c24866e9 100644 --- a/latest-tag/reference/validate_has_elements.html +++ b/latest-tag/reference/validate_has_elements.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/validate_has_variable.html b/latest-tag/reference/validate_has_variable.html index b049d68bed..81871ddb4f 100644 --- a/latest-tag/reference/validate_has_variable.html +++ b/latest-tag/reference/validate_has_variable.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/validate_in.html b/latest-tag/reference/validate_in.html index b756594382..ff06a71838 100644 --- a/latest-tag/reference/validate_in.html +++ b/latest-tag/reference/validate_in.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/validate_inputs.html b/latest-tag/reference/validate_inputs.html index 9dad4bdb89..624e89d82f 100644 --- a/latest-tag/reference/validate_inputs.html +++ b/latest-tag/reference/validate_inputs.html @@ -49,6 +49,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/validate_n_levels.html b/latest-tag/reference/validate_n_levels.html index dd10311f4f..66a3998ee2 100644 --- a/latest-tag/reference/validate_n_levels.html +++ b/latest-tag/reference/validate_n_levels.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/validate_no_intersection.html b/latest-tag/reference/validate_no_intersection.html index cf67208df9..d4b73ecc1e 100644 --- a/latest-tag/reference/validate_no_intersection.html +++ b/latest-tag/reference/validate_no_intersection.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/latest-tag/reference/validate_one_row_per_id.html b/latest-tag/reference/validate_one_row_per_id.html index ba31e01897..95386675f8 100644 --- a/latest-tag/reference/validate_one_row_per_id.html +++ b/latest-tag/reference/validate_one_row_per_id.html @@ -47,6 +47,8 @@ aria-expanded="false" aria-haspopup="true" id="dropdown-versions">Versions diff --git a/main/404.html b/main/404.html index fe8d16917e..48b442b9c3 100644 --- a/main/404.html +++ b/main/404.html @@ -80,6 +80,18 @@.github/CODE_OF_CONDUCT.md
+ We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.
+We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
+Examples of behavior that contributes to a positive environment for our community include:
+Examples of unacceptable behavior include:
+Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
+Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
+This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [INSERT CONTACT METHOD]. All complaints will be reviewed and investigated promptly and fairly.
+All community leaders are obligated to respect the privacy and security of the reporter of any incident.
+Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
+Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
+Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
+Community Impact: A violation through a single incident or series of actions.
+Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
+Community Impact: A serious violation of community standards, including sustained inappropriate behavior.
+Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
+Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
+Consequence: A permanent ban from any sort of public interaction within the community.
+This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
+Community Impact Guidelines were inspired by Mozilla’s code of conduct enforcement ladder.
+For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.
+.github/CONTRIBUTING.md
+ 🙏 Thank you for taking the time to contribute!
+Your input is deeply valued, whether an issue, a pull request, or even feedback, regardless of size, content or scope.
+ +Please refer the project documentation for a brief introduction. Please also see other articles within the project documentation for additional information.
+A Code of Conduct governs this project. Participants and contributors are expected to follow the rules outlined therein.
+All your contributions will be covered by this project’s license.
+We use GitHub to track issues, feature requests, and bugs. Before submitting a new issue, please check if the issue has already been reported. If the issue already exists, please upvote the existing issue 👍.
+For new feature requests, please elaborate on the context and the benefit the feature will have for users, developers, or other relevant personas.
+This repository uses the GitHub Flow model for collaboration. To submit a pull request:
+Create a branch
+Please see the branch naming convention below. If you don’t have write access to this repository, please fork it.
+Make changes
+Make sure your code
+Create a pull request (PR)
+In the pull request description, please link the relevant issue (if any), provide a detailed description of the change, and include any assumptions.
+Address review comments, if any
Post approval
+Merge your PR if you have write access. Otherwise, the reviewer will merge the PR on your behalf.
+Pat yourself on the back
+Congratulations! 🎉 You are now an official contributor to this project! We are grateful for your contribution.
+Suppose your changes are related to a current issue in the current project; please name your branch as follows: <issue_id>_<short_description>
. Please use underscore (_
) as a delimiter for word separation. For example, 420_fix_ui_bug
would be a suitable branch name if your change is resolving and UI-related bug reported in issue number 420
in the current project.
If your change affects multiple repositories, please name your branches as follows: <issue_id>_<issue_repo>_<short description>
. For example, 69_awesomeproject_fix_spelling_error
would reference issue 69
reported in project awesomeproject
and aims to resolve one or more spelling errors in multiple (likely related) repositories.
monorepo
and staged.dependencies
+Sometimes you might need to change upstream dependent package(s) to be able to submit a meaningful change. We are using staged.dependencies
functionality to simulate a monorepo
behavior. The dependency configuration is already specified in this project’s staged_dependencies.yaml
file. You need to name the feature branches appropriately. This is the only exception from the branch naming convention described above.
Please refer to the staged.dependencies package documentation for more details.
+This repository follows some unified processes and standards adopted by its maintainers to ensure software development is carried out consistently within teams and cohesively across other repositories.
+This repository follows the standard tidyverse
style guide and uses lintr
for lint checks. Customized lint configurations are available in this repository’s .lintr
file.
Lightweight is the right weight. This repository follows tinyverse recommedations of limiting dependencies to minimum.
+If the code is not compatible with all (!) historical versions of a given dependenct package, it is required to specify minimal version in the DESCRIPTION
file. In particular: if the development version requires (imports) the development version of another package - it is required to put abc (>= 1.2.3.9000)
.
We continuously test our packages against the newest R version along with the most recent dependencies from CRAN and BioConductor. We recommend that your working environment is also set up in the same way. You can find the details about the R version and packages used in the R CMD check
GitHub Action execution log - there is a step that prints out the R sessionInfo()
.
If you discover bugs on older R versions or with an older set of dependencies, please create the relevant bug reports.
+pre-commit
We highly recommend that you use the pre-commit
tool combined with R hooks for pre-commit
to execute some of the checks before committing and pushing your changes.
Pre-commit hooks are already available in this repository’s .pre-commit-config.yaml
file.
As mentioned previously, all contributions are deeply valued and appreciated. While all contribution data is available as part of the repository insights, to recognize a significant contribution and hence add the contributor to the package authors list, the following rules are enforced:
+git blame
query) OR*Excluding auto-generated code, including but not limited to roxygen
comments or renv.lock
files.
The package maintainer also reserves the right to adjust the criteria to recognize contributions.
+Copyright 2022 F. Hoffmann-La Roche AG + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ++ +
SECURITY.md
+ If you believe you have found a security vulnerability in any of the repositories in this organization, please report it to us through coordinated disclosure.
+Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.
+Instead, please send an email to vulnerability.management[@]roche.com.
+Please include as much of the information listed below as you can to help us better understand and resolve the issue:
+This information will help us triage your report more quickly.
+vignettes/adding-support-for-reporting.Rmd
+ adding-support-for-reporting.Rmd
The teal
package offers an integrated reporting feature
+utilizing the teal.reporter
package. For a comprehensive
+explanation of the reporting functionality itself, please refer to the
+documentation therein.
This article is intended for module developers and aims to provide
+guidance on enhancing a custom teal
module with an
+automatic reporting feature. This enhancement enables users to
+incorporate snapshots of the module outputs into a report which can then
+be reviewed in another module automatically provided by
+teal
. Thus the app user can interact with the report.
The responsibilities of a module developer include:
+The entire life cycle of objects involved in creating the report and
+configuring the module to preview the report is handled by
+teal
.
Let us consider an example module, based on the example module from
+teal
:
+library(teal)
+example_module <- function(label = "example teal module") {
+ module(
+ label = label,
+ server = function(id, data) {
+ checkmate::assert_class(data, "reactive")
+ checkmate::assert_class(isolate(data()), "teal_data")
+
+ moduleServer(id, function(input, output, session) {
+ updateSelectInput(session, "dataname", choices = isolate(datanames(data())))
+ output$dataset <- renderPrint({
+ req(input$dataname)
+ data()[[input$dataname]]
+ })
+ })
+ },
+ ui = function(id) {
+ ns <- NS(id)
+ sidebarLayout(
+ sidebarPanel(selectInput(ns("dataname"), "Choose a dataset", choices = NULL)),
+ mainPanel(verbatimTextOutput(ns("dataset")))
+ )
+ }
+ )
+}
Using teal
, you can launch this example module with the
+following:
+app <- init(
+ data = teal_data(IRIS = iris, MTCARS = mtcars),
+ modules = example_module()
+)
+
+if (interactive()) shinyApp(app$ui, app$server)
The first step is to add an additional argument to the server
+function declaration - reporter
. This informs
+teal
that the module requires reporter
, and it
+will be included when the module is called. See below:
+example_module_with_reporting <- function(label = "example teal module") {
+ module(
+ label = label,
+ server = function(id, data, reporter) {
+ moduleServer(id, function(input, output, session) {
+ updateSelectInput(session, "dataname", choices = isolate(datanames(data())))
+ output$dataset <- renderPrint({
+ req(input$dataname)
+ data()[[input$dataname]]
+ })
+ })
+ },
+ ui = function(id) {
+ ns <- NS(id)
+ sidebarLayout(
+ sidebarPanel(selectInput(ns("dataname"), "Choose a dataset", choices = NULL)),
+ mainPanel(verbatimTextOutput(ns("dataset")))
+ )
+ }
+ )
+}
With these modifications, the module is now ready to be launched with
+teal
:
+app <- init(
+ data = teal_data(IRIS = iris, MTCARS = mtcars),
+ modules = example_module_with_reporting()
+)
+
+if (interactive()) shinyApp(app$ui, app$server)
teal
adds another tab to the application, titled
+Report previewer
. However, there is no visible change in
+how the module operates and appears and the user cannot add content to
+the report from this module. That requires inserting UI and server
+elements of the teal.reporter
module into the module
+body.
teal.reporter
module
+The UI and the server logic necessary for adding cards from
+example_module_with_reporting
to the report are provided by
+teal.reporter::simple_reporter_ui
and
+teal.reporter::simple_reporter_srv
.
+example_module_with_reporting <- function(label = "example teal module") {
+ module(
+ label = label,
+ server = function(id, data, reporter) {
+ moduleServer(id, function(input, output, session) {
+ teal.reporter::simple_reporter_srv(
+ id = "reporter",
+ reporter = reporter,
+ card_fun = function(card) card
+ )
+ updateSelectInput(session, "dataname", choices = isolate(datanames(data())))
+ output$dataset <- renderPrint({
+ req(input$dataname)
+ data()[[input$dataname]]
+ })
+ })
+ },
+ ui = function(id) {
+ ns <- NS(id)
+ sidebarLayout(
+ sidebarPanel(
+ teal.reporter::simple_reporter_ui(ns("reporter")),
+ selectInput(ns("dataname"), "Choose a dataset", choices = NULL)
+ ),
+ mainPanel(verbatimTextOutput(ns("dataset")))
+ )
+ }
+ )
+}
This updated module is now ready to be launched:
+
+app <- init(
+ data = teal_data(IRIS = iris, MTCARS = mtcars),
+ modules = example_module_with_reporting()
+)
+
+if (interactive()) shinyApp(app$ui, app$server)
A new piece of UI
has been added, and the buttons are
+clickable. The user can now add a card to the report and view it in the
+Report previewer
module but the preview is still empty
+since we have not instructed our module what to put on the card.
To add content to a card, we will utilize the public API exposed by
+the TealReportCard
class. The
+teal.reporter::simple_reporter_srv
module accepts the
+card_fun
argument that determines the appearance of the
+output from our custom module. ReportCard
and its
+derivatives allow the sequential addition of content according to the
+order of method calls. To explore the content, we can use the
+$get_content
method. For further details, refer to the
+documentation of TealReportCard
and
+teal.reporter::ReportCard
.
We will add simple text to the card by modifying the
+card_fun
argument passed to
+teal.reporter::simple_reporter_srv
. The function must
+return the card
object, otherwise errors may occur in
+teal
.
+custom_function <- function(card = teal.reporter::ReportCard$new()) {
+ card$append_text("This is content from a custom teal module!")
+ card
+}
+
+example_module_with_reporting <- function(label = "example teal module") {
+ module(
+ label = label,
+ server = function(id, data, reporter) {
+ moduleServer(id, function(input, output, session) {
+ teal.reporter::simple_reporter_srv(
+ id = "reporter",
+ reporter = reporter,
+ card_fun = custom_function
+ )
+ updateSelectInput(session, "dataname", choices = isolate(datanames(data())))
+ output$dataset <- renderPrint({
+ req(input$dataname)
+ data()[[input$dataname]]
+ })
+ })
+ },
+ ui = function(id) {
+ ns <- NS(id)
+ sidebarLayout(
+ sidebarPanel(
+ teal.reporter::simple_reporter_ui(ns("reporter")),
+ selectInput(ns("dataname"), "Choose a dataset", choices = NULL)
+ ),
+ mainPanel(verbatimTextOutput(ns("dataset")))
+ )
+ }
+ )
+}
+app <- init(
+ data = teal_data(IRIS = iris, MTCARS = mtcars),
+ modules = example_module_with_reporting()
+)
+
+if (interactive()) shinyApp(app$ui, app$server)
Now, an application user can see the text added by
+custom_function
in the Report previewer
+module.
teal.reporter
supports the addition of tables, charts,
+and more. For more information, explore the API of
+teal.reporter::ReportCard
to learn about the supported
+content types.
TealReportCard
+teal
exports the TealReportCard
class,
+which extends the teal.reporter::ReportCard
class and
+provides several convenient methods to facilitate working with
+teal
features like the filter panel or source code. For
+more details, refer to the documentation of
+TealReportCard
.
To support TealReportCard
, the function that is passed
+to teal.reporter::simple_reporter_srv
must define a default
+value for the card, as shown below:
+custom_function <- function(card = TealReportCard$new()) {
+ # ... some code ... #
+ card
+}
Without this definition, the API of TealReportCard
will
+not be available within the function.
In conclusion, we have demonstrated how to build a standard
+teal
app with code reproducibility and reporter
+functionalities. Note that the server function requires the
+filter_panel_api
argument so that the filter panel state
+can be added to the report.
In the final example, we have incorporated teal.code
+snippets. teal.code
is an R
library that
+offers utilities for storing code and associating it with an execution
+environment. This allows ReporterCard
to store the code
+necessary to generate the table along with the table itself. To learn
+more about teal.code
see the vignette
+qenv
in teal.code
.
##
+
+example_reporter_module <- function(label = "Example") {
+ module(
+ label = label,
+ server = function(id, data, reporter, filter_panel_api) {
+ with_filter <- !missing(filter_panel_api) && inherits(filter_panel_api, "FilterPanelApi")
+ moduleServer(id, function(input, output, session) {
+ updateSelectInput(session, "dataname", choices = isolate(datanames(data())))
+ dat <- reactive(data()[[input$dataname]])
+ observe({
+ req(dat())
+ updateSliderInput(session, "nrow", max = nrow(dat()), value = floor(nrow(dat()) / 5))
+ })
+
+ table_q <- reactive({
+ req(input$dataname)
+ req(input$nrow)
+ within(
+ data(),
+ result <- head(dataset, nrows),
+ dataset = as.name(input$dataname),
+ nrows = input$nrow
+ )
+ })
+
+ output$table <- renderTable(table_q()[["result"]])
+
+ ### REPORTER
+ card_fun <- function(card = teal.reporter::ReportCard$new(), comment) {
+ card$set_name("Table Module")
+ card$append_text(paste("Selected dataset", input$dataname), "header2")
+ card$append_text("Selected Filters", "header3")
+ if (with_filter) {
+ card$append_text(filter_panel_api$get_filter_state(), "verbatim")
+ }
+ card$append_text("Encoding", "header3")
+ card$append_text(
+ yaml::as.yaml(
+ stats::setNames(
+ lapply(c("dataname", "nrow"), function(x) input[[x]]), c("dataname", "nrow")
+ )
+ ),
+ "verbatim"
+ )
+ card$append_text("Module Table", "header3")
+ card$append_table(table_q()[["result"]])
+ card$append_text("Show R Code", "header3")
+ card$append_text(teal.code::get_code(table_q()), "verbatim")
+ if (!comment == "") {
+ card$append_text("Comment", "header3")
+ card$append_text(comment)
+ }
+ card
+ }
+ teal.reporter::add_card_button_srv(
+ "addReportCard",
+ reporter = reporter,
+ card_fun = card_fun
+ )
+ teal.reporter::download_report_button_srv("downloadButton", reporter = reporter)
+ teal.reporter::reset_report_button_srv("resetButton", reporter)
+ ###
+ })
+ },
+ ui = function(id) {
+ ns <- NS(id)
+
+ sidebarLayout(
+ sidebarPanel(selectInput(ns("dataname"), "Choose a dataset", choices = NULL)),
+ mainPanel(
+ teal.reporter::simple_reporter_ui(ns("reporter")),
+ verbatimTextOutput(ns("dataset"))
+ )
+ )
+
+ sidebarLayout(
+ sidebarPanel(
+ div(
+ teal.reporter::add_card_button_ui(ns("addReportCard")),
+ teal.reporter::download_report_button_ui(ns("downloadButton")),
+ teal.reporter::reset_report_button_ui(ns("resetButton"))
+ ),
+ selectInput(ns("dataname"), "Choose a dataset", choices = NULL),
+ sliderInput(ns("nrow"), "Number of rows", min = 1, max = 1, value = 1, step = 1)
+ ),
+ mainPanel(tableOutput(ns("table")))
+ )
+ }
+ )
+}
+
+app <- init(
+ data = teal_data(AIR = airquality, IRIS = iris),
+ modules = list(
+ example_reporter_module(label = "with Reporter"),
+ example_module(label = "without Reporter")
+ ),
+ filter = teal_slices(teal_slice(dataname = "AIR", varname = "Temp", selected = c(72, 85))),
+ header = "Example teal app with reporter"
+)
+
+if (interactive()) shinyApp(app$ui, app$server)
There are two main actors in the teal
development:
teal
App Developerteal
Module Developerteal
app developer
++%% This is a mermaid diagram, if you see this the plot failed to render. Sorry. +graph LR + A[teal App Developer]--utilizes--> B[teal modules] + B--to create--> C[teal app] + D[app user]--uses--> C +style A fill:lightblue +style C fill:gold +style D fill:pink ++
The primary responsibility of a teal
app developer is to
+leverage the available building blocks of the teal
+framework to create a functional teal
app that analyses the
+data.
To expedite the app creation process, developers can take advantage
+of pre-existing teal
modules found in R
+packages like teal.modules.general
and
+teal.modules.clinical
.
These modules are designed with a focus on standardization and +versatility, making them suitable for a wide range of use cases.
+When developing a teal
app, the developer will select
+the most appropriate teal
modules and integrate them into
+the app’s interface to ensure seamless usability for end-users.
To learn more about the existing modules, visit teal.gallery
,
+which contains several demo applications and their source code.
teal
module developer
++%% This is a mermaid diagram, if you see this the plot failed to render. Sorry. +graph LR + A[Teal App Developer]--utilizes--> B[teal modules] + E[Teal Module Developer]--develops--> B + B--to create--> C[teal app] + D[app user]--uses--> C +style A fill:lightblue +style E fill:lightgreen +style D fill:pink +style C fill:gold ++
The main duty of a teal
module developer is to construct
+a compatible teal
module that can be utilized within the
+teal
framework.
Several factors influence the scope and requirements for building a
+teal
module.
When creating a reusable teal
module, it’s advisable to
+focus on making it as general and adaptable as feasible to maximize the
+possibilities of being re-used in the future. However, developers have
+the freedom to create a teal
module that is customized to
+suit the specific demands of a project.
Ultimately, one or more teal
modules are employed to
+construct a teal
app.
To learn more about creating custom modules follow the Tutorial on Creating a Custom +Module.
++%% This is a mermaid diagram, if you see this the plot failed to render. Sorry. +%%| fig-width: 7.5 +graph LR + subgraph Study B + A2[Study Teal App Developer]--utilizes--> B2[teal modules] + E2[Study Teal Module Developer]-.develops.-> B2 + B2--to create--> C2[study teal app] + D2[study app user]--uses--> C2 + end + E3[Teal Module Developer]--develops--> B + E3--develops-->B2 + subgraph Study A + A[Study Teal App Developer]--utilizes--> B[teal modules] + E[Study Teal Module Developer]-.develops.-> B + B--to create--> C[study teal app] + D[study app user]--uses--> C + end +style A fill:lightblue +style A2 fill:lightblue +style E fill:limegreen +style E2 fill:limegreen +style E3 fill:lightgreen +style D fill:pink +style D2 fill:pink +style C fill:gold +style C2 fill:gold ++
In a clinical trial study setting, a unique study
+teal
app developer is assigned to each study team
+and is accountable for developing a tailored teal
app for
+their respective study.
The study teal
app developer will
+initially leverage existing teal
modules from
+R
packages created by teal
module
+developers.
In cases where there is a need to create new modules tailored to the
+study, a study teal
module developer will
+need to be involved.
Upon completion, each study team will have their own designated
+teal
app tailored to their specific study.
+%% This is a mermaid diagram, if you see this the plot failed to render. Sorry. +sequenceDiagram; + autonumber + participant data + participant filters + participant filtered data + participant teal module + data->filters: gets + filters->>filtered data: becomes + filtered data->>teal module: sent to ++
The sequence diagram above illustrates the different stages that data
+goes through within the teal
framework, supported by the
+teal.slice
package:
teal
app;
+teal_data
before being
+passed to the app;teal_data
class
+facilitates reproducibility;teal
modules for analysis;
+teal_data
object so analysis
+code applied to the data is tracked (and can be used to reproduce
+the whole analysis);Whenever filters are added or removed, the data coming into modules
+is re-computed, providing the teal
module with new filtered
+data to conduct the required analysis.
vignettes/blueprint/filter_panel.Rmd
+ filter_panel.Rmd
The teal.slice
package provides teal
+applications with the filter panel, a powerful tool for
+exploring and analyzing data, and a key component of the
+teal
framework.
One of the great things about the filter panel is that it comes
+built-in with teal
, requiring no programming knowledge to
+use.
The filter panel provides a convenient way for users to subset their +data, simplifying the process of exploration and comprehension. +Moreover, users can activate or deactivate filter states interactively, +either individually or globally, using the filter panel.
++%% This is a mermaid diagram, if you see this the plot failed to render. Sorry. +sequenceDiagram + autonumber + data->teal.slice: processed by + teal.slice->>shiny inputs: creates + Note over teal.slice,shiny inputs: based on data type + shiny inputs->>reactive dataset: updates + reactive dataset->>teal modules: processed by ++
The filter panel creates subsets of data. Subsetting is achieved by
+creating filter states, each of which holds a logical predicate (filter
+condition) that is applied to single variables. These filter conditions
+are composed into a single expression, a call to a particular function
+(e.g. dplyr::filter
), and that expression is evaluated to
+create a filtered data subset.
The process is entirely interactive. Filter states can be created, +removed, and changed at will, however, the app developer may choose to +constrain or even restrict them.
+When a filter state is created, the filter panel generates a
+filter card with shiny
inputs appropriate to the
+type of the variable, e.g. range selectors for numeric columns and sets
+of checkboxes or drop-down menus for categorical ones.
As users interact with the filter cards, the subsetting complete +expression is updated and filtered data is recomputed.
+The filtered data is passed to teal
modules for
+downstream analysis. The subsetting expression is returned along with
+the data, ensuring an unbroken track record of the entire analysis.
+Signature of the data are also stored to ensure reproducible
+results.
Typically the data that is passed into a teal
+application is available before the app is run. However, this is not
+always true and in some cases the data will be built only after the app
+has started. A good example is pulling the data from an external
+repository, like a database, or uploading a file. Additional
+authentication may be required.
teal_data_module
+Preprocessing actions can be performed in-app using the
+teal_data_module
. Rather than passing a
+teal_data
object to the app, one may pass a
+shiny
module that returns a
+teal_data
object (wrapped in a reactive expression). This
+allows the app developer to include user actions data creation,
+fetching, and even pre-filtering modification.
A complete explanation of using the teal_data_module
can
+be found in this teal
+vignette
vignettes/blueprint/index.Rmd
+ index.Rmd
Welcome to teal
Technical Blueprint documentation!
The purpose of this material is to aid new developer’s comprehension
+of the fundamental principles of the teal
framework. We
+will explore crucial teal
concepts such as data flow,
+actors, and filter panel, among others.
While this material will be presented at a high-level, we will direct +you to our vignettes for a more in-depth understanding.
+Our hope is that this resource will provide new developers with a
+strong grasp of teal
products, enabling them to contribute
+to code with confidence.
Reproducibility is paramount in the pharmaceutical industry. Accurate +and consistent results are essential to ensure high-quality research and +the safety of patients. By prioritizing reproducibility, researchers can +validate their methods, confirm their findings, and contribute to the +advancement of the field.
+The teal.code
package provides the qenv
+class that facilitates code reproducibility. Code is passed to a
+qenv
object, where is evaluated in a specific environment.
+qenv
also stores the code so that it can be retrieved on
+request.
The teal_data
class, which serves as the primary data
+interface for teal
applications, inherits this code
+tracking behavior from qenv
.
teal
application
+All teal
applications run on data provided in a
+teal_data
object. Data objects are stored and modified
+within the environment of the teal_data
object and all
+R
code used is tracked, which allows for the code to be
+evaluated and executed in the teal
application, and
+reproduced outside the teal
application. This includes data
+loading, preprocessing, filtering, transformations, and plotting,
+etc.
The teal_data
object makes it easy for users to
+reproduce and validate the results of their analyses.
Learn more about the use of teal_data
in the teal.data
+package vignettes.
Show R Code
and Reporter
+In both the teal.modules.clinical
and
+teal.modules.general
packages, you’ll find that most
+modules include a convenient Show R Code
button. When this
+button is clicked, a modal window appears, revealing the R
+code responsible for generating the module’s output. This functionality
+is achieved by inspecting the teal_data
object and
+retrieving code from it. With the Show R Code
button, users
+can easily copy and independently run the code to reproduce the analysis
+presented in the teal module.
The Reporter feature also leverages the teal_data
object
+in its operation. Much like the Show R Code
mechanism, the
+code displayed in a Reporter Card is extracted from the
+teal_data
object.
To learn more about the Reporter
feature, please visit
+the teal.reporter
+documentation.
Overall, qenv
from teal.code
and its child
+class, teal_data
, are powerful tools for ensuring code
+reproducibility and promoting high-quality research in the
+R
programming language.
teal
is an interactive data exploration framework based
+on Shiny, designed primarily to analyze CDISC clinical trial data.
A Shiny Application created with teal
offers users the
+ability to:
Moreover, the teal
framework provides application
+developers with a wide range of customizable standard analysis modules
+to integrate into their applications, along with a logging framework
+that facilitates debugging. Additionally, advanced users of the
+framework can develop new analysis modules and easily integrate them
+into any teal
application.
The teal
framework’s functionality draws heavily from
+the following packages:
R package | +Description | +
---|---|
teal |
+
+shiny -based interactive exploration
+framework for analyzing data |
+
teal.widgets |
+
+shiny UI components used within
+teal
+ |
+
teal.data |
+provides the data structure used in all
+teal applications |
+
teal.slice |
+provides the filter panel to allow dynamic filtering of +data | +
teal.code |
+provides a mechanism for tracking code to reproduce an +analysis | +
teal.logger |
+standardizes logging within teal
+framework |
+
teal.reporter |
+allows teal applications to generate
+reports |
+
Although these packages are mentioned in the material, we strongly +recommend visiting their vignettes to learn more about them.
+Learn on how to make your first teal
application here!
vignettes/blueprint/module_encapsulation.Rmd
+ module_encapsulation.Rmd
The teal
framework leverages the shiny
+module concept to enable encapsulation of analytical actions in
+teal
modules, while maintaining seamless communication
+between the modules and the application.
By implementing the modular app technique from the shiny module into
+the creation of the teal
module, several benefits are
+realized:
Streamlined maintenance
+The development of the teal
module becomes more manageable,
+as it can function independently from the teal
framework.
+This separation allows developers to maintain the module with ease. This
+approach has been successfully applied in R
packages
+dedicated to teal
module development, such as
+teal.modules.general
and
+teal.modules.clinical
.
Enhanced focus on outputteal
module developers can concentrate solely on refining
+parameters or encoding, and output aspects (such as data summarization
+and visualization) without the need to concern themselves with the
+intricacies of the teal
framework. When developed
+correctly, the module seamlessly integrates with
+teal
.
Facilitated collaborationteal
module development becomes an accessible entry point
+for developers interested in collaborating. This approach encourages
+user collaboration for the improvement of teal
modules, as
+developers gain a deeper understanding of the mechanics of the
+teal
framework.
+%% This is a mermaid diagram, if you see this the plot failed to render. Sorry. +flowchart RL +teal +subgraph features + direction LR + teal.data + teal.slice + teal.code + teal.logger + teal.widgets +end +subgraph modules + direction RL + teal.modules.general + teal.modules.clinical + teal.osprey + teal.goshawk + teal.modules.hermes +end +teal--has-->features +features--builds-->modules +modules--creates-->teal +subgraph modules + teal.modules.general + teal.modules.clinical + teal.osprey + teal.goshawk + teal.modules.hermes +end +subgraph calculations + direction RL + tern + osprey + goshawk + hermes +end +tern--supports-->teal.modules.clinical +osprey--supports-->teal.osprey +goshawk--supports-->teal.goshawk +hermes--supports-->teal.modules.hermes +style teal fill:lightblue +style features fill:lightgreen +style modules fill:pink ++
teal
is a modular framework that relies on a suite of
+related packages, as illustrated in the above diagram, to provide a wide
+range of functionalities.
teal
’s primary function is to create web app for
+analyzing clinical trial data but it has a multitude of
+features distributed across various packages.
Developers can selectively leverage these packages, such as
+teal.widgets
, teal.code
, and
+teal.logger
, to build teal
+modules for a teal
app. This approach gives the developers
+the tools that speed up their work and avoid re-implementing existing
+logic and UI elements.
The teal
modules utilize various packages such as
+tern
, osprey
, and goshawk
to
+perform calculations and analyses. These packages provide
+support to the teal
modules by performing
+all computations while the modules only have to focus on how to wrap the
+input options and the output.
Once developed, new and existing modules can be integrated into
+teal
to create a functional
+teal
app.
vignettes/bootstrap-themes-in-teal.Rmd
+ bootstrap-themes-in-teal.Rmd
We offer an easy application of a custom Bootstrap theme in a
+teal
app. teal
uses the bslib
+R
package which provides tools for customizing Bootstrap
+themes, including those of shiny
apps.
teal
app developers can specify custom Bootstrap themes
+by setting the teal.bs_theme
R
option, which
+has to be set to bslib::bs_theme
object. The
+bslib::bs_theme(...)
function creates a Bootstrap theme
+object, where one specifies the (major) Bootstrap version (default or
+one of 3, 4, or 5). Optionally one can choose a
+bootswatch
theme and customize the
+app CSS with functions like bslib::bs_add_rules
.
+Please read more about custom themes in the
+bslib
getting started vignette. The
+teal.bs_theme
R
option has to be specified at
+the top of the code script.
Please install bslib
package before you run the code
+below.
teal.bs_theme
R
option
+options("teal.bs_theme" = bslib::bs_theme("Custom Options"))
+
+#######################
+# teal::init() app code
+#######################
+The best and recommended ways to explore the
+Bootstrap themes are to use
+bslib::run_with_themer(shinyApp(app$ui, app$server))
or
+bslib::bs_theme_preview()
, both of which offer an
+interactive explore mode (not supported for Bootstrap 3). The
+bslib::bs_theme_preview()
is recommended when the end user
+does not have any shiny
app yet. When you already have a
+shiny
app and you want to test different Bootstrap themes
+(and CSS
styling) then
+bslib::run_with_themer(shinyApp(app$ui, app$server))
is
+recommended.
Available Bootstrap versions could be checked with
+bslib::versions()
and Bootstrap themes
+(bootswatch
) with
+bslib::bootswatch_themes(version = "5")
.
# bslib::versions()
+# bslib::bootswatch_themes(version = "5")
+options("teal.bs_theme" = bslib::bs_theme(version = "5", bootswatch = "lux")
+# or
+options("teal.bs_theme" = bslib::bs_theme_update(bslib::bs_theme(version = "5"), bootswatch = "lux"))
+When using the default bslib
theme for any version (3, 4
+or 5), its styling might not be as expected. Please run the interactive
+themer (recommended) or apply a custom theme to explore all the theme
+options. In many scenarios updating only the theme might not be
+enough and e.g. font color and other specifications should be updated
+too.
# instead of
+options("teal.bs_theme" = bslib::bs_theme(version = "5"))
+# try non-default themes
+options("teal.bs_theme" = bslib::bs_theme(version = "5", bootswatch = "THEME NAME". ...))
+# or run the app inside bslib::run_with_themer
+Please use the options("teal.bs_theme" = NULL)
call to
+return to the default shiny
Bootstrap for teal
+apps.
One reason the theme is not updated could be that the web browser
+caches the previous one, especially when different themes are run one
+after another. Please, use the Cmd+Shift+R
(Mac) or
+Ctrl+F5
(Windows) to hard refresh the webpage.
teal
CSS
+The most important HTML tags in teal
have a specific id
+or class, so they can be directly styled. The
+bslib::bs_add_rules
function could be used around the
+bslib::bs_theme
object to apply custom CSS
+rules.
library(magrittr)
+options("teal.bs_theme" = bslib::bs_theme(version = "5") %>% bslib::bs_add_rules("Anything understood by sass::as_sass()"))
+Other bslib::bs_add_*
family functions could be used to
+specify low-level Bootstrap elements.
It is important to note that the statements
+options("teal.bs_theme" = NULL)
and
+options("teal.bs_theme" = bslib::bs_theme(version = "3")
+are not equivalent as the bslib
approximation of the
+default shiny
theme for Bootstrap version 3 can introduce
+some discrepancies. One important difference is that when using
+bslib::bs_theme(version = "3", bootswatch = "THEME NAME")
+one can apply the custom Bootstrap theme. Another one is that the usage
+of bslib::bs_theme(version = "3")
requires the installation
+of the latest shinyWidgets
package from the main branch,
+see below.
# Downloading the newest shinyWidgets
+# needed only when bslib::bs_theme(version = "3", ...) is used
+remotes::install_github("https://github.com/dreamRs/shinyWidgets@main")
+shiny::fluidPage
+If you want to update the theme in a regular
+shiny::fluidPage
-like app, you do not need the
+teal.bs_theme
option. Simply provide the
+bslib::bs_theme
directly:
+shiny::fluidPage(theme = bslib::bs_theme(...), ...)
.
In this section we provide a step-by-step guide to customizing a
+teal
application theme interactively with
+bslib::run_with_themer()
. We recommend starting with a
+simple case and once you are satisfied, verifying with your full
+application. To that end we will use the teal
application
+below. For this example we assume that we want to use Bootstrap 5. To
+start, we launch the app with
+bslib::run_with_themer(app$ui, app$server)
instead of
+shiny::shinyApp
.
+options("teal.bs_theme" = bslib::bs_theme(version = "5"))
+
+library(teal)
+
+app <- init(
+ data = teal_data(IRIS = iris), # nolint
+ filter = teal_slices(teal_slice("IRIS", "Sepal.Length", selected = c(5, 7))),
+ modules = modules(example_module(), example_module()),
+ header = "My first teal application"
+)
+
+bslib::run_with_themer(shinyApp(app$ui, app$server))
This gives us the following.
+ +Note the Theme Customizer
section on the right hand
+side. This was added by bslib
and is how we customize our
+theme.
Instead of starting from scratch, we want to start with a Bootswatch
theme. Let us
+select the Minty theme in the “Overall theme” drop-down.
bslib
has updated our CSS
styles to use our
+new theme, including the customizer
theme. Additionally, if
+we look at our R
console, we will see
+#### Update your bs_theme() R code with: #####
+bs_theme_update(theme, bootswatch = "minty")
This is a helpful guide that provides code to update our theme. For
+teal
applications we don’t actually use
+bs_theme_update
and opt for bs_theme
instead.
+However, the printed code will still be helpful.
bootswatch
theme
+Our base theme (Minty) is close to what we want but let’s make a few
+modifications. To start, we will increase the base font size. To do
+this, we choose the “Fonts” section of the customizer
theme
+and then set a value in the “Base font size” input. We use 1.25 here,
+which means all our fonts will be increased by a factor of 1.25. If we
+check the R
console, we will see bslib
has
+printed
+bs_theme_update(theme, font_scale = 1.25, bootswatch = "minty")
,
+which now includes our font size adjustment.
Finally, suppose we do not want borders to be rounded. In our
+customizer
theme, we can go to “Options” and then uncheck
+the “Rounded corners” box.
As expected, our corners are no longer rounded. If we look at our
+R
console, we will now see
+bs_theme_update(theme, font_scale = 1.25,
enable-rounded= FALSE, bootswatch = "minty")
.
Once our customization is complete, we will apply the changes to our
+application. To do this, we use the option teal.bs_theme
+like before but this time we will expand on our
+bslib::bs_theme
call to include our changes. Luckily, the
+arguments that were printed to the R
console when running
+our app in the themer can be plugged right in.
+