diff --git a/development/assets/www/lock/graphs/efficacy/fstg01.lock b/development/assets/www/lock/graphs/efficacy/fstg01.lock index 4453601add..0fc7e6d1c8 100644 --- a/development/assets/www/lock/graphs/efficacy/fstg01.lock +++ b/development/assets/www/lock/graphs/efficacy/fstg01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1943,11 +1943,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1958,7 +1958,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2273,11 +2273,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2298,7 +2298,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2459,7 +2459,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2478,7 +2478,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/graphs/efficacy/fstg02.lock b/development/assets/www/lock/graphs/efficacy/fstg02.lock index 4453601add..0fc7e6d1c8 100644 --- a/development/assets/www/lock/graphs/efficacy/fstg02.lock +++ b/development/assets/www/lock/graphs/efficacy/fstg02.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1943,11 +1943,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1958,7 +1958,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2273,11 +2273,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2298,7 +2298,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2459,7 +2459,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2478,7 +2478,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/graphs/efficacy/kmg01.lock b/development/assets/www/lock/graphs/efficacy/kmg01.lock index 4453601add..0fc7e6d1c8 100644 --- a/development/assets/www/lock/graphs/efficacy/kmg01.lock +++ b/development/assets/www/lock/graphs/efficacy/kmg01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1943,11 +1943,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1958,7 +1958,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2273,11 +2273,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2298,7 +2298,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2459,7 +2459,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2478,7 +2478,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/graphs/efficacy/mmrmg01.lock b/development/assets/www/lock/graphs/efficacy/mmrmg01.lock index 4453601add..0fc7e6d1c8 100644 --- a/development/assets/www/lock/graphs/efficacy/mmrmg01.lock +++ b/development/assets/www/lock/graphs/efficacy/mmrmg01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1943,11 +1943,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1958,7 +1958,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2273,11 +2273,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2298,7 +2298,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2459,7 +2459,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2478,7 +2478,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/graphs/efficacy/mmrmg02.lock b/development/assets/www/lock/graphs/efficacy/mmrmg02.lock index d468e9f74f..05fbfaf8d0 100644 --- a/development/assets/www/lock/graphs/efficacy/mmrmg02.lock +++ b/development/assets/www/lock/graphs/efficacy/mmrmg02.lock @@ -540,11 +540,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -552,7 +552,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/graphs/other/brg01.lock b/development/assets/www/lock/graphs/other/brg01.lock index 059bd66855..4a647e5bfe 100644 --- a/development/assets/www/lock/graphs/other/brg01.lock +++ b/development/assets/www/lock/graphs/other/brg01.lock @@ -538,11 +538,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -550,7 +550,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/graphs/other/bwg01.lock b/development/assets/www/lock/graphs/other/bwg01.lock index 3479c25e3f..e9657957c2 100644 --- a/development/assets/www/lock/graphs/other/bwg01.lock +++ b/development/assets/www/lock/graphs/other/bwg01.lock @@ -838,11 +838,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -850,7 +850,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -2199,11 +2199,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2224,7 +2224,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2282,11 +2282,11 @@ }, "teal.modules.general": { "Package": "teal.modules.general", - "Version": "0.3.0.9005", + "Version": "0.3.0.9006", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.modules.general.git", - "RemoteSha": "94ee47f54272acba7c568e1d4ee603cc383653ea", + "RemoteSha": "99d7f0256a10be0c84afbf160bf1a093f63ae44f", "Requirements": [ "DT", "R", @@ -2317,7 +2317,7 @@ "tools", "utils" ], - "Hash": "aea7dc9ae22bf11fd8c46318a850ac40" + "Hash": "f3a57da302227c4b65b5245bd584705b" }, "teal.reporter": { "Package": "teal.reporter", @@ -2381,7 +2381,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2400,7 +2400,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/graphs/other/cig01.lock b/development/assets/www/lock/graphs/other/cig01.lock index 4453601add..0fc7e6d1c8 100644 --- a/development/assets/www/lock/graphs/other/cig01.lock +++ b/development/assets/www/lock/graphs/other/cig01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1943,11 +1943,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1958,7 +1958,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2273,11 +2273,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2298,7 +2298,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2459,7 +2459,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2478,7 +2478,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/graphs/other/ippg01.lock b/development/assets/www/lock/graphs/other/ippg01.lock index 4453601add..0fc7e6d1c8 100644 --- a/development/assets/www/lock/graphs/other/ippg01.lock +++ b/development/assets/www/lock/graphs/other/ippg01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1943,11 +1943,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1958,7 +1958,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2273,11 +2273,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2298,7 +2298,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2459,7 +2459,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2478,7 +2478,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/graphs/other/ltg01.lock b/development/assets/www/lock/graphs/other/ltg01.lock index 4453601add..0fc7e6d1c8 100644 --- a/development/assets/www/lock/graphs/other/ltg01.lock +++ b/development/assets/www/lock/graphs/other/ltg01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1943,11 +1943,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1958,7 +1958,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2273,11 +2273,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2298,7 +2298,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2459,7 +2459,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2478,7 +2478,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/graphs/other/mng01.lock b/development/assets/www/lock/graphs/other/mng01.lock index 4453601add..0fc7e6d1c8 100644 --- a/development/assets/www/lock/graphs/other/mng01.lock +++ b/development/assets/www/lock/graphs/other/mng01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1943,11 +1943,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1958,7 +1958,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2273,11 +2273,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2298,7 +2298,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2459,7 +2459,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2478,7 +2478,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/graphs/pharmacokinetic/pkcg01.lock b/development/assets/www/lock/graphs/pharmacokinetic/pkcg01.lock index 4e87243b02..1da2d11269 100644 --- a/development/assets/www/lock/graphs/pharmacokinetic/pkcg01.lock +++ b/development/assets/www/lock/graphs/pharmacokinetic/pkcg01.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/graphs/pharmacokinetic/pkcg02.lock b/development/assets/www/lock/graphs/pharmacokinetic/pkcg02.lock index 4e87243b02..1da2d11269 100644 --- a/development/assets/www/lock/graphs/pharmacokinetic/pkcg02.lock +++ b/development/assets/www/lock/graphs/pharmacokinetic/pkcg02.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/graphs/pharmacokinetic/pkcg03.lock b/development/assets/www/lock/graphs/pharmacokinetic/pkcg03.lock index 4e87243b02..1da2d11269 100644 --- a/development/assets/www/lock/graphs/pharmacokinetic/pkcg03.lock +++ b/development/assets/www/lock/graphs/pharmacokinetic/pkcg03.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/graphs/pharmacokinetic/pkpg01.lock b/development/assets/www/lock/graphs/pharmacokinetic/pkpg01.lock index 4e87243b02..1da2d11269 100644 --- a/development/assets/www/lock/graphs/pharmacokinetic/pkpg01.lock +++ b/development/assets/www/lock/graphs/pharmacokinetic/pkpg01.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/graphs/pharmacokinetic/pkpg02.lock b/development/assets/www/lock/graphs/pharmacokinetic/pkpg02.lock index 4e87243b02..1da2d11269 100644 --- a/development/assets/www/lock/graphs/pharmacokinetic/pkpg02.lock +++ b/development/assets/www/lock/graphs/pharmacokinetic/pkpg02.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/graphs/pharmacokinetic/pkpg03.lock b/development/assets/www/lock/graphs/pharmacokinetic/pkpg03.lock index 4e87243b02..1da2d11269 100644 --- a/development/assets/www/lock/graphs/pharmacokinetic/pkpg03.lock +++ b/development/assets/www/lock/graphs/pharmacokinetic/pkpg03.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/graphs/pharmacokinetic/pkpg04.lock b/development/assets/www/lock/graphs/pharmacokinetic/pkpg04.lock index fe2302fff5..825b98e036 100644 --- a/development/assets/www/lock/graphs/pharmacokinetic/pkpg04.lock +++ b/development/assets/www/lock/graphs/pharmacokinetic/pkpg04.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/graphs/pharmacokinetic/pkpg06.lock b/development/assets/www/lock/graphs/pharmacokinetic/pkpg06.lock index 4e87243b02..1da2d11269 100644 --- a/development/assets/www/lock/graphs/pharmacokinetic/pkpg06.lock +++ b/development/assets/www/lock/graphs/pharmacokinetic/pkpg06.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/listings/ADA/adal02.lock b/development/assets/www/lock/listings/ADA/adal02.lock index fd0bb4eb44..6c4c9cc26e 100644 --- a/development/assets/www/lock/listings/ADA/adal02.lock +++ b/development/assets/www/lock/listings/ADA/adal02.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -423,11 +423,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -438,7 +438,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/ECG/egl01.lock b/development/assets/www/lock/listings/ECG/egl01.lock index fd0bb4eb44..6c4c9cc26e 100644 --- a/development/assets/www/lock/listings/ECG/egl01.lock +++ b/development/assets/www/lock/listings/ECG/egl01.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -423,11 +423,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -438,7 +438,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/adverse-events/ael01.lock b/development/assets/www/lock/listings/adverse-events/ael01.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/adverse-events/ael01.lock +++ b/development/assets/www/lock/listings/adverse-events/ael01.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/adverse-events/ael01_nollt.lock b/development/assets/www/lock/listings/adverse-events/ael01_nollt.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/adverse-events/ael01_nollt.lock +++ b/development/assets/www/lock/listings/adverse-events/ael01_nollt.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/adverse-events/ael02.lock b/development/assets/www/lock/listings/adverse-events/ael02.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/adverse-events/ael02.lock +++ b/development/assets/www/lock/listings/adverse-events/ael02.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/adverse-events/ael02_ed.lock b/development/assets/www/lock/listings/adverse-events/ael02_ed.lock index 581d295575..bbda05235f 100644 --- a/development/assets/www/lock/listings/adverse-events/ael02_ed.lock +++ b/development/assets/www/lock/listings/adverse-events/ael02_ed.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -421,11 +421,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -436,7 +436,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/adverse-events/ael03.lock b/development/assets/www/lock/listings/adverse-events/ael03.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/adverse-events/ael03.lock +++ b/development/assets/www/lock/listings/adverse-events/ael03.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/adverse-events/ael04.lock b/development/assets/www/lock/listings/adverse-events/ael04.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/adverse-events/ael04.lock +++ b/development/assets/www/lock/listings/adverse-events/ael04.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/concomitant-medications/cml01.lock b/development/assets/www/lock/listings/concomitant-medications/cml01.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/concomitant-medications/cml01.lock +++ b/development/assets/www/lock/listings/concomitant-medications/cml01.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/concomitant-medications/cml02a_gl.lock b/development/assets/www/lock/listings/concomitant-medications/cml02a_gl.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/concomitant-medications/cml02a_gl.lock +++ b/development/assets/www/lock/listings/concomitant-medications/cml02a_gl.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/concomitant-medications/cml02b_gl.lock b/development/assets/www/lock/listings/concomitant-medications/cml02b_gl.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/concomitant-medications/cml02b_gl.lock +++ b/development/assets/www/lock/listings/concomitant-medications/cml02b_gl.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/development-safety-update-report/dsur4.lock b/development/assets/www/lock/listings/development-safety-update-report/dsur4.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/development-safety-update-report/dsur4.lock +++ b/development/assets/www/lock/listings/development-safety-update-report/dsur4.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/disposition/dsl01.lock b/development/assets/www/lock/listings/disposition/dsl01.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/disposition/dsl01.lock +++ b/development/assets/www/lock/listings/disposition/dsl01.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/disposition/dsl02.lock b/development/assets/www/lock/listings/disposition/dsl02.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/disposition/dsl02.lock +++ b/development/assets/www/lock/listings/disposition/dsl02.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/efficacy/oncl01.lock b/development/assets/www/lock/listings/efficacy/oncl01.lock index fd0bb4eb44..6c4c9cc26e 100644 --- a/development/assets/www/lock/listings/efficacy/oncl01.lock +++ b/development/assets/www/lock/listings/efficacy/oncl01.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -423,11 +423,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -438,7 +438,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/exposure/exl01.lock b/development/assets/www/lock/listings/exposure/exl01.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/exposure/exl01.lock +++ b/development/assets/www/lock/listings/exposure/exl01.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/lab-results/lbl01.lock b/development/assets/www/lock/listings/lab-results/lbl01.lock index fd0bb4eb44..6c4c9cc26e 100644 --- a/development/assets/www/lock/listings/lab-results/lbl01.lock +++ b/development/assets/www/lock/listings/lab-results/lbl01.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -423,11 +423,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -438,7 +438,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/lab-results/lbl01_rls.lock b/development/assets/www/lock/listings/lab-results/lbl01_rls.lock index fd0bb4eb44..6c4c9cc26e 100644 --- a/development/assets/www/lock/listings/lab-results/lbl01_rls.lock +++ b/development/assets/www/lock/listings/lab-results/lbl01_rls.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -423,11 +423,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -438,7 +438,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/lab-results/lbl02a.lock b/development/assets/www/lock/listings/lab-results/lbl02a.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/lab-results/lbl02a.lock +++ b/development/assets/www/lock/listings/lab-results/lbl02a.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/lab-results/lbl02a_rls.lock b/development/assets/www/lock/listings/lab-results/lbl02a_rls.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/lab-results/lbl02a_rls.lock +++ b/development/assets/www/lock/listings/lab-results/lbl02a_rls.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/lab-results/lbl02b.lock b/development/assets/www/lock/listings/lab-results/lbl02b.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/lab-results/lbl02b.lock +++ b/development/assets/www/lock/listings/lab-results/lbl02b.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/medical-history/mhl01.lock b/development/assets/www/lock/listings/medical-history/mhl01.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/medical-history/mhl01.lock +++ b/development/assets/www/lock/listings/medical-history/mhl01.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/pharmacokinetic/pkcl01.lock b/development/assets/www/lock/listings/pharmacokinetic/pkcl01.lock index cbed1e33f9..4bfcf2d320 100644 --- a/development/assets/www/lock/listings/pharmacokinetic/pkcl01.lock +++ b/development/assets/www/lock/listings/pharmacokinetic/pkcl01.lock @@ -183,11 +183,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -195,7 +195,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -398,11 +398,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -413,7 +413,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/pharmacokinetic/pkcl02.lock b/development/assets/www/lock/listings/pharmacokinetic/pkcl02.lock index fd0bb4eb44..6c4c9cc26e 100644 --- a/development/assets/www/lock/listings/pharmacokinetic/pkcl02.lock +++ b/development/assets/www/lock/listings/pharmacokinetic/pkcl02.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -423,11 +423,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -438,7 +438,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/pharmacokinetic/pkpl01.lock b/development/assets/www/lock/listings/pharmacokinetic/pkpl01.lock index fd0bb4eb44..6c4c9cc26e 100644 --- a/development/assets/www/lock/listings/pharmacokinetic/pkpl01.lock +++ b/development/assets/www/lock/listings/pharmacokinetic/pkpl01.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -423,11 +423,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -438,7 +438,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/pharmacokinetic/pkpl02.lock b/development/assets/www/lock/listings/pharmacokinetic/pkpl02.lock index fd0bb4eb44..6c4c9cc26e 100644 --- a/development/assets/www/lock/listings/pharmacokinetic/pkpl02.lock +++ b/development/assets/www/lock/listings/pharmacokinetic/pkpl02.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -423,11 +423,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -438,7 +438,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/pharmacokinetic/pkpl04.lock b/development/assets/www/lock/listings/pharmacokinetic/pkpl04.lock index fd0bb4eb44..6c4c9cc26e 100644 --- a/development/assets/www/lock/listings/pharmacokinetic/pkpl04.lock +++ b/development/assets/www/lock/listings/pharmacokinetic/pkpl04.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -423,11 +423,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -438,7 +438,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/listings/vital-signs/vsl01.lock b/development/assets/www/lock/listings/vital-signs/vsl01.lock index fd0bb4eb44..6c4c9cc26e 100644 --- a/development/assets/www/lock/listings/vital-signs/vsl01.lock +++ b/development/assets/www/lock/listings/vital-signs/vsl01.lock @@ -193,11 +193,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -205,7 +205,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -423,11 +423,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -438,7 +438,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", diff --git a/development/assets/www/lock/tables/ADA/adat01.lock b/development/assets/www/lock/tables/ADA/adat01.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/ADA/adat01.lock +++ b/development/assets/www/lock/tables/ADA/adat01.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/ADA/adat02.lock b/development/assets/www/lock/tables/ADA/adat02.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/ADA/adat02.lock +++ b/development/assets/www/lock/tables/ADA/adat02.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/ADA/adat03.lock b/development/assets/www/lock/tables/ADA/adat03.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/ADA/adat03.lock +++ b/development/assets/www/lock/tables/ADA/adat03.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/ADA/adat04a.lock b/development/assets/www/lock/tables/ADA/adat04a.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/ADA/adat04a.lock +++ b/development/assets/www/lock/tables/ADA/adat04a.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/ADA/adat04b.lock b/development/assets/www/lock/tables/ADA/adat04b.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/ADA/adat04b.lock +++ b/development/assets/www/lock/tables/ADA/adat04b.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/ECG/egt01.lock b/development/assets/www/lock/tables/ECG/egt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/ECG/egt01.lock +++ b/development/assets/www/lock/tables/ECG/egt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/ECG/egt02.lock b/development/assets/www/lock/tables/ECG/egt02.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/ECG/egt02.lock +++ b/development/assets/www/lock/tables/ECG/egt02.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/ECG/egt03.lock b/development/assets/www/lock/tables/ECG/egt03.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/ECG/egt03.lock +++ b/development/assets/www/lock/tables/ECG/egt03.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/ECG/egt04.lock b/development/assets/www/lock/tables/ECG/egt04.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/ECG/egt04.lock +++ b/development/assets/www/lock/tables/ECG/egt04.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/ECG/egt05_qtcat.lock b/development/assets/www/lock/tables/ECG/egt05_qtcat.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/ECG/egt05_qtcat.lock +++ b/development/assets/www/lock/tables/ECG/egt05_qtcat.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet01.lock b/development/assets/www/lock/tables/adverse-events/aet01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet01.lock +++ b/development/assets/www/lock/tables/adverse-events/aet01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet01_aesi.lock b/development/assets/www/lock/tables/adverse-events/aet01_aesi.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet01_aesi.lock +++ b/development/assets/www/lock/tables/adverse-events/aet01_aesi.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet02.lock b/development/assets/www/lock/tables/adverse-events/aet02.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet02.lock +++ b/development/assets/www/lock/tables/adverse-events/aet02.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet02_smq.lock b/development/assets/www/lock/tables/adverse-events/aet02_smq.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet02_smq.lock +++ b/development/assets/www/lock/tables/adverse-events/aet02_smq.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet03.lock b/development/assets/www/lock/tables/adverse-events/aet03.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet03.lock +++ b/development/assets/www/lock/tables/adverse-events/aet03.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet04.lock b/development/assets/www/lock/tables/adverse-events/aet04.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet04.lock +++ b/development/assets/www/lock/tables/adverse-events/aet04.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet04_pi.lock b/development/assets/www/lock/tables/adverse-events/aet04_pi.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet04_pi.lock +++ b/development/assets/www/lock/tables/adverse-events/aet04_pi.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet05.lock b/development/assets/www/lock/tables/adverse-events/aet05.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet05.lock +++ b/development/assets/www/lock/tables/adverse-events/aet05.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet05_all.lock b/development/assets/www/lock/tables/adverse-events/aet05_all.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet05_all.lock +++ b/development/assets/www/lock/tables/adverse-events/aet05_all.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet06.lock b/development/assets/www/lock/tables/adverse-events/aet06.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet06.lock +++ b/development/assets/www/lock/tables/adverse-events/aet06.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet06_smq.lock b/development/assets/www/lock/tables/adverse-events/aet06_smq.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet06_smq.lock +++ b/development/assets/www/lock/tables/adverse-events/aet06_smq.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet07.lock b/development/assets/www/lock/tables/adverse-events/aet07.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet07.lock +++ b/development/assets/www/lock/tables/adverse-events/aet07.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet09.lock b/development/assets/www/lock/tables/adverse-events/aet09.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet09.lock +++ b/development/assets/www/lock/tables/adverse-events/aet09.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet09_smq.lock b/development/assets/www/lock/tables/adverse-events/aet09_smq.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet09_smq.lock +++ b/development/assets/www/lock/tables/adverse-events/aet09_smq.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/adverse-events/aet10.lock b/development/assets/www/lock/tables/adverse-events/aet10.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/adverse-events/aet10.lock +++ b/development/assets/www/lock/tables/adverse-events/aet10.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/concomitant-medications/cmt01.lock b/development/assets/www/lock/tables/concomitant-medications/cmt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/concomitant-medications/cmt01.lock +++ b/development/assets/www/lock/tables/concomitant-medications/cmt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/concomitant-medications/cmt01a.lock b/development/assets/www/lock/tables/concomitant-medications/cmt01a.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/concomitant-medications/cmt01a.lock +++ b/development/assets/www/lock/tables/concomitant-medications/cmt01a.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/concomitant-medications/cmt01b.lock b/development/assets/www/lock/tables/concomitant-medications/cmt01b.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/concomitant-medications/cmt01b.lock +++ b/development/assets/www/lock/tables/concomitant-medications/cmt01b.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/concomitant-medications/cmt02_pt.lock b/development/assets/www/lock/tables/concomitant-medications/cmt02_pt.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/concomitant-medications/cmt02_pt.lock +++ b/development/assets/www/lock/tables/concomitant-medications/cmt02_pt.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/deaths/dtht01.lock b/development/assets/www/lock/tables/deaths/dtht01.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/deaths/dtht01.lock +++ b/development/assets/www/lock/tables/deaths/dtht01.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/demography/dmt01.lock b/development/assets/www/lock/tables/demography/dmt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/demography/dmt01.lock +++ b/development/assets/www/lock/tables/demography/dmt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/disclosures/disclosurest01.lock b/development/assets/www/lock/tables/disclosures/disclosurest01.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/disclosures/disclosurest01.lock +++ b/development/assets/www/lock/tables/disclosures/disclosurest01.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/disclosures/eudrat01.lock b/development/assets/www/lock/tables/disclosures/eudrat01.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/disclosures/eudrat01.lock +++ b/development/assets/www/lock/tables/disclosures/eudrat01.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/disclosures/eudrat02.lock b/development/assets/www/lock/tables/disclosures/eudrat02.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/disclosures/eudrat02.lock +++ b/development/assets/www/lock/tables/disclosures/eudrat02.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/disposition/dst01.lock b/development/assets/www/lock/tables/disposition/dst01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/disposition/dst01.lock +++ b/development/assets/www/lock/tables/disposition/dst01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/disposition/pdt01.lock b/development/assets/www/lock/tables/disposition/pdt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/disposition/pdt01.lock +++ b/development/assets/www/lock/tables/disposition/pdt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/disposition/pdt02.lock b/development/assets/www/lock/tables/disposition/pdt02.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/disposition/pdt02.lock +++ b/development/assets/www/lock/tables/disposition/pdt02.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/efficacy/aovt01.lock b/development/assets/www/lock/tables/efficacy/aovt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/aovt01.lock +++ b/development/assets/www/lock/tables/efficacy/aovt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/aovt02.lock b/development/assets/www/lock/tables/efficacy/aovt02.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/aovt02.lock +++ b/development/assets/www/lock/tables/efficacy/aovt02.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/aovt03.lock b/development/assets/www/lock/tables/efficacy/aovt03.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/efficacy/aovt03.lock +++ b/development/assets/www/lock/tables/efficacy/aovt03.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/efficacy/cfbt01.lock b/development/assets/www/lock/tables/efficacy/cfbt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/cfbt01.lock +++ b/development/assets/www/lock/tables/efficacy/cfbt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/cmht01.lock b/development/assets/www/lock/tables/efficacy/cmht01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/cmht01.lock +++ b/development/assets/www/lock/tables/efficacy/cmht01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/coxt01.lock b/development/assets/www/lock/tables/efficacy/coxt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/coxt01.lock +++ b/development/assets/www/lock/tables/efficacy/coxt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/coxt02.lock b/development/assets/www/lock/tables/efficacy/coxt02.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/coxt02.lock +++ b/development/assets/www/lock/tables/efficacy/coxt02.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/dort01.lock b/development/assets/www/lock/tables/efficacy/dort01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/dort01.lock +++ b/development/assets/www/lock/tables/efficacy/dort01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/lgrt02.lock b/development/assets/www/lock/tables/efficacy/lgrt02.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/lgrt02.lock +++ b/development/assets/www/lock/tables/efficacy/lgrt02.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/mmrmt01.lock b/development/assets/www/lock/tables/efficacy/mmrmt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/mmrmt01.lock +++ b/development/assets/www/lock/tables/efficacy/mmrmt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/onct05.lock b/development/assets/www/lock/tables/efficacy/onct05.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/onct05.lock +++ b/development/assets/www/lock/tables/efficacy/onct05.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/ratet01.lock b/development/assets/www/lock/tables/efficacy/ratet01.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/efficacy/ratet01.lock +++ b/development/assets/www/lock/tables/efficacy/ratet01.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/efficacy/rbmit01.lock b/development/assets/www/lock/tables/efficacy/rbmit01.lock index 3b0aeb9967..4b64da19f1 100644 --- a/development/assets/www/lock/tables/efficacy/rbmit01.lock +++ b/development/assets/www/lock/tables/efficacy/rbmit01.lock @@ -607,11 +607,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -619,7 +619,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/efficacy/rspt01.lock b/development/assets/www/lock/tables/efficacy/rspt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/rspt01.lock +++ b/development/assets/www/lock/tables/efficacy/rspt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/efficacy/ttet01.lock b/development/assets/www/lock/tables/efficacy/ttet01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/efficacy/ttet01.lock +++ b/development/assets/www/lock/tables/efficacy/ttet01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/exposure/ext01.lock b/development/assets/www/lock/tables/exposure/ext01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/exposure/ext01.lock +++ b/development/assets/www/lock/tables/exposure/ext01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/lab-results/lbt01.lock b/development/assets/www/lock/tables/lab-results/lbt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/lab-results/lbt01.lock +++ b/development/assets/www/lock/tables/lab-results/lbt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/lab-results/lbt02.lock b/development/assets/www/lock/tables/lab-results/lbt02.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/lab-results/lbt02.lock +++ b/development/assets/www/lock/tables/lab-results/lbt02.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/lab-results/lbt03.lock b/development/assets/www/lock/tables/lab-results/lbt03.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/lab-results/lbt03.lock +++ b/development/assets/www/lock/tables/lab-results/lbt03.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/lab-results/lbt04.lock b/development/assets/www/lock/tables/lab-results/lbt04.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/lab-results/lbt04.lock +++ b/development/assets/www/lock/tables/lab-results/lbt04.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/lab-results/lbt05.lock b/development/assets/www/lock/tables/lab-results/lbt05.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/lab-results/lbt05.lock +++ b/development/assets/www/lock/tables/lab-results/lbt05.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/lab-results/lbt06.lock b/development/assets/www/lock/tables/lab-results/lbt06.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/lab-results/lbt06.lock +++ b/development/assets/www/lock/tables/lab-results/lbt06.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/lab-results/lbt07.lock b/development/assets/www/lock/tables/lab-results/lbt07.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/lab-results/lbt07.lock +++ b/development/assets/www/lock/tables/lab-results/lbt07.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/lab-results/lbt08.lock b/development/assets/www/lock/tables/lab-results/lbt08.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/lab-results/lbt08.lock +++ b/development/assets/www/lock/tables/lab-results/lbt08.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/lab-results/lbt09.lock b/development/assets/www/lock/tables/lab-results/lbt09.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/lab-results/lbt09.lock +++ b/development/assets/www/lock/tables/lab-results/lbt09.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/lab-results/lbt10.lock b/development/assets/www/lock/tables/lab-results/lbt10.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/lab-results/lbt10.lock +++ b/development/assets/www/lock/tables/lab-results/lbt10.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/lab-results/lbt10_bl.lock b/development/assets/www/lock/tables/lab-results/lbt10_bl.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/lab-results/lbt10_bl.lock +++ b/development/assets/www/lock/tables/lab-results/lbt10_bl.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/lab-results/lbt11.lock b/development/assets/www/lock/tables/lab-results/lbt11.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/lab-results/lbt11.lock +++ b/development/assets/www/lock/tables/lab-results/lbt11.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/lab-results/lbt11_bl.lock b/development/assets/www/lock/tables/lab-results/lbt11_bl.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/lab-results/lbt11_bl.lock +++ b/development/assets/www/lock/tables/lab-results/lbt11_bl.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/lab-results/lbt12.lock b/development/assets/www/lock/tables/lab-results/lbt12.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/lab-results/lbt12.lock +++ b/development/assets/www/lock/tables/lab-results/lbt12.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/lab-results/lbt12_bl.lock b/development/assets/www/lock/tables/lab-results/lbt12_bl.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/lab-results/lbt12_bl.lock +++ b/development/assets/www/lock/tables/lab-results/lbt12_bl.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/lab-results/lbt13.lock b/development/assets/www/lock/tables/lab-results/lbt13.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/lab-results/lbt13.lock +++ b/development/assets/www/lock/tables/lab-results/lbt13.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/lab-results/lbt14.lock b/development/assets/www/lock/tables/lab-results/lbt14.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/lab-results/lbt14.lock +++ b/development/assets/www/lock/tables/lab-results/lbt14.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/lab-results/lbt15.lock b/development/assets/www/lock/tables/lab-results/lbt15.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/lab-results/lbt15.lock +++ b/development/assets/www/lock/tables/lab-results/lbt15.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/medical-history/mht01.lock b/development/assets/www/lock/tables/medical-history/mht01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/medical-history/mht01.lock +++ b/development/assets/www/lock/tables/medical-history/mht01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/pharmacokinetic/pkct01.lock b/development/assets/www/lock/tables/pharmacokinetic/pkct01.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/pharmacokinetic/pkct01.lock +++ b/development/assets/www/lock/tables/pharmacokinetic/pkct01.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/pharmacokinetic/pkpt02.lock b/development/assets/www/lock/tables/pharmacokinetic/pkpt02.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/pharmacokinetic/pkpt02.lock +++ b/development/assets/www/lock/tables/pharmacokinetic/pkpt02.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/pharmacokinetic/pkpt03.lock b/development/assets/www/lock/tables/pharmacokinetic/pkpt03.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/pharmacokinetic/pkpt03.lock +++ b/development/assets/www/lock/tables/pharmacokinetic/pkpt03.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/pharmacokinetic/pkpt04.lock b/development/assets/www/lock/tables/pharmacokinetic/pkpt04.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/pharmacokinetic/pkpt04.lock +++ b/development/assets/www/lock/tables/pharmacokinetic/pkpt04.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/pharmacokinetic/pkpt05.lock b/development/assets/www/lock/tables/pharmacokinetic/pkpt05.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/pharmacokinetic/pkpt05.lock +++ b/development/assets/www/lock/tables/pharmacokinetic/pkpt05.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/pharmacokinetic/pkpt06.lock b/development/assets/www/lock/tables/pharmacokinetic/pkpt06.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/pharmacokinetic/pkpt06.lock +++ b/development/assets/www/lock/tables/pharmacokinetic/pkpt06.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/pharmacokinetic/pkpt07.lock b/development/assets/www/lock/tables/pharmacokinetic/pkpt07.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/pharmacokinetic/pkpt07.lock +++ b/development/assets/www/lock/tables/pharmacokinetic/pkpt07.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/pharmacokinetic/pkpt08.lock b/development/assets/www/lock/tables/pharmacokinetic/pkpt08.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/pharmacokinetic/pkpt08.lock +++ b/development/assets/www/lock/tables/pharmacokinetic/pkpt08.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/pharmacokinetic/pkpt11.lock b/development/assets/www/lock/tables/pharmacokinetic/pkpt11.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/pharmacokinetic/pkpt11.lock +++ b/development/assets/www/lock/tables/pharmacokinetic/pkpt11.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/risk-management-plan/rmpt01.lock b/development/assets/www/lock/tables/risk-management-plan/rmpt01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/risk-management-plan/rmpt01.lock +++ b/development/assets/www/lock/tables/risk-management-plan/rmpt01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/risk-management-plan/rmpt03.lock b/development/assets/www/lock/tables/risk-management-plan/rmpt03.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/risk-management-plan/rmpt03.lock +++ b/development/assets/www/lock/tables/risk-management-plan/rmpt03.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/risk-management-plan/rmpt04.lock b/development/assets/www/lock/tables/risk-management-plan/rmpt04.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/risk-management-plan/rmpt04.lock +++ b/development/assets/www/lock/tables/risk-management-plan/rmpt04.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/risk-management-plan/rmpt05.lock b/development/assets/www/lock/tables/risk-management-plan/rmpt05.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/risk-management-plan/rmpt05.lock +++ b/development/assets/www/lock/tables/risk-management-plan/rmpt05.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/risk-management-plan/rmpt06.lock b/development/assets/www/lock/tables/risk-management-plan/rmpt06.lock index 417ac923e5..6a64e551e8 100644 --- a/development/assets/www/lock/tables/risk-management-plan/rmpt06.lock +++ b/development/assets/www/lock/tables/risk-management-plan/rmpt06.lock @@ -524,11 +524,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -536,7 +536,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", diff --git a/development/assets/www/lock/tables/safety/enrollment01.lock b/development/assets/www/lock/tables/safety/enrollment01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/safety/enrollment01.lock +++ b/development/assets/www/lock/tables/safety/enrollment01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/vital-signs/vst01.lock b/development/assets/www/lock/tables/vital-signs/vst01.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/vital-signs/vst01.lock +++ b/development/assets/www/lock/tables/vital-signs/vst01.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/lock/tables/vital-signs/vst02.lock b/development/assets/www/lock/tables/vital-signs/vst02.lock index fbf27a6c64..fa8f2c3ff4 100644 --- a/development/assets/www/lock/tables/vital-signs/vst02.lock +++ b/development/assets/www/lock/tables/vital-signs/vst02.lock @@ -857,11 +857,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -869,7 +869,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -1928,11 +1928,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -1943,7 +1943,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2258,11 +2258,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2283,7 +2283,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2444,7 +2444,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -2463,7 +2463,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/assets/www/renv.lock b/development/assets/www/renv.lock index 5c6fb4ddff..7d55da9331 100644 --- a/development/assets/www/renv.lock +++ b/development/assets/www/renv.lock @@ -1016,11 +1016,11 @@ }, "formatters": { "Package": "formatters", - "Version": "0.5.5.9016", + "Version": "0.5.5.9018", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/formatters.git", - "RemoteSha": "9b2c25c3a7fec823a069aa924e6ad2fa935f95a8", + "RemoteSha": "732244fd36407608717e45ed6c2154b48dfe1c88", "Requirements": [ "R", "checkmate", @@ -1028,7 +1028,7 @@ "htmltools", "methods" ], - "Hash": "50ba027f16aafa7179451757c5c8a120" + "Hash": "49a4c3625f29cf1a3e1b3952b1e26362" }, "fs": { "Package": "fs", @@ -2358,11 +2358,11 @@ }, "rlistings": { "Package": "rlistings", - "Version": "0.2.7.9011", + "Version": "0.2.7.9012", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/rlistings.git", - "RemoteSha": "54e3cc29776c4485cd814faafe93d391c257bfb9", + "RemoteSha": "06090df4c06fc43018ba87931623abf76d899734", "Requirements": [ "checkmate", "formatters", @@ -2373,7 +2373,7 @@ "tibble", "utils" ], - "Hash": "94d74d41ee0078eabf211b79183becf6" + "Hash": "7fb8b2a64519539a95b33a6f8b9a5c45" }, "rmarkdown": { "Package": "rmarkdown", @@ -2784,11 +2784,11 @@ }, "teal": { "Package": "teal", - "Version": "0.15.2.9019", + "Version": "0.15.2.9020", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.git", - "RemoteSha": "59cae26c6fd00effe14a91d4d93cc9f4a7f3f5e9", + "RemoteSha": "af17c0790729bdf1b01aa2a627753b5f2250b97a", "Requirements": [ "R", "checkmate", @@ -2809,7 +2809,7 @@ "teal.widgets", "utils" ], - "Hash": "14ab6bb091e88029f7451ab0d2aa3df0" + "Hash": "29b5417f37496279707ca29eb012d47e" }, "teal.code": { "Package": "teal.code", @@ -2910,11 +2910,11 @@ }, "teal.modules.general": { "Package": "teal.modules.general", - "Version": "0.3.0.9005", + "Version": "0.3.0.9006", "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.modules.general.git", - "RemoteSha": "94ee47f54272acba7c568e1d4ee603cc383653ea", + "RemoteSha": "99d7f0256a10be0c84afbf160bf1a093f63ae44f", "Requirements": [ "DT", "R", @@ -2945,7 +2945,7 @@ "tools", "utils" ], - "Hash": "aea7dc9ae22bf11fd8c46318a850ac40" + "Hash": "f3a57da302227c4b65b5245bd584705b" }, "teal.reporter": { "Package": "teal.reporter", @@ -3009,7 +3009,7 @@ "Source": "Git", "RemoteType": "git2r", "RemoteUrl": "https://github.com/insightsengineering/teal.transform.git", - "RemoteSha": "67801d108f8dcd55b5e9dbcafcd3e63ec5ff81df", + "RemoteSha": "4e0c69102823738bfee2e772c69cc86140ab2bc9", "Requirements": [ "R", "checkmate", @@ -3028,7 +3028,7 @@ "tidyr", "tidyselect" ], - "Hash": "4937c02d2140c300c243ca5a6a7c5dca" + "Hash": "8e5cc90f19adad6df29dda7b3b20907c" }, "teal.widgets": { "Package": "teal.widgets", diff --git a/development/graphs/efficacy/fstg01.html b/development/graphs/efficacy/fstg01.html index 0273bb41f9..af8e94e25f 100644 --- a/development/graphs/efficacy/fstg01.html +++ b/development/graphs/efficacy/fstg01.html @@ -1738,7 +1738,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:55:54 UTC"
+
[1] "2024-04-03 18:00:45 UTC"

Session Info

@@ -1769,11 +1769,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 nestcolor_0.1.2.9009 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/graphs/efficacy/fstg01_files/figure-html/teal-1.png b/development/graphs/efficacy/fstg01_files/figure-html/teal-1.png index a57db59eb6..947b9f1cd6 100644 Binary files a/development/graphs/efficacy/fstg01_files/figure-html/teal-1.png and b/development/graphs/efficacy/fstg01_files/figure-html/teal-1.png differ diff --git a/development/graphs/efficacy/fstg02.html b/development/graphs/efficacy/fstg02.html index 1336fb7280..1720f453b3 100644 --- a/development/graphs/efficacy/fstg02.html +++ b/development/graphs/efficacy/fstg02.html @@ -1762,7 +1762,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:56:15 UTC"
+
[1] "2024-04-03 17:58:51 UTC"

Session Info

@@ -1793,13 +1793,13 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] nestcolor_0.1.2.9009 forcats_1.0.0 [11] dplyr_1.1.4 tern_0.9.3.9028 [13] rtables_0.6.6.9011 magrittr_2.0.3 -[15] formatters_0.5.5.9016 +[15] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 diff --git a/development/graphs/efficacy/fstg02_files/figure-html/teal-1.png b/development/graphs/efficacy/fstg02_files/figure-html/teal-1.png index 1ed6b182c0..00c7ff956f 100644 Binary files a/development/graphs/efficacy/fstg02_files/figure-html/teal-1.png and b/development/graphs/efficacy/fstg02_files/figure-html/teal-1.png differ diff --git a/development/graphs/efficacy/kmg01.html b/development/graphs/efficacy/kmg01.html index 788195a27e..bb720a3a39 100644 --- a/development/graphs/efficacy/kmg01.html +++ b/development/graphs/efficacy/kmg01.html @@ -1673,7 +1673,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:55:31 UTC"
+
[1] "2024-04-03 17:59:24 UTC"

Session Info

@@ -1704,12 +1704,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 nestcolor_0.1.2.9009 [9] dplyr_1.1.4 scda_0.1.6.9017 [11] tern_0.9.3.9028 rtables_0.6.6.9011 -[13] magrittr_2.0.3 formatters_0.5.5.9016 +[13] magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 diff --git a/development/graphs/efficacy/kmg01_files/figure-html/teal-1.png b/development/graphs/efficacy/kmg01_files/figure-html/teal-1.png index 0c7038aa75..05f973574e 100644 Binary files a/development/graphs/efficacy/kmg01_files/figure-html/teal-1.png and b/development/graphs/efficacy/kmg01_files/figure-html/teal-1.png differ diff --git a/development/graphs/efficacy/mmrmg01.html b/development/graphs/efficacy/mmrmg01.html index 49abefbad8..8350480b50 100644 --- a/development/graphs/efficacy/mmrmg01.html +++ b/development/graphs/efficacy/mmrmg01.html @@ -1657,7 +1657,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:57:10 UTC"
+
[1] "2024-04-03 17:59:47 UTC"

Session Info

@@ -1688,12 +1688,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 nestcolor_0.1.2.9009 [9] scda_0.1.6.9017 tern.mmrm_0.3.0.9005 [11] tern_0.9.3.9028 rtables_0.6.6.9011 -[13] magrittr_2.0.3 formatters_0.5.5.9016 +[13] magrittr_2.0.3 formatters_0.5.5.9018 [15] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/graphs/efficacy/mmrmg01_files/figure-html/teal-1.png b/development/graphs/efficacy/mmrmg01_files/figure-html/teal-1.png index b4c47a4c1b..c3790c250a 100644 Binary files a/development/graphs/efficacy/mmrmg01_files/figure-html/teal-1.png and b/development/graphs/efficacy/mmrmg01_files/figure-html/teal-1.png differ diff --git a/development/graphs/efficacy/mmrmg02.html b/development/graphs/efficacy/mmrmg02.html index 7956b6d3e4..b027addb91 100644 --- a/development/graphs/efficacy/mmrmg02.html +++ b/development/graphs/efficacy/mmrmg02.html @@ -1583,7 +1583,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:56:47 UTC"
+
[1] "2024-04-03 18:00:20 UTC"

Session Info

@@ -1614,7 +1614,7 @@ other attached packages: [1] nestcolor_0.1.2.9009 tern.mmrm_0.3.0.9005 tern_0.9.3.9028 -[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016 +[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018 [7] dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/graphs/other/brg01.html b/development/graphs/other/brg01.html index d9cdf516c8..b32f9075bd 100644 --- a/development/graphs/other/brg01.html +++ b/development/graphs/other/brg01.html @@ -1815,7 +1815,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:57:58 UTC"
+
[1] "2024-04-03 17:57:54 UTC"

Session Info

@@ -1846,7 +1846,7 @@ other attached packages: [1] nestcolor_0.1.2.9009 tern_0.9.3.9028 rtables_0.6.6.9011 - [4] magrittr_2.0.3 formatters_0.5.5.9016 tidyr_1.3.1 + [4] magrittr_2.0.3 formatters_0.5.5.9018 tidyr_1.3.1 [7] scda_0.1.6.9017 ggplot2_3.5.0 dplyr_1.1.4 [10] binom_1.1-1.1 diff --git a/development/graphs/other/bwg01.html b/development/graphs/other/bwg01.html index c7c0d4456a..c15ca56fae 100644 --- a/development/graphs/other/bwg01.html +++ b/development/graphs/other/bwg01.html @@ -1968,7 +1968,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:57:31 UTC"
+
[1] "2024-04-03 17:57:28 UTC"

Session Info

@@ -1999,9 +1999,9 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 - [3] magrittr_2.0.3 formatters_0.5.5.9016 - [5] teal.modules.general_0.3.0.9005 teal.transform_0.5.0.9004 - [7] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] magrittr_2.0.3 formatters_0.5.5.9018 + [5] teal.modules.general_0.3.0.9006 teal.transform_0.5.0.9004 + [7] teal_0.15.2.9020 teal.slice_0.5.0.9009 [9] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [11] shiny_1.8.0 ggmosaic_0.3.3 [13] nestcolor_0.1.2.9009 ggplot2_3.5.0 diff --git a/development/graphs/other/bwg01_files/figure-html/teal-1.png b/development/graphs/other/bwg01_files/figure-html/teal-1.png index 7be4da3fe5..f11e72d29a 100644 Binary files a/development/graphs/other/bwg01_files/figure-html/teal-1.png and b/development/graphs/other/bwg01_files/figure-html/teal-1.png differ diff --git a/development/graphs/other/cig01.html b/development/graphs/other/cig01.html index d6a2498e4a..eb6425e169 100644 --- a/development/graphs/other/cig01.html +++ b/development/graphs/other/cig01.html @@ -1726,7 +1726,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:58:27 UTC"
+
[1] "2024-04-03 17:57:07 UTC"

Session Info

@@ -1757,13 +1757,13 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 nestcolor_0.1.2.9009 [9] scda_0.1.6.9017 dplyr_1.1.4 [11] ggplot2_3.5.0 tern_0.9.3.9028 [13] rtables_0.6.6.9011 magrittr_2.0.3 -[15] formatters_0.5.5.9016 +[15] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 diff --git a/development/graphs/other/cig01_files/figure-html/teal-1.png b/development/graphs/other/cig01_files/figure-html/teal-1.png index eb333b5ba4..ec16da095f 100644 Binary files a/development/graphs/other/cig01_files/figure-html/teal-1.png and b/development/graphs/other/cig01_files/figure-html/teal-1.png differ diff --git a/development/graphs/other/ippg01.html b/development/graphs/other/ippg01.html index 7694f9bb9e..1fa3a33afd 100644 --- a/development/graphs/other/ippg01.html +++ b/development/graphs/other/ippg01.html @@ -1647,7 +1647,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:57:48 UTC"
+
[1] "2024-04-03 17:57:44 UTC"

Session Info

@@ -1678,13 +1678,13 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 nestcolor_0.1.2.9009 [9] ggplot2_3.5.0 dplyr_1.1.4 [11] scda_0.1.6.9017 tern_0.9.3.9028 [13] rtables_0.6.6.9011 magrittr_2.0.3 -[15] formatters_0.5.5.9016 +[15] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 diff --git a/development/graphs/other/ippg01_files/figure-html/teal-1.png b/development/graphs/other/ippg01_files/figure-html/teal-1.png index d874afd3cf..2602e16ba9 100644 Binary files a/development/graphs/other/ippg01_files/figure-html/teal-1.png and b/development/graphs/other/ippg01_files/figure-html/teal-1.png differ diff --git a/development/graphs/other/ltg01.html b/development/graphs/other/ltg01.html index 9990f98a0b..5f2b822518 100644 --- a/development/graphs/other/ltg01.html +++ b/development/graphs/other/ltg01.html @@ -1697,7 +1697,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:58:11 UTC"
+
[1] "2024-04-03 17:58:08 UTC"

Session Info

@@ -1729,11 +1729,11 @@ other attached packages: [1] nestcolor_0.1.2.9009 dplyr_1.1.4 [3] ggplot2_3.5.0 teal.modules.clinical_0.9.0.9014 - [5] teal.transform_0.5.0.9004 teal_0.15.2.9019 + [5] teal.transform_0.5.0.9004 teal_0.15.2.9020 [7] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 [9] teal.code_0.5.0.9004 shiny_1.8.0 [11] tern_0.9.3.9028 rtables_0.6.6.9011 -[13] magrittr_2.0.3 formatters_0.5.5.9016 +[13] magrittr_2.0.3 formatters_0.5.5.9018 [15] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/graphs/other/mng01.html b/development/graphs/other/mng01.html index 5c1379b5a2..919027a919 100644 --- a/development/graphs/other/mng01.html +++ b/development/graphs/other/mng01.html @@ -1699,7 +1699,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:58:48 UTC"
+
[1] "2024-04-03 17:58:30 UTC"

Session Info

@@ -1730,12 +1730,12 @@ other attached packages: [1] forcats_1.0.0 teal.modules.clinical_0.9.0.9014 - [3] teal.transform_0.5.0.9004 teal_0.15.2.9019 + [3] teal.transform_0.5.0.9004 teal_0.15.2.9020 [5] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 [7] teal.code_0.5.0.9004 shiny_1.8.0 [9] nestcolor_0.1.2.9009 scda_0.1.6.9017 [11] tern_0.9.3.9028 rtables_0.6.6.9011 -[13] magrittr_2.0.3 formatters_0.5.5.9016 +[13] magrittr_2.0.3 formatters_0.5.5.9018 [15] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/graphs/other/mng01_files/figure-html/teal-1.png b/development/graphs/other/mng01_files/figure-html/teal-1.png index 77506dfd6b..d9802fe70f 100644 Binary files a/development/graphs/other/mng01_files/figure-html/teal-1.png and b/development/graphs/other/mng01_files/figure-html/teal-1.png differ diff --git a/development/graphs/pharmacokinetic/pkcg01.html b/development/graphs/pharmacokinetic/pkcg01.html index d86de5a914..3ac06226c7 100644 --- a/development/graphs/pharmacokinetic/pkcg01.html +++ b/development/graphs/pharmacokinetic/pkcg01.html @@ -1556,7 +1556,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:54:53 UTC"
+
[1] "2024-04-03 18:01:36 UTC"

Session Info

@@ -1588,7 +1588,7 @@ other attached packages: [1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 [4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 -[7] magrittr_2.0.3 formatters_0.5.5.9016 +[7] magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/graphs/pharmacokinetic/pkcg02.html b/development/graphs/pharmacokinetic/pkcg02.html index 0340de9b86..4cdc5dc165 100644 --- a/development/graphs/pharmacokinetic/pkcg02.html +++ b/development/graphs/pharmacokinetic/pkcg02.html @@ -1557,7 +1557,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:54:30 UTC"
+
[1] "2024-04-03 18:00:53 UTC"

Session Info

@@ -1589,7 +1589,7 @@ other attached packages: [1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 [4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 -[7] magrittr_2.0.3 formatters_0.5.5.9016 +[7] magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/graphs/pharmacokinetic/pkcg03.html b/development/graphs/pharmacokinetic/pkcg03.html index 31173b490d..165c05861a 100644 --- a/development/graphs/pharmacokinetic/pkcg03.html +++ b/development/graphs/pharmacokinetic/pkcg03.html @@ -1573,7 +1573,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:54:44 UTC"
+
[1] "2024-04-03 18:01:27 UTC"

Session Info

@@ -1605,7 +1605,7 @@ other attached packages: [1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 [4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 -[7] magrittr_2.0.3 formatters_0.5.5.9016 +[7] magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/graphs/pharmacokinetic/pkpg01.html b/development/graphs/pharmacokinetic/pkpg01.html index a2f37d08fc..3db310e750 100644 --- a/development/graphs/pharmacokinetic/pkpg01.html +++ b/development/graphs/pharmacokinetic/pkpg01.html @@ -1602,7 +1602,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:54:37 UTC"
+
[1] "2024-04-03 18:01:43 UTC"

Session Info

@@ -1634,7 +1634,7 @@ other attached packages: [1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 [4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 -[7] magrittr_2.0.3 formatters_0.5.5.9016 +[7] magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/graphs/pharmacokinetic/pkpg02.html b/development/graphs/pharmacokinetic/pkpg02.html index 997d4171b2..2005b0e2fc 100644 --- a/development/graphs/pharmacokinetic/pkpg02.html +++ b/development/graphs/pharmacokinetic/pkpg02.html @@ -1620,7 +1620,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:54:24 UTC"
+
[1] "2024-04-03 18:01:13 UTC"

Session Info

@@ -1652,7 +1652,7 @@ other attached packages: [1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 [4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 -[7] magrittr_2.0.3 formatters_0.5.5.9016 +[7] magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/graphs/pharmacokinetic/pkpg03.html b/development/graphs/pharmacokinetic/pkpg03.html index ecbd37f23e..18f35f28c6 100644 --- a/development/graphs/pharmacokinetic/pkpg03.html +++ b/development/graphs/pharmacokinetic/pkpg03.html @@ -1515,7 +1515,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:54:11 UTC"
+
[1] "2024-04-03 18:00:59 UTC"

Session Info

@@ -1547,7 +1547,7 @@ other attached packages: [1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 [4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 -[7] magrittr_2.0.3 formatters_0.5.5.9016 +[7] magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/graphs/pharmacokinetic/pkpg04.html b/development/graphs/pharmacokinetic/pkpg04.html index 379dbfae16..636b14e636 100644 --- a/development/graphs/pharmacokinetic/pkpg04.html +++ b/development/graphs/pharmacokinetic/pkpg04.html @@ -1517,7 +1517,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:54:18 UTC"
+
[1] "2024-04-03 18:01:20 UTC"

Session Info

@@ -1549,7 +1549,7 @@ other attached packages: [1] nestcolor_0.1.2.9009 ggrepel_0.9.5 ggplot2_3.5.0 [4] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 -[7] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016 +[7] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] utf8_1.2.4 generics_0.1.3 tidyr_1.3.1 lattice_0.22-6 diff --git a/development/graphs/pharmacokinetic/pkpg04_files/figure-html/plot1-1.png b/development/graphs/pharmacokinetic/pkpg04_files/figure-html/plot1-1.png index c16b958d56..97b9f86f19 100644 Binary files a/development/graphs/pharmacokinetic/pkpg04_files/figure-html/plot1-1.png and b/development/graphs/pharmacokinetic/pkpg04_files/figure-html/plot1-1.png differ diff --git a/development/graphs/pharmacokinetic/pkpg06.html b/development/graphs/pharmacokinetic/pkpg06.html index a84ec1b768..6a79d85a07 100644 --- a/development/graphs/pharmacokinetic/pkpg06.html +++ b/development/graphs/pharmacokinetic/pkpg06.html @@ -1715,7 +1715,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:55:00 UTC"
+
[1] "2024-04-03 18:01:06 UTC"

Session Info

@@ -1746,7 +1746,7 @@ other attached packages: [1] nestcolor_0.1.2.9009 tern_0.9.3.9028 rtables_0.6.6.9011 -[4] magrittr_2.0.3 formatters_0.5.5.9016 tidyr_1.3.1 +[4] magrittr_2.0.3 formatters_0.5.5.9018 tidyr_1.3.1 [7] ggplot2_3.5.0 scda_0.1.6.9017 dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/listings/ADA/adal02.html b/development/listings/ADA/adal02.html index a52e4459f2..d77aefa75d 100644 --- a/development/listings/ADA/adal02.html +++ b/development/listings/ADA/adal02.html @@ -1554,11 +1554,9 @@ Persistent ADA = ADA positive result detected (a) at the last post-baseline sampling timepoint, OR (b) at 2 or more time points during treatment where the first and last ADA positive samples are separated by a period ≥ 16 weeks, irrespective of any negative samples in between. Asterisk denotes sample that tested positive for Neutralizing Antibodies." -) -
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Anti-R1800000 Antibody Data for Treatment Emergent ADA Positive Patients, PK Population
 Protocol: A: Drug X Antibody
@@ -1603,28 +1601,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:09 UTC"
+
[1] "2024-04-03 17:34:22 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1649,8 +1647,8 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] scda_0.1.6.9017       rlistings_0.2.7.9011  tibble_3.2.1         
-[4] formatters_0.5.5.9016 dplyr_1.1.4          
+[1] scda_0.1.6.9017       rlistings_0.2.7.9012  tibble_3.2.1         
+[4] formatters_0.5.5.9018 dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
  [1] vctrs_0.6.5       cli_3.6.2         knitr_1.45        rlang_1.1.3      
@@ -1668,31 +1666,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2320,139 +2318,139 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of ECG Data: Safety-Evaluable Patients
 
@@ -1560,28 +1558,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:06 UTC"
+
[1] "2024-04-03 17:35:26 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1606,7 +1604,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1625,31 +1623,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2277,106 +2275,106 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Preferred Terms, Lowest Level Terms, and Investigator-Specified Adverse Event Terms
 
@@ -1496,28 +1494,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:37 UTC"
+
[1] "2024-04-03 17:34:56 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1542,7 +1540,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] dplyr_1.1.4           scda_0.1.6.9017      
 
 loaded via a namespace (and not attached):
@@ -1561,31 +1559,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2213,56 +2211,56 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Preferred Terms and Investigator-Specified Adverse Event Terms
 
@@ -1495,28 +1493,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:26 UTC"
+
[1] "2024-04-03 17:34:45 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1541,7 +1539,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] dplyr_1.1.4           scda_0.1.6.9017      
 
 loaded via a namespace (and not attached):
@@ -1560,31 +1558,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2212,55 +2210,55 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Adverse Events
 
@@ -1560,28 +1558,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:30 UTC"
+
[1] "2024-04-03 17:34:49 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1606,7 +1604,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1625,31 +1623,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2277,98 +2275,98 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Adverse Events (for early development studies)
 
@@ -1578,28 +1576,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:33 UTC"
+
[1] "2024-04-03 17:34:53 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1624,8 +1622,8 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] lubridate_1.9.3       rlistings_0.2.7.9011  tibble_3.2.1         
-[4] formatters_0.5.5.9016 scda_0.1.6.9017       dplyr_1.1.4          
+[1] lubridate_1.9.3       rlistings_0.2.7.9012  tibble_3.2.1         
+[4] formatters_0.5.5.9018 scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
  [1] vctrs_0.6.5       cli_3.6.2         knitr_1.45        rlang_1.1.3      
@@ -1643,31 +1641,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2295,116 +2293,116 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Serious Adverse Events
 
@@ -1579,28 +1577,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:20 UTC"
+
[1] "2024-04-03 17:34:41 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1625,7 +1623,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] dplyr_1.1.4           scda_0.1.6.9017      
 
 loaded via a namespace (and not attached):
@@ -1644,31 +1642,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2296,112 +2294,112 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Patient Deaths
 
@@ -1517,28 +1515,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:23 UTC"
+
[1] "2024-04-03 17:34:38 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1563,7 +1561,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1582,31 +1580,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2234,66 +2232,66 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Previous and Concomitant Medications
 
@@ -1528,28 +1526,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:52:55 UTC"
+
[1] "2024-04-03 17:35:30 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1574,7 +1572,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1593,31 +1591,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2245,77 +2243,77 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Concomitant Medication Class Level 2, Preferred Name, and Investigator-Specified Terms
 
@@ -1502,28 +1500,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:52:59 UTC"
+
[1] "2024-04-03 17:35:33 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1548,7 +1546,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] dplyr_1.1.4           scda_0.1.6.9017      
 
 loaded via a namespace (and not attached):
@@ -1567,31 +1565,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2219,55 +2217,55 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Concomitant Medication Class, Preferred Name, and Investigator-Specified Terms
 
@@ -1505,28 +1503,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:02 UTC"
+
[1] "2024-04-03 17:35:37 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1551,7 +1549,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] dplyr_1.1.4           scda_0.1.6.9017      
 
 loaded via a namespace (and not attached):
@@ -1570,31 +1568,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2222,58 +2220,58 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Patients Who Died During Reporting Period
 Number of patient deaths during reporting period = 70
@@ -1507,28 +1505,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:54:06 UTC"
+
[1] "2024-04-03 17:34:31 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1553,7 +1551,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] dplyr_1.1.4           scda_0.1.6.9017      
 
 loaded via a namespace (and not attached):
@@ -1572,31 +1570,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2224,57 +2222,57 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Patients with Study Drug Withdrawn Due to Adverse Events
 
@@ -1516,28 +1514,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:13 UTC"
+
[1] "2024-04-03 17:35:03 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1562,7 +1560,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] dplyr_1.1.4           scda_0.1.6.9017      
 
 loaded via a namespace (and not attached):
@@ -1581,31 +1579,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2233,65 +2231,65 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Patients Who Discontinued Early from Study
 
@@ -1511,28 +1509,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:16 UTC"
+
[1] "2024-04-03 17:35:00 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1557,7 +1555,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] dplyr_1.1.4           scda_0.1.6.9017      
 
 loaded via a namespace (and not attached):
@@ -1576,31 +1574,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2228,73 +2226,73 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Individual Efficacy Data
 
@@ -1571,28 +1569,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:52:52 UTC"
+
[1] "2024-04-03 17:34:27 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1617,7 +1615,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] dplyr_1.1.4           scda_0.1.6.9017      
 
 loaded via a namespace (and not attached):
@@ -1636,31 +1634,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2288,117 +2286,117 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Exposure to Study Drug
 
@@ -1515,28 +1513,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:52:48 UTC"
+
[1] "2024-04-03 17:36:04 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1561,7 +1559,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1580,31 +1578,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2232,65 +2230,65 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Laboratory Test Results
 
@@ -1544,28 +1542,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:59 UTC"
+
[1] "2024-04-03 17:35:49 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1590,7 +1588,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1609,31 +1607,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2261,90 +2259,90 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Laboratory Test Results Using Roche Safety Lab Standardization
 
@@ -1549,28 +1547,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:48 UTC"
+
[1] "2024-04-03 17:35:56 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1595,7 +1593,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1614,31 +1612,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2266,95 +2264,95 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Laboratory Abnormalities Defined by NCI CTCAE Grade >= 1
 
@@ -1544,28 +1542,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:52 UTC"
+
[1] "2024-04-03 17:36:00 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1590,7 +1588,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1609,31 +1607,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2261,90 +2259,90 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Laboratory Abnormalities Defined by Roche Safety Lab Standardization
 
@@ -1565,28 +1563,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:55 UTC"
+
[1] "2024-04-03 17:35:45 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1611,7 +1609,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1630,31 +1628,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2282,110 +2280,110 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Laboratory Abnormalities Defined by NCI CTCAE Grade >= 2
 
@@ -1545,28 +1543,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:54:03 UTC"
+
[1] "2024-04-03 17:35:53 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1591,7 +1589,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1610,31 +1608,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2262,91 +2260,91 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Medical History and Concurrent Diseases
 
@@ -1520,28 +1518,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:44 UTC"
+
[1] "2024-04-03 17:34:34 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1566,7 +1564,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1585,31 +1583,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2237,69 +2235,69 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Plasma Drug X Concentration by Treatment Group, Subject and Nominal Time, PK Population
 Protocol: xxnnnnn
@@ -1518,28 +1516,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:52:41 UTC"
+
[1] "2024-04-03 17:35:18 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1564,8 +1562,8 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] dplyr_1.1.4           scda_0.1.6.9017       rlistings_0.2.7.9011 
-[4] tibble_3.2.1          formatters_0.5.5.9016
+[1] dplyr_1.1.4           scda_0.1.6.9017       rlistings_0.2.7.9012 
+[4] tibble_3.2.1          formatters_0.5.5.9018
 
 loaded via a namespace (and not attached):
  [1] vctrs_0.6.5       cli_3.6.2         knitr_1.45        rlang_1.1.3      
@@ -1583,31 +1581,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2235,65 +2233,65 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Drug X Urine Concentration and Volumes following BID of Drug X, PK Population
 Protocol: xxnnnnn
@@ -1552,28 +1550,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:52:37 UTC"
+
[1] "2024-04-03 17:35:07 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1598,8 +1596,8 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] scda_0.1.6.9017       rlistings_0.2.7.9011  tibble_3.2.1         
-[4] formatters_0.5.5.9016 dplyr_1.1.4          
+[1] scda_0.1.6.9017       rlistings_0.2.7.9012  tibble_3.2.1         
+[4] formatters_0.5.5.9018 dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
  [1] vctrs_0.6.5       cli_3.6.2         knitr_1.45        rlang_1.1.3      
@@ -1617,31 +1615,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2269,98 +2267,98 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Plasma Drug X Plasma PK Parameters, PK Population
 Protocol: xxnnnnn
@@ -1520,28 +1518,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:52:34 UTC"
+
[1] "2024-04-03 17:35:11 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1566,8 +1564,8 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] scda_0.1.6.9017       rlistings_0.2.7.9011  tibble_3.2.1         
-[4] formatters_0.5.5.9016 dplyr_1.1.4          
+[1] scda_0.1.6.9017       rlistings_0.2.7.9012  tibble_3.2.1         
+[4] formatters_0.5.5.9018 dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
  [1] vctrs_0.6.5       cli_3.6.2         knitr_1.45        rlang_1.1.3      
@@ -1585,31 +1583,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2237,69 +2235,69 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Plasma Drug X Urine PK Parameters, PK Population
 Protocol: xxnnnnn
@@ -1521,28 +1519,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:52:30 UTC"
+
[1] "2024-04-03 17:35:22 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1567,8 +1565,8 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] scda_0.1.6.9017       rlistings_0.2.7.9011  tibble_3.2.1         
-[4] formatters_0.5.5.9016 dplyr_1.1.4          
+[1] scda_0.1.6.9017       rlistings_0.2.7.9012  tibble_3.2.1         
+[4] formatters_0.5.5.9018 dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
  [1] vctrs_0.6.5       cli_3.6.2         knitr_1.45        rlang_1.1.3      
@@ -1586,31 +1584,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2238,70 +2236,70 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Individual Plasma Drug X AUC Infinity Obs and Max Conc Ratios following BID Plasma Drug X or Plasma Drug Y, PK Population
 Protocol: xxnnnnn
@@ -1539,28 +1537,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:52:45 UTC"
+
[1] "2024-04-03 17:35:15 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1585,8 +1583,8 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] scda_0.1.6.9017       rlistings_0.2.7.9011  tibble_3.2.1         
-[4] formatters_0.5.5.9016 dplyr_1.1.4          
+[1] scda_0.1.6.9017       rlistings_0.2.7.9012  tibble_3.2.1         
+[4] formatters_0.5.5.9018 dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
  [1] vctrs_0.6.5       cli_3.6.2         knitr_1.45        rlang_1.1.3      
@@ -1604,31 +1602,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2256,85 +2254,85 @@
-
-
sorting incoming data by key columns
-
-
Code
head(lsting, 20)
+) + +head(lsting, 20)
Listing of Vital Signs: Safety-Evaluable Patients
 
@@ -1596,28 +1594,28 @@
 
-
Code
if (exists("tenv")) {
-  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
-  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
-  if (!dir.exists(dirname(filepath))) {
-    dir.create(dirname(filepath), recursive = TRUE)
-  }
-  saveRDS(tenv, filepath)
-}
+
Code
if (exists("tenv")) {
+  filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
+  filepath <- gsub(normalizePath(Sys.getenv("QUARTO_PROJECT_DIR")), file.path(Sys.getenv("QUARTO_TESTTHAT_DATA_PATH"), Sys.getenv("QUARTO_PROFILE")), filename)
+  if (!dir.exists(dirname(filepath))) {
+    dir.create(dirname(filepath), recursive = TRUE)
+  }
+  saveRDS(tenv, filepath)
+}

Timestamp

-
Code
Sys.time()
+
Code
Sys.time()
-
[1] "2024-03-30 17:53:41 UTC"
+
[1] "2024-04-03 17:35:41 UTC"

Session Info

-
Code
sessionInfo()
+
Code
sessionInfo()
R version 4.3.3 (2024-02-29)
 Platform: x86_64-pc-linux-gnu (64-bit)
@@ -1642,7 +1640,7 @@
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] rlistings_0.2.7.9011  tibble_3.2.1          formatters_0.5.5.9016
+[1] rlistings_0.2.7.9012  tibble_3.2.1          formatters_0.5.5.9018
 [4] scda_0.1.6.9017       dplyr_1.1.4          
 
 loaded via a namespace (and not attached):
@@ -1661,31 +1659,31 @@
 .lock file
 

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

-
Code
parent_file_path <- knitr::current_input(dir = TRUE)
-
-book_root_dir <- parent_file_path
-while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
-
-lock_path <- file.path(
-  "../../assets/www/lock",
-  paste0(
-    gsub(
-      file.path(book_root_dir, ""),
-      "",
-      gsub(
-        "\\.rmarkdown$",
-        "",
-        knitr::current_input(dir = TRUE)
-      )
-    ),
-    ".lock"
-  )
-)
-
-withr::with_options(
-  list(renv.verbose = FALSE),
-  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
-)
+
Code
parent_file_path <- knitr::current_input(dir = TRUE)
+
+book_root_dir <- parent_file_path
+while (!file.exists(file.path(book_root_dir, "_quarto.yml"))) book_root_dir <- dirname(book_root_dir)
+
+lock_path <- file.path(
+  "../../assets/www/lock",
+  paste0(
+    gsub(
+      file.path(book_root_dir, ""),
+      "",
+      gsub(
+        "\\.rmarkdown$",
+        "",
+        knitr::current_input(dir = TRUE)
+      )
+    ),
+    ".lock"
+  )
+)
+
+withr::with_options(
+  list(renv.verbose = FALSE),
+  renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)
+)

Download

@@ -2313,139 +2311,139 @@

Session Info

diff --git a/development/search.json b/development/search.json index 17024acaa0..ff7d19de45 100644 --- a/development/search.json +++ b/development/search.json @@ -1,106 +1,125 @@ [ { - "objectID": "test-utils/save_results.html", - "href": "test-utils/save_results.html", + "objectID": "CONTRIBUTING.html#table-of-contents", + "href": "CONTRIBUTING.html#table-of-contents", "title": "", - "section": "", - "text": "Codeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}" + "section": "Table of contents", + "text": "Table of contents\n👶 Getting started\n📔 Code of Conduct\n🗃 License\n📜 Issues\n🚩 Pull requests\n💻 Coding guidelines\n🏆 Recognition model\n❓ Questions" }, { - "objectID": "index.html", - "href": "index.html", - "title": "TLG Catalog ", - "section": "", - "text": "The TLG catalog is a catalog of Tables, Listings, and Graphs for clinical trials generated using NEST packages.\nThis repository provides a comprehensive collection of clinical trials outputs generated using the R language. The target audience is the clinical trials community, including statisticians, data scientists, and other professionals interested in applying R to clinical trials data.\n\n\nEach TLG is represented on a separate article page, typically including the following sections:\n\nSetup and pre-processing of synthetic data.\nSteps to produce the TLG.\nThe output TLG generated by the given code (including any available variants).\nAn interactive application that can alternatively be used to produce and interact with the TLG.\nReproducibility information.\n\nSee the full list of available TLGs on the Index page.\n\n\n\n\nThe full source code of each article can be viewed by clicking on the “Source Code” button at the top of the page and copied using the “Copy to Clipboard” button.\n\n\n\nIndividual code chunks from within the article can also be viewed and copied.\n\n\n\nThe Reproducibility tab contains session information and allows one to install the packages required to properly run the code.\n\n\n\n\n\n\n\n\nThis catalog as well as code examples are licensed under the Apache License, Version 2.0 - see the LICENSE file for details.\n\n\n\nWe welcome contributions big and small to the TLG catalog. Please refer to the Contributing guide for more information on how you can contribute. Use the giscus panels at the bottom of each page to share your feedback & ideas, ask questions, and report issues.\n\n\n\nThis website is built using Quarto and hosted on GitHub Pages. This website is rebuilt and republished daily as well as every time a change is pushed to the repository as part of the CI/CD process.\nThe catalog is rendered using “Stable” and “Development” profiles. The main difference between these two profiles is the package versions used to generate the outputs. The “Stable” profile uses the most recently released versions of all packages, whereas the “Development” profile uses the latest development versions of all NEST packages. This means that the same R code (e.g. foo::bar()) would be run using both the latest released and development package versions (e.g. foo@v1.2.3 on the “Stable” profile and foo@v1.2.3.9123 on the “Development” profile). If your article is affected by API changes between released and development versions, please consider conditional content (checking QUARTO_PROFILE environment variable) and/or if statements on respective package versions to enable the article to work in both profiles.\nAs a part of the CI/CD process, each article’s code is checked for quality, coherence, and readability using tools such as lintr, styler, and spelling. Additionally, regression testing is performed using testthat snapshot testing (see the package component of the repository for more details).\nIf you are adding a new table, listing, or graph in the form a new .qmd file, then you will also need to update the index in the tlg-index.qmd file with the new file name. To do so, run the R code in the generate-index.R file after creating your template.", - "crumbs": [ - "Introduction" - ] + "objectID": "CONTRIBUTING.html#getting-started", + "href": "CONTRIBUTING.html#getting-started", + "title": "", + "section": "Getting started", + "text": "Getting started\nPlease familiarize yourself with the specific project structure and the book content. Please make sure you read the “Development” section in the README file." }, { - "objectID": "index.html#usage", - "href": "index.html#usage", - "title": "TLG Catalog ", - "section": "", - "text": "Each TLG is represented on a separate article page, typically including the following sections:\n\nSetup and pre-processing of synthetic data.\nSteps to produce the TLG.\nThe output TLG generated by the given code (including any available variants).\nAn interactive application that can alternatively be used to produce and interact with the TLG.\nReproducibility information.\n\nSee the full list of available TLGs on the Index page.\n\n\n\n\nThe full source code of each article can be viewed by clicking on the “Source Code” button at the top of the page and copied using the “Copy to Clipboard” button.\n\n\n\nIndividual code chunks from within the article can also be viewed and copied.\n\n\n\nThe Reproducibility tab contains session information and allows one to install the packages required to properly run the code.", - "crumbs": [ - "Introduction" - ] + "objectID": "CONTRIBUTING.html#code-of-conduct", + "href": "CONTRIBUTING.html#code-of-conduct", + "title": "", + "section": "Code of Conduct", + "text": "Code of Conduct\nA Code of Conduct governs this project. Participants and contributors are expected to follow the rules outlined therein." }, { - "objectID": "index.html#license", - "href": "index.html#license", - "title": "TLG Catalog ", - "section": "", - "text": "This catalog as well as code examples are licensed under the Apache License, Version 2.0 - see the LICENSE file for details.", - "crumbs": [ - "Introduction" - ] + "objectID": "CONTRIBUTING.html#license", + "href": "CONTRIBUTING.html#license", + "title": "", + "section": "License", + "text": "License\nAll your contributions will be covered by this project’s license." }, { - "objectID": "index.html#contributing", - "href": "index.html#contributing", - "title": "TLG Catalog ", - "section": "", - "text": "We welcome contributions big and small to the TLG catalog. Please refer to the Contributing guide for more information on how you can contribute. Use the giscus panels at the bottom of each page to share your feedback & ideas, ask questions, and report issues.", - "crumbs": [ - "Introduction" - ] + "objectID": "CONTRIBUTING.html#issues", + "href": "CONTRIBUTING.html#issues", + "title": "", + "section": "Issues", + "text": "Issues\nWe 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 👍.\nFor new feature requests, please elaborate on the context and the benefit the feature will have for users, developers, or other relevant personas." }, { - "objectID": "index.html#development", - "href": "index.html#development", - "title": "TLG Catalog ", + "objectID": "CONTRIBUTING.html#pull-requests", + "href": "CONTRIBUTING.html#pull-requests", + "title": "", + "section": "Pull requests", + "text": "Pull requests\n\nGitHub Flow\nThis repository uses the GitHub Flow model for collaboration. To submit a pull request:\n\nCreate a branch\nPlease see the branch naming convention below. If you don’t have write access to this repository, please fork it.\nMake changes\nMake sure your code\n\npasses all checks imposed by GitHub Actions\nis well documented\nis well tested with unit tests sufficiently covering the changes introduced\n\nCreate a pull request (PR)\nIn the pull request description, please link the relevant issue (if any), provide a detailed description of the change, and include any assumptions.\nAddress review comments, if any\nPost approval\nMerge your PR if you have write access. Otherwise, the reviewer will merge the PR on your behalf.\nPat yourself on the back\nCongratulations! 🎉 You are now an official contributor to this project! We are grateful for your contribution.\n\n\n\nBranch naming convention\nSuppose 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.\nIf 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.\n\n\nmonorepo and staged.dependencies\nSometimes 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.\nPlease refer to the staged.dependencies package documentation for more details." + }, + { + "objectID": "CONTRIBUTING.html#coding-guidelines", + "href": "CONTRIBUTING.html#coding-guidelines", + "title": "", + "section": "Coding guidelines", + "text": "Coding guidelines\nThis 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.\n\nStyle guide\nThis repository follows the standard tidyverse style guide and uses lintr for lint checks. Customized lint configurations are available in this repository’s .lintr file.\n\n\nDependency management\nLightweight is the right weight. This repository follows tinyverse recommedations of limiting dependencies to minimum.\n\n\nDependency version management\nIf 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).\n\n\nRecommended development environment & tools\n\nR & package versions\nWe 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().\nIf you discover bugs on older R versions or with an older set of dependencies, please create the relevant bug reports.\n\n\npre-commit\nWe 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.\nPre-commit hooks are already available in this repository’s .pre-commit-config.yaml file." + }, + { + "objectID": "CONTRIBUTING.html#recognition-model", + "href": "CONTRIBUTING.html#recognition-model", + "title": "", + "section": "Recognition model", + "text": "Recognition model\nAs 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:\n\nMinimum 5% of lines of code authored* (determined by git blame query) OR\nBeing at the top 5 contributors in terms of number of commits OR lines added OR lines removed*\n\n*Excluding auto-generated code, including but not limited to roxygen comments or renv.lock files.\nThe package maintainer also reserves the right to adjust the criteria to recognize contributions." + }, + { + "objectID": "CONTRIBUTING.html#questions", + "href": "CONTRIBUTING.html#questions", + "title": "", + "section": "Questions", + "text": "Questions\nIf you have further questions regarding the contribution guidelines, please contact the package/repository maintainer." + }, + { + "objectID": "graphs/pharmacokinetic/pkpg01.html", + "href": "graphs/pharmacokinetic/pkpg01.html", + "title": "PKPG01", "section": "", - "text": "This website is built using Quarto and hosted on GitHub Pages. This website is rebuilt and republished daily as well as every time a change is pushed to the repository as part of the CI/CD process.\nThe catalog is rendered using “Stable” and “Development” profiles. The main difference between these two profiles is the package versions used to generate the outputs. The “Stable” profile uses the most recently released versions of all packages, whereas the “Development” profile uses the latest development versions of all NEST packages. This means that the same R code (e.g. foo::bar()) would be run using both the latest released and development package versions (e.g. foo@v1.2.3 on the “Stable” profile and foo@v1.2.3.9123 on the “Development” profile). If your article is affected by API changes between released and development versions, please consider conditional content (checking QUARTO_PROFILE environment variable) and/or if statements on respective package versions to enable the article to work in both profiles.\nAs a part of the CI/CD process, each article’s code is checked for quality, coherence, and readability using tools such as lintr, styler, and spelling. Additionally, regression testing is performed using testthat snapshot testing (see the package component of the repository for more details).\nIf you are adding a new table, listing, or graph in the form a new .qmd file, then you will also need to update the index in the tlg-index.qmd file with the new file name. To do so, run the R code in the generate-index.R file after creating your template.", + "text": "Data Setup\nPlot with Two Cohorts\nPlot with Six Cohorts\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\nset.seed(123)\n\n# loading in the data\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\n# filtering the rows for specific data entries\nadpp <- adpp %>%\n filter(PARAMCD == \"RCPCINT\", AVISIT == \"CYCLE 1 DAY 1\", PPCAT == \"Plasma Drug X\")\n\n# adding or modifying specific columns\nadpp <- adpp %>%\n mutate(ARM = as.factor(TRT01A)) %>%\n mutate(PARAM1 = \"Fe\") %>% # re-format PK parameter name\n mutate(Time = as.numeric(gsub(\"PT*|\\\\.|H$\", \"\", PPENINT))) %>%\n droplevels() %>%\n df_explicit_na()\n\n# in cases where the cohorts are numeric it is possible to rename them\nlevels(adpp$ARM) <- c(\n \"A: Drug X\",\n \"C: Combination\"\n)\n\n\n\n\n\n\nCodeuse_title <- \"Plot of Mean (+/- SD) Cummulative Percentage (%) of Recovered Drug in Urine \\nby Analyte, Visit: PK Evaluable Patients\" \nuse_subtitle <- \"Analyte: Plasma Drug X \\nVisit: CYCLE 1 DAY 1 \\nPK Parameter:\"\nuse_footnote <- \"Program: \\nOutput:\"\n\nseparation_between_barplots <- 1.5\n\nresult <- g_lineplot(\n df = adpp,\n variables = control_lineplot_vars(\n x = \"Time\",\n y = \"AVAL\",\n group_var = \"ARM\",\n paramcd = \"PARAM1\",\n y_unit = \"AVALU\"\n ),\n alt_counts_df = adpp,\n y_lab = \"Cummulative Percentage\",\n x_lab = \"Time (hours)\",\n y_lab_add_paramcd = FALSE,\n y_lab_add_unit = TRUE,\n interval = \"mean_sdi\",\n whiskers = c(\"mean_sdi_lwr\", \"mean_sdi_upr\"),\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n ggtheme = theme_nest(),\n position = ggplot2::position_dodge(width = 2)\n)\n\nplot <- result + theme(plot.caption = element_text(hjust = 0)) +\n scale_x_continuous(breaks = c(12, 24))\nplot\n\n\n\n\n\n\n\n\n\nIn this case we need to process the data further by artificially adding more random rows. Of course this step is not necessary in the case that data already has more cohorts.\n\n\nCodeadpp_hck <- adpp %>%\n mutate(AVAL + 1 * rnorm(nrow(adpp), mean = 1, sd = 1)) %>%\n mutate(ARM = as.factor(sample(\n c(\n \"D: Drug D\",\n \"E: Drug E\",\n \"F: Drug F\",\n \"G: Drug G\"\n ),\n nrow(adpp),\n replace = TRUE,\n prob = c(0.4, 0.3, 0.2, 0.1)\n )))\n\nadpp <- bind_rows(adpp, adpp_hck)\n\nuse_title <- \"Plot of Mean (+/- SD) Cummulative Percentage (%) of Recovered Drug in Urine \\nby Analyte, Visit: PK Evaluable Patients\" \nuse_subtitle <- \"Analyte: Plasma Drug X \\nVisit: CYCLE 1 DAY 1 \\nPK Parameter:\"\nuse_footnote <- \"Program: \\nOutput:\"\n\nseparation_between_barplots <- 1.5\n\nresult <- g_lineplot(\n df = adpp,\n variables = control_lineplot_vars(\n x = \"Time\",\n y = \"AVAL\",\n group_var = \"ARM\",\n paramcd = \"PARAM1\",\n y_unit = \"AVALU\"\n ),\n alt_counts_df = adpp,\n y_lab = \"Cummulative Percentage\",\n x_lab = \"Time (hours)\",\n y_lab_add_paramcd = FALSE,\n y_lab_add_unit = TRUE,\n interval = \"mean_sdi\",\n whiskers = c(\"mean_sdi_lwr\", \"mean_sdi_upr\"),\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n ggtheme = theme_nest(),\n position = ggplot2::position_dodge(width = 2)\n)\n\nplot <- result + theme(plot.caption = element_text(hjust = 0)) +\n scale_x_continuous(breaks = c(12, 24))\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 18:01:43 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 labeling_0.4.3 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 farver_2.1.1 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Introduction" + "Graphs", + "Pharmacokinetic", + "PKPG01" ] }, { - "objectID": "appendix/reproducibility.html#session-info", - "href": "appendix/reproducibility.html#session-info", - "title": "Reproducibility", - "section": "Session Info", - "text": "Session Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nloaded via a namespace (and not attached):\n [1] digest_0.6.35 R6_2.5.1 codetools_0.2-19 fastmap_1.1.1 \n [5] xfun_0.42 magrittr_2.0.3 knitr_1.45 htmltools_0.5.7 \n [9] rmarkdown_2.26 cli_3.6.2 testthat_3.2.1 compiler_4.3.3 \n[13] tools_4.3.3 brio_1.1.4 evaluate_0.23 yaml_2.3.8 \n[17] rlang_1.1.3 jsonlite_1.8.8 htmlwidgets_1.6.4\n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodewithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(\"..\", lockfile = \"../assets/www/renv.lock\", prompt = FALSE, force = TRUE)\n)\n\n\nNOTE: Dependency discovery took 11 seconds during snapshot.\nConsider using .renvignore to ignore files, or switching to explicit snapshots.\nSee `?renv::dependencies` for more information.\n\n\nDownload", + "objectID": "graphs/pharmacokinetic/pkcg03.html", + "href": "graphs/pharmacokinetic/pkcg03.html", + "title": "PKCG03", + "section": "", + "text": "Data Setup\nPlot in Linear Scale\nPlot in Log Scale\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\nadsl_f <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>%\n filter(SAFFL == \"Y\" & ARM != \"B: Placebo\") %>%\n df_explicit_na()\n\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\") %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID)) %>%\n filter(PARAM == \"Plasma Drug X\") %>%\n droplevels() %>%\n df_explicit_na()\n\n\n\n\n\n\nCodeuse_title <- \"Plot of Mean (+/- SD) Plasma Concentrations Over Time by Treatment, \\nPK Evaluable Patients\"\nuse_subtitle <- \"Analyte:\"\nuse_footnote <- \"Program: \\nOutput:\"\n\nresult <- g_lineplot(\n df = adpc,\n variables = control_lineplot_vars(\n x = \"NFRLT\",\n y = \"AVAL\",\n group_var = \"ARM\",\n paramcd = \"PARAM\",\n y_unit = \"AVALU\",\n subject_var = \"USUBJID\"\n ),\n alt_counts_df = adsl_f,\n y_lab = \"Concentration\",\n y_lab_add_paramcd = FALSE,\n y_lab_add_unit = TRUE,\n interval = \"mean_sdi\",\n whiskers = c(\"mean_sdi_lwr\", \"mean_sdi_upr\"),\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n ggtheme = theme_nest()\n)\n\nplot <- result + theme(plot.caption = element_text(hjust = 0))\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeuse_title <- \"Plot of Mean (+/- SD) Log-Scale Plasma Concentrations Over Time by Treatment, \\nPK Evaluable Patients\"\nuse_subtitle <- \"Analyte:\"\nuse_footnote <- \"Program: \\nOutput:\"\n\nadpc <- adpc %>%\n mutate(avalog = ifelse(AVAL != 0, AVAL, 0.001))\n\nresult <- g_lineplot(\n df = adpc,\n variables = control_lineplot_vars(\n x = \"NFRLT\",\n y = \"avalog\",\n group_var = \"ARM\",\n paramcd = \"PARAM\",\n y_unit = \"AVALU\",\n subject_var = \"USUBJID\"\n ),\n alt_counts_df = adsl_f,\n y_lab = \"Concentration\",\n y_lab_add_paramcd = FALSE,\n y_lab_add_unit = TRUE,\n interval = \"mean_sdi\",\n whiskers = c(\"mean_sdi_lwr\", \"mean_sdi_upr\"),\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n ggtheme = theme_nest()\n)\n\nplot <- result + theme(plot.caption = element_text(hjust = 0)) +\n ggplot2::scale_y_log10(breaks = c(0.001, 0.01, 0.1, 1, 10), labels = c(0.001, 0.01, 0.1, 1, 10))\n\nScale for y is already present.\nAdding another scale for y, which will replace the existing scale.\n\nCodeplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 18:01:27 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 labeling_0.4.3 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 farver_2.1.1 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Appendix", - "Reproducibility" + "Graphs", + "Pharmacokinetic", + "PKCG03" ] }, { - "objectID": "graphs/other/mng01.html", - "href": "graphs/other/mng01.html", - "title": "MNG01", + "objectID": "graphs/pharmacokinetic/pkpg02.html", + "href": "graphs/pharmacokinetic/pkpg02.html", + "title": "PKPG02", "section": "", - "text": "Data Setup\nPlot of Mean and CI\nPlot of Mean and CIs of Change from Baseline (Changing the Input Analysis Data Set and Analysis Variable)\nPlot of Mean (+/-SD) (Changing the Statistics)\nPlot of Mean and CI (Modify Alpha Level)\nPlot of Mean and CI (with Number of Patients only in Table Section)\nPlot of Mean and CI (with Table Section)\nPlot of Median and CI (Visits Condensed in Table Section)\nPlot of Mean and Upper Confidence Limit\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\nlibrary(nestcolor)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\nadvs <- synthetic_cdisc_dataset(\"latest\", \"advs\")\n\nadsl_f <- adsl %>%\n filter(SAFFL == \"Y\") %>%\n df_explicit_na()\n\nadlb_f <- adlb %>%\n mutate(AVISIT = forcats::fct_reorder(AVISIT, AVISITN, min)) %>%\n dplyr::filter(\n SAFFL == \"Y\",\n ANL01FL == \"Y\",\n ONTRTFL == \"Y\",\n PARAMCD == \"ALT\",\n AVISIT != \"SCREENING\"\n ) %>%\n droplevels() %>%\n df_explicit_na()\n\nadvs_f <- advs %>%\n mutate(AVISIT = forcats::fct_reorder(AVISIT, AVISITN, min)) %>%\n dplyr::filter(\n SAFFL == \"Y\",\n ONTRTFL == \"Y\",\n PARAMCD == \"DIABP\",\n AVISIT != \"SCREENING\"\n ) %>%\n droplevels() %>%\n df_explicit_na()\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = advs_f,\n alt_counts_df = adsl_f,\n variables = control_lineplot_vars(y = \"CHG\"),\n title = \"Plot of Mean and 95% Confidence Intervals of Change from Baseline by Visit\",\n subtitle = \"Assessment:\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n interval = \"mean_sdi\",\n whiskers = c(\"mean_sdi_lwr\", \"mean_sdi_upr\"),\n title = \"Plot of Mean (+/-SD)\",\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n control = control_analyze_vars(conf_level = 0.80),\n title = \"Plot of Mean and 80% Confidence Limits by Visit\",\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n table = \"n\",\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n table = c(\"n\", \"mean\", \"mean_ci\"),\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\n\nThis option is not supported.\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n whiskers = \"mean_ci_upr\",\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n library(forcats)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n mutate(AVISIT = fct_reorder(AVISIT, AVISITN, min))\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_lineplot(\n label = \"LINE PLOT\",\n dataname = \"ADLB\",\n strata = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n y = choices_selected(\n variable_choices(ADLB, c(\"AVAL\", \"BASE\", \"CHG\", \"PCHG\")),\n \"AVAL\"\n ),\n param = choices_selected(\n value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n \"ALT\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: Error in : could not find function \"control_summarize_vars\" \n when evaluating qenv code:\nplot <- g_lineplot(df = anl, variables = variables, interval = \"mean_ci\", mid = \"mean\", whiskers = c(\"mean_ci_lwr\", \"mean_ci_upr\"), table = c(\"n\", \"mean_sd\", \"median\", \"range\"), mid_type = \"pl\", mid_point_size = 2, table_font_size = 4, newpage = FALSE, title = \"Plot of Mean and 95% Mean Confidence Interval of AVAL by Visit\", subtitle = \"\", caption = NULL, y_lab = \"AVAL Mean Values for\", legend_title = NULL, ggtheme = ggplot2::theme_minimal(), control = control_summarize_vars(conf_level = 0.95), subtitle_add_paramcd = FALSE, subtitle_add_unit = FALSE)\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:58:48 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] forcats_1.0.0 teal.modules.clinical_0.9.0.9014\n [3] teal.transform_0.5.0.9004 teal_0.15.2.9019 \n [5] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 \n [7] teal.code_0.5.0.9004 shiny_1.8.0 \n [9] nestcolor_0.1.2.9009 scda_0.1.6.9017 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9016 \n[15] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] crayon_1.5.2 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 purrr_1.0.2 xfun_0.42 \n[25] shinyvalidate_0.1.3 cachem_1.0.8 teal.reporter_0.3.1.9002\n[28] jsonlite_1.8.8 later_1.3.2 broom_1.0.5 \n[31] R6_2.5.1 bslib_0.6.1 brio_1.1.4 \n[34] jquerylib_0.1.4 estimability_1.5 Rcpp_1.0.12 \n[37] knitr_1.45 zoo_1.8-12 teal.logger_0.2.0.9001 \n[40] httpuv_1.6.14 Matrix_1.6-5 splines_4.3.3 \n[43] tidyselect_1.2.1 yaml_2.3.8 codetools_0.2-19 \n[46] websocket_1.4.1 processx_3.8.4 teal.widgets_0.4.2.9009 \n[49] lattice_0.22-6 tibble_3.2.1 withr_3.0.0 \n[52] coda_0.19-4.1 evaluate_0.23 survival_3.5-8 \n[55] pillar_1.9.0 shinycssloaders_1.0.0 checkmate_2.3.1 \n[58] shinyjs_2.1.0 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] tools_4.3.3 webshot2_0.1.1 webshot_0.5.5 \n[70] mvtnorm_1.2-4 cowplot_1.1.3 grid_4.3.3 \n[73] tidyr_1.3.1 rbibutils_2.2.16 colorspace_2.1-0 \n[76] nlme_3.1-164 cli_3.6.2 fansi_1.0.6 \n[79] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[82] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[85] farver_2.1.1 memoise_2.0.1 htmltools_0.5.7 \n[88] lifecycle_1.0.4 shinyWidgets_0.8.2 mime_0.12 \n[91] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nSummary of Pharmacokinetic Parameters – Plasma\nSummary of Plasma Pharmacokinetic Parameters with Median Points\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\n# need adex for dose info and adpp for AUC max info\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\nadpp_a <- adpp %>%\n filter(\n PPSPEC == \"Plasma\",\n AVISITN == \"1\",\n PARAMCD == \"AUCIFO\"\n ) %>%\n mutate(AUCinf = AVAL)\n\nadex_a <- adex %>%\n filter(\n AVISITN == \"1\",\n PARAMCD == \"DOSE\"\n ) %>%\n mutate(Dose = AVAL) %>%\n select(USUBJID, Dose)\n\n# join the dose information to the adpp table\nadpp_adex <- left_join(adpp_a, adex_a, by = \"USUBJID\") %>%\n group_by(`ARM`) %>%\n mutate(count = paste0(`ARM`, \" (\", n(), \")\"))\n\n# set x and y variable names\nx_var <- \"Dose\"\ny_var <- \"AUCinf\"\n\n\n\n\n\n\nCode# calculate Summary Statistics (mean and sd) for each group\nSummaryStat <- adpp_adex %>% \n group_by(Dose = as.factor(Dose)) %>%\n summarise(AUCsd = sd(AUCinf), meanAUC = mean(AUCinf))\nSummaryStat$Dose <- as.numeric(as.character(SummaryStat$Dose)) \n\n# generate linear model\nmod1 <- lm(log(AUCinf) ~ log(Dose), adpp_adex)\n\n# obtain linear model coefficient values\ncf <- round(coef(mod1), 2)\n\n# generate linear model equation\neq <- paste0(\n \"y = \", cf[1],\n ifelse(sign(cf[2]) == 1, \" + \", \" - \"), abs(cf[2]), \" x , \",\n \"R²\",\n \" = \",\n signif(summary(mod1)$adj.r.squared, 3)\n)\n\nplot <- ggplot(adpp_adex, aes(x = .data[[x_var]], y = .data[[y_var]])) +\n annotate(geom = \"text\", x = min(adpp_adex[[x_var]]), y = max(adpp_adex[[y_var]]), label = eq, hjust = 0.1) +\n geom_point(size = 1, aes(color = factor(`count`))) +\n scale_x_continuous(\n name = \"Dose (mg/mL)\",\n breaks = unique(adpp_adex$Dose)\n ) +\n scale_y_continuous(\n name = paste(y_var, adpp_a$AVALU),\n transform = \"log\",\n breaks = exp(ceiling(seq(\n from = min(log(adpp_adex$AUCinf)), to = max(log(adpp_adex$AUCinf)),\n by = 1\n ))),\n labels = as.character(ceiling(seq(\n from = min(log(adpp_adex$AUCinf)),\n to = max(log(adpp_adex$AUCinf)), by = 1\n )))\n ) +\n geom_smooth(method = \"lm\", formula = y ~ x, se = FALSE, color = \"black\", linewidth = 0.5) +\n # Display error bars for each dosing group (this will only appear if the sd is less than the mean)\n geom_errorbar(\n data = SummaryStat,\n aes(x = `Dose`, y = `meanAUC`, ymin = `meanAUC` - `AUCsd`, ymax = `meanAUC` + AUCsd),\n width = .05,\n position = position_dodge(.1)\n ) +\n geom_point(data = SummaryStat, aes(x = Dose, y = meanAUC, size = 1), shape = 2, show.legend = FALSE) +\n ggtitle(paste(\n \"Dose-Proportionality Plot of Serum\", as.character(unique(adex$TRT01P)),\n y_var, \"in\", adpp_a$AVALU\n ), subtitle = \"Summary of serum PK parameters by treatment\") +\n labs(color = \"Treatment Arm\") +\n theme_nest()\n\nplot\n\n\n\n\n\n\n\n\n\n\n\nCode# calculate median for each group if preferred\nSummaryStat <- adpp_adex %>% \n group_by(Dose = as.factor(Dose)) %>%\n summarise(medAUC = median(AUCinf))\nSummaryStat$Dose <- as.numeric(as.character(SummaryStat$Dose)) \n\nplot <- ggplot(adpp_adex, aes(x = .data[[x_var]], y = .data[[y_var]])) +\n annotate(geom = \"text\", x = min(adpp_adex[[x_var]]), y = max(adpp_adex[[y_var]]), label = eq, hjust = 0.1) +\n geom_point(size = 1, aes(color = factor(`count`))) +\n geom_smooth(method = \"lm\", formula = y ~ x, se = FALSE, color = \"black\", linewidth = 0.5) +\n geom_point(data = SummaryStat, aes(x = Dose, y = medAUC, size = 1), shape = 2, show.legend = FALSE) +\n ggtitle(\n paste(\n \"Dose-Proportionality Plot of Serum\",\n as.character(unique(adex$TRT01P)),\n y_var,\n \"in\",\n adpp_a$AVALU\n ),\n subtitle = \"Summary of serum PK parameters by treatment\"\n ) +\n labs(color = \"Treatment Arm\") +\n scale_y_continuous(\n name = paste(y_var, adpp_a$AVALU),\n transform = \"log\",\n breaks = exp(ceiling(seq(from = min(log(adpp_adex$AUCinf)), to = max(log(adpp_adex$AUCinf)), by = 1))),\n labels = as.character(ceiling(seq(from = min(log(adpp_adex$AUCinf)), to = max(log(adpp_adex$AUCinf)), by = 1)))\n ) +\n scale_x_continuous(\n name = \"Dose (mg/mL)\",\n breaks = unique(adpp_adex$Dose)\n ) +\n theme_nest()\n\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 18:01:13 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 generics_0.1.3 knitr_1.45 rbibutils_2.2.16 \n[17] htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 tibble_3.2.1 \n[21] munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 utf8_1.2.4 \n[25] testthat_3.2.1 broom_1.0.5 xfun_0.42 cli_3.6.2 \n[29] mgcv_1.9-1 withr_3.0.0 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 nlme_3.1-164 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 farver_2.1.1 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Other", - "MNG01" + "Pharmacokinetic", + "PKPG02" ] }, { - "objectID": "graphs/other/ltg01.html", - "href": "graphs/other/ltg01.html", - "title": "LTG01", + "objectID": "graphs/pharmacokinetic/pkpg03.html", + "href": "graphs/pharmacokinetic/pkpg03.html", + "title": "PKPG03", "section": "", - "text": "Lattice plots are natively handled by R, the examples below rely mostly on the package ggplot2.\n\n\nData Setup\nPlot of Liver Function Tests\nPlot of Liver Function Tests Including Mean, Median, and 95% CIs\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(teal)\nlibrary(teal.modules.clinical)\nlibrary(ggplot2)\nlibrary(dplyr)\nlibrary(nestcolor)\n\n# Datasets\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>% slice(1:8)\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>% filter(USUBJID %in% adsl$USUBJID)\n\n# Pre-processing\nadlb$AVISIT_txt <- adlb$AVISIT\nadlb$AVISIT <- as.numeric(adlb$AVISIT)\nadlb$ARM_N <- adlb$ARM\nlevels(adlb$ARM_N) <- with(\n data = adlb,\n paste0(\n levels(ARM_N), \" (N = \",\n tapply(SUBJID, ARM_N, function(x) length(unique(x))), \")\"\n )\n)\n\n# Plot utils\nnpch <- 1:25\nnpatients <- length(unique(adlb$SUBJID))\npch <- c(\n rep(npch, times = npatients %/% length(npch)),\n npch[1:(npatients %% length(npch))]\n)\n\n\n\n\nBasic Plot\n\n\nCode# General mapping and \"lattice\" (\"facet\" in ggplot2 nomenclature).\ng1 <- {\n ggplot(\n data = adlb,\n mapping = aes(x = AVISIT, y = AVAL, colour = SUBJID, shape = SUBJID)\n ) +\n facet_grid(LBTESTCD ~ ARM, scales = \"free_y\") +\n scale_shape_manual(values = pch)\n}\n\n# Add points and lines.\ng1 <- g1 + geom_point()\ng1 <- g1 + geom_line()\nplot <- g1\nplot\n\n\n\n\n\n\n\nModifying Facets\nThe units describing rows of panes and the number of patients under each arm is specified by modifying facet_grid():\n\n\nCode# Include the units and the sample size N.\ng2 <- g1 + facet_grid(\n paste0(LBTESTCD, \"\\n(\", AVALU, \")\") ~ ARM_N,\n scales = \"free_y\"\n)\n\nplot <- g2\nplot\n\n\n\n\n\n\n\nModifying X-Axis\nThe graphic elements are modified through usual ggplot2 functions. For instance, the x-axis could be improved as follows:\n\n\nCodeg3 <- g2 + theme(\n axis.text.x = element_text(angle = 45, hjust = 1),\n axis.title = element_blank()\n) + scale_x_continuous(breaks = adlb$AVISIT, labels = adlb$AVISIT_txt)\n\nplot <- g3\nplot\n\n\n\n\n\n\n\n\n\n\nThe functions stat_mean_ci and stat_median_ci from the tern package allow the addition of mean and/or median confidence intervals. The example below suggests a larger dataset, where the individual subject legend may not be relevant but the mean or the median are of special interest.\nPre-Processing\n\nCode# Datasets\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>% slice(1:40)\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>% filter(USUBJID %in% adsl$USUBJID)\n\n# Pre-processing\nadlb$AVISIT_txt <- adlb$AVISIT\nadlb$AVISIT <- as.numeric(adlb$AVISIT)\nadlb$ARM_N <- adlb$ARM\nlevels(adlb$ARM_N) <- with(\n data = adlb,\n paste0(\n levels(ARM_N), \" (N = \",\n tapply(SUBJID, ARM_N, function(x) length(unique(x))), \")\"\n )\n)\n\n# Plot utils\nnpch <- 1:25\nnpatients <- length(unique(adlb$SUBJID))\npch <- c(\n rep(npch, times = npatients %/% length(npch)),\n npch[1:(npatients %% length(npch))]\n)\n\n\nBasic Plot\n\nCode# General mapping and \"lattice\" (\"facet\" in ggplot2 nomenclature)\ng4 <- {\n ggplot(\n data = adlb,\n mapping = aes(x = AVISIT, y = AVAL, colour = SUBJID, shape = SUBJID)\n ) +\n facet_grid(LBTESTCD ~ ARM_N, scales = \"free_y\") +\n scale_shape_manual(values = pch) +\n scale_color_manual(values = rep(getOption(\"ggplot2.discrete.colour\"), 2))\n}\n\n# Add points and lines.\n# Note that with so many patients, legend might not be useful and transparency\n# is advisable.\ng4 <- g4 + geom_point(alpha = .3)\ng4 <- g4 + geom_line(alpha = .3)\ng4 <- g4 + guides(colour = \"none\", shape = \"none\")\ng4 <- g4 + theme(\n axis.text.x = element_text(angle = 45, hjust = 1),\n axis.title = element_blank()\n)\ng4 <- g4 + scale_x_continuous(breaks = adlb$AVISIT, labels = adlb$AVISIT_txt)\nplot <- g4\nplot\n\n\n\n\n\n\n\nAdding Mean\n\n\nCode# Add the mean along with the 95% CI at every visit.\ng51 <- g4 + stat_summary(\n fun = mean, linewidth = 1, geom = \"line\",\n aes(group = 1, linetype = \"Mean +/- 95% CI\")\n)\ng51 <- g51 + stat_summary(\n fun.data = tern::stat_mean_ci, geom = \"errorbar\",\n aes(group = 1, linetype = \"Mean +/- 95% CI\")\n)\nplot <- g51 + guides(linetype = guide_legend(title = NULL))\nplot\n\n\n\n\n\n\n\nAdding Median\n\n\nCode# Instead of a mean, the median could be more relevant.\ng52 <- g51 + stat_summary(\n fun = median, linewidth = 1, geom = \"line\",\n aes(group = 1, linetype = \"Median +/- 95% CI\")\n)\ng52 <- g52 + stat_summary(\n fun.data = tern::stat_median_ci, geom = \"errorbar\",\n aes(group = 1, linetype = \"Median +/- 95% CI\")\n)\nplot <- g52 + guides(linetype = guide_legend(title = \"Aggregate\"))\nplot\n\n\n\n\n\n\n\nChanging Confidence Level\n\n\nCode# Change the confidence level of interval for the median.\n# Note: check `?stat_mean_ci()` and `?stat_median_ci()` for further fine tuning.\ng53 <- g4 + stat_summary(\n fun = median, linewidth = 1, geom = \"line\",\n aes(group = 1, linetype = \"Median +/- 80% CI\")\n)\ng53 <- g53 + stat_summary(\n fun.data = function(x) tern::stat_median_ci(x, conf_level = 0.8),\n geom = \"errorbar\", aes(group = 1, linetype = \"Median +/- 80% CI\")\n)\nplot <- g53 + guides(linetype = guide_legend(title = NULL))\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:58:11 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] nestcolor_0.1.2.9009 dplyr_1.1.4 \n [3] ggplot2_3.5.0 teal.modules.clinical_0.9.0.9014\n [5] teal.transform_0.5.0.9004 teal_0.15.2.9019 \n [7] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 \n [9] teal.code_0.5.0.9004 shiny_1.8.0 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9016 \n[15] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] gtable_0.3.4 xfun_0.42 htmlwidgets_1.6.4 \n [4] lattice_0.22-6 vctrs_0.6.5 tools_4.3.3 \n [7] Rdpack_2.6 generics_0.1.3 sandwich_3.1-0 \n[10] tibble_3.2.1 fansi_1.0.6 pkgconfig_2.0.3 \n[13] Matrix_1.6-5 checkmate_2.3.1 lifecycle_1.0.4 \n[16] farver_2.1.1 compiler_4.3.3 brio_1.1.4 \n[19] munsell_0.5.0 codetools_0.2-19 httpuv_1.6.14 \n[22] htmltools_0.5.7 yaml_2.3.8 later_1.3.2 \n[25] pillar_1.9.0 tidyr_1.3.1 MASS_7.3-60.0.1 \n[28] ellipsis_0.3.2 tern.gee_0.1.3.9004 multcomp_1.4-25 \n[31] nlme_3.1-164 mime_0.12 tidyselect_1.2.1 \n[34] digest_0.6.35 mvtnorm_1.2-4 purrr_1.0.2 \n[37] labeling_0.4.3 geepack_1.3.10 splines_4.3.3 \n[40] fastmap_1.1.1 grid_4.3.3 colorspace_2.1-0 \n[43] cli_3.6.2 logger_0.3.0 survival_3.5-8 \n[46] utf8_1.2.4 TH.data_1.1-2 broom_1.0.5 \n[49] withr_3.0.0 scales_1.3.0 promises_1.2.1 \n[52] backports_1.4.1 estimability_1.5 rmarkdown_2.26 \n[55] emmeans_1.10.0 zoo_1.8-12 coda_0.19-4.1 \n[58] evaluate_0.23 knitr_1.45 rbibutils_2.2.16 \n[61] testthat_3.2.1 rlang_1.1.3 Rcpp_1.0.12 \n[64] xtable_1.8-4 glue_1.7.0 jsonlite_1.8.8 \n[67] teal.logger_0.2.0.9001 R6_2.5.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nPlot of CMAX by Visit\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\n\n\n\n\n\nCode# filtered parameter\nadpp <- adpp %>% filter(PARAMCD == \"CMAX\", PPSPEC == \"Plasma\")\n\nuse_title <- paste0(\"Boxplot of \", as.character(unique(adpp$PARAM)), \" by Visit\")\nuse_subtitle <- paste0(\n \"Analyte:\\nPK Parameter: \",\n as.character(unique(adpp$PARAM)),\n \" (\",\n as.character(unique(adpp$AVALU)),\n \")\"\n)\nuse_footnote <- \"Program: \\nOutput:\"\n\nplot <- ggplot(adpp, aes(x = AVISIT, y = AVAL, fill = ACTARM)) +\n geom_boxplot(outlier.size = 2) +\n stat_boxplot(geom = \"errorbar\") +\n stat_summary(geom = \"point\", fun = \"mean\", col = \"black\", size = 5, shape = 8, position = position_dodge(0.75)) +\n geom_text(\n data = . %>% dplyr::group_by(AVISIT, ACTARM) %>% dplyr::filter(AVAL %in% boxplot.stats(AVAL)$out),\n aes(x = AVISIT, y = AVAL, label = SUBJID, color = ACTARM),\n size = 3, hjust = -0.2, position = position_dodge(0.75)\n ) +\n labs(\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n x = \"Visit\",\n y = paste0(as.character(unique(adpp$PARAM)), \" (\", as.character(unique(adpp$AVALU)), \")\")\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 18:00:59 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 labeling_0.4.3 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 broom_1.0.5 xfun_0.42 \n[29] cli_3.6.2 withr_3.0.0 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 farver_2.1.1 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Other", - "LTG01" + "Pharmacokinetic", + "PKPG03" ] }, { - "objectID": "graphs/other/ippg01.html", - "href": "graphs/other/ippg01.html", - "title": "IPPG01", + "objectID": "graphs/efficacy/fstg01.html", + "href": "graphs/efficacy/fstg01.html", + "title": "FSTG01", "section": "", - "text": "For illustration purposes, we will subset the adlb dataset for safety population in treatment arm A and a specific lab parameter (ALT).\n\n\nData Setup\nStandard Plot\nPlot with Patient Baselines as Reference\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\n# use small sample size\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>% slice(1:15)\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>% filter(USUBJID %in% adsl$USUBJID)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadlb <- df_explicit_na(adlb)\n\nadlb_f <- adlb %>%\n filter(\n SAFFL == \"Y\",\n PARAMCD == \"ALT\",\n AVISIT != \"SCREENING\",\n ARMCD == \"ARM A\"\n ) %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID))\n\n\n\n\nThe user can select different plotting_choices depending on their preference. To demonstrate, separate plots are produced with a maximum of 3 observations each.\n\n\nCodeplots <- g_ipp(\n df = adlb_f,\n xvar = \"AVISIT\",\n yvar = \"AVAL\",\n xlab = \"Visit\",\n ylab = \"SGOT/ALT (U/L)\",\n id_var = \"Patient_ID\",\n title = \"Individual Patient Plots\",\n subtitle = \"Treatment Arm A\",\n plotting_choices = \"split_by_max_obs\",\n max_obs_per_plot = 3\n)\nplots\n\n[[1]]\n\n\n\n\n\n\n\n\n\n[[2]]\n\n\n\n\n\n\n\n\n\n\nHere, patients’ individual baseline values will be shown for reference. Note that users can provide their own custom theme to the function via the ggtheme argument.\n\n\nCodeplots <- g_ipp(\n df = adlb_f,\n xvar = \"AVISIT\",\n yvar = \"AVAL\",\n xlab = \"Visit\",\n ylab = \"SGOT/ALT (U/L)\",\n id_var = \"Patient_ID\",\n title = \"Individual Patient Plots\",\n subtitle = \"Treatment Arm A\",\n add_baseline_hline = TRUE,\n yvar_baseline = \"BASE\",\n ggtheme = theme_minimal(),\n plotting_choices = \"split_by_max_obs\",\n max_obs_per_plot = 3\n)\nplots\n\n[[1]]\n\n\n\n\n\n\n\n\n\n[[2]]\n\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(tern)\n library(scda)\n library(dplyr)\n\n # use small sample size\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>% slice(1:15)\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>% filter(USUBJID %in% ADSL$USUBJID)\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADLB <- df_explicit_na(ADLB) %>%\n filter(AVISIT != \"SCREENING\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_ipp(\n label = \"Individual Patient Plot\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n value_choices(ADLB, c(\"ARMCD\")),\n \"ARM A\"\n ),\n paramcd = choices_selected(\n value_choices(ADLB, \"PARAMCD\"),\n \"ALT\"\n ),\n aval_var = choices_selected(\n variable_choices(ADLB, c(\"AVAL\")),\n \"AVAL\"\n ),\n avalu_var = choices_selected(\n variable_choices(ADLB, c(\"AVALU\")),\n \"AVALU\",\n fixed = TRUE\n ),\n id_var = choices_selected(\n variable_choices(ADLB, c(\"USUBJID\")),\n \"USUBJID\",\n fixed = TRUE\n ),\n visit_var = choices_selected(\n variable_choices(ADLB, c(\"AVISIT\")),\n \"AVISIT\"\n ),\n baseline_var = choices_selected(\n variable_choices(ADLB, c(\"BASE\")),\n \"BASE\",\n fixed = TRUE\n ),\n add_baseline_hline = FALSE,\n separate_by_obs = FALSE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:57:48 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 nestcolor_0.1.2.9009 \n [9] ggplot2_3.5.0 dplyr_1.1.4 \n[11] scda_0.1.6.9017 tern_0.9.3.9028 \n[13] rtables_0.6.6.9011 magrittr_2.0.3 \n[15] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] brio_1.1.4 jquerylib_0.1.4 estimability_1.5 \n[37] Rcpp_1.0.12 knitr_1.45 zoo_1.8-12 \n[40] teal.logger_0.2.0.9001 httpuv_1.6.14 Matrix_1.6-5 \n[43] splines_4.3.3 tidyselect_1.2.1 yaml_2.3.8 \n[46] codetools_0.2-19 websocket_1.4.1 processx_3.8.4 \n[49] teal.widgets_0.4.2.9009 lattice_0.22-6 tibble_3.2.1 \n[52] withr_3.0.0 coda_0.19-4.1 evaluate_0.23 \n[55] survival_3.5-8 pillar_1.9.0 shinycssloaders_1.0.0 \n[58] checkmate_2.3.1 shinyjs_2.1.0 generics_0.1.3 \n[61] chromote_0.2.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] tools_4.3.3 webshot2_0.1.1 webshot_0.5.5 \n[70] forcats_1.0.0 mvtnorm_1.2-4 grid_4.3.3 \n[73] tidyr_1.3.1 rbibutils_2.2.16 colorspace_2.1-0 \n[76] nlme_3.1-164 cli_3.6.2 textshaping_0.3.7 \n[79] fansi_1.0.6 geepack_1.3.10 gtable_0.3.4 \n[82] sass_0.4.9 digest_0.6.35 TH.data_1.1-2 \n[85] htmlwidgets_1.6.4 farver_2.1.1 memoise_2.0.1 \n[88] htmltools_0.5.7 lifecycle_1.0.4 shinyWidgets_0.8.2 \n[91] mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Plot\nPlot Specifying Class Variables and Options for the Treatment Variable\nPlot Selecting Columns and Changing the Alpha Level\nPlot with Fixed Symbol Size\nPlot of CR Only, Setting Values Indicating Response\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\nlibrary(nestcolor)\n\nadsl_f <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>%\n select(STUDYID, USUBJID, ARMCD, ARM, SEX, BMRKR2, STRATA1, STRATA2)\n\nadrs_f <- synthetic_cdisc_dataset(\"latest\", \"adrs\") %>%\n filter(PARAMCD == \"INVET\") %>%\n select(STUDYID, USUBJID, PARAMCD, AVISIT, AVALC)\n\nanl <- inner_join(adsl_f, adrs_f, by = c(\"STUDYID\", \"USUBJID\"))\nanl <- df_explicit_na(anl)\nanl_labels <- var_labels(anl)\n\nanl_rsp_arms_ab <- anl %>%\n mutate(is_rsp = AVALC %in% c(\"CR\", \"PR\")) %>%\n filter(ARMCD %in% c(\"ARM B\", \"ARM A\")) %>%\n mutate(\n ARMCD = relevel(ARMCD, ref = \"ARM B\") %>%\n droplevels(),\n ARM = relevel(ARM, ref = \"B: Placebo\") %>%\n droplevels()\n ) %>%\n droplevels()\nvar_labels(anl_rsp_arms_ab) <- c(anl_labels, is_rsp = \"Is Responder\")\n\n\n\n\n\n\n\nCodedf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"is_rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"BMRKR2\"),\n strata = \"STRATA2\"\n ),\n data = anl_rsp_arms_ab,\n conf_level = 0.95\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\n\nCodeanl_rsp_comb_arms_ac <- anl %>%\n mutate(is_rsp = AVALC %in% c(\"CR\", \"PR\")) %>%\n filter(ARMCD %in% c(\"ARM B\", \"ARM A\", \"ARM C\")) %>%\n mutate(\n ARMCD = relevel(ARMCD, ref = \"ARM B\") %>%\n droplevels() %>%\n combine_levels(levels = c(\"ARM A\", \"ARM C\")),\n ARM = relevel(ARM, ref = \"B: Placebo\") %>%\n droplevels() %>%\n combine_levels(levels = c(\"A: Drug X\", \"C: Combination\")),\n # reorder levels of SEX\n SEX = forcats::fct_relevel(SEX, \"M\", \"F\"),\n # reorder levels of STRATA1 by frequency\n STRATA1 = forcats::fct_infreq(STRATA1)\n ) %>%\n droplevels()\nvar_labels(anl_rsp_comb_arms_ac) <- c(anl_labels, is_rsp = \"Is Responder\")\n\ndf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"is_rsp\",\n arm = \"ARMCD\",\n subgroups = c(\"SEX\", \"BMRKR2\"),\n strata = \"STRATA2\"\n ),\n data = anl_rsp_comb_arms_ac,\n conf_level = 0.95\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\n\nCodedf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"is_rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"BMRKR2\"),\n strata = \"STRATA2\"\n ),\n data = anl_rsp_arms_ab,\n conf_level = 0.90\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"or\", \"ci\"))\n\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\n\nCodedf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"is_rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"BMRKR2\"),\n strata = \"STRATA2\"\n ),\n data = anl_rsp_arms_ab,\n conf_level = 0.95\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nplot <- g_forest(\n tbl = result,\n col_symbol_size = NULL\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\n\nCodeanl_cr_arms_ab <- anl %>%\n mutate(is_rsp = AVALC == \"CR\") %>%\n filter(ARMCD %in% c(\"ARM B\", \"ARM A\")) %>%\n mutate(\n ARMCD = relevel(ARMCD, ref = \"ARM B\") %>%\n droplevels(),\n ARM = relevel(ARM, ref = \"B: Placebo\") %>%\n droplevels()\n ) %>%\n droplevels()\nvar_labels(anl_cr_arms_ab) <- c(anl_labels, is_rsp = \"Is CR\")\n\ndf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"is_rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"BMRKR2\"),\n strata = \"STRATA2\"\n ),\n data = anl_cr_arms_ab,\n conf_level = 0.95\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADRS <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n})\ndatanames <- c(\"ADSL\", \"ADRS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\narm_ref_comp <- list(\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n ),\n ARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n )\n)\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADRS <- data[[\"ADRS\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_forest_rsp(\n label = \"Forest Response\",\n dataname = \"ADRS\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n \"ARMCD\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADRS, \"PARAMCD\", \"PARAM\"),\n \"BESRSPI\"\n ),\n subgroup_var = choices_selected(\n variable_choices(ADSL, names(ADSL)),\n c(\"BMRKR2\", \"SEX\")\n ),\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"STRATA1\", \"STRATA2\")),\n \"STRATA2\"\n ),\n plot_height = c(600L, 200L, 2000L),\n plot_width = c(1100L, 200L, 2000L)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 18:00:45 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 nestcolor_0.1.2.9009 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[37] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[40] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[43] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[46] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[49] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[52] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[55] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[58] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[61] generics_0.1.3 chromote_0.2.0 ggplot2_3.5.0 \n[64] munsell_0.5.0 scales_1.3.0 xtable_1.8-4 \n[67] glue_1.7.0 emmeans_1.10.0 tools_4.3.3 \n[70] webshot2_0.1.1 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 cowplot_1.1.3 grid_4.3.3 \n[76] tidyr_1.3.1 rbibutils_2.2.16 colorspace_2.1-0 \n[79] nlme_3.1-164 cli_3.6.2 textshaping_0.3.7 \n[82] fansi_1.0.6 geepack_1.3.10 gtable_0.3.4 \n[85] sass_0.4.9 digest_0.6.35 TH.data_1.1-2 \n[88] htmlwidgets_1.6.4 farver_2.1.1 memoise_2.0.1 \n[91] htmltools_0.5.7 lifecycle_1.0.4 shinyWidgets_0.8.2 \n[94] mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Other", - "IPPG01" + "Efficacy", + "FSTG01" ] }, { @@ -108,7 +127,7 @@ "href": "graphs/efficacy/mmrmg01.html", "title": "MMRMG01", "section": "", - "text": "Given an MMRM fitted with s_mmrm, g_mmrm_lsmeans displays for each visit the adjusted means within group and/or difference in adjusted means between groups. g_mmrm_diagnostic displays marginal residual plots for evaluating model fit.\n\n\nData Setup and Model Fitting\nLeast Squares Means: Estimates Within Groups\nLeast Squares Means: Contrasts Between Groups\nModel Diagnostics: Marginal Fitted Values vs. Residuals\nModel Diagnostics: Normality of Marginal Residuals\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern.mmrm)\nlibrary(scda)\nlibrary(nestcolor)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\nadqs_f <- adqs %>%\n dplyr::filter(PARAMCD == \"FKSI-FWB\" & !AVISIT %in% c(\"BASELINE\")) %>%\n droplevels() %>%\n dplyr::mutate(ARM = factor(ARM, levels = c(\"B: Placebo\", \"A: Drug X\", \"C: Combination\"))) %>%\n dplyr::mutate(AVISITN = rank(AVISITN) %>% as.factor() %>% as.numeric() %>% as.factor())\n\nmmrm_results <- fit_mmrm(\n vars = list(\n response = \"AVAL\",\n covariates = c(\"STRATA2\"),\n id = \"USUBJID\",\n arm = \"ARM\",\n visit = \"AVISIT\"\n ),\n data = adqs_f\n)\n\n\n\n\nConsidering the treatment variable in the model\n\n\nCodeplot <- g_mmrm_lsmeans(\n mmrm_results,\n select = \"estimates\",\n xlab = \"Visit\"\n)\nplot\n\n\n\n\n\n\n\nConsidering the treatment variable in the model, with lines\n\n\nCodeplot <- g_mmrm_lsmeans(\n mmrm_results,\n select = \"estimates\",\n xlab = \"Visit\",\n show_lines = TRUE\n)\nplot\n\n\n\n\n\n\n\nConsidering the treatment variable in the model, with statistics table\n\n\nCodeplot <- g_mmrm_lsmeans(\n mmrm_results,\n select = \"estimates\",\n xlab = \"Visit\",\n table_stats = c(\"n\", \"estimate\", \"se\", \"ci\"),\n table_font_size = 4,\n table_rel_height = 0.6\n)\nplot\n\n\n\n\n\n\n\n\n\n\nUsers can choose to display both estimates and contrasts together by running g_mmrm_lsmeans(mmrm_results).\n\n\nCodeplot <- g_mmrm_lsmeans(\n mmrm_results,\n select = \"contrasts\",\n titles = c(contrasts = \"Contrasts of FKSI-FWB means\"),\n xlab = \"Visit\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_mmrm_diagnostic(mmrm_results)\nplot\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_mmrm_diagnostic(mmrm_results, type = \"q-q-residual\")\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADQS <- synthetic_cdisc_dataset(\"latest\", \"adqs\") %>%\n filter(ABLFL != \"Y\" & ABLFL2 != \"Y\") %>%\n filter(AVISIT %in% c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\", \"WEEK 3 DAY 22\")) %>%\n mutate(\n AVISIT = as.factor(AVISIT),\n AVISITN = rank(AVISITN) %>%\n as.factor() %>%\n as.numeric() %>%\n as.factor() # making consecutive numeric factor\n )\n})\ndatanames <- c(\"ADSL\", \"ADQS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\narm_ref_comp <- list(\n ARMCD = list(\n ref = \"ARM A\",\n comp = c(\"ARM B\", \"ARM C\")\n )\n)\n\n## Reusable Configuration For Modules\nADQS <- data[[\"ADQS\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_a_mmrm(\n label = \"MMRM\",\n dataname = \"ADQS\",\n aval_var = choices_selected(c(\"AVAL\", \"CHG\"), \"AVAL\"),\n id_var = choices_selected(c(\"USUBJID\", \"SUBJID\"), \"USUBJID\"),\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARMCD\"),\n visit_var = choices_selected(c(\"AVISIT\", \"AVISITN\"), \"AVISIT\"),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n choices = value_choices(ADQS, \"PARAMCD\", \"PARAM\"),\n selected = \"FKSI-FWB\"\n ),\n cov_var = choices_selected(c(\"BASE\", \"AGE\", \"SEX\", \"BASE:AVISIT\"), NULL),\n conf_level = choices_selected(c(0.95, 0.9, 0.8), 0.95)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:57:10 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 nestcolor_0.1.2.9009 \n [9] scda_0.1.6.9017 tern.mmrm_0.3.0.9005 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9016 \n[15] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 mmrm_0.3.11 formatR_1.14 \n [4] tern.gee_0.1.3.9004 logger_0.3.0 testthat_3.2.1 \n [7] sandwich_3.1-0 rlang_1.1.3 multcomp_1.4-25 \n[10] compiler_4.3.3 callr_3.7.5 vctrs_0.6.5 \n[13] stringr_1.5.1 pkgconfig_2.0.3 fastmap_1.1.1 \n[16] backports_1.4.1 ellipsis_0.3.2 fontawesome_0.5.2 \n[19] labeling_0.4.3 utf8_1.2.4 promises_1.2.1 \n[22] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 parallel_4.3.3 R6_2.5.1 \n[34] bslib_0.6.1 stringi_1.8.3 parallelly_1.37.1 \n[37] brio_1.1.4 jquerylib_0.1.4 estimability_1.5 \n[40] Rcpp_1.0.12 knitr_1.45 zoo_1.8-12 \n[43] teal.logger_0.2.0.9001 httpuv_1.6.14 Matrix_1.6-5 \n[46] splines_4.3.3 tidyselect_1.2.1 yaml_2.3.8 \n[49] TMB_1.9.10 codetools_0.2-19 websocket_1.4.1 \n[52] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[55] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[58] evaluate_0.23 survival_3.5-8 shinycssloaders_1.0.0 \n[61] pillar_1.9.0 checkmate_2.3.1 shinyjs_2.1.0 \n[64] generics_0.1.3 chromote_0.2.0 ggplot2_3.5.0 \n[67] munsell_0.5.0 scales_1.3.0 xtable_1.8-4 \n[70] glue_1.7.0 emmeans_1.10.0 tools_4.3.3 \n[73] webshot2_0.1.1 webshot_0.5.5 mvtnorm_1.2-4 \n[76] cowplot_1.1.3 grid_4.3.3 tidyr_1.3.1 \n[79] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[82] cli_3.6.2 fansi_1.0.6 geepack_1.3.10 \n[85] gtable_0.3.4 sass_0.4.9 digest_0.6.35 \n[88] TH.data_1.1-2 htmlwidgets_1.6.4 farver_2.1.1 \n[91] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[94] shinyWidgets_0.8.2 mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Given an MMRM fitted with s_mmrm, g_mmrm_lsmeans displays for each visit the adjusted means within group and/or difference in adjusted means between groups. g_mmrm_diagnostic displays marginal residual plots for evaluating model fit.\n\n\nData Setup and Model Fitting\nLeast Squares Means: Estimates Within Groups\nLeast Squares Means: Contrasts Between Groups\nModel Diagnostics: Marginal Fitted Values vs. Residuals\nModel Diagnostics: Normality of Marginal Residuals\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern.mmrm)\nlibrary(scda)\nlibrary(nestcolor)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\nadqs_f <- adqs %>%\n dplyr::filter(PARAMCD == \"FKSI-FWB\" & !AVISIT %in% c(\"BASELINE\")) %>%\n droplevels() %>%\n dplyr::mutate(ARM = factor(ARM, levels = c(\"B: Placebo\", \"A: Drug X\", \"C: Combination\"))) %>%\n dplyr::mutate(AVISITN = rank(AVISITN) %>% as.factor() %>% as.numeric() %>% as.factor())\n\nmmrm_results <- fit_mmrm(\n vars = list(\n response = \"AVAL\",\n covariates = c(\"STRATA2\"),\n id = \"USUBJID\",\n arm = \"ARM\",\n visit = \"AVISIT\"\n ),\n data = adqs_f\n)\n\n\n\n\nConsidering the treatment variable in the model\n\n\nCodeplot <- g_mmrm_lsmeans(\n mmrm_results,\n select = \"estimates\",\n xlab = \"Visit\"\n)\nplot\n\n\n\n\n\n\n\nConsidering the treatment variable in the model, with lines\n\n\nCodeplot <- g_mmrm_lsmeans(\n mmrm_results,\n select = \"estimates\",\n xlab = \"Visit\",\n show_lines = TRUE\n)\nplot\n\n\n\n\n\n\n\nConsidering the treatment variable in the model, with statistics table\n\n\nCodeplot <- g_mmrm_lsmeans(\n mmrm_results,\n select = \"estimates\",\n xlab = \"Visit\",\n table_stats = c(\"n\", \"estimate\", \"se\", \"ci\"),\n table_font_size = 4,\n table_rel_height = 0.6\n)\nplot\n\n\n\n\n\n\n\n\n\n\nUsers can choose to display both estimates and contrasts together by running g_mmrm_lsmeans(mmrm_results).\n\n\nCodeplot <- g_mmrm_lsmeans(\n mmrm_results,\n select = \"contrasts\",\n titles = c(contrasts = \"Contrasts of FKSI-FWB means\"),\n xlab = \"Visit\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_mmrm_diagnostic(mmrm_results)\nplot\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_mmrm_diagnostic(mmrm_results, type = \"q-q-residual\")\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADQS <- synthetic_cdisc_dataset(\"latest\", \"adqs\") %>%\n filter(ABLFL != \"Y\" & ABLFL2 != \"Y\") %>%\n filter(AVISIT %in% c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\", \"WEEK 3 DAY 22\")) %>%\n mutate(\n AVISIT = as.factor(AVISIT),\n AVISITN = rank(AVISITN) %>%\n as.factor() %>%\n as.numeric() %>%\n as.factor() # making consecutive numeric factor\n )\n})\ndatanames <- c(\"ADSL\", \"ADQS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\narm_ref_comp <- list(\n ARMCD = list(\n ref = \"ARM A\",\n comp = c(\"ARM B\", \"ARM C\")\n )\n)\n\n## Reusable Configuration For Modules\nADQS <- data[[\"ADQS\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_a_mmrm(\n label = \"MMRM\",\n dataname = \"ADQS\",\n aval_var = choices_selected(c(\"AVAL\", \"CHG\"), \"AVAL\"),\n id_var = choices_selected(c(\"USUBJID\", \"SUBJID\"), \"USUBJID\"),\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARMCD\"),\n visit_var = choices_selected(c(\"AVISIT\", \"AVISITN\"), \"AVISIT\"),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n choices = value_choices(ADQS, \"PARAMCD\", \"PARAM\"),\n selected = \"FKSI-FWB\"\n ),\n cov_var = choices_selected(c(\"BASE\", \"AGE\", \"SEX\", \"BASE:AVISIT\"), NULL),\n conf_level = choices_selected(c(0.95, 0.9, 0.8), 0.95)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:59:47 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 nestcolor_0.1.2.9009 \n [9] scda_0.1.6.9017 tern.mmrm_0.3.0.9005 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9018 \n[15] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 mmrm_0.3.11 formatR_1.14 \n [4] tern.gee_0.1.3.9004 logger_0.3.0 testthat_3.2.1 \n [7] sandwich_3.1-0 rlang_1.1.3 multcomp_1.4-25 \n[10] compiler_4.3.3 callr_3.7.5 vctrs_0.6.5 \n[13] stringr_1.5.1 pkgconfig_2.0.3 fastmap_1.1.1 \n[16] backports_1.4.1 ellipsis_0.3.2 fontawesome_0.5.2 \n[19] labeling_0.4.3 utf8_1.2.4 promises_1.2.1 \n[22] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 parallel_4.3.3 R6_2.5.1 \n[34] bslib_0.6.1 stringi_1.8.3 parallelly_1.37.1 \n[37] brio_1.1.4 jquerylib_0.1.4 estimability_1.5 \n[40] Rcpp_1.0.12 knitr_1.45 zoo_1.8-12 \n[43] teal.logger_0.2.0.9001 httpuv_1.6.14 Matrix_1.6-5 \n[46] splines_4.3.3 tidyselect_1.2.1 yaml_2.3.8 \n[49] TMB_1.9.10 codetools_0.2-19 websocket_1.4.1 \n[52] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[55] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[58] evaluate_0.23 survival_3.5-8 shinycssloaders_1.0.0 \n[61] pillar_1.9.0 checkmate_2.3.1 shinyjs_2.1.0 \n[64] generics_0.1.3 chromote_0.2.0 ggplot2_3.5.0 \n[67] munsell_0.5.0 scales_1.3.0 xtable_1.8-4 \n[70] glue_1.7.0 emmeans_1.10.0 tools_4.3.3 \n[73] webshot2_0.1.1 webshot_0.5.5 mvtnorm_1.2-4 \n[76] cowplot_1.1.3 grid_4.3.3 tidyr_1.3.1 \n[79] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[82] cli_3.6.2 fansi_1.0.6 geepack_1.3.10 \n[85] gtable_0.3.4 sass_0.4.9 digest_0.6.35 \n[88] TH.data_1.1-2 htmlwidgets_1.6.4 farver_2.1.1 \n[91] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[94] shinyWidgets_0.8.2 mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", "Efficacy", @@ -120,7 +139,7 @@ "href": "graphs/efficacy/fstg02.html", "title": "FSTG02", "section": "", - "text": "Data Setup\nStandard Plot\nPlot Specifying Class Variables and Options for the Treatment Variable\nPlot Selecting Columns and Changing the Alpha Level\nPlot with Fixed Symbol Size\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(forcats)\nlibrary(nestcolor)\nlibrary(scda)\n\npreprocess_adtte <- function(adtte) {\n # Save variable labels before data processing steps.\n adtte_labels <- var_labels(adtte)\n\n adtte <- adtte %>%\n df_explicit_na() %>%\n dplyr::filter(\n PARAMCD == \"OS\",\n ARM %in% c(\"B: Placebo\", \"A: Drug X\"),\n SEX %in% c(\"M\", \"F\")\n ) %>%\n dplyr::mutate(\n # Reorder levels of ARM to display reference arm before treatment arm.\n ARM = droplevels(forcats::fct_relevel(ARM, \"B: Placebo\")),\n SEX = droplevels(SEX),\n is_event = CNSR == 0,\n # Convert time to MONTH\n AVAL = day2month(AVAL),\n AVALU = \"Months\"\n ) %>%\n var_relabel(\n ARM = adtte_labels[\"ARM\"],\n SEX = adtte_labels[\"SEX\"],\n is_event = \"Event Flag\",\n AVAL = adtte_labels[\"AVAL\"],\n AVALU = adtte_labels[\"AVALU\"]\n )\n\n adtte\n}\n\nanl <- synthetic_cdisc_dataset(\"latest\", \"adtte\") %>%\n preprocess_adtte()\n\n\n\n\n\n\nCodeanl1 <- anl\n\ndf <- extract_survival_subgroups(\n variables = list(tte = \"AVAL\", is_event = \"is_event\", arm = \"ARM\", subgroups = c(\"SEX\", \"BMRKR2\")),\n data = anl1\n)\n\nresult <- basic_table() %>%\n tabulate_survival_subgroups(\n df = df,\n vars = c(\"n_tot\", \"n\", \"median\", \"hr\", \"ci\"),\n time_unit = anl1$AVALU[1]\n )\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Median (Months) n Median (Months) Hazard Ratio 95% Wald CI \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 NA 134 NA 1.00 (0.69, 1.44)\nSex \n F 161 82 NA 79 NA 0.79 (0.49, 1.28)\n M 107 52 NA 55 9.6 1.39 (0.78, 2.47)\nCategorical Level Biomarker 2 \n LOW 95 45 NA 50 9.3 1.14 (0.64, 2.02)\n MEDIUM 93 56 NA 37 NA 0.97 (0.52, 1.82)\n HIGH 80 33 NA 47 NA 0.97 (0.45, 2.12)\n\nCode# Add plot.\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl2 <- anl %>%\n mutate(\n # Recode levels of arm.\n ARM = forcats::fct_recode(\n ARM,\n \"Placebo\" = \"B: Placebo\",\n \"Drug X\" = \"A: Drug X\"\n ),\n # Reorder levels of `SEX`.\n SEX = forcats::fct_relevel(SEX, \"M\", \"F\"),\n # Reorder levels of `STRATA1`` by frequency.\n STRATA1 = forcats::fct_infreq(STRATA1)\n )\n\ndf <- extract_survival_subgroups(\n variables = list(tte = \"AVAL\", is_event = \"is_event\", arm = \"ARM\", subgroups = c(\"SEX\", \"STRATA1\")),\n data = anl2\n)\n\nresult <- basic_table() %>%\n tabulate_survival_subgroups(\n df = df,\n vars = c(\"n_tot\", \"n\", \"median\", \"hr\", \"ci\"),\n time_unit = anl2$AVALU[1]\n )\nresult\n\n Placebo Drug X \nBaseline Risk Factors Total n n Median (Months) n Median (Months) Hazard Ratio 95% Wald CI \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 NA 134 NA 1.00 (0.69, 1.44)\nSex \n M 107 52 NA 55 9.6 1.39 (0.78, 2.47)\n F 161 82 NA 79 NA 0.79 (0.49, 1.28)\nStratification Factor 1 \n C 94 45 NA 49 NA 0.75 (0.41, 1.38)\n B 92 45 NA 47 NA 1.34 (0.71, 2.54)\n A 82 44 NA 38 NA 1.02 (0.53, 1.97)\n\nCodeplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl3 <- anl\n\ndf <- extract_survival_subgroups(\n variables = list(tte = \"AVAL\", is_event = \"is_event\", arm = \"ARM\", subgroups = c(\"SEX\", \"BMRKR2\")),\n control = control_coxph(conf_level = 0.9),\n data = anl3\n)\n\nresult <- basic_table() %>%\n tabulate_survival_subgroups(\n df = df,\n vars = c(\"n_tot\", \"hr\", \"ci\")\n )\nresult\n\n \nBaseline Risk Factors Total n Hazard Ratio 90% Wald CI \n—————————————————————————————————————————————————————————————————————\nAll Patients 268 1.00 (0.74, 1.36)\nSex \n F 161 0.79 (0.53, 1.19)\n M 107 1.39 (0.86, 2.25)\nCategorical Level Biomarker 2 \n LOW 95 1.14 (0.71, 1.84)\n MEDIUM 93 0.97 (0.58, 1.64)\n HIGH 80 0.97 (0.51, 1.87)\n\nCode# Add plot.\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl4 <- anl\n\ndf <- extract_survival_subgroups(\n variables = list(tte = \"AVAL\", is_event = \"is_event\", arm = \"ARM\", subgroups = c(\"SEX\", \"BMRKR2\")),\n data = anl4\n)\n\nresult <- basic_table() %>%\n tabulate_survival_subgroups(\n df = df,\n vars = c(\"n_tot\", \"n\", \"median\", \"hr\", \"ci\"),\n time_unit = anl4$AVALU[1]\n )\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Median (Months) n Median (Months) Hazard Ratio 95% Wald CI \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 NA 134 NA 1.00 (0.69, 1.44)\nSex \n F 161 82 NA 79 NA 0.79 (0.49, 1.28)\n M 107 52 NA 55 9.6 1.39 (0.78, 2.47)\nCategorical Level Biomarker 2 \n LOW 95 45 NA 50 9.3 1.14 (0.64, 2.02)\n MEDIUM 93 56 NA 37 NA 0.97 (0.52, 1.82)\n HIGH 80 33 NA 47 NA 0.97 (0.45, 2.12)\n\nCode# Add plot.\nplot <- g_forest(\n tbl = result,\n col_symbol_size = NULL\n)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n library(forcats)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADSL <- ADSL %>%\n filter(ARM %in% c(\"B: Placebo\", \"A: Drug X\")) %>%\n mutate(ARM = droplevels(fct_relevel(ARM, \"B: Placebo\"))) %>%\n mutate(ARMCD = droplevels(fct_relevel(ARMCD, \"ARM B\")))\n ADSL$RACE <- droplevels(ADSL$RACE)\n\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n adtte_labels <- col_labels(ADTTE)\n\n ADTTE <- ADTTE %>%\n filter(\n PARAMCD == \"OS\",\n ARM %in% c(\"B: Placebo\", \"A: Drug X\"),\n SEX %in% c(\"M\", \"F\")\n ) %>%\n mutate(\n # Reorder levels of ARM to display reference arm before treatment arm.\n ARM = droplevels(fct_relevel(ARM, \"B: Placebo\")),\n SEX = droplevels(SEX),\n is_event = CNSR == 0,\n # Convert time to MONTH\n AVAL = day2month(AVAL),\n AVALU = \"Months\"\n ) %>%\n col_relabel(\n ARM = adtte_labels[\"ARM\"],\n SEX = adtte_labels[\"SEX\"],\n is_event = \"Event Flag\",\n AVAL = adtte_labels[\"AVAL\"],\n AVALU = adtte_labels[\"AVALU\"]\n )\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADTTE <- data[[\"ADTTE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_forest_tte(\n label = \"Forest Survival\",\n dataname = \"ADTTE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n subgroup_var = choices_selected(names(ADSL), c(\"SEX\", \"BMRKR2\")),\n paramcd = choices_selected(value_choices(ADTTE, \"PARAMCD\", \"PARAM\"), \"OS\"),\n strata_var = choices_selected(c(\"STRATA1\", \"STRATA2\"), \"STRATA2\"),\n plot_height = c(600, 200, 2000),\n plot_width = c(1500, 200, 5000)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:56:15 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] nestcolor_0.1.2.9009 forcats_1.0.0 \n[11] dplyr_1.1.4 tern_0.9.3.9028 \n[13] rtables_0.6.6.9011 magrittr_2.0.3 \n[15] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[37] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[40] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[43] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[46] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[49] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[52] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[55] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[58] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[61] generics_0.1.3 chromote_0.2.0 ggplot2_3.5.0 \n[64] munsell_0.5.0 scales_1.3.0 xtable_1.8-4 \n[67] glue_1.7.0 emmeans_1.10.0 tools_4.3.3 \n[70] webshot2_0.1.1 webshot_0.5.5 mvtnorm_1.2-4 \n[73] cowplot_1.1.3 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 textshaping_0.3.7 fansi_1.0.6 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] farver_2.1.1 memoise_2.0.1 htmltools_0.5.7 \n[91] lifecycle_1.0.4 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Plot\nPlot Specifying Class Variables and Options for the Treatment Variable\nPlot Selecting Columns and Changing the Alpha Level\nPlot with Fixed Symbol Size\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(forcats)\nlibrary(nestcolor)\nlibrary(scda)\n\npreprocess_adtte <- function(adtte) {\n # Save variable labels before data processing steps.\n adtte_labels <- var_labels(adtte)\n\n adtte <- adtte %>%\n df_explicit_na() %>%\n dplyr::filter(\n PARAMCD == \"OS\",\n ARM %in% c(\"B: Placebo\", \"A: Drug X\"),\n SEX %in% c(\"M\", \"F\")\n ) %>%\n dplyr::mutate(\n # Reorder levels of ARM to display reference arm before treatment arm.\n ARM = droplevels(forcats::fct_relevel(ARM, \"B: Placebo\")),\n SEX = droplevels(SEX),\n is_event = CNSR == 0,\n # Convert time to MONTH\n AVAL = day2month(AVAL),\n AVALU = \"Months\"\n ) %>%\n var_relabel(\n ARM = adtte_labels[\"ARM\"],\n SEX = adtte_labels[\"SEX\"],\n is_event = \"Event Flag\",\n AVAL = adtte_labels[\"AVAL\"],\n AVALU = adtte_labels[\"AVALU\"]\n )\n\n adtte\n}\n\nanl <- synthetic_cdisc_dataset(\"latest\", \"adtte\") %>%\n preprocess_adtte()\n\n\n\n\n\n\nCodeanl1 <- anl\n\ndf <- extract_survival_subgroups(\n variables = list(tte = \"AVAL\", is_event = \"is_event\", arm = \"ARM\", subgroups = c(\"SEX\", \"BMRKR2\")),\n data = anl1\n)\n\nresult <- basic_table() %>%\n tabulate_survival_subgroups(\n df = df,\n vars = c(\"n_tot\", \"n\", \"median\", \"hr\", \"ci\"),\n time_unit = anl1$AVALU[1]\n )\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Median (Months) n Median (Months) Hazard Ratio 95% Wald CI \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 NA 134 NA 1.00 (0.69, 1.44)\nSex \n F 161 82 NA 79 NA 0.79 (0.49, 1.28)\n M 107 52 NA 55 9.6 1.39 (0.78, 2.47)\nCategorical Level Biomarker 2 \n LOW 95 45 NA 50 9.3 1.14 (0.64, 2.02)\n MEDIUM 93 56 NA 37 NA 0.97 (0.52, 1.82)\n HIGH 80 33 NA 47 NA 0.97 (0.45, 2.12)\n\nCode# Add plot.\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl2 <- anl %>%\n mutate(\n # Recode levels of arm.\n ARM = forcats::fct_recode(\n ARM,\n \"Placebo\" = \"B: Placebo\",\n \"Drug X\" = \"A: Drug X\"\n ),\n # Reorder levels of `SEX`.\n SEX = forcats::fct_relevel(SEX, \"M\", \"F\"),\n # Reorder levels of `STRATA1`` by frequency.\n STRATA1 = forcats::fct_infreq(STRATA1)\n )\n\ndf <- extract_survival_subgroups(\n variables = list(tte = \"AVAL\", is_event = \"is_event\", arm = \"ARM\", subgroups = c(\"SEX\", \"STRATA1\")),\n data = anl2\n)\n\nresult <- basic_table() %>%\n tabulate_survival_subgroups(\n df = df,\n vars = c(\"n_tot\", \"n\", \"median\", \"hr\", \"ci\"),\n time_unit = anl2$AVALU[1]\n )\nresult\n\n Placebo Drug X \nBaseline Risk Factors Total n n Median (Months) n Median (Months) Hazard Ratio 95% Wald CI \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 NA 134 NA 1.00 (0.69, 1.44)\nSex \n M 107 52 NA 55 9.6 1.39 (0.78, 2.47)\n F 161 82 NA 79 NA 0.79 (0.49, 1.28)\nStratification Factor 1 \n C 94 45 NA 49 NA 0.75 (0.41, 1.38)\n B 92 45 NA 47 NA 1.34 (0.71, 2.54)\n A 82 44 NA 38 NA 1.02 (0.53, 1.97)\n\nCodeplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl3 <- anl\n\ndf <- extract_survival_subgroups(\n variables = list(tte = \"AVAL\", is_event = \"is_event\", arm = \"ARM\", subgroups = c(\"SEX\", \"BMRKR2\")),\n control = control_coxph(conf_level = 0.9),\n data = anl3\n)\n\nresult <- basic_table() %>%\n tabulate_survival_subgroups(\n df = df,\n vars = c(\"n_tot\", \"hr\", \"ci\")\n )\nresult\n\n \nBaseline Risk Factors Total n Hazard Ratio 90% Wald CI \n—————————————————————————————————————————————————————————————————————\nAll Patients 268 1.00 (0.74, 1.36)\nSex \n F 161 0.79 (0.53, 1.19)\n M 107 1.39 (0.86, 2.25)\nCategorical Level Biomarker 2 \n LOW 95 1.14 (0.71, 1.84)\n MEDIUM 93 0.97 (0.58, 1.64)\n HIGH 80 0.97 (0.51, 1.87)\n\nCode# Add plot.\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl4 <- anl\n\ndf <- extract_survival_subgroups(\n variables = list(tte = \"AVAL\", is_event = \"is_event\", arm = \"ARM\", subgroups = c(\"SEX\", \"BMRKR2\")),\n data = anl4\n)\n\nresult <- basic_table() %>%\n tabulate_survival_subgroups(\n df = df,\n vars = c(\"n_tot\", \"n\", \"median\", \"hr\", \"ci\"),\n time_unit = anl4$AVALU[1]\n )\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Median (Months) n Median (Months) Hazard Ratio 95% Wald CI \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 NA 134 NA 1.00 (0.69, 1.44)\nSex \n F 161 82 NA 79 NA 0.79 (0.49, 1.28)\n M 107 52 NA 55 9.6 1.39 (0.78, 2.47)\nCategorical Level Biomarker 2 \n LOW 95 45 NA 50 9.3 1.14 (0.64, 2.02)\n MEDIUM 93 56 NA 37 NA 0.97 (0.52, 1.82)\n HIGH 80 33 NA 47 NA 0.97 (0.45, 2.12)\n\nCode# Add plot.\nplot <- g_forest(\n tbl = result,\n col_symbol_size = NULL\n)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n library(forcats)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADSL <- ADSL %>%\n filter(ARM %in% c(\"B: Placebo\", \"A: Drug X\")) %>%\n mutate(ARM = droplevels(fct_relevel(ARM, \"B: Placebo\"))) %>%\n mutate(ARMCD = droplevels(fct_relevel(ARMCD, \"ARM B\")))\n ADSL$RACE <- droplevels(ADSL$RACE)\n\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n adtte_labels <- col_labels(ADTTE)\n\n ADTTE <- ADTTE %>%\n filter(\n PARAMCD == \"OS\",\n ARM %in% c(\"B: Placebo\", \"A: Drug X\"),\n SEX %in% c(\"M\", \"F\")\n ) %>%\n mutate(\n # Reorder levels of ARM to display reference arm before treatment arm.\n ARM = droplevels(fct_relevel(ARM, \"B: Placebo\")),\n SEX = droplevels(SEX),\n is_event = CNSR == 0,\n # Convert time to MONTH\n AVAL = day2month(AVAL),\n AVALU = \"Months\"\n ) %>%\n col_relabel(\n ARM = adtte_labels[\"ARM\"],\n SEX = adtte_labels[\"SEX\"],\n is_event = \"Event Flag\",\n AVAL = adtte_labels[\"AVAL\"],\n AVALU = adtte_labels[\"AVALU\"]\n )\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADTTE <- data[[\"ADTTE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_forest_tte(\n label = \"Forest Survival\",\n dataname = \"ADTTE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n subgroup_var = choices_selected(names(ADSL), c(\"SEX\", \"BMRKR2\")),\n paramcd = choices_selected(value_choices(ADTTE, \"PARAMCD\", \"PARAM\"), \"OS\"),\n strata_var = choices_selected(c(\"STRATA1\", \"STRATA2\"), \"STRATA2\"),\n plot_height = c(600, 200, 2000),\n plot_width = c(1500, 200, 5000)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:58:51 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] nestcolor_0.1.2.9009 forcats_1.0.0 \n[11] dplyr_1.1.4 tern_0.9.3.9028 \n[13] rtables_0.6.6.9011 magrittr_2.0.3 \n[15] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[37] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[40] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[43] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[46] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[49] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[52] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[55] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[58] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[61] generics_0.1.3 chromote_0.2.0 ggplot2_3.5.0 \n[64] munsell_0.5.0 scales_1.3.0 xtable_1.8-4 \n[67] glue_1.7.0 emmeans_1.10.0 tools_4.3.3 \n[70] webshot2_0.1.1 webshot_0.5.5 mvtnorm_1.2-4 \n[73] cowplot_1.1.3 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 textshaping_0.3.7 fansi_1.0.6 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] farver_2.1.1 memoise_2.0.1 htmltools_0.5.7 \n[91] lifecycle_1.0.4 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", "Efficacy", @@ -128,231 +147,226 @@ ] }, { - "objectID": "graphs/efficacy/kmg01.html", - "href": "graphs/efficacy/kmg01.html", - "title": "KMG01", + "objectID": "graphs/other/ltg01.html", + "href": "graphs/other/ltg01.html", + "title": "LTG01", "section": "", - "text": "Data Setup\nStandard Plot\nPlot of Failures\nPlot Without Comparative Statistics\nPlot Without Censoring Marks\nPlot Modifying Censoring Marks\nPlot Modifying Options for Statistics, Tie Handling, Stratification, etc.\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(nestcolor)\n\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\nanl <- adtte %>%\n dplyr::filter(PARAMCD == \"OS\") %>%\n dplyr::mutate(is_event = CNSR == 0)\nvariables <- list(tte = \"AVAL\", is_event = \"is_event\", arm = \"ARMCD\")\n\n\n\n\n\n\nCodeplot <- g_km(\n df = anl,\n variables = variables,\n xlab = \"Time (Days)\",\n ylim = c(0, 1),\n annot_coxph = TRUE\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_km(\n df = anl,\n variables = variables,\n xlab = \"Time (Days)\",\n yval = \"Failure\",\n ylim = c(0, 1),\n font_size = 8,\n annot_coxph = TRUE\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_km(\n df = anl,\n variables = variables,\n xlab = \"Time (Days)\",\n ylim = c(0, 1)\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_km(\n df = anl,\n variables = variables,\n censor_show = FALSE,\n xlab = \"Time (Days)\",\n ylim = c(0, 1),\n annot_coxph = TRUE\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_km(\n df = anl,\n variables = variables,\n pch = 1,\n size = 2,\n xlab = \"Time (Days)\",\n ylim = c(0, 1),\n annot_coxph = TRUE\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodevariables$strata <- c(\"STRATA1\", \"STRATA2\")\nplot <- g_km(\n df = anl,\n variables = variables,\n control_surv = control_surv_timepoint(conf_level = 0.8),\n xlab = \"Time (Days)\",\n ylim = c(0, 1),\n annot_coxph = TRUE,\n control_coxph_pw = control_coxph(\n pval_method = \"wald\",\n ties = \"breslow\",\n conf_level = 0.8\n )\n)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADTTE <- data[[\"ADTTE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_km(\n label = \"KM PLOT\",\n plot_height = c(600, 100, 2000),\n dataname = \"ADTTE\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n paramcd = choices_selected(\n value_choices(ADTTE, \"PARAMCD\", \"PARAM\"),\n \"OS\"\n ),\n arm_ref_comp = arm_ref_comp,\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"SEX\", \"BMRKR2\")),\n \"SEX\"\n ),\n facet_var = choices_selected(\n variable_choices(ADSL, c(\"SEX\", \"BMRKR2\")),\n NULL\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:55:31 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 nestcolor_0.1.2.9009 \n [9] dplyr_1.1.4 scda_0.1.6.9017 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] brio_1.1.4 jquerylib_0.1.4 estimability_1.5 \n[37] Rcpp_1.0.12 knitr_1.45 zoo_1.8-12 \n[40] teal.logger_0.2.0.9001 httpuv_1.6.14 Matrix_1.6-5 \n[43] splines_4.3.3 tidyselect_1.2.1 yaml_2.3.8 \n[46] codetools_0.2-19 websocket_1.4.1 processx_3.8.4 \n[49] teal.widgets_0.4.2.9009 lattice_0.22-6 tibble_3.2.1 \n[52] withr_3.0.0 coda_0.19-4.1 evaluate_0.23 \n[55] survival_3.5-8 pillar_1.9.0 shinycssloaders_1.0.0 \n[58] checkmate_2.3.1 shinyjs_2.1.0 generics_0.1.3 \n[61] chromote_0.2.0 ggplot2_3.5.0 munsell_0.5.0 \n[64] scales_1.3.0 xtable_1.8-4 glue_1.7.0 \n[67] emmeans_1.10.0 tools_4.3.3 webshot2_0.1.1 \n[70] webshot_0.5.5 mvtnorm_1.2-4 cowplot_1.1.3 \n[73] grid_4.3.3 tidyr_1.3.1 rbibutils_2.2.16 \n[76] colorspace_2.1-0 nlme_3.1-164 cli_3.6.2 \n[79] textshaping_0.3.7 fansi_1.0.6 geepack_1.3.10 \n[82] gtable_0.3.4 sass_0.4.9 digest_0.6.35 \n[85] TH.data_1.1-2 htmlwidgets_1.6.4 farver_2.1.1 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] shinyWidgets_0.8.2 mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Lattice plots are natively handled by R, the examples below rely mostly on the package ggplot2.\n\n\nData Setup\nPlot of Liver Function Tests\nPlot of Liver Function Tests Including Mean, Median, and 95% CIs\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(teal)\nlibrary(teal.modules.clinical)\nlibrary(ggplot2)\nlibrary(dplyr)\nlibrary(nestcolor)\n\n# Datasets\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>% slice(1:8)\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>% filter(USUBJID %in% adsl$USUBJID)\n\n# Pre-processing\nadlb$AVISIT_txt <- adlb$AVISIT\nadlb$AVISIT <- as.numeric(adlb$AVISIT)\nadlb$ARM_N <- adlb$ARM\nlevels(adlb$ARM_N) <- with(\n data = adlb,\n paste0(\n levels(ARM_N), \" (N = \",\n tapply(SUBJID, ARM_N, function(x) length(unique(x))), \")\"\n )\n)\n\n# Plot utils\nnpch <- 1:25\nnpatients <- length(unique(adlb$SUBJID))\npch <- c(\n rep(npch, times = npatients %/% length(npch)),\n npch[1:(npatients %% length(npch))]\n)\n\n\n\n\nBasic Plot\n\n\nCode# General mapping and \"lattice\" (\"facet\" in ggplot2 nomenclature).\ng1 <- {\n ggplot(\n data = adlb,\n mapping = aes(x = AVISIT, y = AVAL, colour = SUBJID, shape = SUBJID)\n ) +\n facet_grid(LBTESTCD ~ ARM, scales = \"free_y\") +\n scale_shape_manual(values = pch)\n}\n\n# Add points and lines.\ng1 <- g1 + geom_point()\ng1 <- g1 + geom_line()\nplot <- g1\nplot\n\n\n\n\n\n\n\nModifying Facets\nThe units describing rows of panes and the number of patients under each arm is specified by modifying facet_grid():\n\n\nCode# Include the units and the sample size N.\ng2 <- g1 + facet_grid(\n paste0(LBTESTCD, \"\\n(\", AVALU, \")\") ~ ARM_N,\n scales = \"free_y\"\n)\n\nplot <- g2\nplot\n\n\n\n\n\n\n\nModifying X-Axis\nThe graphic elements are modified through usual ggplot2 functions. For instance, the x-axis could be improved as follows:\n\n\nCodeg3 <- g2 + theme(\n axis.text.x = element_text(angle = 45, hjust = 1),\n axis.title = element_blank()\n) + scale_x_continuous(breaks = adlb$AVISIT, labels = adlb$AVISIT_txt)\n\nplot <- g3\nplot\n\n\n\n\n\n\n\n\n\n\nThe functions stat_mean_ci and stat_median_ci from the tern package allow the addition of mean and/or median confidence intervals. The example below suggests a larger dataset, where the individual subject legend may not be relevant but the mean or the median are of special interest.\nPre-Processing\n\nCode# Datasets\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>% slice(1:40)\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>% filter(USUBJID %in% adsl$USUBJID)\n\n# Pre-processing\nadlb$AVISIT_txt <- adlb$AVISIT\nadlb$AVISIT <- as.numeric(adlb$AVISIT)\nadlb$ARM_N <- adlb$ARM\nlevels(adlb$ARM_N) <- with(\n data = adlb,\n paste0(\n levels(ARM_N), \" (N = \",\n tapply(SUBJID, ARM_N, function(x) length(unique(x))), \")\"\n )\n)\n\n# Plot utils\nnpch <- 1:25\nnpatients <- length(unique(adlb$SUBJID))\npch <- c(\n rep(npch, times = npatients %/% length(npch)),\n npch[1:(npatients %% length(npch))]\n)\n\n\nBasic Plot\n\nCode# General mapping and \"lattice\" (\"facet\" in ggplot2 nomenclature)\ng4 <- {\n ggplot(\n data = adlb,\n mapping = aes(x = AVISIT, y = AVAL, colour = SUBJID, shape = SUBJID)\n ) +\n facet_grid(LBTESTCD ~ ARM_N, scales = \"free_y\") +\n scale_shape_manual(values = pch) +\n scale_color_manual(values = rep(getOption(\"ggplot2.discrete.colour\"), 2))\n}\n\n# Add points and lines.\n# Note that with so many patients, legend might not be useful and transparency\n# is advisable.\ng4 <- g4 + geom_point(alpha = .3)\ng4 <- g4 + geom_line(alpha = .3)\ng4 <- g4 + guides(colour = \"none\", shape = \"none\")\ng4 <- g4 + theme(\n axis.text.x = element_text(angle = 45, hjust = 1),\n axis.title = element_blank()\n)\ng4 <- g4 + scale_x_continuous(breaks = adlb$AVISIT, labels = adlb$AVISIT_txt)\nplot <- g4\nplot\n\n\n\n\n\n\n\nAdding Mean\n\n\nCode# Add the mean along with the 95% CI at every visit.\ng51 <- g4 + stat_summary(\n fun = mean, linewidth = 1, geom = \"line\",\n aes(group = 1, linetype = \"Mean +/- 95% CI\")\n)\ng51 <- g51 + stat_summary(\n fun.data = tern::stat_mean_ci, geom = \"errorbar\",\n aes(group = 1, linetype = \"Mean +/- 95% CI\")\n)\nplot <- g51 + guides(linetype = guide_legend(title = NULL))\nplot\n\n\n\n\n\n\n\nAdding Median\n\n\nCode# Instead of a mean, the median could be more relevant.\ng52 <- g51 + stat_summary(\n fun = median, linewidth = 1, geom = \"line\",\n aes(group = 1, linetype = \"Median +/- 95% CI\")\n)\ng52 <- g52 + stat_summary(\n fun.data = tern::stat_median_ci, geom = \"errorbar\",\n aes(group = 1, linetype = \"Median +/- 95% CI\")\n)\nplot <- g52 + guides(linetype = guide_legend(title = \"Aggregate\"))\nplot\n\n\n\n\n\n\n\nChanging Confidence Level\n\n\nCode# Change the confidence level of interval for the median.\n# Note: check `?stat_mean_ci()` and `?stat_median_ci()` for further fine tuning.\ng53 <- g4 + stat_summary(\n fun = median, linewidth = 1, geom = \"line\",\n aes(group = 1, linetype = \"Median +/- 80% CI\")\n)\ng53 <- g53 + stat_summary(\n fun.data = function(x) tern::stat_median_ci(x, conf_level = 0.8),\n geom = \"errorbar\", aes(group = 1, linetype = \"Median +/- 80% CI\")\n)\nplot <- g53 + guides(linetype = guide_legend(title = NULL))\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:58:08 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] nestcolor_0.1.2.9009 dplyr_1.1.4 \n [3] ggplot2_3.5.0 teal.modules.clinical_0.9.0.9014\n [5] teal.transform_0.5.0.9004 teal_0.15.2.9020 \n [7] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 \n [9] teal.code_0.5.0.9004 shiny_1.8.0 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9018 \n[15] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] gtable_0.3.4 xfun_0.42 htmlwidgets_1.6.4 \n [4] lattice_0.22-6 vctrs_0.6.5 tools_4.3.3 \n [7] Rdpack_2.6 generics_0.1.3 sandwich_3.1-0 \n[10] tibble_3.2.1 fansi_1.0.6 pkgconfig_2.0.3 \n[13] Matrix_1.6-5 checkmate_2.3.1 lifecycle_1.0.4 \n[16] farver_2.1.1 compiler_4.3.3 brio_1.1.4 \n[19] munsell_0.5.0 codetools_0.2-19 httpuv_1.6.14 \n[22] htmltools_0.5.7 yaml_2.3.8 later_1.3.2 \n[25] pillar_1.9.0 tidyr_1.3.1 MASS_7.3-60.0.1 \n[28] ellipsis_0.3.2 tern.gee_0.1.3.9004 multcomp_1.4-25 \n[31] nlme_3.1-164 mime_0.12 tidyselect_1.2.1 \n[34] digest_0.6.35 mvtnorm_1.2-4 purrr_1.0.2 \n[37] labeling_0.4.3 geepack_1.3.10 splines_4.3.3 \n[40] fastmap_1.1.1 grid_4.3.3 colorspace_2.1-0 \n[43] cli_3.6.2 logger_0.3.0 survival_3.5-8 \n[46] utf8_1.2.4 TH.data_1.1-2 broom_1.0.5 \n[49] withr_3.0.0 scales_1.3.0 promises_1.2.1 \n[52] backports_1.4.1 estimability_1.5 rmarkdown_2.26 \n[55] emmeans_1.10.0 zoo_1.8-12 coda_0.19-4.1 \n[58] evaluate_0.23 knitr_1.45 rbibutils_2.2.16 \n[61] testthat_3.2.1 rlang_1.1.3 Rcpp_1.0.12 \n[64] xtable_1.8-4 glue_1.7.0 jsonlite_1.8.8 \n[67] teal.logger_0.2.0.9001 R6_2.5.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Efficacy", - "KMG01" + "Other", + "LTG01" ] }, { - "objectID": "graphs/pharmacokinetic/pkcg01.html", - "href": "graphs/pharmacokinetic/pkcg01.html", - "title": "PKCG01", + "objectID": "graphs/other/ippg01.html", + "href": "graphs/other/ippg01.html", + "title": "IPPG01", "section": "", - "text": "Data Setup\nPlot in Linear Scale\nPlot in Log Scale\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\")\n\n\n\n\n\n\nCodeadpc_a <- adpc %>%\n filter(\n PARAM == \"Plasma Drug X\",\n ARMCD == \"ARM A\"\n ) %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID))\n\nuse_title <- \"Plot of Plasma Drug X (ug/mL) Concentrations Over Time by\\nPatient: PK Evaluable Patients\"\nuse_subtitle <- \"Analyte: Plasma Drug X (ug/mL) \\nTreatment Group: ARM A\"\nuse_footnote <- \"Program: \\nOutput:\"\n\nresult <- g_ipp(\n df = adpc_a,\n xvar = \"NFRLT\",\n yvar = \"AVAL\",\n xlab = \"Norminal Time from First Dose (hr)\",\n ylab = \"Concentration (ug/mL)\",\n id_var = \"Patient_ID\",\n add_baseline_hline = FALSE,\n yvar_baseline = \"AVAL\", # yvar_baseline cannot be NA or ignore\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n plotting_choices = \"separate_by_obs\"\n)\nplot <- result[[1]] # only show the first subject\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeadpc_a <- adpc %>%\n filter(\n PARAM == \"Plasma Drug X\",\n ARMCD == \"ARM A\"\n ) %>%\n mutate(avalog = ifelse(AVAL != 0, AVAL, 0.001)) %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID))\n\nuse_title2 <- \"Plot of Plasma Drug X (ug/mL) Concentrations Over Time by\\nPatient: PK Evaluable Patients\"\nuse_subtitle2 <- \"Analyte: Plasma Drug X (ug/mL) \\nTreatment Group: ARM A\"\nuse_footnote2 <- \"Program: \\nOutput:\"\n\nresult <- g_ipp(\n df = adpc_a,\n xvar = \"NFRLT\",\n yvar = \"avalog\",\n xlab = \"Norminal Time from First Dose (hr)\",\n ylab = \"Concentration (ug/mL)\",\n id_var = \"Patient_ID\",\n add_baseline_hline = FALSE,\n yvar_baseline = \"AVAL\", # yvar_baseline cannot be NA or ignore\n title = use_title2,\n subtitle = use_subtitle2,\n caption = use_footnote2,\n plotting_choices = \"separate_by_obs\"\n)\nplot <- result[[1]] + ggplot2::scale_y_log10(breaks = c(0.001, 0.01, 0.1, 1, 10), labels = c(0.001, 0.01, 0.1, 1, 10))\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:54:53 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 labeling_0.4.3 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 broom_1.0.5 xfun_0.42 \n[29] cli_3.6.2 withr_3.0.0 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 farver_2.1.1 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "For illustration purposes, we will subset the adlb dataset for safety population in treatment arm A and a specific lab parameter (ALT).\n\n\nData Setup\nStandard Plot\nPlot with Patient Baselines as Reference\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\n# use small sample size\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>% slice(1:15)\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>% filter(USUBJID %in% adsl$USUBJID)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadlb <- df_explicit_na(adlb)\n\nadlb_f <- adlb %>%\n filter(\n SAFFL == \"Y\",\n PARAMCD == \"ALT\",\n AVISIT != \"SCREENING\",\n ARMCD == \"ARM A\"\n ) %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID))\n\n\n\n\nThe user can select different plotting_choices depending on their preference. To demonstrate, separate plots are produced with a maximum of 3 observations each.\n\n\nCodeplots <- g_ipp(\n df = adlb_f,\n xvar = \"AVISIT\",\n yvar = \"AVAL\",\n xlab = \"Visit\",\n ylab = \"SGOT/ALT (U/L)\",\n id_var = \"Patient_ID\",\n title = \"Individual Patient Plots\",\n subtitle = \"Treatment Arm A\",\n plotting_choices = \"split_by_max_obs\",\n max_obs_per_plot = 3\n)\nplots\n\n[[1]]\n\n\n\n\n\n\n\n\n\n[[2]]\n\n\n\n\n\n\n\n\n\n\nHere, patients’ individual baseline values will be shown for reference. Note that users can provide their own custom theme to the function via the ggtheme argument.\n\n\nCodeplots <- g_ipp(\n df = adlb_f,\n xvar = \"AVISIT\",\n yvar = \"AVAL\",\n xlab = \"Visit\",\n ylab = \"SGOT/ALT (U/L)\",\n id_var = \"Patient_ID\",\n title = \"Individual Patient Plots\",\n subtitle = \"Treatment Arm A\",\n add_baseline_hline = TRUE,\n yvar_baseline = \"BASE\",\n ggtheme = theme_minimal(),\n plotting_choices = \"split_by_max_obs\",\n max_obs_per_plot = 3\n)\nplots\n\n[[1]]\n\n\n\n\n\n\n\n\n\n[[2]]\n\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(tern)\n library(scda)\n library(dplyr)\n\n # use small sample size\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>% slice(1:15)\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>% filter(USUBJID %in% ADSL$USUBJID)\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADLB <- df_explicit_na(ADLB) %>%\n filter(AVISIT != \"SCREENING\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_ipp(\n label = \"Individual Patient Plot\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n value_choices(ADLB, c(\"ARMCD\")),\n \"ARM A\"\n ),\n paramcd = choices_selected(\n value_choices(ADLB, \"PARAMCD\"),\n \"ALT\"\n ),\n aval_var = choices_selected(\n variable_choices(ADLB, c(\"AVAL\")),\n \"AVAL\"\n ),\n avalu_var = choices_selected(\n variable_choices(ADLB, c(\"AVALU\")),\n \"AVALU\",\n fixed = TRUE\n ),\n id_var = choices_selected(\n variable_choices(ADLB, c(\"USUBJID\")),\n \"USUBJID\",\n fixed = TRUE\n ),\n visit_var = choices_selected(\n variable_choices(ADLB, c(\"AVISIT\")),\n \"AVISIT\"\n ),\n baseline_var = choices_selected(\n variable_choices(ADLB, c(\"BASE\")),\n \"BASE\",\n fixed = TRUE\n ),\n add_baseline_hline = FALSE,\n separate_by_obs = FALSE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:57:44 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 nestcolor_0.1.2.9009 \n [9] ggplot2_3.5.0 dplyr_1.1.4 \n[11] scda_0.1.6.9017 tern_0.9.3.9028 \n[13] rtables_0.6.6.9011 magrittr_2.0.3 \n[15] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] brio_1.1.4 jquerylib_0.1.4 estimability_1.5 \n[37] Rcpp_1.0.12 knitr_1.45 zoo_1.8-12 \n[40] teal.logger_0.2.0.9001 httpuv_1.6.14 Matrix_1.6-5 \n[43] splines_4.3.3 tidyselect_1.2.1 yaml_2.3.8 \n[46] codetools_0.2-19 websocket_1.4.1 processx_3.8.4 \n[49] teal.widgets_0.4.2.9009 lattice_0.22-6 tibble_3.2.1 \n[52] withr_3.0.0 coda_0.19-4.1 evaluate_0.23 \n[55] survival_3.5-8 pillar_1.9.0 shinycssloaders_1.0.0 \n[58] checkmate_2.3.1 shinyjs_2.1.0 generics_0.1.3 \n[61] chromote_0.2.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] tools_4.3.3 webshot2_0.1.1 webshot_0.5.5 \n[70] forcats_1.0.0 mvtnorm_1.2-4 grid_4.3.3 \n[73] tidyr_1.3.1 rbibutils_2.2.16 colorspace_2.1-0 \n[76] nlme_3.1-164 cli_3.6.2 textshaping_0.3.7 \n[79] fansi_1.0.6 geepack_1.3.10 gtable_0.3.4 \n[82] sass_0.4.9 digest_0.6.35 TH.data_1.1-2 \n[85] htmlwidgets_1.6.4 farver_2.1.1 memoise_2.0.1 \n[88] htmltools_0.5.7 lifecycle_1.0.4 shinyWidgets_0.8.2 \n[91] mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Pharmacokinetic", - "PKCG01" + "Other", + "IPPG01" ] }, { - "objectID": "graphs/pharmacokinetic/pkpg01.html", - "href": "graphs/pharmacokinetic/pkpg01.html", - "title": "PKPG01", + "objectID": "graphs/other/cig01.html", + "href": "graphs/other/cig01.html", + "title": "CIG01", "section": "", - "text": "Data Setup\nPlot with Two Cohorts\nPlot with Six Cohorts\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\nset.seed(123)\n\n# loading in the data\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\n# filtering the rows for specific data entries\nadpp <- adpp %>%\n filter(PARAMCD == \"RCPCINT\", AVISIT == \"CYCLE 1 DAY 1\", PPCAT == \"Plasma Drug X\")\n\n# adding or modifying specific columns\nadpp <- adpp %>%\n mutate(ARM = as.factor(TRT01A)) %>%\n mutate(PARAM1 = \"Fe\") %>% # re-format PK parameter name\n mutate(Time = as.numeric(gsub(\"PT*|\\\\.|H$\", \"\", PPENINT))) %>%\n droplevels() %>%\n df_explicit_na()\n\n# in cases where the cohorts are numeric it is possible to rename them\nlevels(adpp$ARM) <- c(\n \"A: Drug X\",\n \"C: Combination\"\n)\n\n\n\n\n\n\nCodeuse_title <- \"Plot of Mean (+/- SD) Cummulative Percentage (%) of Recovered Drug in Urine \\nby Analyte, Visit: PK Evaluable Patients\" \nuse_subtitle <- \"Analyte: Plasma Drug X \\nVisit: CYCLE 1 DAY 1 \\nPK Parameter:\"\nuse_footnote <- \"Program: \\nOutput:\"\n\nseparation_between_barplots <- 1.5\n\nresult <- g_lineplot(\n df = adpp,\n variables = control_lineplot_vars(\n x = \"Time\",\n y = \"AVAL\",\n group_var = \"ARM\",\n paramcd = \"PARAM1\",\n y_unit = \"AVALU\"\n ),\n alt_counts_df = adpp,\n y_lab = \"Cummulative Percentage\",\n x_lab = \"Time (hours)\",\n y_lab_add_paramcd = FALSE,\n y_lab_add_unit = TRUE,\n interval = \"mean_sdi\",\n whiskers = c(\"mean_sdi_lwr\", \"mean_sdi_upr\"),\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n ggtheme = theme_nest(),\n position = ggplot2::position_dodge(width = 2)\n)\n\nplot <- result + theme(plot.caption = element_text(hjust = 0)) +\n scale_x_continuous(breaks = c(12, 24))\nplot\n\n\n\n\n\n\n\n\n\nIn this case we need to process the data further by artificially adding more random rows. Of course this step is not necessary in the case that data already has more cohorts.\n\n\nCodeadpp_hck <- adpp %>%\n mutate(AVAL + 1 * rnorm(nrow(adpp), mean = 1, sd = 1)) %>%\n mutate(ARM = as.factor(sample(\n c(\n \"D: Drug D\",\n \"E: Drug E\",\n \"F: Drug F\",\n \"G: Drug G\"\n ),\n nrow(adpp),\n replace = TRUE,\n prob = c(0.4, 0.3, 0.2, 0.1)\n )))\n\nadpp <- bind_rows(adpp, adpp_hck)\n\nuse_title <- \"Plot of Mean (+/- SD) Cummulative Percentage (%) of Recovered Drug in Urine \\nby Analyte, Visit: PK Evaluable Patients\" \nuse_subtitle <- \"Analyte: Plasma Drug X \\nVisit: CYCLE 1 DAY 1 \\nPK Parameter:\"\nuse_footnote <- \"Program: \\nOutput:\"\n\nseparation_between_barplots <- 1.5\n\nresult <- g_lineplot(\n df = adpp,\n variables = control_lineplot_vars(\n x = \"Time\",\n y = \"AVAL\",\n group_var = \"ARM\",\n paramcd = \"PARAM1\",\n y_unit = \"AVALU\"\n ),\n alt_counts_df = adpp,\n y_lab = \"Cummulative Percentage\",\n x_lab = \"Time (hours)\",\n y_lab_add_paramcd = FALSE,\n y_lab_add_unit = TRUE,\n interval = \"mean_sdi\",\n whiskers = c(\"mean_sdi_lwr\", \"mean_sdi_upr\"),\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n ggtheme = theme_nest(),\n position = ggplot2::position_dodge(width = 2)\n)\n\nplot <- result + theme(plot.caption = element_text(hjust = 0)) +\n scale_x_continuous(breaks = c(12, 24))\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:54:37 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 labeling_0.4.3 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 farver_2.1.1 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nPlot of Mean and 95% CIs for Mean\nPlot of Confidence Interval Using a Different Stratification Variable\nPlot of Median and 95% CIs for Median\nPlot of Median and 95% CIs for Median Using Different Alpha Level\nTable of Mean and Median\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(ggplot2)\nlibrary(dplyr)\nlibrary(scda)\nlibrary(nestcolor)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n filter(PARAMCD == \"ALT\", AVISIT == \"BASELINE\")\n\n\n\n\nThe function stat_mean_ci from the tern package can be used with default values to draw the 95% confidence interval around the mean.\n\n\nCodeplot <- ggplot(\n data = adlb,\n mapping = aes(\n x = ARMCD, y = AVAL, color = SEX,\n lty = SEX, shape = SEX\n )\n) +\n stat_summary(\n fun.data = tern::stat_mean_ci,\n geom = \"errorbar\",\n width = 0.1,\n position = position_dodge(width = 0.5)\n ) +\n stat_summary(\n fun = mean,\n geom = \"point\",\n position = position_dodge(width = 0.5)\n ) +\n labs(\n title = \"Confidence Interval Plot by Treatment Group\",\n caption = \"Mean and 95% CIs for mean are displayed.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n )\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- ggplot(\n data = adlb,\n mapping = aes(\n x = ARMCD, y = AVAL, color = STRATA2,\n lty = STRATA2, shape = STRATA2\n )\n) +\n stat_summary(\n fun.data = tern::stat_mean_ci,\n geom = \"errorbar\",\n width = 0.1,\n position = position_dodge(width = 0.5)\n ) +\n stat_summary(\n fun = mean,\n geom = \"point\",\n position = position_dodge(width = 0.5)\n ) +\n labs(\n title = \"Confidence Interval Plot by Treatment Group\",\n caption = \"Mean and 95% CIs for mean are displayed.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n )\nplot\n\n\n\n\n\n\n\n\n\nThe function stat_median_ci from the tern package works similarly to stat_mean_ci.\n\n\nCodeplot <- ggplot(\n data = adlb,\n mapping = aes(\n x = ARMCD, y = AVAL, color = STRATA1,\n lty = STRATA1, shape = STRATA1\n )\n) +\n stat_summary(\n fun.data = stat_median_ci,\n geom = \"errorbar\",\n width = 0.1,\n position = position_dodge(width = 0.5)\n ) +\n stat_summary(\n fun = median,\n geom = \"point\",\n position = position_dodge(width = 0.5)\n ) +\n labs(\n title = \"Confidence Interval Plot by Treatment Group\",\n caption = \"Median and 95% CIs for median are displayed.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n )\nplot\n\n\n\n\n\n\n\n\n\nTo modify the confidence level for the estimation of the confidence interval, the call to stat_mean_ci (or stat_median_ci) can be slightly modified.\n\n\nCodeplot <- ggplot(\n data = adlb,\n mapping = aes(\n x = ARMCD, y = AVAL, color = SEX,\n lty = SEX, shape = SEX\n )\n) +\n stat_summary(\n fun.data = function(x) tern::stat_mean_ci(x, conf_level = 0.9),\n geom = \"errorbar\",\n width = 0.1,\n position = position_dodge(width = 0.5)\n ) +\n stat_summary(\n fun = mean,\n geom = \"point\",\n position = position_dodge(width = 0.5)\n ) +\n labs(\n title = \"Confidence Interval Plot by Treatment Group\",\n caption = \"Mean and 90% CIs for mean are displayed.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n )\nplot\n\n\n\n\n\n\n\n\n\nThe corresponding table is simply obtained using the rtables framework:\n\nCodelyt <- basic_table() %>%\n split_cols_by(var = \"ARMCD\") %>%\n analyze_vars(vars = \"AVAL\", .stats = c(\"mean_sd\", \"median\"))\ntable <- build_table(lyt = lyt, df = adlb)\ntable\n\n ARM A ARM B ARM C \n————————————————————————————————————————————————\nMean (SD) 17.7 (9.9) 18.7 (9.8) 19.5 (9.1)\nMedian 17.5 18.2 19.0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_ci(\n label = \"Confidence Interval Plot\",\n x_var = data_extract_spec(\n dataname = \"ADSL\",\n select = select_spec(\n choices = c(\"ARMCD\", \"BMRKR2\"),\n selected = c(\"ARMCD\"),\n multiple = FALSE,\n fixed = FALSE\n )\n ),\n y_var = data_extract_spec(\n dataname = \"ADLB\",\n filter = list(\n filter_spec(\n vars = \"PARAMCD\",\n choices = levels(ADLB$PARAMCD),\n selected = levels(ADLB$PARAMCD)[1],\n multiple = FALSE,\n label = \"Select lab:\"\n ),\n filter_spec(\n vars = \"AVISIT\",\n choices = levels(ADLB$AVISIT),\n selected = levels(ADLB$AVISIT)[1],\n multiple = FALSE,\n label = \"Select visit:\"\n )\n ),\n select = select_spec(\n label = \"Analyzed Value\",\n choices = c(\"AVAL\", \"CHG\"),\n selected = \"AVAL\",\n multiple = FALSE,\n fixed = FALSE\n )\n ),\n color = data_extract_spec(\n dataname = \"ADSL\",\n select = select_spec(\n label = \"Color by variable\",\n choices = c(\"SEX\", \"STRATA1\", \"STRATA2\"),\n selected = c(\"STRATA1\"),\n multiple = FALSE,\n fixed = FALSE\n )\n )\n )\n ),\n header = \"Example of Confidence Interval Plot\",\n footer = tags$p(\n class = \"text-muted\", \"Source: `teal.modules.clinical::tm_g_ci`\"\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:57:07 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 nestcolor_0.1.2.9009 \n [9] scda_0.1.6.9017 dplyr_1.1.4 \n[11] ggplot2_3.5.0 tern_0.9.3.9028 \n[13] rtables_0.6.6.9011 magrittr_2.0.3 \n[15] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[37] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[40] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[43] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[46] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[49] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[52] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[55] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[58] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[61] generics_0.1.3 chromote_0.2.0 munsell_0.5.0 \n[64] scales_1.3.0 xtable_1.8-4 glue_1.7.0 \n[67] emmeans_1.10.0 tools_4.3.3 webshot2_0.1.1 \n[70] webshot_0.5.5 mvtnorm_1.2-4 grid_4.3.3 \n[73] tidyr_1.3.1 rbibutils_2.2.16 colorspace_2.1-0 \n[76] nlme_3.1-164 cli_3.6.2 textshaping_0.3.7 \n[79] fansi_1.0.6 geepack_1.3.10 gtable_0.3.4 \n[82] sass_0.4.9 digest_0.6.35 TH.data_1.1-2 \n[85] htmlwidgets_1.6.4 farver_2.1.1 memoise_2.0.1 \n[88] htmltools_0.5.7 lifecycle_1.0.4 shinyWidgets_0.8.2 \n[91] mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Pharmacokinetic", - "PKPG01" + "Other", + "CIG01" ] }, { - "objectID": "graphs/pharmacokinetic/pkpg02.html", - "href": "graphs/pharmacokinetic/pkpg02.html", - "title": "PKPG02", - "section": "", - "text": "Data Setup\nSummary of Pharmacokinetic Parameters – Plasma\nSummary of Plasma Pharmacokinetic Parameters with Median Points\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\n# need adex for dose info and adpp for AUC max info\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\nadpp_a <- adpp %>%\n filter(\n PPSPEC == \"Plasma\",\n AVISITN == \"1\",\n PARAMCD == \"AUCIFO\"\n ) %>%\n mutate(AUCinf = AVAL)\n\nadex_a <- adex %>%\n filter(\n AVISITN == \"1\",\n PARAMCD == \"DOSE\"\n ) %>%\n mutate(Dose = AVAL) %>%\n select(USUBJID, Dose)\n\n# join the dose information to the adpp table\nadpp_adex <- left_join(adpp_a, adex_a, by = \"USUBJID\") %>%\n group_by(`ARM`) %>%\n mutate(count = paste0(`ARM`, \" (\", n(), \")\"))\n\n# set x and y variable names\nx_var <- \"Dose\"\ny_var <- \"AUCinf\"\n\n\n\n\n\n\nCode# calculate Summary Statistics (mean and sd) for each group\nSummaryStat <- adpp_adex %>% \n group_by(Dose = as.factor(Dose)) %>%\n summarise(AUCsd = sd(AUCinf), meanAUC = mean(AUCinf))\nSummaryStat$Dose <- as.numeric(as.character(SummaryStat$Dose)) \n\n# generate linear model\nmod1 <- lm(log(AUCinf) ~ log(Dose), adpp_adex)\n\n# obtain linear model coefficient values\ncf <- round(coef(mod1), 2)\n\n# generate linear model equation\neq <- paste0(\n \"y = \", cf[1],\n ifelse(sign(cf[2]) == 1, \" + \", \" - \"), abs(cf[2]), \" x , \",\n \"R²\",\n \" = \",\n signif(summary(mod1)$adj.r.squared, 3)\n)\n\nplot <- ggplot(adpp_adex, aes(x = .data[[x_var]], y = .data[[y_var]])) +\n annotate(geom = \"text\", x = min(adpp_adex[[x_var]]), y = max(adpp_adex[[y_var]]), label = eq, hjust = 0.1) +\n geom_point(size = 1, aes(color = factor(`count`))) +\n scale_x_continuous(\n name = \"Dose (mg/mL)\",\n breaks = unique(adpp_adex$Dose)\n ) +\n scale_y_continuous(\n name = paste(y_var, adpp_a$AVALU),\n transform = \"log\",\n breaks = exp(ceiling(seq(\n from = min(log(adpp_adex$AUCinf)), to = max(log(adpp_adex$AUCinf)),\n by = 1\n ))),\n labels = as.character(ceiling(seq(\n from = min(log(adpp_adex$AUCinf)),\n to = max(log(adpp_adex$AUCinf)), by = 1\n )))\n ) +\n geom_smooth(method = \"lm\", formula = y ~ x, se = FALSE, color = \"black\", linewidth = 0.5) +\n # Display error bars for each dosing group (this will only appear if the sd is less than the mean)\n geom_errorbar(\n data = SummaryStat,\n aes(x = `Dose`, y = `meanAUC`, ymin = `meanAUC` - `AUCsd`, ymax = `meanAUC` + AUCsd),\n width = .05,\n position = position_dodge(.1)\n ) +\n geom_point(data = SummaryStat, aes(x = Dose, y = meanAUC, size = 1), shape = 2, show.legend = FALSE) +\n ggtitle(paste(\n \"Dose-Proportionality Plot of Serum\", as.character(unique(adex$TRT01P)),\n y_var, \"in\", adpp_a$AVALU\n ), subtitle = \"Summary of serum PK parameters by treatment\") +\n labs(color = \"Treatment Arm\") +\n theme_nest()\n\nplot\n\n\n\n\n\n\n\n\n\n\n\nCode# calculate median for each group if preferred\nSummaryStat <- adpp_adex %>% \n group_by(Dose = as.factor(Dose)) %>%\n summarise(medAUC = median(AUCinf))\nSummaryStat$Dose <- as.numeric(as.character(SummaryStat$Dose)) \n\nplot <- ggplot(adpp_adex, aes(x = .data[[x_var]], y = .data[[y_var]])) +\n annotate(geom = \"text\", x = min(adpp_adex[[x_var]]), y = max(adpp_adex[[y_var]]), label = eq, hjust = 0.1) +\n geom_point(size = 1, aes(color = factor(`count`))) +\n geom_smooth(method = \"lm\", formula = y ~ x, se = FALSE, color = \"black\", linewidth = 0.5) +\n geom_point(data = SummaryStat, aes(x = Dose, y = medAUC, size = 1), shape = 2, show.legend = FALSE) +\n ggtitle(\n paste(\n \"Dose-Proportionality Plot of Serum\",\n as.character(unique(adex$TRT01P)),\n y_var,\n \"in\",\n adpp_a$AVALU\n ),\n subtitle = \"Summary of serum PK parameters by treatment\"\n ) +\n labs(color = \"Treatment Arm\") +\n scale_y_continuous(\n name = paste(y_var, adpp_a$AVALU),\n transform = \"log\",\n breaks = exp(ceiling(seq(from = min(log(adpp_adex$AUCinf)), to = max(log(adpp_adex$AUCinf)), by = 1))),\n labels = as.character(ceiling(seq(from = min(log(adpp_adex$AUCinf)), to = max(log(adpp_adex$AUCinf)), by = 1)))\n ) +\n scale_x_continuous(\n name = \"Dose (mg/mL)\",\n breaks = unique(adpp_adex$Dose)\n ) +\n theme_nest()\n\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:54:24 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 generics_0.1.3 knitr_1.45 rbibutils_2.2.16 \n[17] htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 tibble_3.2.1 \n[21] munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 utf8_1.2.4 \n[25] testthat_3.2.1 broom_1.0.5 xfun_0.42 cli_3.6.2 \n[29] mgcv_1.9-1 withr_3.0.0 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 nlme_3.1-164 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 farver_2.1.1 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", - "crumbs": [ - "Graphs", - "Pharmacokinetic", - "PKPG02" - ] + "objectID": "repro.html#reproducibility", + "href": "repro.html#reproducibility", + "title": "", + "section": "Reproducibility", + "text": "Reproducibility\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:56:52 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nloaded via a namespace (and not attached):\n [1] htmlwidgets_1.6.4 compiler_4.3.3 fastmap_1.1.1 cli_3.6.2 \n [5] tools_4.3.3 htmltools_0.5.7 yaml_2.3.8 codetools_0.2-19 \n [9] rmarkdown_2.26 knitr_1.45 jsonlite_1.8.8 xfun_0.42 \n[13] digest_0.6.35 rlang_1.1.3 evaluate_0.23 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload" }, { - "objectID": "graphs/pharmacokinetic/pkpg03.html", - "href": "graphs/pharmacokinetic/pkpg03.html", - "title": "PKPG03", + "objectID": "tables/exposure/ext01.html", + "href": "tables/exposure/ext01.html", + "title": "EXT01", "section": "", - "text": "Data Setup\nPlot of CMAX by Visit\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\n\n\n\n\n\nCode# filtered parameter\nadpp <- adpp %>% filter(PARAMCD == \"CMAX\", PPSPEC == \"Plasma\")\n\nuse_title <- paste0(\"Boxplot of \", as.character(unique(adpp$PARAM)), \" by Visit\")\nuse_subtitle <- paste0(\n \"Analyte:\\nPK Parameter: \",\n as.character(unique(adpp$PARAM)),\n \" (\",\n as.character(unique(adpp$AVALU)),\n \")\"\n)\nuse_footnote <- \"Program: \\nOutput:\"\n\nplot <- ggplot(adpp, aes(x = AVISIT, y = AVAL, fill = ACTARM)) +\n geom_boxplot(outlier.size = 2) +\n stat_boxplot(geom = \"errorbar\") +\n stat_summary(geom = \"point\", fun = \"mean\", col = \"black\", size = 5, shape = 8, position = position_dodge(0.75)) +\n geom_text(\n data = . %>% dplyr::group_by(AVISIT, ACTARM) %>% dplyr::filter(AVAL %in% boxplot.stats(AVAL)$out),\n aes(x = AVISIT, y = AVAL, label = SUBJID, color = ACTARM),\n size = 3, hjust = -0.2, position = position_dodge(0.75)\n ) +\n labs(\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n x = \"Visit\",\n y = paste0(as.character(unique(adpp$PARAM)), \" (\", as.character(unique(adpp$AVALU)), \")\")\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:54:11 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 labeling_0.4.3 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 broom_1.0.5 xfun_0.42 \n[29] cli_3.6.2 withr_3.0.0 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 farver_2.1.1 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable with Optional Analyses\nTable with User-Specified Categories for Missed Doses\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\nlibrary(tidyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadex <- df_explicit_na(adex)\n\nadex <- adex %>%\n filter(PARCAT1 == \"OVERALL\") %>%\n select(STUDYID, USUBJID, ACTARM, PARAMCD, PARAM, AVAL, PARCAT2) %>%\n mutate(\n PARAMCD = as.character(PARAMCD),\n AVALC = \"\"\n ) %>%\n droplevels()\n\n# Add new param tdurd for treatment duration.\nset.seed(99)\ntdurd_adsl <- adsl %>%\n select(STUDYID, USUBJID, ACTARM) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(1:150, size = nrow(adsl), replace = TRUE),\n AVALC = case_when(\n 0 <= AVAL & AVAL <= 30 ~ \"0 - 30\",\n 31 <= AVAL & AVAL <= 60 ~ \"31 - 60\",\n 61 <= AVAL & AVAL <= 90 ~ \"61 - 90\",\n TRUE ~ \">= 91\"\n )\n )\ntdurd <- adex %>%\n filter(PARAMCD == \"TNDOSE\") %>%\n select(STUDYID, USUBJID, PARCAT2) %>%\n left_join(tdurd_adsl, by = c(\"STUDYID\", \"USUBJID\"))\n\n# Add new param tndosmis for missed doses.\ntndosmis_adsl <- adsl %>%\n select(STUDYID, USUBJID, ACTARM) %>%\n mutate(\n PARAMCD = \"TNDOSMIS\",\n PARAM = \"Total number of missed doses during study\",\n AVAL = sample(0:20, size = nrow(adsl), replace = TRUE),\n AVALC = \"\"\n )\ntndosmis <- adex %>%\n filter(PARAMCD == \"TNDOSE\") %>%\n select(STUDYID, USUBJID, PARCAT2) %>%\n left_join(tndosmis_adsl, by = c(\"STUDYID\", \"USUBJID\"))\n\nadex <- dplyr::bind_rows(adex, tdurd, tndosmis) %>%\n mutate(PARAM = factor(\n PARAM,\n levels = c(\n \"Overall duration (days)\", \"Total dose administered\", \"Total number of doses administered\",\n \"Total number of missed doses during study\"\n )\n ))\n\n\n\n\n\nCode# When summary table contains only categorical or only numeric parameters\n\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARCAT2\", split_label = \"\\nParameter Category (Drug A/Drug B)\", label_pos = \"topleft\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun) %>%\n analyze_vars(vars = \"AVAL\")\n\nresult <- build_table(lyt = lyt, df = adex, alt_counts_df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination \nParameter Category (Drug A/Drug B) (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nDrug A \n Overall duration (days) \n n 75 67 75 \n Mean (SD) 74.3 (41.6) 79.0 (43.1) 74.2 (39.5) \n Median 77.0 80.0 78.0 \n Min - Max 5.0 - 149.0 2.0 - 150.0 1.0 - 147.0 \n Total dose administered \n n 75 67 75 \n Mean (SD) 6675.2 (1110.9) 6505.1 (1249.3) 6982.4 (1272.5)\n Median 6720.0 6480.0 7200.0 \n Min - Max 4800.0 - 9360.0 4080.0 - 9360.0 4320.0 - 9360.0\n Total number of doses administered \n n 75 67 75 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \n Total number of missed doses during study \n n 75 67 75 \n Mean (SD) 10.5 (5.9) 10.0 (6.1) 9.5 (5.5) \n Median 10.0 11.0 9.0 \n Min - Max 0.0 - 20.0 0.0 - 19.0 0.0 - 20.0 \nDrug B \n Overall duration (days) \n n 59 67 57 \n Mean (SD) 77.5 (40.5) 76.3 (41.0) 69.5 (46.2) \n Median 79.0 76.0 65.0 \n Min - Max 2.0 - 149.0 5.0 - 148.0 1.0 - 149.0 \n Total dose administered \n n 59 67 57 \n Mean (SD) 6630.5 (1334.0) 6297.3 (1291.1) 6505.3 (1080.7)\n Median 6720.0 6240.0 6480.0 \n Min - Max 4320.0 - 8880.0 4080.0 - 9120.0 4320.0 - 8640.0\n Total number of doses administered \n n 59 67 57 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \n Total number of missed doses during study \n n 59 67 57 \n Mean (SD) 9.1 (6.5) 10.0 (6.3) 10.7 (5.8) \n Median 9.0 10.0 11.0 \n Min - Max 0.0 - 20.0 0.0 - 20.0 1.0 - 20.0 \n\n\n\n\n\nCode# When summary table contains both categorical and numeric parameters,\n# developer needs to do pre-processing to transform dataset to wide format.\nadex_avalc_wide <- adex %>%\n filter(PARAMCD == \"TDURD\") %>%\n select(STUDYID, USUBJID, PARAMCD, AVALC, PARCAT2) %>%\n tidyr::pivot_wider(\n id_cols = c(STUDYID, USUBJID, PARCAT2),\n names_from = PARAMCD,\n values_from = AVALC\n ) %>%\n mutate(\n TDURDC = factor(TDURD, levels = c(\"0 - 30\", \"31 - 60\", \"61 - 90\", \">= 91\"))\n ) %>%\n select(-TDURD)\n\nanl <- adex %>%\n select(STUDYID, USUBJID, ACTARM, PARAMCD, AVAL, PARCAT2) %>%\n tidyr::pivot_wider(\n id_cols = c(STUDYID, USUBJID, ACTARM, PARCAT2),\n names_from = PARAMCD,\n values_from = AVAL\n ) %>%\n left_join(adex_avalc_wide, by = c(\"STUDYID\", \"USUBJID\", \"PARCAT2\")) %>%\n var_relabel(\n TDOSE = \"Total dose administered\",\n TNDOSE = \"Total number of doses administered\",\n TDURD = \"Overall duration (days)\",\n TNDOSMIS = \"Total number of missed doses during study\",\n TDURDC = \"Overall duration (days)\"\n )\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARCAT2\", split_label = \"\\nParameter Category (Drug A/Drug B)\", label_pos = \"topleft\") %>%\n analyze_vars(\n vars = c(\"TDURD\", \"TDURDC\", \"TDOSE\", \"TNDOSE\"),\n var_labels = var_labels(anl)[c(\"TDURD\", \"TDURDC\", \"TDOSE\", \"TNDOSE\")]\n )\n\nresult <- build_table(lyt = lyt, df = anl, alt_counts_df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination \nParameter Category (Drug A/Drug B) (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————\nDrug A \n Overall duration (days) \n n 75 67 75 \n Mean (SD) 74.3 (41.6) 79.0 (43.1) 74.2 (39.5) \n Median 77.0 80.0 78.0 \n Min - Max 5.0 - 149.0 2.0 - 150.0 1.0 - 147.0 \n Overall duration (days) \n n 75 67 75 \n 0 - 30 12 (16%) 12 (17.9%) 15 (20%) \n 31 - 60 18 (24%) 12 (17.9%) 14 (18.7%) \n 61 - 90 19 (25.3%) 15 (22.4%) 18 (24%) \n >= 91 26 (34.7%) 28 (41.8%) 28 (37.3%) \n Total dose administered \n n 75 67 75 \n Mean (SD) 6675.2 (1110.9) 6505.1 (1249.3) 6982.4 (1272.5)\n Median 6720.0 6480.0 7200.0 \n Min - Max 4800.0 - 9360.0 4080.0 - 9360.0 4320.0 - 9360.0\n Total number of doses administered \n n 75 67 75 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \nDrug B \n Overall duration (days) \n n 59 67 57 \n Mean (SD) 77.5 (40.5) 76.3 (41.0) 69.5 (46.2) \n Median 79.0 76.0 65.0 \n Min - Max 2.0 - 149.0 5.0 - 148.0 1.0 - 149.0 \n Overall duration (days) \n n 59 67 57 \n 0 - 30 8 (13.6%) 10 (14.9%) 16 (28.1%) \n 31 - 60 14 (23.7%) 16 (23.9%) 12 (21.1%) \n 61 - 90 15 (25.4%) 17 (25.4%) 11 (19.3%) \n >= 91 22 (37.3%) 24 (35.8%) 18 (31.6%) \n Total dose administered \n n 59 67 57 \n Mean (SD) 6630.5 (1334.0) 6297.3 (1291.1) 6505.3 (1080.7)\n Median 6720.0 6240.0 6480.0 \n Min - Max 4320.0 - 8880.0 4080.0 - 9120.0 4320.0 - 8640.0\n Total number of doses administered \n n 59 67 57 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \n\n\n\n\n\nCode# When summary table contains both categorical and numeric parameters,\n# developer needs to do pre-processing to transform dataset to wide format.\nadex_avalc_wide <- adex %>%\n filter(PARAMCD == \"TDURD\") %>%\n select(STUDYID, USUBJID, PARAMCD, AVALC, PARCAT2) %>%\n tidyr::pivot_wider(\n id_cols = c(STUDYID, USUBJID, PARCAT2),\n names_from = PARAMCD,\n values_from = AVALC\n ) %>%\n mutate(\n TDURDC = factor(TDURD, levels = c(\"0 - 30\", \"31 - 60\", \"61 - 90\", \">= 91\"))\n ) %>%\n select(-TDURD)\n\nanl <- adex %>%\n select(STUDYID, USUBJID, ACTARM, PARAMCD, AVAL, PARCAT2) %>%\n tidyr::pivot_wider(\n id_cols = c(STUDYID, USUBJID, ACTARM, PARCAT2),\n names_from = PARAMCD,\n values_from = AVAL\n ) %>%\n left_join(adex_avalc_wide, by = c(\"STUDYID\", \"USUBJID\", \"PARCAT2\")) %>%\n var_relabel(\n TDOSE = \"Total dose administered\",\n TNDOSE = \"Total number of doses administered\",\n TDURD = \"Overall duration (days)\",\n TNDOSMIS = \"Total number of missed doses during study\",\n TDURDC = \"Overall duration (days)\"\n )\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARCAT2\", split_label = \"\\nParameter Category (Drug A/Drug B)\", label_pos = \"topleft\") %>%\n analyze_vars(\n vars = c(\"TDURD\", \"TDURDC\", \"TDOSE\", \"TNDOSE\"),\n var_labels = var_labels(anl)[c(\"TDURD\", \"TDURDC\", \"TDOSE\", \"TNDOSE\")]\n ) %>%\n count_missed_doses(\n \"TNDOSMIS\",\n thresholds = c(1, 5, 10, 15),\n var_labels = \"Missed Doses\"\n )\n\nresult <- build_table(lyt = lyt, df = anl, alt_counts_df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination \nParameter Category (Drug A/Drug B) (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————\nDrug A \n Overall duration (days) \n n 75 67 75 \n Mean (SD) 74.3 (41.6) 79.0 (43.1) 74.2 (39.5) \n Median 77.0 80.0 78.0 \n Min - Max 5.0 - 149.0 2.0 - 150.0 1.0 - 147.0 \n Overall duration (days) \n n 75 67 75 \n 0 - 30 12 (16%) 12 (17.9%) 15 (20%) \n 31 - 60 18 (24%) 12 (17.9%) 14 (18.7%) \n 61 - 90 19 (25.3%) 15 (22.4%) 18 (24%) \n >= 91 26 (34.7%) 28 (41.8%) 28 (37.3%) \n Total dose administered \n n 75 67 75 \n Mean (SD) 6675.2 (1110.9) 6505.1 (1249.3) 6982.4 (1272.5)\n Median 6720.0 6480.0 7200.0 \n Min - Max 4800.0 - 9360.0 4080.0 - 9360.0 4320.0 - 9360.0\n Total number of doses administered \n n 75 67 75 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \n Missed Doses \n n 75 67 75 \n At least 1 missed dose 74 (55.2%) 63 (47%) 73 (55.3%) \n At least 5 missed doses 59 (44%) 49 (36.6%) 59 (44.7%) \n At least 10 missed doses 41 (30.6%) 38 (28.4%) 37 (28%) \n At least 15 missed doses 26 (19.4%) 21 (15.7%) 16 (12.1%) \nDrug B \n Overall duration (days) \n n 59 67 57 \n Mean (SD) 77.5 (40.5) 76.3 (41.0) 69.5 (46.2) \n Median 79.0 76.0 65.0 \n Min - Max 2.0 - 149.0 5.0 - 148.0 1.0 - 149.0 \n Overall duration (days) \n n 59 67 57 \n 0 - 30 8 (13.6%) 10 (14.9%) 16 (28.1%) \n 31 - 60 14 (23.7%) 16 (23.9%) 12 (21.1%) \n 61 - 90 15 (25.4%) 17 (25.4%) 11 (19.3%) \n >= 91 22 (37.3%) 24 (35.8%) 18 (31.6%) \n Total dose administered \n n 59 67 57 \n Mean (SD) 6630.5 (1334.0) 6297.3 (1291.1) 6505.3 (1080.7)\n Median 6720.0 6240.0 6480.0 \n Min - Max 4320.0 - 8880.0 4080.0 - 9120.0 4320.0 - 8640.0\n Total number of doses administered \n n 59 67 57 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \n Missed Doses \n n 59 67 57 \n At least 1 missed dose 56 (41.8%) 63 (47%) 57 (43.2%) \n At least 5 missed doses 41 (30.6%) 50 (37.3%) 47 (35.6%) \n At least 10 missed doses 27 (20.1%) 36 (26.9%) 31 (23.5%) \n At least 15 missed doses 17 (12.7%) 18 (13.4%) 20 (15.2%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEX <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n adex_labels <- unname(col_labels(ADEX))\n ADEX <- ADEX %>%\n filter(PARCAT1 == \"OVERALL\") %>%\n mutate(\n AVALCAT1 = case_when(\n PARAMCD == \"TDOSE\" & AVAL < 5000 ~ \"LOW\",\n PARAMCD == \"TDOSE\" & AVAL >= 5000 ~ \"HIGH\",\n PARAMCD == \"TNDOSE\" & AVAL < 10 ~ \"< 10\",\n PARAMCD == \"TNDOSE\" & AVAL >= 10 ~ \">= 10\"\n )\n )\n col_labels(ADEX) <- c(adex_labels, \"\")\n})\ndatanames <- c(\"ADSL\", \"ADEX\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADEX <- data[[\"ADEX\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Exposure Table\",\n dataname = \"ADEX\",\n arm_var = choices_selected(\n choices = variable_choices(ADEX, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADEX, c(\"PARCAT2\", \"PARAM\")),\n selected = c(\"PARCAT2\", \"PARAM\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADEX, c(\"AVAL\", \"AVALCAT1\")),\n selected = c(\"AVAL\", \"AVALCAT1\")\n ),\n paramcd = choices_selected(\n choices = value_choices(ADEX, \"PARAMCD\", \"PARAM\"),\n selected = c(\"TDOSE\", \"TNDOSE\")\n ),\n denominator = choices_selected(\n choices = c(\"n\", \"N\", \"omit\"),\n selected = \"N\"\n )\n )\n ), # Set initial filter state as single study drug to produce smaller table\n filter = teal_slices(\n teal_slice(\"ADEX\", \"PARCAT2\", selected = \"Drug A\"),\n teal_slice(\"ADEX\", \"AVAL\", selected = NULL)\n )\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADEX-filter-ADEX_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:56:48 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tidyr_1.3.1 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 rbibutils_2.2.16 \n[76] colorspace_2.1-0 nlme_3.1-164 cli_3.6.2 \n[79] fansi_1.0.6 viridisLite_0.4.2 geepack_1.3.10 \n[82] gtable_0.3.4 sass_0.4.9 digest_0.6.35 \n[85] TH.data_1.1-2 htmlwidgets_1.6.4 memoise_2.0.1 \n[88] htmltools_0.5.7 lifecycle_1.0.4 httr_1.4.7 \n[91] shinyWidgets_0.8.2 mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Graphs", - "Pharmacokinetic", - "PKPG03" + "Tables", + "Exposure", + "EXT01" ] }, { - "objectID": "listings/lab-results/lbl02b.html", - "href": "listings/lab-results/lbl02b.html", - "title": "LBL02B", + "objectID": "tables/lab-results/lbt04.html", + "href": "tables/lab-results/lbt04.html", + "title": "LBT04", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_x <- adlb %>%\n filter(\n !sub(\"-\", \"\", ATOXGR) %in% c(\"\", \"0\", \"1\"),\n LBTEST != \"\",\n !is.na(ADY),\n !ANRIND %in% c(\"\", \"NORMAL\")\n ) %>%\n mutate(\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n ADTM = toupper(format(as.Date(ADTM), \"%d%b%Y\")),\n AVAL = format(round(AVAL, 1), nsmall = 1),\n LBNRNG = paste(format(round(ANRLO, 1), nsmall = 1), format(round(ANRHI, 1), nsmall = 1), sep = \" - \"),\n ANRIND_GR = factor(\n case_when(\n ANRIND == \"LOW\" ~ paste0(\"L\", sub(\"-\", \"\", ATOXGR)),\n ANRIND == \"HIGH\" ~ paste0(\"H\", ATOXGR)\n )\n )\n ) %>%\n select(LBTEST, TRT01A, CPID, ADY, ADTM, AVAL, AVALU, LBNRNG, ANRIND_GR) %>%\n unique() %>%\n arrange(CPID, ADY) %>%\n group_by(LBTEST, CPID) %>%\n mutate(DLD = ADY - lag(ADY)) %>%\n ungroup() %>%\n mutate(DLD = ifelse(is.na(DLD), 0, DLD))\n\nout <- adlb_x %>%\n select(LBTEST, TRT01A, CPID, ADY, ADTM, DLD, AVAL, AVALU, LBNRNG, ANRIND_GR)\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n LBTEST = \"Lab Test\",\n TRT01A = \"Treatment\",\n CPID = \"Center/Patient ID\",\n ADY = \"Study\\nDay\",\n ADTM = \"Date\",\n DLD = \"Days Since\\nLast Dose of\\nStudy Drug\",\n AVAL = \"Result\",\n AVALU = \"Unit\",\n LBNRNG = \"Lab Normal\\nRange\",\n ANRIND_GR = \"NCI\\nCTCAE\\nGrade\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"LBTEST\", \"CPID\"),\n disp_cols = names(out),\n main_title = \"Listing of Laboratory Abnormalities Defined by NCI CTCAE Grade >= 2\",\n main_footer = \"NCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Laboratory Abnormalities Defined by NCI CTCAE Grade >= 2\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Days Since NCI \n Study Last Dose of Lab Normal CTCAE\nTreatment Lab Test Center/Patient ID Day Date Study Drug Result Unit Range Grade\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X Alanine Aminotransferase Measurement BRA-1/id-105 80 27MAY2020 0 4.3 U/L 7.0 - 55.0 L4 \n 398 10APR2021 318 3.7 U/L 7.0 - 55.0 L3 \n CAN-1/id-18 465 12APR2022 0 1.8 U/L 7.0 - 55.0 L2 \n CHN-1/id-133 127 13DEC2020 0 5.6 U/L 7.0 - 55.0 L2 \n 197 21FEB2021 70 1.2 U/L 7.0 - 55.0 L4 \n CHN-1/id-199 277 11OCT2020 0 5.3 U/L 7.0 - 55.0 L4 \n 672 10NOV2021 395 6.8 U/L 7.0 - 55.0 L2 \n CHN-1/id-235 348 25JUN2020 0 3.0 U/L 7.0 - 55.0 L3 \n CHN-1/id-275 364 01JUN2021 0 5.1 U/L 7.0 - 55.0 L2 \n CHN-1/id-277 483 12MAY2022 0 1.1 U/L 7.0 - 55.0 L4 \n CHN-1/id-287 182 23MAY2020 0 5.9 U/L 7.0 - 55.0 L2 \n 191 01JUN2020 9 5.3 U/L 7.0 - 55.0 L3 \n 515 21APR2021 324 2.9 U/L 7.0 - 55.0 L4 \n CHN-1/id-315 289 05JUN2020 0 4.6 U/L 7.0 - 55.0 L4 \n 599 11APR2021 310 5.2 U/L 7.0 - 55.0 L4 \n CHN-1/id-316 971 14MAY2023 0 3.6 U/L 7.0 - 55.0 L4 \n CHN-1/id-360 689 01APR2022 0 4.7 U/L 7.0 - 55.0 L2 \n CHN-1/id-371 81 01MAY2021 0 5.9 U/L 7.0 - 55.0 L2 \n CHN-1/id-47 236 11SEP2020 0 4.4 U/L 7.0 - 55.0 L3 \n CHN-1/id-53 98 13FEB2020 0 6.4 U/L 7.0 - 55.0 L2 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:54:03 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\nadlb_f <- adlb %>%\n filter(ONTRTFL == \"Y\", ANRIND != \"<Missing>\") %>%\n var_relabel(\n PARAM = \"Laboratory Test\",\n ANRIND = \"Direction of Abnormality\"\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = obj_label(adlb_f$PARAM)\n ) %>%\n count_abnormal(\n var = \"ANRIND\",\n abnormal = list(Low = c(\"LOW\", \"LOW LOW\"), High = c(\"HIGH\", \"HIGH HIGH\")),\n exclude_base_abn = TRUE\n ) %>%\n append_varlabels(adlb_f, \"ANRIND\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adlb_f, alt_counts_df = adsl)\n\nresult\n\nLaboratory Test A: Drug X B: Placebo C: Combination\n Direction of Abnormality (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Low 57/113 (50.4%) 62/117 (53%) 61/123 (49.6%)\n High 0/134 0/134 0/132 \nC-Reactive Protein Measurement \n Low 78/119 (65.5%) 71/113 (62.8%) 62/112 (55.4%)\n High 69/114 (60.5%) 57/112 (50.9%) 58/115 (50.4%)\nImmunoglobulin A Measurement \n Low 0/134 0/134 0/132 \n High 64/119 (53.8%) 62/116 (53.4%) 62/113 (54.9%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n col_relabel(PARAM = \"Laboratory Test\", ANRIND = \"Direction of Abnormality\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_abnormality(\n label = \"Abnormality Table\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"LBCAT\", \"PARAM\", \"AVISIT\")),\n selected = c(\"LBCAT\", \"PARAM\"),\n keep_order = TRUE\n ),\n grade = choices_selected(\n choices = variable_choices(ADLB, subset = \"ANRIND\"),\n selected = \"ANRIND\",\n fixed = TRUE\n ),\n abnormal = list(low = \"LOW\", high = \"HIGH\"),\n exclude_base_abn = TRUE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:56:23 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", + "Tables", "Lab Results", - "LBL02B" + "LBT04" ] }, { - "objectID": "listings/lab-results/lbl02a_rls.html", - "href": "listings/lab-results/lbl02a_rls.html", - "title": "LBL02A_RLS", + "objectID": "tables/lab-results/lbt13.html", + "href": "tables/lab-results/lbt13.html", + "title": "LBT13", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_x <- adlb %>%\n filter(\n LBTEST != \"\"\n ) %>%\n mutate(\n LBTEST_U = paste0(LBTEST, \" (\", AVALU, \")\"),\n CPID = paste(SITEID, SUBJID, sep = \"/\")\n ) %>%\n mutate(CRC = paste(\"40%\", \"40%\", sep = \" / \"))\n\nstd_rng <- adlb_x %>%\n group_by(LBTEST_U) %>%\n summarise(\n STD_RNG_LO = stats::quantile(AVAL, probs = c(0.1), na.rm = TRUE),\n STD_RNG_HI = stats::quantile(AVAL, probs = c(0.9), na.rm = TRUE)\n ) %>%\n ungroup()\n\nadlb_x <- adlb_x %>%\n left_join(std_rng, by = \"LBTEST_U\") %>%\n mutate(\n AVAL = format(round(AVAL, 1), nsmall = 1),\n PCHG = format(round(PCHG, 1), nsmall = 1),\n LBNRNG = paste(ANRLO, ANRHI, sep = \" - \"),\n STD_RNG_LO = format(round(STD_RNG_LO, 1), nsmall = 1),\n STD_RNG_HI = format(round(STD_RNG_HI, 1), nsmall = 1)\n ) %>%\n mutate(\n STD_RNG = paste(STD_RNG_LO, STD_RNG_HI, sep = \" - \"),\n ANRIND = factor(case_when(\n ANRIND == \"LOW\" & AVAL > STD_RNG_LO ~ \"L\",\n ANRIND == \"HIGH\" & AVAL < STD_RNG_HI ~ \"H\",\n ANRIND == \"LOW\" & AVAL <= STD_RNG_LO ~ \"LL\",\n ANRIND == \"HIGH\" & AVAL >= STD_RNG_HI ~ \"HH\",\n TRUE ~ \"\"\n ))\n ) %>%\n select(LBTEST_U, TRT01A, CPID, ADY, AVAL, PCHG, STD_RNG, LBNRNG, CRC, ANRIND) %>%\n unique() %>%\n arrange(CPID, ADY) %>%\n group_by(LBTEST_U, CPID) %>%\n mutate(DLD = ADY - lag(ADY)) %>%\n ungroup() %>%\n mutate(DLD = ifelse(is.na(DLD), 0, DLD))\n\nout <- adlb_x %>%\n select(LBTEST_U, TRT01A, CPID, ADY, DLD, AVAL, PCHG, STD_RNG, LBNRNG, CRC, ANRIND)\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n LBTEST_U = \"Lab Test (Unit)\",\n TRT01A = \"Treatment\",\n CPID = \"Center/Patient ID\",\n ADY = \"Study\\nDay\",\n DLD = \"Days Since\\nLast Dose of\\nStudy Drug\",\n AVAL = \"Result\",\n PCHG = \"% Change\\nfrom\\nBaseline\",\n STD_RNG = \"Standard\\nReference\\nRange\",\n LBNRNG = \"Marked\\nReference\\nRange\",\n CRC = \"Clinically\\nRelevant\\nChange\\nDec./Inc.\",\n ANRIND = \"Abnormality\\nFlag\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"LBTEST_U\", \"CPID\"),\n disp_cols = names(out),\n main_title = \"Listing of Laboratory Abnormalities Defined by Roche Safety Lab Standardization\",\n main_footer = \"Standard reference range, marked reference range and clinically relevant change from baseline are from the Roche Safety Lab Standardization guideline. Abnormalities are flagged as high (H) or low (L) if outside the standard reference range; high high (HH) or low low (LL) if outside the marked reference range with a clinically relevant change from baseline.\" \n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Laboratory Abnormalities Defined by Roche Safety Lab Standardization\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Clinically \n Days Since % Change Standard Marked Relevant \n Study Last Dose of from Reference Reference Change Abnormality\nTreatment Lab Test (Unit) Center/Patient ID Day Study Drug Result Baseline Range Range Dec./Inc. Flag \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X Alanine Aminotransferase Measurement (U/L) BRA-1/id-105 80 0 4.3 NA 5.5 - 31.1 7 - 55 40% / 40% LL \n 149 69 24.7 0.0 5.5 - 31.1 7 - 55 40% / 40% \n 314 165 24.9 0.7 5.5 - 31.1 7 - 55 40% / 40% \n 398 84 3.7 -85.2 5.5 - 31.1 7 - 55 40% / 40% LL \n 470 72 18.5 -24.9 5.5 - 31.1 7 - 55 40% / 40% \n 528 58 7.7 -68.7 5.5 - 31.1 7 - 55 40% / 40% \n 535 7 23.5 -4.8 5.5 - 31.1 7 - 55 40% / 40% \n BRA-1/id-134 225 0 7.4 NA 5.5 - 31.1 7 - 55 40% / 40% \n 227 2 16.4 0.0 5.5 - 31.1 7 - 55 40% / 40% \n 255 28 11.2 -32.0 5.5 - 31.1 7 - 55 40% / 40% \n 269 14 15.9 -3.2 5.5 - 31.1 7 - 55 40% / 40% \n 357 88 24.4 48.3 5.5 - 31.1 7 - 55 40% / 40% \n 436 79 16.0 -2.4 5.5 - 31.1 7 - 55 40% / 40% \n 440 4 17.2 4.8 5.5 - 31.1 7 - 55 40% / 40% \n BRA-1/id-42 176 0 16.6 NA 5.5 - 31.1 7 - 55 40% / 40% \n 477 301 16.5 0.0 5.5 - 31.1 7 - 55 40% / 40% \n 534 57 18.7 13.4 5.5 - 31.1 7 - 55 40% / 40% \n 550 16 11.4 -30.6 5.5 - 31.1 7 - 55 40% / 40% \n 569 19 21.7 31.3 5.5 - 31.1 7 - 55 40% / 40% \n 608 39 24.6 49.2 5.5 - 31.1 7 - 55 40% / 40% \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nStandard reference range, marked reference range and clinically relevant change from baseline are from the Roche Safety Lab Standardization guideline. Abnormalities are flagged as high (H) or low (L) if outside the standard reference range; high high (HH) or low low (LL) if outside the marked reference range with a clinically relevant change from baseline.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:55 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table (Low)\nStandard Table (High)\nTable Without Patients with Missing Baseline (Low)\nTable with Missing Baseline Considered as Grade 0 (High)\nTable with Fill-In of Grades (High)\nteal App\nReproducibility\n\n\n\nPlease note that for each variant, the adlb dataset needs to be filtered on correct flags like WGRLOVFL, WGRHIVFL, et al., otherwise the layout function will not return the correct counts. There is an option to create a record for a lab test where no record is found at that visit. If you specified add_derived_type = \"PHANTOM\" & dtype_phantom_cond, you don’t have to use the h_adsl_adlb_merge_using_worst_flag function to preprocess your adlb dataset. Otherwise please follow the pre-processing steps below before applying the layout functions.\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\n# Please note that in real clinical data, population flag like SAFFL, and parameter category like PARCAT2 needs to be\n# selected properly.\nadsl_f <- adsl %>% filter(SAFFL == \"Y\")\nadlb <- adlb %>% filter(PARAMCD == \"CRP\" & SAFFL == \"Y\")\n\n\n\n\nNote that the worst laboratory flag (below WGRLOVFL) must be selected appropriately to match the direction of abnormality (here Low). New grouping variables ATOXGR_GP and BTOXGR_GP are created to display the correct output.\n\nCodeadlb_f <- adlb %>% filter(WGRLOVFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- adsl_f %>%\n h_adsl_adlb_merge_using_worst_flag(\n adlb_f,\n worst_flag = c(\"WGRLOVFL\" = \"Y\"),\n by_visit = TRUE,\n no_fillin_visits = c(\"SCREENING\", \"BASELINE\", \"UNSCHEDULED\")\n )\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = case_when(\n ATOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n ATOXGR == -1 ~ \"1\",\n ATOXGR == -2 ~ \"2\",\n ATOXGR == -3 ~ \"3\",\n ATOXGR == -4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n )\n ) %>%\n mutate(\n BTOXGR_GP = case_when(\n BTOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n BTOXGR == -1 ~ \"1\",\n BTOXGR == -2 ~ \"2\",\n BTOXGR == -3 ~ \"3\",\n BTOXGR == -4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n )\n )\n\nadlb_out <- adlb_out %>% mutate(\n AVISIT = forcats::fct_reorder(AVISIT, AVISITN),\n ATOXGR_GP = factor(ATOXGR_GP, levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n BTOXGR_GP = factor(BTOXGR_GP, levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n)\n\nadlb_out <- adlb_out %>%\n var_relabel(\n PARAMCD = \"Parameter Code\",\n AVISIT = \"Visit\",\n ATOXGR_GP = \"NCI CTCAE Grade at Visit\",\n BTOXGR_GP = \"Baseline NCI CTCAE Grade\"\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAMCD\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$PARAMCD)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$AVISIT)\n ) %>%\n split_rows_by(\n \"ATOXGR_GP\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$ATOXGR_GP)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\")) %>%\n count_occurrences(\"BTOXGR_GP\", denom = \"n\", drop = TRUE) %>%\n append_varlabels(adlb_out, \"BTOXGR_GP\", indent = 3L) %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter Code \n Visit \n NCI CTCAE Grade at Visit A: Drug X B: Placebo C: Combination\n Baseline NCI CTCAE Grade (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nCRP \n WEEK 1 DAY 8 \n Not Low (n) 116 110 101 \n Not Low 103 (88.8%) 91 (82.7%) 88 (87.1%) \n 1 3 (2.6%) 5 (4.5%) 6 (5.9%) \n 2 4 (3.4%) 9 (8.2%) 2 (2.0%) \n 3 3 (2.6%) 4 (3.6%) 4 (4.0%) \n 4 3 (2.6%) 1 (0.9%) 1 (1.0%) \n 1 (n) 4 7 5 \n Not Low 3 (75.0%) 7 (100%) 4 (80.0%) \n 3 1 (25.0%) 0 1 (20.0%) \n 2 (n) 5 6 11 \n Not Low 5 (100%) 5 (83.3%) 8 (72.7%) \n 1 0 0 1 (9.1%) \n 3 0 0 2 (18.2%) \n 4 0 1 (16.7%) 0 \n 3 (n) 6 8 5 \n Not Low 6 (100%) 7 (87.5%) 5 (100%) \n 3 0 1 (12.5%) 0 \n 4 (n) 3 3 10 \n Not Low 2 (66.7%) 3 (100%) 7 (70.0%) \n 1 0 0 2 (20.0%) \n 2 1 (33.3%) 0 0 \n 4 0 0 1 (10.0%) \n WEEK 2 DAY 15 \n Not Low (n) 106 111 116 \n Not Low 93 (87.7%) 93 (83.8%) 100 (86.2%) \n 1 3 (2.8%) 4 (3.6%) 8 (6.9%) \n 2 5 (4.7%) 7 (6.3%) 2 (1.7%) \n 3 2 (1.9%) 5 (4.5%) 6 (5.2%) \n 4 3 (2.8%) 2 (1.8%) 0 \n 1 (n) 15 9 2 \n Not Low 13 (86.7%) 8 (88.9%) 1 (50.0%) \n 2 0 1 (11.1%) 0 \n 3 2 (13.3%) 0 0 \n 4 0 0 1 (50.0%) \n 2 (n) 3 3 6 \n Not Low 3 (100%) 3 (100%) 4 (66.7%) \n 1 0 0 1 (16.7%) \n 3 0 0 1 (16.7%) \n 3 (n) 7 7 6 \n Not Low 7 (100%) 6 (85.7%) 5 (83.3%) \n 2 0 1 (14.3%) 0 \n 4 0 0 1 (16.7%) \n 4 (n) 3 4 2 \n Not Low 3 (100%) 3 (75.0%) 2 (100%) \n 1 0 1 (25.0%) 0 \n WEEK 3 DAY 22 \n Not Low (n) 119 110 114 \n Not Low 104 (87.4%) 92 (83.6%) 94 (82.5%) \n 1 3 (2.5%) 4 (3.6%) 9 (7.9%) \n 2 5 (4.2%) 7 (6.4%) 2 (1.8%) \n 3 4 (3.4%) 5 (4.5%) 7 (6.1%) \n 4 3 (2.5%) 2 (1.8%) 2 (1.8%) \n 1 (n) 9 9 6 \n Not Low 9 (100%) 7 (77.8%) 6 (100%) \n 2 0 2 (22.2%) 0 \n 2 (n) 1 7 3 \n Not Low 1 (100%) 6 (85.7%) 3 (100%) \n 1 0 1 (14.3%) 0 \n 3 (n) 4 5 4 \n Not Low 4 (100%) 5 (100%) 4 (100%) \n 4 (n) 1 3 5 \n Not Low 1 (100%) 3 (100%) 5 (100%) \n WEEK 4 DAY 29 \n Not Low (n) 101 119 111 \n Not Low 89 (88.1%) 100 (84.0%) 96 (86.5%) \n 1 3 (3.0%) 4 (3.4%) 6 (5.4%) \n 2 4 (4.0%) 8 (6.7%) 1 (0.9%) \n 3 2 (2.0%) 5 (4.2%) 6 (5.4%) \n 4 3 (3.0%) 2 (1.7%) 2 (1.8%) \n 1 (n) 10 5 6 \n Not Low 9 (90.0%) 5 (100%) 5 (83.3%) \n 1 0 0 1 (16.7%) \n 2 1 (10.0%) 0 0 \n 2 (n) 13 4 6 \n Not Low 13 (100%) 3 (75.0%) 5 (83.3%) \n 1 0 0 1 (16.7%) \n 2 0 1 (25.0%) 0 \n 3 (n) 8 2 6 \n Not Low 6 (75.0%) 1 (50.0%) 5 (83.3%) \n 1 0 1 (50.0%) 0 \n 2 0 0 1 (16.7%) \n 3 2 (25.0%) 0 0 \n 4 (n) 2 4 3 \n Not Low 2 (100%) 4 (100%) 1 (33.3%) \n 1 0 0 1 (33.3%) \n 3 0 0 1 (33.3%) \n WEEK 5 DAY 36 \n Not Low (n) 115 112 111 \n Not Low 102 (88.7%) 94 (83.9%) 96 (86.5%) \n 1 2 (1.7%) 4 (3.6%) 6 (5.4%) \n 2 5 (4.3%) 7 (6.2%) 2 (1.8%) \n 3 3 (2.6%) 5 (4.5%) 5 (4.5%) \n 4 3 (2.6%) 2 (1.8%) 2 (1.8%) \n 1 (n) 5 7 6 \n Not Low 5 (100%) 4 (57.1%) 5 (83.3%) \n 1 0 1 (14.3%) 1 (16.7%) \n 2 0 2 (28.6%) 0 \n 2 (n) 5 11 6 \n Not Low 5 (100%) 11 (100%) 6 (100%) \n 3 (n) 8 2 7 \n Not Low 6 (75.0%) 2 (100%) 4 (57.1%) \n 1 1 (12.5%) 0 1 (14.3%) \n 3 1 (12.5%) 0 2 (28.6%) \n 4 (n) 1 2 2 \n Not Low 1 (100%) 2 (100%) 1 (50.0%) \n 1 0 0 1 (50.0%) \n\n\n\n\nNote that the worst laboratory flag (below WGRHIVFL) must be selected appropriately to match the direction of abnormality (here High). New grouping variables ATOXGR_GP and BTOXGR_GP are created to display the correct output.\n\nCodeadlb_f <- adlb %>% filter(WGRHIVFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- adsl_f %>%\n h_adsl_adlb_merge_using_worst_flag(\n adlb_f,\n worst_flag = c(\"WGRHIVFL\" = \"Y\"),\n by_visit = TRUE,\n no_fillin_visits = c(\"SCREENING\", \"BASELINE\", \"UNSCHEDULED\")\n )\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n )\n ) %>%\n mutate(\n BTOXGR_GP = case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n )\n )\n\nadlb_out <- adlb_out %>% mutate(\n AVISIT = forcats::fct_reorder(AVISIT, AVISITN),\n ATOXGR_GP = factor(ATOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n BTOXGR_GP = factor(BTOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n)\n\nadlb_out <- adlb_out %>%\n var_relabel(\n PARAMCD = \"Parameter Code\",\n AVISIT = \"Visit\",\n ATOXGR_GP = \"NCI CTCAE Grade at Visit\",\n BTOXGR_GP = \"Baseline NCI CTCAE Grade\"\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAMCD\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$PARAMCD)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$AVISIT)\n ) %>%\n split_rows_by(\n \"ATOXGR_GP\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$ATOXGR_GP)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\")) %>%\n count_occurrences(\"BTOXGR_GP\", denom = \"n\", drop = TRUE) %>%\n append_varlabels(adlb_out, \"BTOXGR_GP\", indent = 3L) %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter Code \n Visit \n NCI CTCAE Grade at Visit A: Drug X B: Placebo C: Combination\n Baseline NCI CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————\nCRP \n WEEK 1 DAY 8 \n Not High (n) 111 110 112 \n Not High 93 (83.8%) 92 (83.6%) 98 (87.5%) \n 1 8 (7.2%) 7 (6.4%) 5 (4.5%) \n 2 2 (1.8%) 6 (5.5%) 7 (6.2%) \n 3 6 (5.4%) 3 (2.7%) 2 (1.8%) \n 4 2 (1.8%) 2 (1.8%) 0 \n 1 (n) 8 11 6 \n Not High 7 (87.5%) 11 (100%) 5 (83.3%) \n 3 1 (12.5%) 0 1 (16.7%) \n 2 (n) 6 4 5 \n Not High 6 (100%) 1 (25.0%) 4 (80.0%) \n 1 0 3 (75.0%) 1 (20.0%) \n 3 (n) 8 3 4 \n Not High 7 (87.5%) 3 (100%) 4 (100%) \n 4 1 (12.5%) 0 0 \n 4 (n) 1 6 5 \n Not High 1 (100%) 5 (83.3%) 4 (80.0%) \n 1 0 0 1 (20.0%) \n 3 0 1 (16.7%) 0 \n WEEK 2 DAY 15 \n Not High (n) 117 113 113 \n Not High 99 (84.6%) 95 (84.1%) 100 (88.5%) \n 1 7 (6.0%) 6 (5.3%) 4 (3.5%) \n 2 2 (1.7%) 6 (5.3%) 6 (5.3%) \n 3 6 (5.1%) 4 (3.5%) 3 (2.7%) \n 4 3 (2.6%) 2 (1.8%) 0 \n 1 (n) 6 9 7 \n Not High 5 (83.3%) 8 (88.9%) 6 (85.7%) \n 1 0 1 (11.1%) 0 \n 2 0 0 1 (14.3%) \n 3 1 (16.7%) 0 0 \n 2 (n) 4 4 6 \n Not High 4 (100%) 4 (100%) 3 (50.0%) \n 1 0 0 3 (50.0%) \n 3 (n) 5 3 5 \n Not High 4 (80.0%) 2 (66.7%) 5 (100%) \n 1 1 (20.0%) 1 (33.3%) 0 \n 4 (n) 2 5 1 \n Not High 2 (100%) 3 (60.0%) 1 (100%) \n 1 0 2 (40.0%) 0 \n WEEK 3 DAY 22 \n Not High (n) 110 111 114 \n Not High 92 (83.6%) 94 (84.7%) 98 (86.0%) \n 1 8 (7.3%) 9 (8.1%) 7 (6.1%) \n 2 2 (1.8%) 5 (4.5%) 6 (5.3%) \n 3 5 (4.5%) 2 (1.8%) 3 (2.6%) \n 4 3 (2.7%) 1 (0.9%) 0 \n 1 (n) 7 8 7 \n Not High 7 (100%) 5 (62.5%) 6 (85.7%) \n 1 0 1 (12.5%) 0 \n 2 0 1 (12.5%) 1 (14.3%) \n 3 0 1 (12.5%) 0 \n 2 (n) 9 7 5 \n Not High 9 (100%) 6 (85.7%) 5 (100%) \n 3 0 1 (14.3%) 0 \n 3 (n) 6 3 4 \n Not High 5 (83.3%) 2 (66.7%) 4 (100%) \n 3 1 (16.7%) 0 0 \n 4 0 1 (33.3%) 0 \n 4 (n) 2 5 2 \n Not High 1 (50.0%) 5 (100%) 2 (100%) \n 3 1 (50.0%) 0 0 \n WEEK 4 DAY 29 \n Not High (n) 115 117 113 \n Not High 97 (84.3%) 101 (86.3%) 99 (87.6%) \n 1 8 (7.0%) 7 (6.0%) 6 (5.3%) \n 2 2 (1.7%) 6 (5.1%) 5 (4.4%) \n 3 7 (6.1%) 3 (2.6%) 3 (2.7%) \n 4 1 (0.9%) 0 0 \n 1 (n) 4 3 11 \n Not High 4 (100%) 2 (66.7%) 10 (90.9%) \n 2 0 0 1 (9.1%) \n 4 0 1 (33.3%) 0 \n 2 (n) 6 4 2 \n Not High 6 (100%) 3 (75.0%) 2 (100%) \n 1 0 1 (25.0%) 0 \n 3 (n) 6 7 4 \n Not High 5 (83.3%) 4 (57.1%) 4 (100%) \n 1 0 1 (14.3%) 0 \n 3 0 1 (14.3%) 0 \n 4 1 (16.7%) 1 (14.3%) 0 \n 4 (n) 3 3 2 \n Not High 2 (66.7%) 2 (66.7%) 0 \n 1 0 1 (33.3%) 1 (50.0%) \n 2 0 0 1 (50.0%) \n 4 1 (33.3%) 0 0 \n WEEK 5 DAY 36 \n Not High (n) 111 111 119 \n Not High 95 (85.6%) 95 (85.6%) 104 (87.4%) \n 1 6 (5.4%) 8 (7.2%) 6 (5.0%) \n 2 1 (0.9%) 5 (4.5%) 6 (5.0%) \n 3 6 (5.4%) 2 (1.8%) 3 (2.5%) \n 4 3 (2.7%) 1 (0.9%) 0 \n 1 (n) 8 11 5 \n Not High 7 (87.5%) 9 (81.8%) 4 (80.0%) \n 1 0 1 (9.1%) 0 \n 2 0 0 1 (20.0%) \n 3 1 (12.5%) 1 (9.1%) 0 \n 2 (n) 7 6 3 \n Not High 5 (71.4%) 3 (50.0%) 2 (66.7%) \n 1 1 (14.3%) 1 (16.7%) 1 (33.3%) \n 2 1 (14.3%) 1 (16.7%) 0 \n 4 0 1 (16.7%) 0 \n 3 (n) 3 3 4 \n Not High 3 (100%) 3 (100%) 4 (100%) \n 4 (n) 5 3 1 \n Not High 4 (80.0%) 2 (66.7%) 1 (100%) \n 1 1 (20.0%) 0 0 \n 3 0 1 (33.3%) 0 \n\n\n\n\nNote that missing baseline values are filtered out in the pre-processing step.\n\nCodeadlb_f <- adlb %>% filter(WGRLOVFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- adsl_f %>%\n h_adsl_adlb_merge_using_worst_flag(\n adlb_f,\n worst_flag = c(\"WGRLOVFL\" = \"Y\"),\n by_visit = TRUE,\n no_fillin_visits = c(\"SCREENING\", \"BASELINE\", \"UNSCHEDULED\")\n )\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n filter(BTOXGR != \"<Missing>\") %>% # filter out missing baseline grade\n mutate(\n ATOXGR_GP = case_when(\n ATOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n ATOXGR == -1 ~ \"1\",\n ATOXGR == -2 ~ \"2\",\n ATOXGR == -3 ~ \"3\",\n ATOXGR == -4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n )\n ) %>%\n mutate(\n BTOXGR_GP = case_when(\n BTOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n BTOXGR == -1 ~ \"1\",\n BTOXGR == -2 ~ \"2\",\n BTOXGR == -3 ~ \"3\",\n BTOXGR == -4 ~ \"4\"\n )\n )\n\nadlb_out <- adlb_out %>% mutate(\n AVISIT = forcats::fct_reorder(AVISIT, AVISITN),\n ATOXGR_GP = factor(ATOXGR_GP, levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n BTOXGR_GP = factor(BTOXGR_GP, levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\"))\n)\n\nadlb_out <- adlb_out %>%\n var_relabel(\n PARAMCD = \"Parameter Code\",\n AVISIT = \"Visit\",\n ATOXGR_GP = \"NCI CTCAE Grade at Visit\",\n BTOXGR_GP = \"Baseline NCI CTCAE Grade\"\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAMCD\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$PARAMCD)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$AVISIT)\n ) %>%\n split_rows_by(\n \"ATOXGR_GP\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$ATOXGR_GP)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\")) %>%\n count_occurrences(\"BTOXGR_GP\", denom = \"n\", drop = TRUE) %>%\n append_varlabels(adlb_out, \"BTOXGR_GP\", indent = 3L) %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter Code \n Visit \n NCI CTCAE Grade at Visit A: Drug X B: Placebo C: Combination\n Baseline NCI CTCAE Grade (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nCRP \n WEEK 1 DAY 8 \n Not Low (n) 116 110 101 \n Not Low 103 (88.8%) 91 (82.7%) 88 (87.1%) \n 1 3 (2.6%) 5 (4.5%) 6 (5.9%) \n 2 4 (3.4%) 9 (8.2%) 2 (2.0%) \n 3 3 (2.6%) 4 (3.6%) 4 (4.0%) \n 4 3 (2.6%) 1 (0.9%) 1 (1.0%) \n 1 (n) 4 7 5 \n Not Low 3 (75.0%) 7 (100%) 4 (80.0%) \n 3 1 (25.0%) 0 1 (20.0%) \n 2 (n) 5 6 11 \n Not Low 5 (100%) 5 (83.3%) 8 (72.7%) \n 1 0 0 1 (9.1%) \n 3 0 0 2 (18.2%) \n 4 0 1 (16.7%) 0 \n 3 (n) 6 8 5 \n Not Low 6 (100%) 7 (87.5%) 5 (100%) \n 3 0 1 (12.5%) 0 \n 4 (n) 3 3 10 \n Not Low 2 (66.7%) 3 (100%) 7 (70.0%) \n 1 0 0 2 (20.0%) \n 2 1 (33.3%) 0 0 \n 4 0 0 1 (10.0%) \n WEEK 2 DAY 15 \n Not Low (n) 106 111 116 \n Not Low 93 (87.7%) 93 (83.8%) 100 (86.2%) \n 1 3 (2.8%) 4 (3.6%) 8 (6.9%) \n 2 5 (4.7%) 7 (6.3%) 2 (1.7%) \n 3 2 (1.9%) 5 (4.5%) 6 (5.2%) \n 4 3 (2.8%) 2 (1.8%) 0 \n 1 (n) 15 9 2 \n Not Low 13 (86.7%) 8 (88.9%) 1 (50.0%) \n 2 0 1 (11.1%) 0 \n 3 2 (13.3%) 0 0 \n 4 0 0 1 (50.0%) \n 2 (n) 3 3 6 \n Not Low 3 (100%) 3 (100%) 4 (66.7%) \n 1 0 0 1 (16.7%) \n 3 0 0 1 (16.7%) \n 3 (n) 7 7 6 \n Not Low 7 (100%) 6 (85.7%) 5 (83.3%) \n 2 0 1 (14.3%) 0 \n 4 0 0 1 (16.7%) \n 4 (n) 3 4 2 \n Not Low 3 (100%) 3 (75.0%) 2 (100%) \n 1 0 1 (25.0%) 0 \n WEEK 3 DAY 22 \n Not Low (n) 119 110 114 \n Not Low 104 (87.4%) 92 (83.6%) 94 (82.5%) \n 1 3 (2.5%) 4 (3.6%) 9 (7.9%) \n 2 5 (4.2%) 7 (6.4%) 2 (1.8%) \n 3 4 (3.4%) 5 (4.5%) 7 (6.1%) \n 4 3 (2.5%) 2 (1.8%) 2 (1.8%) \n 1 (n) 9 9 6 \n Not Low 9 (100%) 7 (77.8%) 6 (100%) \n 2 0 2 (22.2%) 0 \n 2 (n) 1 7 3 \n Not Low 1 (100%) 6 (85.7%) 3 (100%) \n 1 0 1 (14.3%) 0 \n 3 (n) 4 5 4 \n Not Low 4 (100%) 5 (100%) 4 (100%) \n 4 (n) 1 3 5 \n Not Low 1 (100%) 3 (100%) 5 (100%) \n WEEK 4 DAY 29 \n Not Low (n) 101 119 111 \n Not Low 89 (88.1%) 100 (84.0%) 96 (86.5%) \n 1 3 (3.0%) 4 (3.4%) 6 (5.4%) \n 2 4 (4.0%) 8 (6.7%) 1 (0.9%) \n 3 2 (2.0%) 5 (4.2%) 6 (5.4%) \n 4 3 (3.0%) 2 (1.7%) 2 (1.8%) \n 1 (n) 10 5 6 \n Not Low 9 (90.0%) 5 (100%) 5 (83.3%) \n 1 0 0 1 (16.7%) \n 2 1 (10.0%) 0 0 \n 2 (n) 13 4 6 \n Not Low 13 (100%) 3 (75.0%) 5 (83.3%) \n 1 0 0 1 (16.7%) \n 2 0 1 (25.0%) 0 \n 3 (n) 8 2 6 \n Not Low 6 (75.0%) 1 (50.0%) 5 (83.3%) \n 1 0 1 (50.0%) 0 \n 2 0 0 1 (16.7%) \n 3 2 (25.0%) 0 0 \n 4 (n) 2 4 3 \n Not Low 2 (100%) 4 (100%) 1 (33.3%) \n 1 0 0 1 (33.3%) \n 3 0 0 1 (33.3%) \n WEEK 5 DAY 36 \n Not Low (n) 115 112 111 \n Not Low 102 (88.7%) 94 (83.9%) 96 (86.5%) \n 1 2 (1.7%) 4 (3.6%) 6 (5.4%) \n 2 5 (4.3%) 7 (6.2%) 2 (1.8%) \n 3 3 (2.6%) 5 (4.5%) 5 (4.5%) \n 4 3 (2.6%) 2 (1.8%) 2 (1.8%) \n 1 (n) 5 7 6 \n Not Low 5 (100%) 4 (57.1%) 5 (83.3%) \n 1 0 1 (14.3%) 1 (16.7%) \n 2 0 2 (28.6%) 0 \n 2 (n) 5 11 6 \n Not Low 5 (100%) 11 (100%) 6 (100%) \n 3 (n) 8 2 7 \n Not Low 6 (75.0%) 2 (100%) 4 (57.1%) \n 1 1 (12.5%) 0 1 (14.3%) \n 3 1 (12.5%) 0 2 (28.6%) \n 4 (n) 1 2 2 \n Not Low 1 (100%) 2 (100%) 1 (50.0%) \n 1 0 0 1 (50.0%) \n\n\n\n\nNote that when BTOXGR is missing, the grouping variable BTOXGR_GP is now \"Not High\" instead of \"Missing\" compared to Standard Table (High).\n\nCodeadlb_f <- adlb %>% filter(WGRHIVFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- adsl_f %>%\n h_adsl_adlb_merge_using_worst_flag(\n adlb_f,\n worst_flag = c(\"WGRHIVFL\" = \"Y\"),\n by_visit = TRUE,\n no_fillin_visits = c(\"SCREENING\", \"BASELINE\", \"UNSCHEDULED\")\n )\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n )\n ) %>%\n mutate(\n BTOXGR_GP = case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4, \"<Missing>\") ~ \"Not High\", # Missing BTOXGR now grouped to \"Not High\"\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\"\n )\n )\n\nadlb_out <- adlb_out %>% mutate(\n AVISIT = forcats::fct_reorder(AVISIT, AVISITN),\n ATOXGR_GP = factor(ATOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n BTOXGR_GP = factor(BTOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n)\n\nadlb_out <- adlb_out %>%\n var_relabel(\n PARAMCD = \"Parameter Code\",\n AVISIT = \"Visit\",\n ATOXGR_GP = \"NCI CTCAE Grade at Visit\",\n BTOXGR_GP = \"Baseline NCI CTCAE Grade\"\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAMCD\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$PARAMCD)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$AVISIT)\n ) %>%\n split_rows_by(\n \"ATOXGR_GP\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$ATOXGR_GP)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\")) %>%\n count_occurrences(\"BTOXGR_GP\", denom = \"n\", drop = TRUE) %>%\n append_varlabels(adlb_out, \"BTOXGR_GP\", indent = 3L) %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter Code \n Visit \n NCI CTCAE Grade at Visit A: Drug X B: Placebo C: Combination\n Baseline NCI CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————\nCRP \n WEEK 1 DAY 8 \n Not High (n) 111 110 112 \n Not High 93 (83.8%) 92 (83.6%) 98 (87.5%) \n 1 8 (7.2%) 7 (6.4%) 5 (4.5%) \n 2 2 (1.8%) 6 (5.5%) 7 (6.2%) \n 3 6 (5.4%) 3 (2.7%) 2 (1.8%) \n 4 2 (1.8%) 2 (1.8%) 0 \n 1 (n) 8 11 6 \n Not High 7 (87.5%) 11 (100%) 5 (83.3%) \n 3 1 (12.5%) 0 1 (16.7%) \n 2 (n) 6 4 5 \n Not High 6 (100%) 1 (25.0%) 4 (80.0%) \n 1 0 3 (75.0%) 1 (20.0%) \n 3 (n) 8 3 4 \n Not High 7 (87.5%) 3 (100%) 4 (100%) \n 4 1 (12.5%) 0 0 \n 4 (n) 1 6 5 \n Not High 1 (100%) 5 (83.3%) 4 (80.0%) \n 1 0 0 1 (20.0%) \n 3 0 1 (16.7%) 0 \n WEEK 2 DAY 15 \n Not High (n) 117 113 113 \n Not High 99 (84.6%) 95 (84.1%) 100 (88.5%) \n 1 7 (6.0%) 6 (5.3%) 4 (3.5%) \n 2 2 (1.7%) 6 (5.3%) 6 (5.3%) \n 3 6 (5.1%) 4 (3.5%) 3 (2.7%) \n 4 3 (2.6%) 2 (1.8%) 0 \n 1 (n) 6 9 7 \n Not High 5 (83.3%) 8 (88.9%) 6 (85.7%) \n 1 0 1 (11.1%) 0 \n 2 0 0 1 (14.3%) \n 3 1 (16.7%) 0 0 \n 2 (n) 4 4 6 \n Not High 4 (100%) 4 (100%) 3 (50.0%) \n 1 0 0 3 (50.0%) \n 3 (n) 5 3 5 \n Not High 4 (80.0%) 2 (66.7%) 5 (100%) \n 1 1 (20.0%) 1 (33.3%) 0 \n 4 (n) 2 5 1 \n Not High 2 (100%) 3 (60.0%) 1 (100%) \n 1 0 2 (40.0%) 0 \n WEEK 3 DAY 22 \n Not High (n) 110 111 114 \n Not High 92 (83.6%) 94 (84.7%) 98 (86.0%) \n 1 8 (7.3%) 9 (8.1%) 7 (6.1%) \n 2 2 (1.8%) 5 (4.5%) 6 (5.3%) \n 3 5 (4.5%) 2 (1.8%) 3 (2.6%) \n 4 3 (2.7%) 1 (0.9%) 0 \n 1 (n) 7 8 7 \n Not High 7 (100%) 5 (62.5%) 6 (85.7%) \n 1 0 1 (12.5%) 0 \n 2 0 1 (12.5%) 1 (14.3%) \n 3 0 1 (12.5%) 0 \n 2 (n) 9 7 5 \n Not High 9 (100%) 6 (85.7%) 5 (100%) \n 3 0 1 (14.3%) 0 \n 3 (n) 6 3 4 \n Not High 5 (83.3%) 2 (66.7%) 4 (100%) \n 3 1 (16.7%) 0 0 \n 4 0 1 (33.3%) 0 \n 4 (n) 2 5 2 \n Not High 1 (50.0%) 5 (100%) 2 (100%) \n 3 1 (50.0%) 0 0 \n WEEK 4 DAY 29 \n Not High (n) 115 117 113 \n Not High 97 (84.3%) 101 (86.3%) 99 (87.6%) \n 1 8 (7.0%) 7 (6.0%) 6 (5.3%) \n 2 2 (1.7%) 6 (5.1%) 5 (4.4%) \n 3 7 (6.1%) 3 (2.6%) 3 (2.7%) \n 4 1 (0.9%) 0 0 \n 1 (n) 4 3 11 \n Not High 4 (100%) 2 (66.7%) 10 (90.9%) \n 2 0 0 1 (9.1%) \n 4 0 1 (33.3%) 0 \n 2 (n) 6 4 2 \n Not High 6 (100%) 3 (75.0%) 2 (100%) \n 1 0 1 (25.0%) 0 \n 3 (n) 6 7 4 \n Not High 5 (83.3%) 4 (57.1%) 4 (100%) \n 1 0 1 (14.3%) 0 \n 3 0 1 (14.3%) 0 \n 4 1 (16.7%) 1 (14.3%) 0 \n 4 (n) 3 3 2 \n Not High 2 (66.7%) 2 (66.7%) 0 \n 1 0 1 (33.3%) 1 (50.0%) \n 2 0 0 1 (50.0%) \n 4 1 (33.3%) 0 0 \n WEEK 5 DAY 36 \n Not High (n) 111 111 119 \n Not High 95 (85.6%) 95 (85.6%) 104 (87.4%) \n 1 6 (5.4%) 8 (7.2%) 6 (5.0%) \n 2 1 (0.9%) 5 (4.5%) 6 (5.0%) \n 3 6 (5.4%) 2 (1.8%) 3 (2.5%) \n 4 3 (2.7%) 1 (0.9%) 0 \n 1 (n) 8 11 5 \n Not High 7 (87.5%) 9 (81.8%) 4 (80.0%) \n 1 0 1 (9.1%) 0 \n 2 0 0 1 (20.0%) \n 3 1 (12.5%) 1 (9.1%) 0 \n 2 (n) 7 6 3 \n Not High 5 (71.4%) 3 (50.0%) 2 (66.7%) \n 1 1 (14.3%) 1 (16.7%) 1 (33.3%) \n 2 1 (14.3%) 1 (16.7%) 0 \n 4 0 1 (16.7%) 0 \n 3 (n) 3 3 4 \n Not High 3 (100%) 3 (100%) 4 (100%) \n 4 (n) 5 3 1 \n Not High 4 (80.0%) 2 (66.7%) 1 (100%) \n 1 1 (20.0%) 0 0 \n 3 0 1 (33.3%) 0 \n\n\n\n\nPre-processing is the same as for Standard Table (High), but in order to keep all levels, the drop argument in count_occurrences is set to FALSE.\n\nCodeadlb_f <- adlb %>% filter(WGRHIVFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- adsl_f %>%\n h_adsl_adlb_merge_using_worst_flag(\n adlb_f,\n worst_flag = c(\"WGRHIVFL\" = \"Y\"),\n by_visit = TRUE,\n no_fillin_visits = c(\"SCREENING\", \"BASELINE\", \"UNSCHEDULED\")\n )\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n )\n ) %>%\n mutate(\n BTOXGR_GP = case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n )\n )\n\nadlb_out <- adlb_out %>% mutate(\n AVISIT = forcats::fct_reorder(AVISIT, AVISITN),\n ATOXGR_GP = factor(ATOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n BTOXGR_GP = factor(BTOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n)\n\nadlb_out <- adlb_out %>%\n var_relabel(\n PARAMCD = \"Parameter Code\",\n AVISIT = \"Visit\",\n ATOXGR_GP = \"NCI CTCAE Grade at Visit\",\n BTOXGR_GP = \"Baseline NCI CTCAE Grade\"\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAMCD\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$PARAMCD)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$AVISIT)\n ) %>%\n split_rows_by(\n \"ATOXGR_GP\",\n split_fun = keep_split_levels(c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n label_pos = \"topleft\",\n split_label = obj_label(adlb_out$ATOXGR_GP)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\")) %>%\n count_occurrences(\"BTOXGR_GP\", denom = \"n\", drop = FALSE) %>%\n append_varlabels(adlb_out, \"BTOXGR_GP\", indent = 3L) %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter Code \n Visit \n NCI CTCAE Grade at Visit A: Drug X B: Placebo C: Combination\n Baseline NCI CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————\nCRP \n WEEK 1 DAY 8 \n Not High (n) 111 110 112 \n Not High 93 (83.8%) 92 (83.6%) 98 (87.5%) \n 1 8 (7.2%) 7 (6.4%) 5 (4.5%) \n 2 2 (1.8%) 6 (5.5%) 7 (6.2%) \n 3 6 (5.4%) 3 (2.7%) 2 (1.8%) \n 4 2 (1.8%) 2 (1.8%) 0 \n Missing 0 0 0 \n 1 (n) 8 11 6 \n Not High 7 (87.5%) 11 (100%) 5 (83.3%) \n 1 0 0 0 \n 2 0 0 0 \n 3 1 (12.5%) 0 1 (16.7%) \n 4 0 0 0 \n Missing 0 0 0 \n 2 (n) 6 4 5 \n Not High 6 (100%) 1 (25.0%) 4 (80.0%) \n 1 0 3 (75.0%) 1 (20.0%) \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 3 (n) 8 3 4 \n Not High 7 (87.5%) 3 (100%) 4 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 1 (12.5%) 0 0 \n Missing 0 0 0 \n 4 (n) 1 6 5 \n Not High 1 (100%) 5 (83.3%) 4 (80.0%) \n 1 0 0 1 (20.0%) \n 2 0 0 0 \n 3 0 1 (16.7%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n Missing (n) 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n WEEK 2 DAY 15 \n Not High (n) 117 113 113 \n Not High 99 (84.6%) 95 (84.1%) 100 (88.5%) \n 1 7 (6.0%) 6 (5.3%) 4 (3.5%) \n 2 2 (1.7%) 6 (5.3%) 6 (5.3%) \n 3 6 (5.1%) 4 (3.5%) 3 (2.7%) \n 4 3 (2.6%) 2 (1.8%) 0 \n Missing 0 0 0 \n 1 (n) 6 9 7 \n Not High 5 (83.3%) 8 (88.9%) 6 (85.7%) \n 1 0 1 (11.1%) 0 \n 2 0 0 1 (14.3%) \n 3 1 (16.7%) 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 2 (n) 4 4 6 \n Not High 4 (100%) 4 (100%) 3 (50.0%) \n 1 0 0 3 (50.0%) \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 3 (n) 5 3 5 \n Not High 4 (80.0%) 2 (66.7%) 5 (100%) \n 1 1 (20.0%) 1 (33.3%) 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 4 (n) 2 5 1 \n Not High 2 (100%) 3 (60.0%) 1 (100%) \n 1 0 2 (40.0%) 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n Missing (n) 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n WEEK 3 DAY 22 \n Not High (n) 110 111 114 \n Not High 92 (83.6%) 94 (84.7%) 98 (86.0%) \n 1 8 (7.3%) 9 (8.1%) 7 (6.1%) \n 2 2 (1.8%) 5 (4.5%) 6 (5.3%) \n 3 5 (4.5%) 2 (1.8%) 3 (2.6%) \n 4 3 (2.7%) 1 (0.9%) 0 \n Missing 0 0 0 \n 1 (n) 7 8 7 \n Not High 7 (100%) 5 (62.5%) 6 (85.7%) \n 1 0 1 (12.5%) 0 \n 2 0 1 (12.5%) 1 (14.3%) \n 3 0 1 (12.5%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n 2 (n) 9 7 5 \n Not High 9 (100%) 6 (85.7%) 5 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 0 1 (14.3%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n 3 (n) 6 3 4 \n Not High 5 (83.3%) 2 (66.7%) 4 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 1 (16.7%) 0 0 \n 4 0 1 (33.3%) 0 \n Missing 0 0 0 \n 4 (n) 2 5 2 \n Not High 1 (50.0%) 5 (100%) 2 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 1 (50.0%) 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n Missing (n) 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n WEEK 4 DAY 29 \n Not High (n) 115 117 113 \n Not High 97 (84.3%) 101 (86.3%) 99 (87.6%) \n 1 8 (7.0%) 7 (6.0%) 6 (5.3%) \n 2 2 (1.7%) 6 (5.1%) 5 (4.4%) \n 3 7 (6.1%) 3 (2.6%) 3 (2.7%) \n 4 1 (0.9%) 0 0 \n Missing 0 0 0 \n 1 (n) 4 3 11 \n Not High 4 (100%) 2 (66.7%) 10 (90.9%) \n 1 0 0 0 \n 2 0 0 1 (9.1%) \n 3 0 0 0 \n 4 0 1 (33.3%) 0 \n Missing 0 0 0 \n 2 (n) 6 4 2 \n Not High 6 (100%) 3 (75.0%) 2 (100%) \n 1 0 1 (25.0%) 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 3 (n) 6 7 4 \n Not High 5 (83.3%) 4 (57.1%) 4 (100%) \n 1 0 1 (14.3%) 0 \n 2 0 0 0 \n 3 0 1 (14.3%) 0 \n 4 1 (16.7%) 1 (14.3%) 0 \n Missing 0 0 0 \n 4 (n) 3 3 2 \n Not High 2 (66.7%) 2 (66.7%) 0 \n 1 0 1 (33.3%) 1 (50.0%) \n 2 0 0 1 (50.0%) \n 3 0 0 0 \n 4 1 (33.3%) 0 0 \n Missing 0 0 0 \n Missing (n) 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n WEEK 5 DAY 36 \n Not High (n) 111 111 119 \n Not High 95 (85.6%) 95 (85.6%) 104 (87.4%) \n 1 6 (5.4%) 8 (7.2%) 6 (5.0%) \n 2 1 (0.9%) 5 (4.5%) 6 (5.0%) \n 3 6 (5.4%) 2 (1.8%) 3 (2.5%) \n 4 3 (2.7%) 1 (0.9%) 0 \n Missing 0 0 0 \n 1 (n) 8 11 5 \n Not High 7 (87.5%) 9 (81.8%) 4 (80.0%) \n 1 0 1 (9.1%) 0 \n 2 0 0 1 (20.0%) \n 3 1 (12.5%) 1 (9.1%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n 2 (n) 7 6 3 \n Not High 5 (71.4%) 3 (50.0%) 2 (66.7%) \n 1 1 (14.3%) 1 (16.7%) 1 (33.3%) \n 2 1 (14.3%) 1 (16.7%) 0 \n 3 0 0 0 \n 4 0 1 (16.7%) 0 \n Missing 0 0 0 \n 3 (n) 3 3 4 \n Not High 3 (100%) 3 (100%) 4 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 4 (n) 5 3 1 \n Not High 4 (80.0%) 2 (66.7%) 1 (100%) \n 1 1 (20.0%) 0 0 \n 2 0 0 0 \n 3 0 1 (33.3%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n Missing (n) 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_shift_by_grade(\n label = \"Grade Laboratory Abnormality Table\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = \"ALT\"\n ),\n worst_flag_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"WGRLOVFL\", \"WGRLOFL\", \"WGRHIVFL\", \"WGRHIFL\")),\n selected = c(\"WGRLOVFL\")\n ),\n worst_flag_indicator = choices_selected(\n value_choices(ADLB, \"WGRLOVFL\"),\n selected = \"Y\", fixed = TRUE\n ),\n anl_toxgrade_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"ATOXGR\")),\n selected = c(\"ATOXGR\"),\n fixed = TRUE\n ),\n base_toxgrade_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"BTOXGR\")),\n selected = c(\"BTOXGR\"),\n fixed = TRUE\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:55:51 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", + "Tables", "Lab Results", - "LBL02A_RLS" + "LBT13" ] }, { - "objectID": "listings/lab-results/lbl01_rls.html", - "href": "listings/lab-results/lbl01_rls.html", - "title": "LBL01_RLS", + "objectID": "tables/lab-results/lbt15.html", + "href": "tables/lab-results/lbt15.html", + "title": "LBT15", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n filter(!is.na(AVAL))\n\nadlb_x <- adlb %>%\n mutate(ANRIND = factor(\n case_when(\n ANRIND == \"LOW\" & AVAL > stats::quantile(adlb$AVAL, probs = c(0.1)) ~ \"L\",\n ANRIND == \"HIGH\" & AVAL < stats::quantile(adlb$AVAL, probs = c(0.9)) ~ \"H\",\n ANRIND == \"LOW\" & AVAL <= stats::quantile(adlb$AVAL, probs = c(0.1)) ~ \"LL\",\n ANRIND == \"HIGH\" & AVAL >= stats::quantile(adlb$AVAL, probs = c(0.9)) ~ \"HH\",\n TRUE ~ as.character(ANRIND)\n ),\n levels = c(\"\", \"H\", \"HH\", \"L\", \"LL\", \"NORMAL\")\n ))\n\nadlb_x <- adlb_x %>%\n filter(!is.na(LBSEQ) & !is.na(ADY) & ANRIND != \"\") %>%\n mutate(\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n PARAM_U = paste0(PARAMCD, \"\\n(\", AVALU, \")\"),\n AVALC = as.character(format(round(AVAL, 2), nsmall = 2))\n ) %>%\n mutate(AVAL_GR = ifelse(\n !ANRIND %in% c(\"H\", \"HH\", \"L\", \"LL\"),\n AVALC,\n paste(AVALC, ANRIND, sep = \" / \")\n )) %>%\n select(CPID, TRT01A, ADY, LBSEQ, PARAM_U, AVAL_GR) %>%\n unique()\n\nout <- adlb_x %>%\n arrange(CPID, ADY, PARAM_U, LBSEQ) %>%\n tidyr::pivot_wider(\n id_cols = c(TRT01A, CPID, ADY),\n names_from = PARAM_U,\n values_from = AVAL_GR\n ) %>%\n group_by(CPID) %>%\n mutate(DLD = ADY - lag(ADY)) %>%\n ungroup() %>%\n select(CPID, TRT01A, ADY, DLD, unique(adlb_x$PARAM_U))\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n TRT01A = \"Treatment\",\n CPID = \"Center/Patient ID\",\n ADY = \"Study\\nDay\",\n DLD = \"Days Since\\nLast Dose of\\nStudy Drug\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CPID\"),\n disp_cols = names(out),\n main_title = \"Listing of Laboratory Test Results Using Roche Safety Lab Standardization\",\n main_footer = \"Abnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range; high high (HH) or low low (LL) if outside the Roche marked reference range with a clinically relevant change from baseline. \" \n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Laboratory Test Results Using Roche Safety Lab Standardization\n\n————————————————————————————————————————————————————————————————————————————————————————\n Days Since \n Study Last Dose of ALT CRP IGA \nTreatment Center/Patient ID Day Study Drug (U/L) (mg/L) (g/L) \n————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-105 80 NA 4.30 / L 9.09 2.84 \n 149 69 24.70 9.15 2.93 \n 314 165 24.87 10.89 / H 2.66 \n 398 84 3.67 / L 8.14 2.86 \n 470 72 18.55 10.59 / H 2.88 \n 528 58 7.73 10.09 / H 2.93 \n 535 7 23.51 9.20 2.88 \n BRA-1/id-134 225 NA 7.37 10.46 / H 2.86 \n 227 2 16.42 7.43 / L 2.76 \n 255 28 11.16 9.41 2.75 \n 269 14 15.89 10.02 / H 2.84 \n 357 88 24.35 8.01 2.86 \n 436 79 16.03 8.51 2.98 \n 440 4 17.21 7.63 / L 2.78 \n BRA-1/id-42 176 NA 16.56 8.88 2.75 \n 477 301 16.49 8.11 2.95 \n 534 57 18.71 8.78 2.95 \n 550 16 11.44 9.53 2.99 \n 569 19 21.66 10.32 / H 3.00 / H\n 608 39 24.61 7.95 / L 2.78 \n————————————————————————————————————————————————————————————————————————————————————————\n\nAbnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range; high high (HH) or low low (LL) if outside the Roche marked reference range with a clinically relevant change from baseline. \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:48 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Modifying Cut Point\nteal App\nReproducibility\n\n\n\nBecause the scda dataset adlb doesn’t have the PARCAT1 variable, this variable is created from LBCAT in pre-processing.\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\nlibrary(forcats)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb <- adlb %>%\n mutate(\n PARAM = with_label(.data$PARAM, \"Laboratory Test\"),\n ANRIND = with_label(.data$ANRIND, \"Direction of Abnormality\")\n ) %>%\n mutate(\n PARCAT1 = LBCAT\n ) %>%\n mutate(\n ANRIND = fct_collapse(.data$ATOXGR,\n \"LOW\" = c(\"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-2\", \"-1\", \"0\", \"1\", \"2\"),\n \"HIGH\" = c(\"3\", \"4\")\n ),\n BNRIND = fct_collapse(.data$BTOXGR,\n \"LOW\" = c(\"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-2\", \"-1\", \"0\", \"1\", \"2\"),\n \"HIGH\" = c(\"3\", \"4\")\n ),\n PARCAT1 = LBCAT\n ) %>%\n filter(ONTRTFL == \"Y\")\n\n\nadlb_alt_cut <- adlb %>%\n mutate(\n ANRIND = fct_collapse(.data$ATOXGR,\n \"LOW\" = c(\"-2\", \"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-1\", \"0\", \"1\"),\n \"HIGH\" = c(\"2\", \"3\", \"4\")\n ),\n BNRIND = fct_collapse(.data$BTOXGR,\n \"LOW\" = c(\"-2\", \"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-1\", \"0\", \"1\"),\n \"HIGH\" = c(\"2\", \"3\", \"4\")\n )\n ) %>%\n filter(ONTRTFL == \"Y\")\n\nadlb <- adlb %>% var_relabel(\n PARCAT1 = \"Category for Lab Test\",\n PARAM = \"Parameter\"\n)\n\n\n\n\n\nCode# Argument exclude_base_abn must be TRUE to include patients with normal or abnormal in the opposite\n# direction in the denom.\n# So for \"High\" direction, subjects with baseline grade 3-4 are not in the denom.\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n add_overall_col(\"All Patients\") %>%\n split_rows_by(\n \"PARCAT1\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb$PARCAT1)\n ) %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb$PARAM)\n ) %>%\n count_abnormal(\n var = \"ANRIND\",\n abnormal = list(Low = \"LOW\", High = \"HIGH\"),\n variables = list(id = \"USUBJID\", baseline = \"BNRIND\"),\n exclude_base_abn = TRUE,\n .indent_mods = 4L\n ) %>%\n append_topleft(\" Direction of Abnormality\")\n\nresult <- build_table(lyt, adlb, alt_counts_df = adsl)\nresult\n\nCategory for Lab Test \n Parameter A: Drug X B: Placebo C: Combination All Patients \n Direction of Abnormality (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————\nCHEMISTRY \n Alanine Aminotransferase Measurement \n Low 32/127 (25.2%) 32/128 (25%) 32/128 (25%) 96/383 (25.1%) \n High 0/134 0/134 0/132 0/400 \n C-Reactive Protein Measurement \n Low 36/127 (28.3%) 36/127 (28.3%) 42/123 (34.1%) 114/377 (30.2%)\n High 34/124 (27.4%) 33/128 (25.8%) 31/129 (24%) 98/381 (25.7%) \nIMMUNOLOGY \n Immunoglobulin A Measurement \n Low 0/134 0/134 0/132 0/400 \n High 33/128 (25.8%) 32/124 (25.8%) 28/120 (23.3%) 93/372 (25%) \n\n\n\n\n\nCoderesult <- build_table(lyt, adlb_alt_cut, alt_counts_df = adsl)\nresult\n\nCategory for Lab Test \n Parameter A: Drug X B: Placebo C: Combination All Patients \n Direction of Abnormality (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————\nCHEMISTRY \n Alanine Aminotransferase Measurement \n Low 46/119 (38.7%) 54/123 (43.9%) 47/127 (37%) 147/369 (39.8%)\n High 0/134 0/134 0/132 0/400 \n C-Reactive Protein Measurement \n Low 59/122 (48.4%) 56/118 (47.5%) 58/121 (47.9%) 173/361 (47.9%)\n High 54/122 (44.3%) 46/122 (37.7%) 44/122 (36.1%) 144/366 (39.3%)\nIMMUNOLOGY \n Immunoglobulin A Measurement \n Low 0/134 0/134 0/132 0/400 \n High 47/124 (37.9%) 54/120 (45%) 47/115 (40.9%) 148/359 (41.2%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nThe current module tm_t_abnormality is only displaying rows that are not all-zero, so the result could be a little different from static output where all-zero rows can be shown.\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n library(forcats)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n mutate(\n ANRIND = fct_collapse(ATOXGR,\n \"LOW\" = c(\"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-2\", \"-1\", \"0\", \"1\", \"2\"),\n \"HIGH\" = c(\"3\", \"4\")\n ),\n BNRIND = fct_collapse(.data$BTOXGR,\n \"LOW\" = c(\"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-2\", \"-1\", \"0\", \"1\", \"2\"),\n \"HIGH\" = c(\"3\", \"4\")\n )\n ) %>%\n filter(ONTRTFL == \"Y\") %>%\n col_relabel(ANRIND = \"Direction of Abnormality\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_abnormality(\n label = \"Abnormality Table\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"PARAM\")),\n selected = c(\"PARAM\"),\n keep_order = TRUE\n ),\n grade = choices_selected(\n choices = variable_choices(ADLB, subset = \"ANRIND\"),\n selected = \"ANRIND\",\n fixed = TRUE\n ),\n baseline_var = choices_selected(\n choices = variable_choices(ADLB, subset = \"BNRIND\"),\n selected = \"BNRIND\",\n fixed = TRUE\n ),\n abnormal = list(Low = \"LOW\", High = \"HIGH\"),\n exclude_base_abn = TRUE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:55:19 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 forcats_1.0.0 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", + "Tables", "Lab Results", - "LBL01_RLS" + "LBT15" ] }, { - "objectID": "listings/vital-signs/vsl01.html", - "href": "listings/vital-signs/vsl01.html", - "title": "VSL01", + "objectID": "tables/lab-results/lbt03.html", + "href": "tables/lab-results/lbt03.html", + "title": "LBT03", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadvs <- synthetic_cdisc_dataset(\"latest\", \"advs\")\n\nget_param_unit_range <- function(dataset) {\n u_rng <- lapply(unique(dataset$PARAMCD), function(p) {\n dat <- dataset %>% filter(PARAMCD == p)\n list(\n unit = unique(dat$AVALU),\n range = paste0(unique(dat$ANRLO), \"-\", unique(dat$ANRHI))\n )\n })\n names(u_rng) <- unique(dataset$PARAMCD)\n u_rng\n}\n\nvs_u_rng <- get_param_unit_range(advs)\n\nadvs_sub <- advs %>%\n filter(!is.na(AVAL) & SAFFL == \"Y\" & ONTRTFL == \"Y\" & !is.na(VSSEQ)) %>%\n mutate(\n CRTNPT = paste(SITEID, sub(\"^.*-([[:alnum:]]+)$\", \"\\\\1\", SUBJID), sep = \"/\"),\n AGSXRC = paste(AGE, SEX, RACE, sep = \"/\"),\n AVAL = format(round(AVAL, 2), nsmall = 2),\n AVAL_ANRIND = ifelse(ANRIND %in% c(\"NORMAL\", \"\"), AVAL, paste(AVAL, substr(ANRIND, 1, 1), sep = \"/\")),\n CHG = format(round(CHG, 2), nsmall = 2)\n )\n\nanl_vs <- advs_sub %>%\n select(SUBJID, CRTNPT, AGSXRC, TRT01A, PARAMCD, AVAL_ANRIND, CHG, ADY, AVISIT, ADTM) %>%\n tidyr::pivot_wider(\n id_cols = c(SUBJID, CRTNPT, AGSXRC, TRT01A, ADY, AVISIT, ADTM),\n names_from = PARAMCD,\n values_from = c(AVAL_ANRIND, CHG)\n )\n\nout <- anl_vs %>%\n select(\n CRTNPT, AGSXRC, TRT01A, AVISIT, ADY, AVAL_ANRIND_WEIGHT, CHG_WEIGHT, AVAL_ANRIND_TEMP, CHG_TEMP, AVAL_ANRIND_DIABP,\n CHG_DIABP, AVAL_ANRIND_SYSBP, CHG_SYSBP, AVAL_ANRIND_PULSE, CHG_PULSE, AVAL_ANRIND_RESP, CHG_RESP\n ) %>%\n var_relabel(\n CRTNPT = \"Center/Subject ID\",\n AGSXRC = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n AVISIT = \"Visit\",\n ADY = \"Study\\nDay\",\n AVAL_ANRIND_WEIGHT = paste0(\n \"Weight\\nResult\\n(\",\n vs_u_rng$WEIGHT$unit,\n \");\\nRange:(\",\n vs_u_rng$WEIGHT$range,\n \")\"\n ),\n CHG_WEIGHT = \"Weight\\nChange from BL\",\n AVAL_ANRIND_TEMP = paste0(\n \"Temperature Result\\n(\",\n vs_u_rng$TEMP$unit,\n \");\\nRange:(\",\n vs_u_rng$TEMP$range,\n \")\"\n ),\n CHG_TEMP = \"Temperature Rate\\nChange from BL\",\n AVAL_ANRIND_DIABP = paste0(\n \"Diastolic Blood\\nPressure,\\nSitting\\nResult\\n(\",\n vs_u_rng$DIABP$unit,\n \");\\nRange:(\",\n vs_u_rng$DIABP$range,\n \")\"\n ),\n CHG_DIABP = \"Diastolic Blood\\nPressure,\\nSitting\\nChange from BL\",\n AVAL_ANRIND_SYSBP = paste0(\n \"Systolic Blood\\nPressure,\\nSitting\\n(\",\n vs_u_rng$SYSBP$unit,\n \");\\nRange:(\",\n vs_u_rng$SYSBP$range,\n \")\"\n ),\n CHG_SYSBP = \"Systolic Blood\\nPressure,\\nSitting\\nChange from BL\",\n AVAL_ANRIND_PULSE = paste0(\n \"Pulse Rate Result\\n(\",\n vs_u_rng$PULSE$unit,\n \");\\nRange:(\",\n vs_u_rng$PULSE$range,\n \")\"\n ),\n CHG_PULSE = \"Pulse Rate\\nChange from BL\",\n AVAL_ANRIND_RESP = paste0(\n \"Respiratory Rate\\nResult\\n(\",\n vs_u_rng$RESP$unit,\n \");\\nRange:(\",\n vs_u_rng$RESP$range,\n \")\"\n ),\n CHG_RESP = \"Respiratory Rate\\nChange from BL\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CRTNPT\", \"AGSXRC\", \"AVISIT\"),\n disp_cols = names(out),\n main_title = \"Listing of Vital Signs: Safety-Evaluable Patients\",\n main_footer = \"Baseline is the patient's last observation prior to initiation of study drug. Abnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range.\" \n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Vital Signs: Safety-Evaluable Patients\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Diastolic Blood \n Pressure, Systolic Blood \n Weight Sitting Diastolic Blood Pressure, Systolic Blood Respiratory Rate \n Result Temperature Result Result Pressure, Sitting Pressure, Pulse Rate Result Result \n Study (Kg); Weight (C); Temperature Rate (Pa); Sitting (Pa); Sitting (beats/min); Pulse Rate (breaths/min); Respiratory Rate\nTreatment Center/Subject ID Age/Sex/Race Visit Day Range:(40-100) Change from BL Range:(36.1-37.2) Change from BL Range:(80-120) Change from BL Range:(120-180) Change from BL Range:(60-100) Change from BL Range:(12-20) Change from BL \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/105 38/M/BLACK OR AFRICAN AMERICAN WEEK 1 DAY 8 189 90.96 24.62 36.79 -1.88 101.10 -12.65 181.05/H 3.70 84.91 -2.05 18.34 1.13 \n WEEK 2 DAY 15 323 41.40 -24.93 36.52 -2.14 111.02 -2.72 132.47 -44.88 71.54 -15.42 9.81/L -7.40 \n WEEK 3 DAY 22 492 60.55 -5.78 35.03/L -3.64 88.35 -25.39 112.67/L -64.68 33.75/L -53.22 21.23/H 4.02 \n WEEK 4 DAY 29 550 69.69 3.36 35.71/L -2.95 100.74 -13.00 194.88/H 17.53 97.51 10.54 12.50 -4.71 \n WEEK 5 DAY 36 628 81.64 15.30 36.01/L -2.65 123.17/H 9.43 140.33 -37.02 62.50 -24.47 10.91/L -6.30 \n BRA-1/134 47/M/WHITE WEEK 1 DAY 8 203 42.95 -12.51 36.39 -1.38 112.71 26.38 148.69 -52.75 69.12 3.72 15.31 -2.84 \n WEEK 2 DAY 15 326 20.36/L -35.09 35.75/L -2.03 98.42 12.09 188.08/H -13.36 68.79 3.40 17.60 -0.55 \n WEEK 3 DAY 22 363 46.33 -9.12 35.43/L -2.34 97.88 11.55 160.05 -41.39 90.21 24.81 18.15 0.00 \n WEEK 4 DAY 29 367 43.83 -11.62 36.01/L -1.76 98.97 12.65 132.19 -69.25 88.39 23.00 19.62 1.48 \n WEEK 5 DAY 36 417 31.75/L -23.71 36.35 -1.42 124.26/H 37.94 134.30 -67.14 88.64 23.25 20.08/H 1.94 \n BRA-1/42 36/M/BLACK OR AFRICAN AMERICAN WEEK 1 DAY 8 265 115.27/H 8.42 37.35/H -1.67 107.32 5.90 173.89 27.40 66.14 26.13 9.23/L 7.13 \n WEEK 2 DAY 15 313 45.84 -61.01 36.01/L -3.01 110.97 9.55 144.75 -1.74 109.71/H 69.70 7.18/L 5.08 \n WEEK 3 DAY 22 325 85.70 -21.14 37.71/H -1.31 124.13/H 22.71 89.08/L -57.41 90.29 50.28 25.16/H 23.05 \n WEEK 4 DAY 29 535 44.64 -62.21 36.44 -2.58 79.51/L -21.91 140.78 -5.71 82.44 42.43 14.06 11.95 \n WEEK 5 DAY 36 729 85.21 -21.64 35.78/L -3.23 105.26 3.84 126.60 -19.89 88.71 48.70 25.98/H 23.87 \n BRA-1/93 34/F/ASIAN WEEK 1 DAY 8 402 47.51 -35.34 35.50/L -0.83 94.27 17.98 98.82/L -61.71 72.44 -7.85 14.97 0.22 \n WEEK 2 DAY 15 460 67.64 -15.21 37.96/H 1.62 109.98 33.69 104.21/L -56.32 104.70/H 24.41 14.90 0.16 \n WEEK 3 DAY 22 464 53.06 -29.78 36.33 -0.01 90.17 13.87 139.66 -20.87 111.13/H 30.85 22.86/H 8.12 \n WEEK 4 DAY 29 496 61.68 -21.17 33.52/L -2.82 112.76 36.47 128.82 -31.70 72.89 -7.39 20.77/H 6.03 \n WEEK 5 DAY 36 538 53.98 -28.86 35.71/L -0.63 80.20 3.91 137.16 -23.37 96.63 16.35 18.10 3.36 \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nBaseline is the patient's last observation prior to initiation of study drug. Abnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:41 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\nFor illustration purposes, this example focuses on “C-Reactive Protein Measurement” starting from baseline, while excluding visit at week 1 for subjects who were randomized to the placebo group.\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\nsaved_labels <- var_labels(adlb)\n\nadlb_f <- adlb %>%\n filter(\n PARAM == \"C-Reactive Protein Measurement\",\n !(ARM == \"B: Placebo\" & AVISIT == \"WEEK 1 DAY 8\"),\n AVISIT != \"SCREENING\"\n ) %>%\n dplyr::mutate(\n AVISIT = droplevels(AVISIT),\n ABLFLL = ABLFL == \"Y\"\n )\n\nvar_labels(adlb_f) <- c(saved_labels, \"\")\n\n\n\n\nThe LBT03 template is the result of a junction between the analysis of AVAL at baseline and CHG at visit time. AVAL is summarized for baseline visits and and CHG is summarized for post-baseline visits.\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f$AVISIT)) %>%\n summarize_change(\n \"CHG\",\n variables = list(value = \"AVAL\", baseline_flag = \"ABLFLL\"),\n na.rm = TRUE\n )\n\nresult <- build_table(\n lyt = lyt,\n df = adlb_f,\n alt_counts_df = adsl\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\nAnalysis Visit (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————\nBASELINE \n n 134 134 132 \n Mean (SD) 9.06 (0.93) 8.99 (0.98) 8.98 (0.89) \n Median 9.07 8.92 8.96 \n Min - Max 6.21 - 11.87 6.23 - 11.63 6.24 - 11.18 \nWEEK 1 DAY 8 \n n 134 0 132 \n Mean (SD) -0.05 (1.38) NA -0.02 (1.30) \n Median -0.17 NA 0.02 \n Min - Max -3.56 - 3.48 NA -3.28 - 3.33 \nWEEK 2 DAY 15 \n n 134 134 132 \n Mean (SD) -0.19 (1.47) 0.01 (1.45) 0.15 (1.25) \n Median -0.27 -0.00 0.15 \n Min - Max -4.53 - 4.45 -3.79 - 3.43 -2.92 - 3.28 \nWEEK 3 DAY 22 \n n 134 134 132 \n Mean (SD) 0.03 (1.38) -0.02 (1.49) 0.02 (1.34) \n Median 0.15 -0.04 0.20 \n Min - Max -3.95 - 2.99 -4.28 - 4.24 -2.76 - 3.26 \nWEEK 4 DAY 29 \n n 134 134 132 \n Mean (SD) -0.26 (1.45) 0.05 (1.24) -0.01 (1.17) \n Median -0.37 0.10 -0.06 \n Min - Max -3.74 - 4.15 -3.34 - 3.71 -3.06 - 3.22 \nWEEK 5 DAY 36 \n n 134 134 132 \n Mean (SD) -0.02 (1.50) 0.07 (1.34) 0.03 (1.27) \n Median 0.01 0.15 0.05 \n Min - Max -4.15 - 3.96 -3.50 - 3.53 -3.63 - 4.78 \n\n\nIn the final step, a new variable is derived from AVISIT that can specify the method of estimation of the evaluated change.\n\nCodeadlb_f <- adlb_f %>% mutate(AVISIT_header = recode(AVISIT,\n \"BASELINE\" = \"BASELINE\",\n \"WEEK 1 DAY 8\" = \"WEEK 1 DAY 8 value minus baseline\",\n \"WEEK 2 DAY 15\" = \"WEEK 2 DAY 15 value minus baseline\",\n \"WEEK 3 DAY 22\" = \"WEEK 3 DAY 22 value minus baseline\",\n \"WEEK 4 DAY 29\" = \"WEEK 4 DAY 29 value minus baseline\",\n \"WEEK 5 DAY 36\" = \"WEEK 5 DAY 36 value minus baseline\"\n))\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\"AVISIT_header\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adlb_f$AVISIT)\n ) %>%\n summarize_change(\n \"CHG\",\n variables = list(value = \"AVAL\", baseline_flag = \"ABLFLL\"),\n na.rm = TRUE\n )\n\nresult <- build_table(\n lyt = lyt,\n df = adlb_f,\n alt_counts_df = adsl\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\nAnalysis Visit (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————\nBASELINE \n n 134 134 132 \n Mean (SD) 9.06 (0.93) 8.99 (0.98) 8.98 (0.89) \n Median 9.07 8.92 8.96 \n Min - Max 6.21 - 11.87 6.23 - 11.63 6.24 - 11.18 \nWEEK 1 DAY 8 value minus baseline \n n 134 0 132 \n Mean (SD) -0.05 (1.38) NA -0.02 (1.30) \n Median -0.17 NA 0.02 \n Min - Max -3.56 - 3.48 NA -3.28 - 3.33 \nWEEK 2 DAY 15 value minus baseline \n n 134 134 132 \n Mean (SD) -0.19 (1.47) 0.01 (1.45) 0.15 (1.25) \n Median -0.27 -0.00 0.15 \n Min - Max -4.53 - 4.45 -3.79 - 3.43 -2.92 - 3.28 \nWEEK 3 DAY 22 value minus baseline \n n 134 134 132 \n Mean (SD) 0.03 (1.38) -0.02 (1.49) 0.02 (1.34) \n Median 0.15 -0.04 0.20 \n Min - Max -3.95 - 2.99 -4.28 - 4.24 -2.76 - 3.26 \nWEEK 4 DAY 29 value minus baseline \n n 134 134 132 \n Mean (SD) -0.26 (1.45) 0.05 (1.24) -0.01 (1.17) \n Median -0.37 0.10 -0.06 \n Min - Max -3.74 - 4.15 -3.34 - 3.71 -3.06 - 3.22 \nWEEK 5 DAY 36 value minus baseline \n n 134 134 132 \n Mean (SD) -0.02 (1.50) 0.07 (1.34) 0.03 (1.27) \n Median 0.01 0.15 0.05 \n Min - Max -4.15 - 3.96 -3.50 - 3.53 -3.63 - 4.78 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nHere, we pre-process and manually define the variable “Baseline or Absolute Change from Baseline”.\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- df_explicit_na(synthetic_cdisc_dataset(\"latest\", \"adsl\"))\n ADLB <- df_explicit_na(synthetic_cdisc_dataset(\"latest\", \"adlb\")) %>%\n filter(\n !(ARM == \"B: Placebo\" & AVISIT == \"WEEK 1 DAY 8\"),\n AVISIT != \"SCREENING\"\n ) %>%\n mutate(\n AVISIT = droplevels(AVISIT),\n ABLFLL = ABLFL == \"Y\",\n AVISIT_header = recode(AVISIT,\n \"BASELINE\" = \"BASELINE\",\n \"WEEK 1 DAY 8\" = \"WEEK 1 DAY 8 value minus baseline\",\n \"WEEK 2 DAY 15\" = \"WEEK 2 DAY 15 value minus baseline\",\n \"WEEK 3 DAY 22\" = \"WEEK 3 DAY 22 value minus baseline\",\n \"WEEK 4 DAY 29\" = \"WEEK 4 DAY 29 value minus baseline\",\n \"WEEK 5 DAY 36\" = \"WEEK 5 DAY 36 value minus baseline\"\n )\n ) %>%\n group_by(USUBJID, PARAM) %>%\n mutate(\n AVAL_CHG = AVAL - (!ABLFLL) * sum(AVAL * ABLFLL)\n ) %>%\n ungroup() %>%\n col_relabel(\n AVAL_CHG = \"Baseline or Absolute Change from Baseline\",\n ABLFLL = \"Baseline Flag (TRUE/FALSE)\",\n AVISIT_header = \"Analysis Visit\"\n )\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Laboratory Test Results Change from Baseline by Visit\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n # note: order matters here. If `PARAM` is first, the split will be first by `PARAM`and then by `AVISIT`\n choices = variable_choices(ADLB, c(\"PARAM\", \"AVISIT_header\")),\n selected = c(\"PARAM\", \"AVISIT_header\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADLB, c(\"AVAL\", \"CHG\", \"AVAL_CHG\")),\n selected = c(\"AVAL_CHG\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = \"CRP\"\n )\n )\n ),\n filter = teal_slices(teal_slice(\"ADLB\", \"AVAL\", selected = NULL))\n)\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADLB-filter-ADLB_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:54:39 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Vital Signs", - "VSL01" + "Tables", + "Lab Results", + "LBT03" ] }, { - "objectID": "listings/adverse-events/ael02_ed.html", - "href": "listings/adverse-events/ael02_ed.html", - "title": "AEL02_ED", + "objectID": "tables/lab-results/lbt12_bl.html", + "href": "tables/lab-results/lbt12_bl.html", + "title": "LBT12_BL", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\nlibrary(lubridate)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nadae_anl <- adae %>%\n filter(SAFFL == \"Y\") %>%\n mutate(\n DHM = as.period(LDOSEDTM %--% ASTDTM),\n TMOM = minute(DHM) + ifelse(second(DHM) >= 30, 1, 0),\n TMOH = hour(DHM) + ifelse(TMOM == 60, 1, 0),\n TMOD = day(DHM) + ifelse(TMOH == 24, 1, 0)\n ) %>%\n mutate(\n TMOM = TMOM %% 60,\n TMOH = TMOH %% 24\n )\n\nout <- adae_anl %>%\n mutate(\n ADURN = AENDY - ASTDY + 1,\n cent_subj = paste(SITEID, SUBJID, sep = \"/\"),\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n AESER_F = if_else(AESER == \"Y\", \"Yes\", \"No\", \"\"),\n AEREL_F = if_else(AEREL == \"Y\", \"Yes\", \"No\", \"\"),\n AECONTRT_F = if_else(AECONTRT == \"Y\", \"Yes\", \"No\", \"\"),\n AEOUT_F = case_when(\n AEOUT == \"FATAL\" ~ 1,\n AEOUT == \"NOT RECOVERED/NOT RESOLVED\" ~ 2,\n AEOUT == \"RECOVERED/RESOLVED\" ~ 3,\n AEOUT == \"RECOVERED/RESOLVED WITH SEQUELAE\" ~ 4,\n AEOUT == \"RECOVERING/RESOLVING\" ~ 5,\n AEOUT == \"UNKNOWN\" ~ 6\n ),\n AEACN_F = case_when(\n AEACN == \"DOSE INCREASED\" ~ 1,\n AEACN == \"DOSE NOT CHANGED\" ~ 2,\n AEACN == \"DOSE REDUCED\" | AEACN == \"DOSE RATE REDUCED\" ~ 3,\n AEACN == \"DRUG INTERRUPTED\" ~ 4,\n AEACN == \"DRUG WITHDRAWN\" ~ 5,\n AEACN == \"NOT APPLICABLE\" | AEACN == \"NOT EVALUABLE\" ~ 6,\n AEACN == \"UNKNOWN\" ~ 7\n )\n ) %>%\n select(\n cent_subj, ASR, TRT01A, AEDECOD, ASTDY, TMOD, TMOH, TMOM,\n ADURN, AESER_F, AESEV, AEREL_F, AEOUT_F, AECONTRT_F, AEACN_F\n )\n\nout <- out %>% var_relabel(\n cent_subj = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n AEDECOD = \"Adverse\\nEvent MedDRA\\nPreferred Term\",\n ASTDY = \"Study\\nDay of\\nOnset\",\n TMOD = \"Time from\\nLast Dose\\nto Onset\\ndays\",\n TMOH = \"Time from\\nLast Dose\\nto Onset\\nhrs\",\n TMOM = \"Time from\\nLast Dose\\nto Onset\\nmins\",\n ADURN = \"AE\\nDuration\\nin Days\",\n AESER_F = \"Serious\",\n AESEV = \"Most\\nExtreme\\nIntensity\",\n AEREL_F = \"Caused by\\nStudy\\nDrug\",\n AEOUT_F = \"Outcome\\n(1)\",\n AECONTRT_F = \"Treatment\\nfor AE\",\n AEACN_F = \"Action\\nTaken\\n(2)\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"cent_subj\", \"ASR\"),\n disp_cols = names(out),\n main_title = \"Listing of Adverse Events (for early development studies)\",\n main_footer = \"\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Adverse Events (for early development studies)\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Time from Time from Time from \n Adverse Study Last Dose Last Dose Last Dose AE Most Caused by Action\n Event MedDRA Day of to Onset to Onset to Onset Duration Extreme Study Outcome Treatment Taken \nTreatment Center/Patient ID Age/Sex/Race Preferred Term Onset days hrs mins in Days Serious Intensity Drug (1) for AE (2) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE dcd B.2.1.2.1 162 7 19 4 173 No MODERATE No 5 Yes 2 \n dcd D.1.1.4.2 196 1 20 48 166 No MODERATE No 5 No 2 \n dcd A.1.1.1.2 321 28 12 54 149 Yes MODERATE No 5 Yes 2 \n dcd A.1.1.1.2 393 12 19 17 43 Yes MODERATE No 5 No 5 \n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN dcd C.2.1.2.1 39 30 9 4 506 No MODERATE Yes 2 No 6 \n dcd D.1.1.1.1 64 26 17 10 630 Yes SEVERE Yes 1 No 6 \n dcd C.2.1.2.1 95 4 12 58 306 No MODERATE Yes 5 No 2 \n dcd A.1.1.1.2 160 24 5 57 259 Yes MODERATE No 2 Yes 2 \n dcd B.2.2.3.1 292 9 23 4 50 Yes MILD No 3 No 2 \n dcd A.1.1.1.2 459 9 5 4 195 Yes MODERATE No 5 Yes 2 \n dcd B.1.1.1.1 470 6 5 0 131 Yes SEVERE Yes 1 No 6 \n dcd A.1.1.1.2 475 20 16 16 113 Yes MODERATE No 4 Yes 2 \n dcd C.1.1.1.3 496 5 5 28 162 No SEVERE Yes 5 Yes 2 \n dcd B.1.1.1.1 641 8 17 4 15 Yes SEVERE Yes 1 Yes 6 \n BRA-1/id-93 34/F/ASIAN dcd D.1.1.4.2 44 18 15 39 47 No MODERATE No 5 Yes 2 \n dcd D.2.1.5.3 79 2 3 58 300 No MILD Yes 5 No 3 \n dcd A.1.1.1.1 136 22 1 19 78 No MILD No 3 Yes 2 \n dcd D.2.1.5.3 260 12 12 26 305 No MILD Yes 5 No 2 \n dcd C.1.1.1.3 281 4 14 52 106 No SEVERE Yes 5 Yes 2 \n dcd D.1.1.1.1 316 6 12 43 250 Yes SEVERE Yes 1 No 6 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:33 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] lubridate_1.9.3 rlistings_0.2.7.9011 tibble_3.2.1 \n[4] formatters_0.5.5.9016 scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 timechange_0.3.0 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 \n[29] utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 \n[33] withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadhy <- synthetic_cdisc_dataset(\"latest\", \"adhy\")\n\nanl <- adhy\nanl$APERIODC <- as.factor(anl$APERIODC) # to ensure the table is built even if there is no patients after filtering\nanl$ACTARM <- as.factor(anl$ACTARM) # to ensure the table is built even if there is no patients after filtering\n\nanl <- anl %>%\n filter(\n SAFFL == \"Y\",\n PARAMCD %in% c(\"ASTPBASE\", \"ALTPBASE\", \"ALTASTPB\") & AVISIT == \"POST-BASELINE\"\n ) %>%\n mutate(\n ARM_AVALC = factor(\n case_when(\n AVALC == \"Y\" ~ as.character(ACTARM),\n TRUE ~ \"Criteria not met\"\n ),\n levels = c(levels(anl$ACTARM), \"Criteria not met\")\n ),\n PARAM = factor(\n case_when(\n PARAMCD == \"ASTPBASE\" ~ \"AST>3x Baseline\",\n PARAMCD == \"ALTPBASE\" ~ \"ALT>3x Baseline\",\n PARAMCD == \"ALTASTPB\" ~ \"AST>3x Baseline or ALT>3x Baseline\"\n ),\n levels = c(\"AST>3x Baseline\", \"ALT>3x Baseline\", \"AST>3x Baseline or ALT>3x Baseline\")\n ),\n TITLE = factor(\"First Elevated Result Occurring During\")\n )\n\nanl <- df_explicit_na(anl)\n\n\n\n\n\nCoderesult <- basic_table() %>%\n split_cols_by(\"TITLE\") %>%\n split_cols_by(\"APERIODC\") %>%\n split_rows_by(\"PARAM\") %>%\n split_rows_by(\"ACTARM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\"ARM_AVALC\", .stats = \"fraction\", denom = \"n\", drop = TRUE) %>%\n build_table(anl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n dplyr::if_else(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- result %>% trim_rows(criteria = criteria_fun)\nresult\n\n First Elevated Result Occurring During \n PERIOD 1 PERIOD 2 \n——————————————————————————————————————————————————————————————————————————————\nAST>3x Baseline \n A: Drug X 14/134 (10.4%) 8/134 (6.0%) \n B: Placebo 11/134 (8.2%) 11/134 (8.2%) \n C: Combination 15/132 (11.4%) 14/132 (10.6%) \nALT>3x Baseline \n A: Drug X 7/134 (5.2%) 20/134 (14.9%) \n B: Placebo 10/134 (7.5%) 9/134 (6.7%) \n C: Combination 12/132 (9.1%) 8/132 (6.1%) \nAST>3x Baseline or ALT>3x Baseline \n A: Drug X 8/134 (6.0%) 22/134 (16.4%) \n B: Placebo 19/134 (14.2%) 15/134 (11.2%) \n C: Combination 14/132 (10.6%) 13/132 (9.8%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:54:15 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Adverse Events", - "AEL02_ED" + "Tables", + "Lab Results", + "LBT12_BL" ] }, { - "objectID": "listings/adverse-events/ael01_nollt.html", - "href": "listings/adverse-events/ael01_nollt.html", - "title": "AEL01_NOLLT", - "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nout <- adae %>%\n select(AESOC, AEDECOD, AETERM) %>%\n unique()\n\nvar_labels(out) <- c(\n AESOC = \"MedDRA System Organ Class\",\n AEDECOD = \"MedDRA Preferred Term\",\n AETERM = \"Investigator-Specified\\nAdverse Event Term\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"AESOC\", \"AEDECOD\"),\n disp_cols = names(out),\n main_title = \"Listing of Preferred Terms and Investigator-Specified Adverse Event Terms\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Preferred Terms and Investigator-Specified Adverse Event Terms\n\n——————————————————————————————————————————————————————————————————————————\n Investigator-Specified\nMedDRA System Organ Class MedDRA Preferred Term Adverse Event Term \n——————————————————————————————————————————————————————————————————————————\n cl A dcd A.1.1.1.1 trm A.1.1.1.1 \n dcd A.1.1.1.2 trm A.1.1.1.2 \n cl B dcd B.1.1.1.1 trm B.1.1.1.1 \n dcd B.2.1.2.1 trm B.2.1.2.1 \n dcd B.2.2.3.1 trm B.2.2.3.1 \n cl C dcd C.1.1.1.3 trm C.1.1.1.3 \n dcd C.2.1.2.1 trm C.2.1.2.1 \n cl D dcd D.1.1.1.1 trm D.1.1.1.1 \n dcd D.1.1.4.2 trm D.1.1.4.2 \n dcd D.2.1.5.3 trm D.2.1.5.3 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:26 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "objectID": "tables/lab-results/lbt11.html", + "href": "tables/lab-results/lbt11.html", + "title": "LBT11", + "section": "", + "text": "Data Setup\nTime-To-Event Summary\nTime-To-Event Summary Selecting Sections to Display\nTime-To-Event Summary with Stratified Analysis\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadaette <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadaette <- df_explicit_na(adaette)\n\nadsl_safl <- dplyr::filter(adsl, .data$SAFFL == \"Y\")\n\nanl <- adaette %>%\n dplyr::filter(\n SAFFL == \"Y\",\n PARAMCD == \"HYSTTEUL\"\n ) %>%\n dplyr::mutate(\n AVAL = .data$AVAL * dplyr::case_when( # convert to days, if possible\n .data$AVALU == \"WEEKS\" ~ 7,\n .data$AVALU == \"MONTHS\" ~ 30.4375,\n .data$AVALU == \"YEARS\" ~ 365,\n TRUE ~ 1\n ),\n AVALU = factor(dplyr::case_when(\n .data$AVALU %in% c(\"WEEKS\", \"MONTHS\", \"YEARS\") ~ factor(\"DAYS\"),\n TRUE ~ .data$AVALU\n ), levels = \"DAYS\"),\n is_event = CNSR == 0, # this will be a LLT event\n event_grp = factor(\n dplyr::case_when(\n CNSR == 0 ~ \"Patients with LLT event (%)\",\n CNSR == 1 ~ \"Patients without LLT event (%)\"\n ),\n levels = c(\n \"Patients with LLT event (%)\",\n \"Patients without LLT event (%)\"\n )\n )\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Unstratified Analysis\",\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 20 (14.9%) 9 (6.7%) 9 (6.8%) \nPatients without LLT event (%) 114 (85.1%) 125 (93.3%) 123 (93.2%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 728.0 \n 95% CI NA (724.0, NA) NA \n 25% and 75%-ile 618.0, NA 724.0, NA 728.0, 728.0 \n Range 1.0 to 731.0 {1} 1.0 to 728.0 {1} 1.0 to 728.0 {2}\nUnstratified Analysis \n p-value (log-rank) 0.0295 0.1687 \n Hazard Ratio 0.43 0.58 \n 95% CI (0.19, 0.94) (0.26, 1.27) \n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n{2} - Censored observation: range minimum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 20 (14.9%) 9 (6.7%) 9 (6.8%) \nPatients without LLT event (%) 114 (85.1%) 125 (93.3%) 123 (93.2%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 728.0 \n 95% CI NA (724.0, NA) NA \n 25% and 75%-ile 618.0, NA 724.0, NA 728.0, 728.0 \n Range 1.0 to 731.0 {1} 1.0 to 728.0 {1} 1.0 to 728.0 {2}\n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n{2} - Censored observation: range minimum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodestrata <- c(\"RACE\", \"SEX\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Unstratified Analysis\",\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = paste0(\"Stratified By: \", paste(strata, collapse = \", \")),\n strata = strata,\n table_names = \"coxph_stratified\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 20 (14.9%) 9 (6.7%) 9 (6.8%) \nPatients without LLT event (%) 114 (85.1%) 125 (93.3%) 123 (93.2%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 728.0 \n 95% CI NA (724.0, NA) NA \n 25% and 75%-ile 618.0, NA 724.0, NA 728.0, 728.0 \n Range 1.0 to 731.0 {1} 1.0 to 728.0 {1} 1.0 to 728.0 {2}\nUnstratified Analysis \n p-value (log-rank) 0.0295 0.1687 \n Hazard Ratio 0.43 0.58 \n 95% CI (0.19, 0.94) (0.26, 1.27) \nStratified By: RACE, SEX \n p-value (log-rank) 0.0858 0.1605 \n Hazard Ratio 0.51 0.57 \n 95% CI (0.23, 1.12) (0.26, 1.26) \n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n{2} - Censored observation: range minimum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAETTE <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAETTE <- df_explicit_na(ADAETTE)\n\n ADSL <- filter(ADSL, .data$SAFFL == \"Y\")\n ADAETTE <- filter(ADAETTE, .data$SAFFL == \"Y\")\n})\ndatanames <- c(\"ADSL\", \"ADAETTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAETTE <- data[[\"ADAETTE\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_tte(\n label = \"Time To LLT Event Table\",\n dataname = \"ADAETTE\",\n arm_var = choices_selected(\n variable_choices(data[[\"ADSL\"]], c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(data[[\"ADAETTE\"]], \"PARAMCD\", \"PARAM\"),\n \"HYSTTEUL\"\n ),\n strata_var = choices_selected(\n variable_choices(data[[\"ADSL\"]], c(\"RACE\", \"SEX\")),\n c(\"RACE\", \"SEX\")\n ),\n time_points = choices_selected(0, NULL),\n event_desc_var = choices_selected(\"EVNTDESC\", \"EVNTDESC\", fixed = TRUE)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:54:01 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Adverse Events", - "AEL01_NOLLT" + "Tables", + "Lab Results", + "LBT11" ] }, { - "objectID": "listings/adverse-events/ael03.html", - "href": "listings/adverse-events/ael03.html", - "title": "AEL03", + "objectID": "tables/lab-results/lbt01.html", + "href": "tables/lab-results/lbt01.html", + "title": "LBT01", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nout <- adae %>%\n filter(AESER == \"Y\") %>%\n mutate(\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n Date_First = toupper(format(as.Date(TRTSDTM), \"%d%b%Y\")),\n Duration = AENDY - ASTDY + 1,\n Related = ifelse(AEREL == \"Y\", \"Yes\", ifelse(AEREL == \"N\", \"No\", \"\")),\n Outcome = case_when(\n AEOUT == \"FATAL\" ~ 1,\n AEOUT == \"NOT RECOVERED/NOT RESOLVED\" ~ 2,\n AEOUT == \"RECOVERED/RESOLVED\" ~ 3,\n AEOUT == \"RECOVERED/RESOLVED WITH SEQUELAE\" ~ 4,\n AEOUT == \"RECOVERING/RESOLVING\" ~ 5,\n AEOUT == \"UNKNOWN\" ~ 6\n ),\n Treated = ifelse(AECONTRT == \"Y\", \"Yes\", ifelse(AECONTRT == \"N\", \"No\", \"\")),\n Action = case_when(\n AEACN == \"DOSE INCREASED\" ~ 1,\n AEACN == \"DOSE NOT CHANGED\" ~ 2,\n AEACN == \"DOSE REDUCED\" | AEACN == \"DOSE RATE REDUCED\" ~ 3,\n AEACN == \"DRUG INTERRUPTED\" ~ 4,\n AEACN == \"DRUG WITHDRAWN\" ~ 5,\n AEACN == \"NOT APPLICABLE\" | AEACN == \"NOT EVALUABLE\" ~ 6,\n AEACN == \"UNKNOWN\" ~ 7\n ),\n SERREAS = case_when(\n AESDTH == \"Y\" ~ \"1\",\n AESLIFE == \"Y\" ~ \"2\",\n AESHOSP == \"Y\" ~ \"3\",\n AESDISAB == \"Y\" ~ \"4\",\n AESCONG == \"Y\" ~ \"5\",\n AESMIE == \"Y\" ~ \"6\",\n TRUE ~ \" \"\n )\n ) %>%\n select(CPID, ASR, TRT01A, AEDECOD, Date_First, ASTDY, Duration, AESEV, Related, Outcome, Treated, Action, SERREAS)\n\nvar_labels(out) <- c(\n CPID = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n AEDECOD = \"Adverse\\nEvent MedDRA\\nPreferred Term\",\n Date_First = \"Date of\\nFirst Study\\nDrug\\nAdministration\",\n ASTDY = \"Study\\nDay of\\nOnset\",\n Duration = \"AE\\nDuration\\nin Days\",\n AESEV = \"Most\\nExtreme\\nIntensity\",\n Related = \"Caused by\\nStudy\\nDrug\",\n Outcome = \"Outcome\\n(1)\",\n Treated = \"Treatment\\nfor AE\",\n Action = \"Action\\nTaken\\n(2)\",\n SERREAS = \"Reason\\nClassified\\nas Serious\\n(3)\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CPID\", \"ASR\"),\n disp_cols = names(out),\n main_title = \"Listing of Serious Adverse Events\",\n main_footer = \"\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n(3) Reason classified as serious: 1 = resulted in death; 2 = life threatening;\n 3 = required prolonged in patient hospitalization; 4 = disabling;\n 5 = a congenital anomaly/birth defect in offspring of study subject;\n 6 = does not meet any of the above serious criteria, but may jeopardize the subject,\n and may require medical or surgical intervention to prevent one of the outcomes listed above.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Serious Adverse Events\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of Reason \n Adverse First Study Study AE Most Caused by Action Classified\n Event MedDRA Drug Day of Duration Extreme Study Outcome Treatment Taken as Serious\nTreatment Center/Patient ID Age/Sex/Race Preferred Term Administration Onset in Days Intensity Drug (1) for AE (2) (3) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE dcd A.1.1.1.2 04NOV2020 321 149 MODERATE No 5 Yes 2 4 \n dcd A.1.1.1.2 04NOV2020 393 43 MODERATE No 5 No 5 5 \n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN dcd D.1.1.1.1 01JAN2020 64 630 SEVERE Yes 1 No 6 1 \n dcd A.1.1.1.2 01JAN2020 160 259 MODERATE No 2 Yes 2 4 \n dcd B.2.2.3.1 01JAN2020 292 50 MILD No 3 No 2 4 \n dcd A.1.1.1.2 01JAN2020 459 195 MODERATE No 5 Yes 2 5 \n dcd B.1.1.1.1 01JAN2020 470 131 SEVERE Yes 1 No 6 1 \n dcd A.1.1.1.2 01JAN2020 475 113 MODERATE No 4 Yes 2 4 \n dcd B.1.1.1.1 01JAN2020 641 15 SEVERE Yes 1 Yes 6 1 \n BRA-1/id-93 34/F/ASIAN dcd D.1.1.1.1 20JUN2020 316 250 SEVERE Yes 1 No 6 1 \n dcd B.1.1.1.1 20JUN2020 523 24 SEVERE Yes 1 No 6 1 \n dcd B.2.2.3.1 20JUN2020 596 10 MILD No 3 Yes 2 4 \n BRA-11/id-345 37/F/WHITE dcd B.1.1.1.1 18AUG2020 1009 35 SEVERE Yes 1 No 6 1 \n BRA-11/id-397 38/M/ASIAN dcd D.1.1.1.1 27JUN2020 516 441 SEVERE Yes 1 No 6 1 \n dcd B.1.1.1.1 27JUN2020 1011 30 SEVERE Yes 1 Yes 6 1 \n BRA-11/id-50 26/M/BLACK OR AFRICAN AMERICAN dcd A.1.1.1.2 28APR2019 1007 68 MODERATE No 3 Yes 2 5 \n BRA-13/id-177 24/M/WHITE dcd B.1.1.1.1 30AUG2020 249 470 SEVERE Yes 1 No 6 1 \n dcd B.1.1.1.1 30AUG2020 1012 33 SEVERE Yes 1 No 6 1 \n BRA-15/id-36 38/F/ASIAN dcd B.1.1.1.1 08JAN2020 372 154 SEVERE Yes 1 Yes 6 1 \n dcd A.1.1.1.2 08JAN2020 573 134 MODERATE No 3 Yes 2 3 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n(3) Reason classified as serious: 1 = resulted in death; 2 = life threatening;\n 3 = required prolonged in patient hospitalization; 4 = disabling;\n 5 = a congenital anomaly/birth defect in offspring of study subject;\n 6 = does not meet any of the above serious criteria, but may jeopardize the subject,\n and may require medical or surgical intervention to prevent one of the outcomes listed above.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:20 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\nIn order to generate the LBT01 standard tabulation, the adlb dataset may be pre-processed so as to discriminate baseline from follow-up visits.\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb) %>%\n filter(ANL01FL == \"Y\")\n\n# For illustration purpose, the example focuses on \"Alanine Aminotransferase\n# Measurement\" starting from baseline, while excluding visit at week 1 for\n# subjects who were prescribed a placebo.\nadlb_f <- adlb %>%\n dplyr::filter(\n PARAM == \"Alanine Aminotransferase Measurement\" &\n !(ACTARM == \"B: Placebo\" & AVISIT == \"WEEK 1 DAY 8\") &\n AVISIT != \"SCREENING\"\n )\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nafun <- function(x, .var, .spl_context, ...) {\n n_fun <- sum(!is.na(x), na.rm = TRUE)\n if (n_fun == 0) {\n mean_sd_fun <- c(NA, NA)\n median_fun <- NA\n min_max_fun <- c(NA, NA)\n } else {\n mean_sd_fun <- c(mean(x, na.rm = TRUE), sd(x, na.rm = TRUE))\n median_fun <- median(x, na.rm = TRUE)\n min_max_fun <- c(min(x), max(x))\n }\n is_chg <- .var == \"CHG\"\n is_baseline <- .spl_context$value[which(.spl_context$split == \"AVISIT\")] == \"BASELINE\"\n if (is_baseline && is_chg) n_fun <- mean_sd_fun <- median_fun <- min_max_fun <- NULL\n\n in_rows(\n \"n\" = n_fun,\n \"Mean (SD)\" = mean_sd_fun,\n \"Median\" = median_fun,\n \"Min - Max\" = min_max_fun,\n .formats = list(\"n\" = \"xx\", \"Mean (SD)\" = \"xx.xx (xx.xx)\", \"Median\" = \"xx.xx\", \"Min - Max\" = \"xx.xx - xx.xx\"),\n .format_na_strs = list(\"n\" = \"NE\", \"Mean (SD)\" = \"NE (NE)\", \"Median\" = \"NE\", \"Min - Max\" = \"NE - NE\")\n )\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f$PARAM)) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f$AVISIT)) %>%\n split_cols_by_multivar(\n vars = c(\"AVAL\", \"CHG\"),\n varlabels = c(\"Value at Visit\", \"Change from\\nBaseline\")\n ) %>%\n analyze_colvars(afun = afun)\n\nresult <- build_table(lyt, adlb_f)\nresult\n\n A: Drug X B: Placebo C: Combination \n Change from Change from Change from \nParameter Value at Visit Baseline Value at Visit Baseline Value at Visit Baseline \n Analysis Visit (N=804) (N=804) (N=670) (N=670) (N=792) (N=792) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n BASELINE \n n 134 134 132 \n Mean (SD) 17.74 (9.93) 18.71 (9.83) 19.46 (9.08) \n Median 17.46 18.19 18.97 \n Min - Max 0.00 - 44.06 1.48 - 54.40 0.57 - 39.81 \n WEEK 1 DAY 8 \n n 134 134 0 0 132 132 \n Mean (SD) 16.75 (9.08) -0.99 (13.49) NE (NE) NE (NE) 19.61 (9.27) 0.14 (12.85) \n Median 16.02 -1.28 NE NE 19.00 0.06 \n Min - Max 0.05 - 36.30 -31.31 - 27.89 NE - NE NE - NE 0.91 - 44.75 -32.45 - 38.85\n WEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 17.82 (9.60) 0.08 (14.15) 18.82 (9.73) 0.11 (14.45) 16.55 (8.15) -2.92 (12.64) \n Median 15.92 0.28 17.96 -0.93 17.02 -1.11 \n Min - Max 0.40 - 44.33 -32.89 - 40.55 0.18 - 44.34 -45.93 - 29.85 0.35 - 34.69 -28.36 - 23.98\n WEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 18.37 (9.30) 0.63 (13.85) 17.65 (9.58) -1.06 (13.58) 16.75 (9.54) -2.71 (13.22) \n Median 18.11 1.13 17.68 -0.49 15.10 -2.66 \n Min - Max 0.59 - 41.73 -40.09 - 31.24 0.02 - 38.61 -46.30 - 31.38 0.48 - 39.23 -30.63 - 26.51\n WEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 19.17 (10.95) 1.44 (15.39) 17.22 (10.64) -1.48 (15.20) 17.92 (9.32) -1.54 (12.63) \n Median 17.41 0.88 15.88 -2.96 17.71 -1.53 \n Min - Max 0.93 - 54.24 -32.93 - 46.98 0.39 - 47.96 -41.45 - 43.08 0.25 - 41.27 -30.33 - 27.99\n WEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 19.22 (9.47) 1.48 (14.49) 18.01 (9.92) -0.69 (14.65) 18.51 (9.43) -0.95 (12.92) \n Median 19.80 2.31 18.28 1.82 19.26 -2.48 \n Min - Max 0.01 - 43.42 -40.08 - 30.07 0.11 - 40.64 -47.60 - 26.04 0.02 - 37.46 -29.78 - 25.00\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADLB <- df_explicit_na(ADLB)\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Laboratory Test Results and Change from Baseline by Visit\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADLB, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"AVISIT\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADLB, c(\"AVAL\", \"CHG\")),\n selected = c(\"AVAL\", \"CHG\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = \"ALT\"\n ),\n parallel_vars = TRUE\n )\n ),\n filter = teal_slices(teal_slice(\"ADLB\", \"AVAL\", selected = NULL))\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADLB-filter-ADLB_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:53:39 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Adverse Events", - "AEL03" + "Tables", + "Lab Results", + "LBT01" ] }, { - "objectID": "listings/disposition/dsl01.html", - "href": "listings/disposition/dsl01.html", - "title": "DSL01", + "objectID": "tables/lab-results/lbt10_bl.html", + "href": "tables/lab-results/lbt10_bl.html", + "title": "LBT10_BL", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\nout <- adsl %>%\n filter(AEWITHFL == \"Y\") %>%\n mutate(\n ID = paste(SITEID, SUBJID, sep = \"/\"),\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n SSADM = toupper(format(as.Date(TRTSDTM), format = \"%d%b%Y\")),\n STDWD = as.numeric(ceiling(difftime(TRTEDTM, TRTSDTM, units = \"days\"))),\n DISCONT = ifelse(!is.na(DCSREAS) & toupper(EOSSTT) == \"DISCONTINUED\", \"Yes\", \"No\")\n ) %>%\n select(ID, ASR, TRT01A, SSADM, STDWD, DISCONT)\n\nvar_labels(out) <- c(\n ID = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n SSADM = \"Date of First\\nStudy Drug\\nAdministration\",\n STDWD = \"Study Day\\nof Withdrawal\",\n DISCONT = \"Discontinued\\nEarly from Study?\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = \"TRT01A\",\n disp_cols = names(out),\n main_title = \"Listing of Patients with Study Drug Withdrawn Due to Adverse Events\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Patients with Study Drug Withdrawn Due to Adverse Events\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of First \n Study Drug Study Day Discontinued \n Treatment Center/Patient ID Age/Sex/Race Administration of Withdrawal Early from Study?\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X RUS-18/id-359 47/F/BLACK OR AFRICAN AMERICAN 08JUN2019 1096 No \n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN 01JAN2020 NA No \n CHN-11/id-256 23/M/ASIAN 17MAR2020 1096 No \n CHN-1/id-26 29/M/WHITE 16JUL2020 1096 No \n CHN-1/id-62 36/F/WHITE 22NOV2020 455 Yes \n B: Placebo CHN-7/id-28 40/M/AMERICAN INDIAN OR ALASKA NATIVE 11MAR2019 1096 No \n CHN-13/id-102 37/M/ASIAN 23MAR2019 1096 No \n CHN-3/id-333 30/F/BLACK OR AFRICAN AMERICAN 13JAN2020 NA No \n USA-12/id-226 30/M/WHITE 29JAN2020 NA No \n CHN-9/id-147 26/F/ASIAN 06FEB2020 NA No \n USA-11/id-157 50/M/WHITE 14JUN2020 1096 No \n CHN-9/id-11 28/F/NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 27JAN2021 388 Yes \nC: Combination CHN-15/id-262 35/M/BLACK OR AFRICAN AMERICAN 26FEB2019 1096 No \n NGA-11/id-173 24/F/BLACK OR AFRICAN AMERICAN 10MAR2019 1096 No \n CHN-11/id-263 34/F/ASIAN 03APR2019 1096 No \n PAK-2/id-191 38/F/AMERICAN INDIAN OR ALASKA NATIVE 07APR2019 1096 No \n USA-11/id-136 38/F/ASIAN 02OCT2019 865 Yes \n CHN-17/id-31 35/F/ASIAN 17NOV2019 NA No \n BRA-11/id-237 64/F/ASIAN 10MAR2020 1096 No \n USA-11/id-100 40/F/ASIAN 10MAR2020 705 Yes \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:13 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Selecting Sections\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadhy <- synthetic_cdisc_dataset(\"latest\", \"adhy\")\n\nadhy_liver <- adhy %>%\n filter(PARAMCD %in% c(\n \"BL2AL2CB\", \"BL2AS2CB\", \"BG2AL2CB\", \"BG2AS2CB\", \"B2A2L2CB\", \"B2A2S2CB\", \"B2A5L2CB\", \"B2A5S2CB\"\n )) %>%\n mutate(PARAMCAT = case_when(\n PARAMCD %in% c(\"BL2AL2CB\", \"BL2AS2CB\") ~ \"Total Bilirubin <= 2xULN\",\n PARAMCD %in% c(\"BG2AL2CB\", \"BG2AS2CB\") ~ \"Total Bilirubin > 2xULN\",\n PARAMCD %in% c(\"B2A2L2CB\", \"B2A2S2CB\") ~ \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN\",\n PARAMCD %in% c(\"B2A5L2CB\", \"B2A5S2CB\") ~ \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN\"\n )) %>%\n mutate(AVALC_FORMAT = case_when(\n PARAMCD %in% c(\"BL2AL2CB\", \"BG2AL2CB\", \"B2A2L2CB\", \"B2A5L2CB\") & AVALC == \"Y\" ~ \"ALT >3xULN at 2 Visits\",\n PARAMCD %in% c(\"BL2AS2CB\", \"BG2AS2CB\", \"B2A2S2CB\", \"B2A5S2CB\") & AVALC == \"Y\" ~ \"AST >3xULN at 2 Visits\",\n TRUE ~ \"Criteria not met\"\n ))\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nanl <- df_explicit_na(adhy_liver)\n\n\n\n\n\nCodetbl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_rows_by(\"PARAMCAT\") %>%\n split_rows_by(\"PARAM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\n vars = \"AVALC_FORMAT\",\n .stats = c(\"fraction\"),\n denom = \"n\",\n drop = TRUE\n ) %>%\n build_table(anl, alt_counts_df = adsl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- tbl %>% trim_rows(criteria = criteria_fun)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3xULN at 2 Visits 25/134 (18.7%) 20/134 (14.9%) 27/132 (20.5%)\n AST >3xULN at 2 Visits 22/134 (16.4%) 14/134 (10.4%) 37/132 (28.0%)\nTotal Bilirubin > 2xULN \n ALT >3xULN at 2 Visits 26/134 (19.4%) 31/134 (23.1%) 23/132 (17.4%)\n AST >3xULN at 2 Visits 30/134 (22.4%) 27/134 (20.1%) 26/132 (19.7%)\n\n\n\n\n\nCodetbl2 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_rows_by(\"PARAMCAT\", split_fun = remove_split_levels(\"Total Bilirubin > 2xULN\")) %>%\n split_rows_by(\"PARAM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\n vars = \"AVALC_FORMAT\",\n .stats = c(\"fraction\"),\n denom = \"n\",\n drop = TRUE\n ) %>%\n build_table(anl, alt_counts_df = adsl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- tbl2 %>% trim_rows(criteria = criteria_fun)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3xULN at 2 Visits 25/134 (18.7%) 20/134 (14.9%) 27/132 (20.5%)\n AST >3xULN at 2 Visits 22/134 (16.4%) 14/134 (10.4%) 37/132 (28.0%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:53:17 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Disposition", - "DSL01" + "Tables", + "Lab Results", + "LBT10_BL" ] }, { - "objectID": "listings/ECG/egl01.html", - "href": "listings/ECG/egl01.html", - "title": "EGL01", + "objectID": "tables/lab-results/lbt11_bl.html", + "href": "tables/lab-results/lbt11_bl.html", + "title": "LBT11_BL", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\nget_param_unit_range <- function(dataset) {\n u_rng <- lapply(unique(dataset$PARAMCD), function(p) {\n dat <- dataset %>% filter(PARAMCD == p)\n list(\n unit = unique(dat$AVALU),\n range = paste0(unique(dat$ANRLO), \"-\", unique(dat$ANRHI))\n )\n })\n names(u_rng) <- unique(dataset$PARAMCD)\n u_rng\n}\n\neg_u_rng <- get_param_unit_range(adeg)\n\nadeg_sub <- adeg %>%\n filter(!is.na(AVAL) & SAFFL == \"Y\" & ANL01FL == \"Y\" & !is.na(EGSEQ) & PARAMCD != \"ECGINTP\") %>%\n mutate(\n CRTNPT = paste(SITEID, sub(\"^.*-([[:alnum:]]+)$\", \"\\\\1\", SUBJID), sep = \"/\"),\n AGSXRC = paste(AGE, SEX, RACE, sep = \"/\"),\n AVAL = format(round(AVAL, 2), nsmall = 2),\n AVAL_ANRIND = ifelse(ANRIND %in% c(\"NORMAL\", \"\"), AVAL, paste(AVAL, substr(ANRIND, 1, 1), sep = \"/\")),\n CHG = format(round(CHG, 2), nsmall = 2)\n )\n\nanl_eg <- adeg_sub %>%\n select(SUBJID, CRTNPT, AGSXRC, TRT01A, PARAMCD, AVAL_ANRIND, CHG, ADY, AVISIT, ADTM) %>%\n tidyr::pivot_wider(\n id_cols = c(SUBJID, CRTNPT, AGSXRC, TRT01A, ADY, AVISIT, ADTM),\n names_from = PARAMCD,\n values_from = c(AVAL_ANRIND, CHG)\n )\n\nout <- anl_eg %>%\n select(\n CRTNPT,\n AGSXRC,\n TRT01A,\n AVISIT,\n ADY,\n AVAL_ANRIND_HR,\n CHG_HR,\n AVAL_ANRIND_QT,\n CHG_QT,\n AVAL_ANRIND_RR,\n CHG_RR\n ) %>%\n var_relabel(\n CRTNPT = \"Center/Subject ID\",\n AGSXRC = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n AVISIT = \"Visit\",\n ADY = \"Study\\nDay\",\n AVAL_ANRIND_HR = paste0(\"Heart Rate Result\\n(\", eg_u_rng$HR$unit, \");\\nRange:(\", eg_u_rng$HR$range, \")\"),\n CHG_HR = \"Heart Rate\\nChange from BL\",\n AVAL_ANRIND_QT = paste0(\"QT Duration Result\\n(\", eg_u_rng$QT$unit, \");\\nRange:(\", eg_u_rng$QT$range, \")\"),\n CHG_QT = \"QT Duration\\nChange from BL\",\n AVAL_ANRIND_RR = paste0(\"RR Duration Result\\n(\", eg_u_rng$RR$unit, \");\\nRange:(\", eg_u_rng$RR$range, \")\"),\n CHG_RR = \"RR Duration\\nChange from BL\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CRTNPT\", \"AGSXRC\", \"AVISIT\", \"ADY\"),\n disp_cols = names(out),\n main_title = \"Listing of ECG Data: Safety-Evaluable Patients\",\n main_footer = \"Baseline is the patient's last observation prior to initiation of study drug. Abnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range.\" \n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of ECG Data: Safety-Evaluable Patients\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Heart Rate Result QT Duration Result RR Duration Result \n Study (beats/min); Heart Rate (msec); QT Duration (msec); RR Duration \nTreatment Center/Subject ID Age/Sex/Race Visit Day Range:(40-100) Change from BL Range:(200-500) Change from BL Range:(600-1500) Change from BL\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/105 38/M/BLACK OR AFRICAN AMERICAN BASELINE 149 66.94 NA 441.78 NA 896.59 NA \n WEEK 1 DAY 8 314 63.18 -3.76 365.68 -76.10 1376.26 479.67 \n WEEK 2 DAY 15 398 57.57 -9.37 355.48 -86.29 799.57 -97.02 \n WEEK 3 DAY 22 470 73.36 6.42 352.45 -89.33 1015.00 118.41 \n WEEK 4 DAY 29 528 53.72 -13.22 388.42 -53.36 1189.29 292.70 \n WEEK 5 DAY 36 535 58.25 -8.69 291.77 -150.01 936.09 39.50 \n BRA-1/134 47/M/WHITE BASELINE 227 46.99 NA 385.29 NA 835.17 NA \n WEEK 1 DAY 8 255 48.38 1.39 453.74 68.46 901.86 66.68 \n WEEK 2 DAY 15 269 35.40/L -11.59 413.54 28.26 892.01 56.84 \n WEEK 3 DAY 22 357 60.50 13.51 394.23 8.95 490.18/L -344.99 \n WEEK 4 DAY 29 436 82.28 35.29 398.29 13.00 757.96 -77.21 \n WEEK 5 DAY 36 440 38.89/L -8.10 339.38 -45.91 880.26 45.08 \n BRA-1/42 36/M/BLACK OR AFRICAN AMERICAN BASELINE 477 56.19 NA 190.94/L NA 1276.65 NA \n WEEK 1 DAY 8 534 85.24 29.05 483.71 292.77 735.11 -541.54 \n WEEK 2 DAY 15 550 55.53 -0.66 386.60 195.66 1092.71 -183.94 \n WEEK 3 DAY 22 569 65.37 9.18 311.08 120.14 1227.15 -49.50 \n WEEK 4 DAY 29 608 65.13 8.93 329.78 138.83 250.18/L -1026.47 \n WEEK 5 DAY 36 675 49.03 -7.16 470.67 279.73 1321.21 44.56 \n BRA-1/93 34/F/ASIAN BASELINE 73 72.12 NA 306.64 NA 1324.80 NA \n WEEK 1 DAY 8 207 66.88 -5.24 190.50/L -116.14 1495.37 170.58 \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nBaseline is the patient's last observation prior to initiation of study drug. Abnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:06 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nTime-To-Event Summary\nTime-To-Event Summary Selecting Sections to Display\nTime-To-Event Summary with Stratified Analysis\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadaette <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadaette <- df_explicit_na(adaette)\n\nadsl_safl <- dplyr::filter(adsl, .data$SAFFL == \"Y\")\n\nanl <- adaette %>%\n dplyr::filter(\n SAFFL == \"Y\",\n PARAMCD == \"HYSTTEBL\"\n ) %>%\n dplyr::mutate(\n AVAL = .data$AVAL * dplyr::case_when( # convert to days, if possible\n .data$AVALU == \"WEEKS\" ~ 7,\n .data$AVALU == \"MONTHS\" ~ 30.4375,\n .data$AVALU == \"YEARS\" ~ 365,\n TRUE ~ 1\n ),\n AVALU = factor(dplyr::case_when(\n .data$AVALU %in% c(\"WEEKS\", \"MONTHS\", \"YEARS\") ~ factor(\"DAYS\"),\n TRUE ~ .data$AVALU\n ), levels = \"DAYS\"),\n is_event = CNSR == 0, # this will be a LLT event\n event_grp = factor(\n dplyr::case_when(\n CNSR == 0 ~ \"Patients with LLT event (%)\",\n CNSR == 1 ~ \"Patients without LLT event (%)\"\n ),\n levels = c(\n \"Patients with LLT event (%)\",\n \"Patients without LLT event (%)\"\n )\n )\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Unstratified Analysis\",\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 14 (10.4%) 18 (13.4%) 15 (11.4%) \nPatients without LLT event (%) 120 (89.6%) 116 (86.6%) 117 (88.6%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 721.0 \n 95% CI NA (681.0, NA) (691.0, NA) \n 25% and 75%-ile 608.0, NA 558.0, NA 644.0, NA \n Range 1.0 to 728.0 {1} 1.0 to 726.0 {1} 1.0 to 724.0 {1}\nUnstratified Analysis \n p-value (log-rank) 0.5013 0.6413 \n Hazard Ratio 1.27 0.84 \n 95% CI (0.63, 2.56) (0.40, 1.75) \n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 14 (10.4%) 18 (13.4%) 15 (11.4%) \nPatients without LLT event (%) 120 (89.6%) 116 (86.6%) 117 (88.6%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 721.0 \n 95% CI NA (681.0, NA) (691.0, NA) \n 25% and 75%-ile 608.0, NA 558.0, NA 644.0, NA \n Range 1.0 to 728.0 {1} 1.0 to 726.0 {1} 1.0 to 724.0 {1}\n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodestrata <- c(\"RACE\", \"SEX\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Unstratified Analysis\",\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = paste0(\"Stratified By: \", paste(strata, collapse = \", \")),\n strata = strata,\n table_names = \"coxph_stratified\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 14 (10.4%) 18 (13.4%) 15 (11.4%) \nPatients without LLT event (%) 120 (89.6%) 116 (86.6%) 117 (88.6%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 721.0 \n 95% CI NA (681.0, NA) (691.0, NA) \n 25% and 75%-ile 608.0, NA 558.0, NA 644.0, NA \n Range 1.0 to 728.0 {1} 1.0 to 726.0 {1} 1.0 to 724.0 {1}\nUnstratified Analysis \n p-value (log-rank) 0.5013 0.6413 \n Hazard Ratio 1.27 0.84 \n 95% CI (0.63, 2.56) (0.40, 1.75) \nStratified By: RACE, SEX \n p-value (log-rank) 0.3886 0.7970 \n Hazard Ratio 1.39 0.91 \n 95% CI (0.65, 2.97) (0.43, 1.93) \n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAETTE <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAETTE <- df_explicit_na(ADAETTE)\n\n ADSL <- filter(ADSL, .data$SAFFL == \"Y\")\n ADAETTE <- filter(ADAETTE, .data$SAFFL == \"Y\")\n})\ndatanames <- c(\"ADSL\", \"ADAETTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAETTE <- data[[\"ADAETTE\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_tte(\n label = \"Time To LLT Event Table\",\n dataname = \"ADAETTE\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADAETTE, \"PARAMCD\", \"PARAM\"),\n \"HYSTTEBL\"\n ),\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"RACE\", \"SEX\")),\n c(\"RACE\", \"SEX\")\n ),\n time_points = choices_selected(0, NULL),\n event_desc_var = choices_selected(\"EVNTDESC\", \"EVNTDESC\", fixed = TRUE)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:52:54 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "ECG", - "EGL01" + "Tables", + "Lab Results", + "LBT11_BL" ] }, { - "objectID": "listings/concomitant-medications/cml02a_gl.html", - "href": "listings/concomitant-medications/cml02a_gl.html", - "title": "CML02A_GL", + "objectID": "tables/vital-signs/vst01.html", + "href": "tables/vital-signs/vst01.html", + "title": "VST01", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nout <- adcm %>%\n select(ATC2, CMDECOD, CMTRT) %>%\n unique()\n\nvar_labels(out) <- c(\n ATC2 = \"ATC Class Level 2\",\n CMDECOD = \"WHODrug Preferred Name\",\n CMTRT = \"Investigator-Specified\\nTreatment Term\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"ATC2\", \"CMDECOD\", \"CMTRT\"),\n disp_cols = names(out),\n main_title = \"Listing of Concomitant Medication Class Level 2, Preferred Name, and Investigator-Specified Terms\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Concomitant Medication Class Level 2, Preferred Name, and Investigator-Specified Terms\n\n———————————————————————————————————————————————————————————————————\n Investigator-Specified\nATC Class Level 2 WHODrug Preferred Name Treatment Term \n———————————————————————————————————————————————————————————————————\n ATCCLAS2 A medname A_1/3 A_1/3 \n medname A_2/3 A_2/3 \n medname A_3/3 A_3/3 \n ATCCLAS2 A p2 medname A_3/3 A_3/3 \n ATCCLAS2 B medname B_1/4 B_1/4 \n medname B_2/4 B_2/4 \n medname B_3/4 B_3/4 \n medname B_4/4 B_4/4 \n ATCCLAS2 B p2 medname B_1/4 B_1/4 \n medname B_2/4 B_2/4 \n ATCCLAS2 B p3 medname B_1/4 B_1/4 \n medname B_2/4 B_2/4 \n ATCCLAS2 C medname C_1/2 C_1/2 \n medname C_2/2 C_2/2 \n ATCCLAS2 C p2 medname C_1/2 C_1/2 \n medname C_2/2 C_2/2 \n ATCCLAS2 C p3 medname C_2/2 C_2/2 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:59 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadvs <- synthetic_cdisc_dataset(\"latest\", \"advs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadvs <- df_explicit_na(advs)\n\nadvs_label <- var_labels(advs)\n\nadvs <- advs %>%\n filter(\n PARAMCD == \"DIABP\",\n PARAM == \"Diastolic Blood Pressure\"\n ) %>%\n mutate(\n PARAMCD = droplevels(PARAMCD),\n PARAM = droplevels(PARAM)\n )\n\n# post-baseline\nadvs_pb <- advs %>%\n filter(ABLFL != \"Y\", ABLFL2 != \"Y\")\n\nadvs_pb_max <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(desc(AVAL)) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Maximum\")\n\nadvs_pb_min <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(AVAL) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Minimum\")\n\nadvs_pb_last <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(desc(AVISITN)) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Last\")\n\n# Please note that for real data, per ADaM Spec 1.1, the advs_f can be obtained by filtering on PARAMCD, then\n# ANL01FL == 'Y' or AVISIT in c('POST-BASELINE MAXIMUM', 'POST-BASELINE MINIMUM', 'POST-BASELINE LAST')\n\nadvs_f <- rbind(\n advs,\n advs_pb_last,\n advs_pb_min,\n advs_pb_max\n)\n\nadvs_f <- advs_f %>%\n mutate(AVISIT = droplevels(AVISIT))\n\nvar_labels(advs_f) <- advs_label\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nafun <- function(x, .var, .spl_context, ...) {\n n_fun <- sum(!is.na(x), na.rm = TRUE)\n if (n_fun == 0) {\n mean_sd_fun <- c(NA, NA)\n median_fun <- NA\n min_max_fun <- c(NA, NA)\n } else {\n mean_sd_fun <- c(mean(x, na.rm = TRUE), sd(x, na.rm = TRUE))\n median_fun <- median(x, na.rm = TRUE)\n min_max_fun <- c(min(x), max(x))\n }\n is_chg <- .var == \"CHG\"\n is_baseline <- .spl_context$value[which(.spl_context$split == \"AVISIT\")] == \"BASELINE\"\n if (is_baseline && is_chg) n_fun <- mean_sd_fun <- median_fun <- min_max_fun <- NULL\n\n in_rows(\n \"n\" = n_fun,\n \"Mean (SD)\" = mean_sd_fun,\n \"Median\" = median_fun,\n \"Min - Max\" = min_max_fun,\n .formats = list(\"n\" = \"xx\", \"Mean (SD)\" = \"xx.xx (xx.xx)\", \"Median\" = \"xx.xx\", \"Min - Max\" = \"xx.xx - xx.xx\"),\n .format_na_strs = list(\"n\" = \"NE\", \"Mean (SD)\" = \"NE (NE)\", \"Median\" = \"NE\", \"Min - Max\" = \"NE - NE\")\n )\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = \"\\n\\nAnalysis Visit\") %>%\n split_cols_by_multivar(\n vars = c(\"AVAL\", \"CHG\"),\n varlabels = c(\"Value at Visit\", \"Change from\\nBaseline\")\n ) %>%\n analyze_colvars(afun = afun)\n\nresult <- build_table(lyt = lyt, df = advs_f, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination \n Change from Change from Change from \n Value at Visit Baseline Value at Visit Baseline Value at Visit Baseline \nAnalysis Visit (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nSCREENING \n n 134 0 134 0 132 0 \n Mean (SD) 99.92 (17.99) NE (NE) 101.88 (21.07) NE (NE) 100.48 (19.07) NE (NE) \n Median 99.26 NE 100.22 NE 99.10 NE \n Min - Max 54.22 - 152.98 NE - NE 48.15 - 148.03 NE - NE 42.22 - 149.95 NE - NE \nBASELINE \n n 134 134 132 \n Mean (SD) 96.50 (19.90) 101.10 (19.87) 102.77 (19.48) \n Median 96.05 100.45 102.01 \n Min - Max 44.28 - 136.59 29.21 - 143.77 49.37 - 153.50 \nWEEK 1 DAY 8 \n n 134 134 134 134 132 132 \n Mean (SD) 100.65 (18.79) 4.14 (26.93) 99.19 (19.36) -1.92 (27.37) 97.14 (19.72) -5.63 (25.95) \n Median 100.22 1.52 99.37 -2.79 94.19 -5.57 \n Min - Max 57.60 - 147.46 -50.92 - 74.84 59.28 - 141.21 -64.50 - 70.93 50.98 - 142.47 -55.15 - 56.11\nWEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 102.09 (19.62) 5.58 (29.38) 99.29 (21.11) -1.81 (31.11) 99.95 (20.85) -2.81 (29.10) \n Median 103.59 7.82 100.57 -1.77 102.52 -5.68 \n Min - Max 54.73 - 150.85 -59.71 - 98.08 51.60 - 145.28 -71.00 - 92.43 37.06 - 138.92 -73.10 - 76.80\nWEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 101.78 (19.54) 5.28 (27.16) 97.73 (19.85) -3.37 (27.76) 99.86 (19.15) -2.91 (27.25) \n Median 100.39 6.53 98.83 -5.79 100.06 -1.54 \n Min - Max 47.68 - 162.22 -64.46 - 76.64 36.25 - 142.78 -70.23 - 84.74 53.80 - 146.37 -74.30 - 67.46\nWEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 100.18 (20.18) 3.68 (27.21) 99.06 (17.75) -2.04 (26.59) 99.27 (20.12) -3.50 (27.62) \n Median 98.17 3.00 97.98 -1.89 99.61 -0.46 \n Min - Max 48.52 - 153.41 -77.30 - 61.90 56.78 - 142.45 -82.96 - 89.87 46.87 - 146.12 -88.68 - 70.90\nWEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 101.42 (18.83) 4.92 (28.02) 95.92 (19.90) -5.19 (29.34) 97.73 (18.92) -5.04 (26.64) \n Median 98.56 3.93 94.30 -7.18 98.09 -5.62 \n Min - Max 62.66 - 155.52 -63.05 - 78.66 51.06 - 151.52 -78.07 - 72.91 51.48 - 157.27 -76.13 - 86.42\nPost-Baseline Last \n n 134 134 134 134 132 132 \n Mean (SD) 101.42 (18.83) 4.92 (28.02) 95.92 (19.90) -5.19 (29.34) 97.73 (18.92) -5.04 (26.64) \n Median 98.56 3.93 94.30 -7.18 98.09 -5.62 \n Min - Max 62.66 - 155.52 -63.05 - 78.66 51.06 - 151.52 -78.07 - 72.91 51.48 - 157.27 -76.13 - 86.42\nPost-Baseline Minimum \n n 134 134 134 134 132 132 \n Mean (SD) 78.98 (11.94) -17.52 (23.92) 75.77 (13.25) -25.33 (25.39) 76.35 (13.13) -26.41 (22.78)\n Median 80.14 -13.96 75.71 -26.70 76.26 -27.17 \n Min - Max 47.68 - 110.54 -77.30 - 33.00 36.25 - 113.53 -82.96 - 69.23 37.06 - 112.35 -88.68 - 34.24\nPost-Baseline Maximum \n n 134 134 134 134 132 132 \n Mean (SD) 125.08 (12.28) 28.57 (23.20) 121.33 (12.01) 20.23 (23.64) 121.42 (12.09) 18.65 (22.74) \n Median 124.20 29.14 120.80 18.74 122.55 16.93 \n Min - Max 94.06 - 162.22 -21.49 - 98.08 94.43 - 151.52 -34.95 - 92.43 79.39 - 157.27 -43.32 - 86.42\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADVS <- synthetic_cdisc_dataset(\"latest\", \"advs\")\n advs_label <- col_labels(ADVS)\n\n # post-baseline\n advs_pb <- ADVS %>%\n filter(\n ABLFL != \"Y\",\n ABLFL2 != \"Y\"\n )\n\n advs_pb_max <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(desc(AVAL)) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Maximum\")\n\n advs_pb_min <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(AVAL) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Minimum\")\n\n advs_pb_last <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(desc(AVISITN)) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Last\")\n\n ADVS <- rbind(\n ADVS,\n advs_pb_last,\n advs_pb_min,\n advs_pb_max\n ) %>%\n mutate(AVISIT = droplevels(AVISIT))\n\n col_labels(ADVS) <- advs_label\n})\ndatanames <- c(\"ADSL\", \"ADVS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADVS <- data[[\"ADVS\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Vital Sign Results and Change from Baseline by Visit\",\n dataname = \"ADVS\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADVS, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"AVISIT\", \"PARAM\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADVS, c(\"AVAL\", \"CHG\")),\n selected = c(\"AVAL\", \"CHG\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADVS, \"PARAMCD\", \"PARAM\"),\n selected = \"DIABP\"\n ),\n parallel_vars = TRUE\n )\n ),\n filter = teal_slices(teal_slice(\"ADVS\", \"AVAL\", selected = NULL))\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADVS-filter-ADVS_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:52:30 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Concomitant Medications", - "CML02A_GL" + "Tables", + "Vital Signs", + "VST01" ] }, { - "objectID": "listings/efficacy/oncl01.html", - "href": "listings/efficacy/oncl01.html", - "title": "ONCL01", + "objectID": "tables/concomitant-medications/cmt01b.html", + "href": "tables/concomitant-medications/cmt01b.html", + "title": "CMT01B", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadrs <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\nout_ex <- adex %>%\n filter(PARAMCD == \"TNDOSE\") %>%\n mutate(ID = paste(SITEID, SUBJID, sep = \"/\")) %>%\n select(ID, AVAL)\n\nout_rs <- adrs %>%\n filter(PARAM %in% c(\"Investigator End Of Induction Response\", \"Best Confirmed Overall Response by Investigator\")) %>%\n mutate(ID = paste(SITEID, SUBJID, sep = \"/\")) %>%\n select(ID, AVALC, PARAM) %>%\n tidyr::pivot_wider(\n id_cols = ID,\n names_from = PARAM,\n values_from = AVALC\n ) %>%\n right_join(out_ex, ., by = \"ID\", multiple = \"all\")\n\nadtte_flt <- adtte %>%\n filter(PARAMCD %in% c(\"OS\", \"PFS\", \"CRSD\")) %>%\n mutate(\n PARAM = paste(PARAM, paste0(\"(\", AVALU, \")\"), sep = \" \"), ID = paste(SITEID, SUBJID, sep = \"/\"),\n trigeventpfs = ifelse(CNSR == 0, EVNTDESC, NA)\n )\n\n# Select triggering event variable\nout_trg <- adtte_flt %>%\n select(ID, trigeventpfs)\n\nout_tte <- adtte_flt %>%\n select(ID, TRT01A, PARAM, AVAL, trigeventpfs) %>%\n tidyr::pivot_wider(\n id_cols = c(ID, TRT01A),\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate_at(\n c(\"Overall Survival (DAYS)\", \"Progression Free Survival (DAYS)\", \"Duration of Confirmed Response (DAYS)\"),\n function(x) format(round(x, 1), nsmall = 1)\n ) %>%\n select(\n ID,\n TRT01A,\n `Overall Survival (DAYS)`,\n `Progression Free Survival (DAYS)`,\n `Duration of Confirmed Response (DAYS)`\n ) %>%\n right_join(out_trg, ., by = \"ID\", multiple = \"all\")\n\nout <- out_tte %>%\n right_join(out_rs, ., by = \"ID\", multiple = \"all\") %>%\n select(\n \"ID\", \"TRT01A\", \"AVAL\", \"Best Confirmed Overall Response by Investigator\",\n \"Investigator End Of Induction Response\", \"Overall Survival (DAYS)\", \"Progression Free Survival (DAYS)\",\n \"trigeventpfs\", \"Duration of Confirmed Response (DAYS)\"\n )\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n ID = \"Center/Patient ID\",\n TRT01A = \"Treatment\",\n AVAL = \"Number of Doses\\nReceived\",\n `Best Confirmed Overall Response by Investigator` = \"Best Confirmed\\nOverall Response\\nby Investigator\",\n `Investigator End Of Induction Response` = \"Investigator\\nEnd Of Induction\\nResponse\",\n trigeventpfs = \"Triggering Event\\n for PFS\",\n `Overall Survival (DAYS)` = \"Overall Survival\\n(days)\",\n `Progression Free Survival (DAYS)` = \"PFS\\n(days)\",\n `Duration of Confirmed Response (DAYS)` = \"Duration of\\nConfirmed Response\\n(days)\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"ID\"),\n disp_cols = names(out),\n main_title = \"Listing of Individual Efficacy Data\",\n main_footer = \"PFS = Progression Free Survival\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Individual Efficacy Data\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Best Confirmed Investigator Duration of \n Number of Doses Overall Response End Of Induction Overall Survival PFS Triggering Event Confirmed Response\nTreatment Center/Patient ID Received by Investigator Response (days) (days) for PFS (days) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-105 7 CR CR 402.6 235.7 Disease Progression 119.6 \n 7 CR CR 402.6 235.7 NA 119.6 \n 7 CR CR 402.6 235.7 NA 119.6 \n BRA-1/id-134 7 CR CR 90.1 90.1 Death 90.1 \n 7 CR CR 90.1 90.1 Death 90.1 \n 7 CR CR 90.1 90.1 Death 90.1 \n BRA-1/id-42 7 PR PR 407.0 204.6 Disease Progression 193.9 \n 7 PR PR 407.0 204.6 NA 193.9 \n 7 PR PR 407.0 204.6 NA 193.9 \n BRA-1/id-93 7 CR PD 316.0 255.7 NA 140.3 \n 7 CR PD 316.0 255.7 NA 140.3 \n 7 CR PD 316.0 255.7 NA 140.3 \n BRA-11/id-217 7 CR CR 293.0 293.0 Disease Progression 153.2 \n 7 CR CR 293.0 293.0 Death 153.2 \n 7 CR CR 293.0 293.0 Death 153.2 \n BRA-11/id-345 7 CR CR 305.5 272.6 NA 150.6 \n 7 CR CR 305.5 272.6 NA 150.6 \n 7 CR CR 305.5 272.6 NA 150.6 \n BRA-11/id-397 7 PR PR 138.7 138.7 Death 138.7 \n 7 PR PR 138.7 138.7 Death 138.7 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nPFS = Progression Free Survival\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:52 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4\n[25] testthat_3.2.1 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table with > 1 ATC Class Level\nTable Changing Class Levels\nTable with Classes Sorted by Frequency\nTable with Total Number of Treatments per Medication Class Suppressed\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nadcm$CMSEQ <- as.factor(adcm$CMSEQ)\n\nadsl <- df_explicit_na(adsl)\nadcm <- df_explicit_na(adcm)\n\n# Keep only safety-evaluable patients and concomitant medications\nadsl <- adsl %>%\n filter(SAFFL == \"Y\")\n\nadcm <- adcm %>%\n filter(SAFFL == \"Y\" & ATIREL == \"CONCOMITANT\")\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC1\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC1)\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n split_rows_by(\n \"ATC3\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC3)\n ) %>%\n split_rows_by(\n \"ATC4\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC4)\n ) %>%\n append_topleft(\" Other Treatment\") %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adcm,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC1\", \"*\", \"ATC2\", \"*\", \"ATC3\", \"*\", \"ATC4\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 1 Text \n ATC Level 2 Text \n ATC Level 3 Text \n ATC Level 4 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS1 A \n ATCCLAS2 A \n ATCCLAS3 A \n ATCCLAS4 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 A p2 \n ATCCLAS2 A p2 \n ATCCLAS3 A p2 \n ATCCLAS4 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 B \n ATCCLAS2 B \n ATCCLAS3 B \n ATCCLAS4 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS1 B p2 \n ATCCLAS2 B p2 \n ATCCLAS3 B p2 \n ATCCLAS4 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 B p3 \n ATCCLAS2 B p3 \n ATCCLAS3 B p3 \n ATCCLAS4 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 C \n ATCCLAS2 C \n ATCCLAS3 C \n ATCCLAS4 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p2 \n ATCCLAS2 C p2 \n ATCCLAS3 C p2 \n ATCCLAS4 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p3 \n ATCCLAS2 C p3 \n ATCCLAS3 C p3 \n ATCCLAS4 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC3\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC3)\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_topleft(\" Other Treatment\")\n\nresult <- build_table(\n lyt = lyt,\n df = adcm,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC3\", \"*\", \"ATC2\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 3 Text \n ATC Level 2 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS3 A \n ATCCLAS2 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS3 A p2 \n ATCCLAS2 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS3 B \n ATCCLAS2 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS3 B p2 \n ATCCLAS2 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS3 B p3 \n ATCCLAS2 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS3 C \n ATCCLAS2 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS3 C p2 \n ATCCLAS2 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS3 C p3 \n ATCCLAS2 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\n\n\nCode# In progress\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\n \"ATC1\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC1)\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n split_rows_by(\n \"ATC3\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC3)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC4\",\n child_labels = \"visible\",\n nested = TRUE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC4)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_topleft(\" Other Treatment\")\n\nresult <- build_table(\n lyt = lyt,\n df = adcm,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC1\", \"*\", \"ATC2\", \"*\", \"ATC3\", \"*\", \"ATC4\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 1 Text \n ATC Level 2 Text \n ATC Level 3 Text \n ATC Level 4 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————\nATCCLAS1 A \n ATCCLAS2 A \n ATCCLAS3 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n ATCCLAS4 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 A p2 \n ATCCLAS2 A p2 \n ATCCLAS3 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n ATCCLAS4 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 B \n ATCCLAS2 B \n ATCCLAS3 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n ATCCLAS4 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS1 B p2 \n ATCCLAS2 B p2 \n ATCCLAS3 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n ATCCLAS4 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 B p3 \n ATCCLAS2 B p3 \n ATCCLAS3 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n ATCCLAS4 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 C \n ATCCLAS2 C \n ATCCLAS3 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n ATCCLAS4 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p2 \n ATCCLAS2 C p2 \n ATCCLAS3 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n ATCCLAS4 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p3 \n ATCCLAS2 C p3 \n ATCCLAS3 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n ATCCLAS4 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\nadcm_keys <- c(\"STUDYID\", \"USUBJID\", \"ASTDTM\", \"CMSEQ\", \"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADCM <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n ADCM$CMSEQ <- as.integer(ADCM$CMSEQ)\n\n ADSL <- df_explicit_na(ADSL)\n ADCM <- df_explicit_na(ADCM)\n})\ndatanames <- c(\"ADSL\", \"ADCM\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\njoin_keys(data)[\"ADCM\", \"ADCM\"] <- adcm_keys\n\n## Reusable Configuration For Modules\nADCM <- data[[\"ADCM\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_mult_events(\n label = \"Concomitant Medications by Medication Class and Preferred Name\",\n dataname = \"ADCM\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n seq_var = choices_selected(\"CMSEQ\", selected = \"CMSEQ\", fixed = TRUE),\n hlt = choices_selected(\n choices = variable_choices(ADCM, c(\"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")),\n selected = c(\"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")\n ),\n llt = choices_selected(\n choices = variable_choices(ADCM, c(\"CMDECOD\")),\n selected = c(\"CMDECOD\")\n ),\n add_total = FALSE,\n event_type = \"treatment\"\n )\n ),\n filter = teal_slices(\n teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"),\n teal_slice(\"ADCM\", \"ATIREL\", selected = \"CONCOMITANT\")\n )\n)\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:51:57 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Efficacy", - "ONCL01" + "Tables", + "Concomitant Medications", + "CMT01B" ] }, { - "objectID": "listings/pharmacokinetic/pkpl04.html", - "href": "listings/pharmacokinetic/pkpl04.html", - "title": "PKPL04", + "objectID": "tables/concomitant-medications/cmt02_pt.html", + "href": "tables/concomitant-medications/cmt02_pt.html", + "title": "CMT02_PT", "section": "", - "text": "Data Setup\nStandard Listing - CYCLE 1 DAY 1\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(rlistings)\nlibrary(scda)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\nvisit <- \"CYCLE 1 DAY 1\"\ndrug_a <- \"Plasma Drug X\" # numerator drug\ndrug_b <- \"Plasma Drug Y\" # denominator drug\n\nadpp_x <- adpp %>%\n filter(\n AVISIT == visit,\n PPCAT %in% c(drug_a, drug_b),\n PARAMCD %in% c(\"CMAX\", \"AUCIFO\")\n ) %>%\n mutate(\n PARAM_U = paste0(PARAM, \" (\", AVALU, \")\")\n )\n\nadpp_ratio <- adpp_x %>%\n tidyr::pivot_wider(\n id_cols = c(USUBJID, PARAM_U),\n names_from = PPCAT,\n values_from = AVAL\n )\n\nadpp_ratio[, paste0(drug_a, \"/\", drug_b)] <- as.numeric(unlist(adpp_ratio[, drug_a] / adpp_ratio[, drug_b]))\n\nout <- adpp_ratio %>%\n tidyr::pivot_wider(\n id_cols = USUBJID,\n names_from = PARAM_U,\n names_glue = \"{PARAM_U}\\n{.value}\",\n values_from = c(all_of(drug_a), all_of(drug_b), paste0(drug_a, \"/\", drug_b))\n ) %>%\n select(names(.)[c(1:2, 4, 6, 3, 5, 7)])\n\nvar_labels(out) <- names(out)\nout <- out %>% var_relabel(USUBJID = \"Subject ID\")\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = \"USUBJID\",\n disp_cols = names(out),\n main_title = paste0(\n \"Listing of Individual \", drug_a, \" \", paste(unique(adpp_x$PARAM), collapse = \" and \"), \" Ratios following \",\n unique(adpp_x$REGIMEN), \" \", paste(drug_a, drug_b, sep = \" or \"), \", PK Population\\nProtocol: xxnnnnn\",\n \"\\nVisit: \", unique(adpp_x$AVISIT)\n ),\n subtitles = paste0(\"\\nAnalytes: \", paste(drug_a, drug_b, sep = \" and \"))\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Individual Plasma Drug X AUC Infinity Obs and Max Conc Ratios following BID Plasma Drug X or Plasma Drug Y, PK Population\nProtocol: xxnnnnn\nVisit: CYCLE 1 DAY 1\n\nAnalytes: Plasma Drug X and Plasma Drug Y\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n AUC Infinity Obs (day*ug/mL) AUC Infinity Obs (day*ug/mL) AUC Infinity Obs (day*ug/mL) Max Conc (ug/mL) Max Conc (ug/mL) Max Conc (ug/mL) \n Subject ID Plasma Drug X Plasma Drug Y Plasma Drug X/Plasma Drug Y Plasma Drug X Plasma Drug Y Plasma Drug X/Plasma Drug Y\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAB12345-BRA-1-id-105 246.349321001289 NA NA 31.2264481880236 NA NA \nAB12345-BRA-1-id-134 248.519038520728 NA NA 21.7795763901966 NA NA \nAB12345-BRA-1-id-141 204.038850147211 191.797779791421 1.06382279486812 29.5409649407056 38.8911230490524 0.759581174949522 \nAB12345-BRA-1-id-265 196.360864588266 218.652833415662 0.898048570973609 35.6328283094637 34.2215467219396 1.04123956170044 \n AB12345-BRA-1-id-42 210.528307366678 NA NA 26.7845825535397 NA NA \n AB12345-BRA-1-id-93 160.406798051843 NA NA 17.5296885232566 NA NA \nAB12345-BRA-11-id-171 217.543269983548 180.798322952882 1.20323721166508 30.3782220474834 31.615072576154 0.960877820992148 \nAB12345-BRA-11-id-217 272.094354596647 NA NA 34.2812274648873 NA NA \nAB12345-BRA-11-id-237 148.094218281784 193.694022424355 0.764578154907287 32.9103242471385 38.7385450224575 0.849549827647366 \nAB12345-BRA-11-id-321 206.178847103577 216.464946980475 0.95248145244585 33.0064256549217 28.4783979285037 1.1589986816599 \nAB12345-BRA-11-id-345 228.51025073098 NA NA 39.7523164840323 NA NA \nAB12345-BRA-11-id-397 201.536920713046 NA NA 36.5841424116449 NA NA \nAB12345-BRA-11-id-50 189.012389008811 NA NA 21.1977400008473 NA NA \n AB12345-BRA-11-id-9 235.477941027941 207.851453783084 1.13291457308587 27.1559637630099 28.2923295654501 0.959834844995305 \nAB12345-BRA-13-id-177 185.956676853099 NA NA 31.0405525087113 NA NA \nAB12345-BRA-14-id-120 209.878908685802 301.584778421544 0.695920098435608 31.8076450080362 22.9229189133965 1.38759139393227 \nAB12345-BRA-14-id-23 270.799396057463 NA NA 29.2804222629517 NA NA \nAB12345-BRA-15-id-36 183.877364155027 NA NA 37.9405096212457 NA NA \nAB12345-BRA-2-id-296 216.092875093089 NA NA 27.3509307000219 NA NA \nAB12345-BRA-4-id-368 203.23438144437 149.30280248041 1.36122281744199 38.3952821076341 30.8121148640987 1.24610992387189 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:45 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 rlistings_0.2.7.9011 tibble_3.2.1 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nadcm$CMSEQ <- as.factor(adcm$CMSEQ)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n# If you want your missing levels to show as \"No Coding Available\", please use\nadsl <- df_explicit_na(adsl, na_level = \"No Coding Available\")\nadcm <- df_explicit_na(adcm, na_level = \"No Coding Available\")\n\n# Keep only safety-evaluable patients and concomitant medications\nadsl <- adsl %>%\n filter(SAFFL == \"Y\")\n\n# Keep only concomitant medications\nadcm <- adcm %>% filter(ATIREL == \"CONCOMITANT\")\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n add_overall_col(\"All Patients\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n ),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(vars = \"CMDECOD\") %>%\n append_topleft(paste(\"\\nOther Treatment\"))\n\nresult <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%\n sort_at_path(\n path = c(\"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\nOther Treatment (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) 349 (87.2%) \nTotal number of treatments 415 414 460 1289 \nmedname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) 170 (42.5%) \nmedname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) 168 (42.0%) \nmedname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) 159 (39.8%) \nmedname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) 157 (39.2%) \nmedname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) 150 (37.5%) \nmedname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) 147 (36.8%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\nadcm_keys <- c(\"STUDYID\", \"USUBJID\", \"ASTDTM\", \"CMSEQ\", \"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADCM <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n ADCM$CMSEQ <- as.integer(ADCM$CMSEQ)\n\n ADSL <- df_explicit_na(ADSL)\n ADCM <- df_explicit_na(ADCM)\n})\ndatanames <- c(\"ADSL\", \"ADCM\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\njoin_keys(data)[\"ADCM\", \"ADCM\"] <- adcm_keys\n\n## Reusable Configuration For Modules\nADCM <- data[[\"ADCM\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_mult_events(\n label = \"Concomitant Medications by Medication Class and Preferred Name\",\n dataname = \"ADCM\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n seq_var = choices_selected(\"CMSEQ\", selected = \"CMSEQ\", fixed = TRUE),\n hlt = choices_selected(\n choices = variable_choices(ADCM, c(\"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")),\n selected = c(\"ATC1\")\n ),\n llt = choices_selected(\n choices = variable_choices(ADCM, c(\"CMDECOD\")),\n selected = c(\"CMDECOD\")\n ),\n add_total = TRUE,\n event_type = \"treatment\"\n )\n ),\n filter = teal_slices(\n teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"),\n teal_slice(\"ADCM\", \"ATIREL\", selected = \"CONCOMITANT\")\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:51:20 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Pharmacokinetic", - "PKPL04" + "Tables", + "Concomitant Medications", + "CMT02_PT" ] }, { - "objectID": "listings/pharmacokinetic/pkcl02.html", - "href": "listings/pharmacokinetic/pkcl02.html", - "title": "PKCL02", + "objectID": "tables/risk-management-plan/rmpt01.html", + "href": "tables/risk-management-plan/rmpt01.html", + "title": "RMPT01", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(rlistings)\nlibrary(scda)\n\ndrug_a <- \"Drug X\"\nspec <- \"URINE\"\n\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\")\nadpc_x <- adpc %>%\n mutate(REGIMEN = ifelse(\"REGIMEN\" %in% names(adpc), REGIMEN, \"BID\")) %>%\n filter(\n grepl(drug_a, PARAM),\n ASMED == spec\n )\n\nout <- adpc_x %>%\n tidyr::pivot_longer(\n cols = c(AVAL, PCVOL),\n names_to = \"URCD\",\n values_to = \"VALUE\"\n ) %>%\n mutate(\n URCD = case_when(\n URCD == \"AVAL\" ~ \"UR_Conc\",\n URCD == \"PCVOL\" ~ \"Vurine\",\n TRUE ~ URCD\n ),\n UNIT = case_when(\n URCD == \"UR_Conc\" ~ as.character(AVALU),\n URCD == \"Vurine\" ~ as.character(PCVOLU),\n TRUE ~ \"NA\"\n )\n ) %>%\n mutate(\n PARAM_INT = paste0(\n URCD, \" (\", UNIT, \") -\\nUrine Collection\\nInterval\",\n ifelse(PCTPT == \"Predose\", \"\", \" (hours)\"), \":\\n\",\n gsub(\"[PTH]\", \"\", PCTPT)\n )\n ) %>%\n select(TRT01A, USUBJID, VISIT, PARAM_INT, VALUE) %>%\n unique() %>%\n tidyr::pivot_wider(\n id_cols = c(TRT01A, USUBJID, VISIT),\n names_from = PARAM_INT,\n values_from = VALUE\n )\n\nvar_labels(out) <- names(out)\nout <- out %>% var_relabel(\n TRT01A = \"Treatment Group\",\n USUBJID = \"Subject ID\",\n VISIT = \"Visit\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"USUBJID\", \"VISIT\"),\n disp_cols = names(out),\n main_title = paste0(\n \"Listing of \", drug_a, \" Urine Concentration and Volumes following \", unique(adpc_x$REGIMEN)[1],\n \" of \", drug_a, \", PK Population\\nProtocol: xxnnnnn\"\n ),\n subtitles = paste(\"Analyte:\", drug_a)\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Drug X Urine Concentration and Volumes following BID of Drug X, PK Population\nProtocol: xxnnnnn\nAnalyte: Drug X\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n UR_Conc (ug/mL) - Vurine (mL) - UR_Conc (ug/mL) - Vurine (mL) - UR_Conc (ug/mL) - Vurine (mL) - UR_Conc (ug/mL) - Vurine (mL) - UR_Conc (ug/mL) - Vurine (mL) - \n Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection \n Interval: Interval: Interval (hours): Interval (hours): Interval (hours): Interval (hours): Interval (hours): Interval (hours): Interval (hours): Interval (hours):\nTreatment Group Subject ID Visit redose redose 0 - 4 0 - 4 4 - 8 4 - 8 8 - 12 8 - 12 0 - 24 0 - 24 \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X AB12345-BRA-1-id-105 Day 1 0 713.94 5.461 96.92 0.562 235.38 0.049 384.98 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 735.22 \n AB12345-BRA-1-id-134 Day 1 0 1068.83 4.064 145.1 0.178 352.39 0.006 576.35 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 1080.14 \n AB12345-BRA-1-id-42 Day 1 0 817.09 4.277 110.93 0.305 269.39 0.018 440.6 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 737.25 \n AB12345-BRA-1-id-93 Day 1 0 864.61 4.324 117.38 0.278 285.06 0.015 466.23 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 757.23 \n AB12345-BRA-11-id-217 Day 1 0 724.93 6.225 98.41 0.672 239.01 0.059 390.91 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 1185.46 \n AB12345-BRA-11-id-345 Day 1 0 840.09 6.511 114.05 0.588 276.98 0.04 453.01 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 883.89 \n AB12345-BRA-11-id-397 Day 1 0 974.41 5.478 132.28 0.354 321.26 0.017 525.44 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 918.67 \n AB12345-BRA-11-id-50 Day 1 0 922.97 4.122 125.3 0.228 304.3 0.01 497.7 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 808.08 \n AB12345-BRA-13-id-177 Day 1 0 694.09 4.267 94.23 0.421 228.84 0.038 374.28 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 908.45 \n AB12345-BRA-14-id-23 Day 1 0 722.84 4.254 98.13 0.386 238.32 0.032 389.78 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 862.1 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:37 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 rlistings_0.2.7.9011 tibble_3.2.1 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadex <- df_explicit_na(adex)\n\n# Simulate ADEX records with PARAMCD == \"TDURD\" as they are not in sample scda dataset.\nset.seed(1, kind = \"Mersenne-Twister\")\nadex2 <- adex %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE)\n ) %>%\n bind_rows(adex)\n\n# Now pre-processing steps are carried out.\nanl <- adex2 %>%\n filter(\n PARAMCD == \"TDURD\",\n PARCAT2 == \"Drug A\",\n SAFFL == \"Y\"\n ) %>%\n mutate(\n aval_months = day2month(AVAL),\n aval_months_cat = factor(case_when(\n aval_months < 1 ~ \"< 1 month\",\n aval_months >= 1 & aval_months < 3 ~ \"1 to <3 months\",\n aval_months >= 3 & aval_months < 6 ~ \"3 to <6 months\",\n TRUE ~ \">=6 months\"\n ), levels = c(\"< 1 month\", \"1 to <3 months\", \"3 to <6 months\", \">=6 months\"))\n )\n\nadsl_f <- adsl %>% filter(adsl$SAFFL == \"Y\")\n\n\n\n\n\nCodelyt <- basic_table(\n title = \"Duration of Exposure: Safety-Evaluable Patients\",\n main_footer = \"* Patient Time is the sum of exposure across all patients in days.\",\n show_colcounts = TRUE\n) %>%\n summarize_patients_exposure_in_cols(\n var = \"AVAL\", col_split = TRUE,\n .labels = c(n_patients = \"Number of Patients\", sum_exposure = \"Patient Time*\"),\n custom_label = \"Total Number of Patients and Patient Time\"\n ) %>%\n analyze_patients_exposure_in_cols(\n var = \"aval_months_cat\",\n col_split = FALSE\n ) %>%\n append_topleft(c(\"\", \"Duration of exposure\"))\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_f)\nresult\n\nDuration of Exposure: Safety-Evaluable Patients\n\n——————————————————————————————————————————————————————————————————————————————\n Number of Patients Patient Time*\nDuration of exposure (N=400) (N=400) \n——————————————————————————————————————————————————————————————————————————————\nTotal Number of Patients and Patient Time 217 (54.2%) 20641 \n < 1 month 28 (7.0%) 504 \n 1 to <3 months 79 (19.8%) 4727 \n 3 to <6 months 101 (25.2%) 13690 \n >=6 months 9 (2.2%) 1720 \n——————————————————————————————————————————————————————————————————————————————\n\n* Patient Time is the sum of exposure across all patients in days.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEX <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n labels <- col_labels(ADEX)\n set.seed(1, kind = \"Mersenne-Twister\")\n ADEX <- ADEX %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE),\n AVALU = \"Days\"\n ) %>%\n bind_rows(ADEX)\n\n ADEX <- ADEX %>%\n mutate(\n aval_months = day2month(AVAL),\n aval_months_cat = factor(case_when(\n aval_months < 1 ~ \"< 1 month\",\n aval_months >= 1 & aval_months < 3 ~ \"1 to <3 months\",\n aval_months >= 3 & aval_months < 6 ~ \"3 to <6 months\",\n TRUE ~ \">=6 months\"\n ), levels = c(\"< 1 month\", \"1 to <3 months\", \"3 to <6 months\", \">=6 months\")) %>% with_label(\"Overall duration\")\n ) %>%\n select(-aval_months)\n})\ndatanames <- c(\"ADSL\", \"ADEX\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADEX <- data[[\"ADEX\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_exposure(\n label = \"Duration of Exposure Table\",\n dataname = \"ADEX\",\n paramcd = choices_selected(\n choices = value_choices(ADEX, \"PARAMCD\", \"PARAM\"),\n selected = \"TDURD\"\n ),\n col_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"ARM\")),\n selected = \"ARM\"\n ),\n row_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"aval_months_cat\", \"RACE\", \"STRATA1\", \"SEX\")),\n selected = \"aval_months_cat\"\n ),\n parcat = choices_selected(\n choices = value_choices(ADEX, \"PARCAT2\"),\n selected = \"Drug A\"\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:50:48 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Pharmacokinetic", - "PKCL02" + "Tables", + "Risk Management Plan", + "RMPT01" ] }, { - "objectID": "listings/pharmacokinetic/pkpl02.html", - "href": "listings/pharmacokinetic/pkpl02.html", - "title": "PKPL02", + "objectID": "tables/risk-management-plan/rmpt03.html", + "href": "tables/risk-management-plan/rmpt03.html", + "title": "RMPT03", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(rlistings)\nlibrary(scda)\n\ndrug_a <- \"Plasma Drug X\"\nspec <- \"Urine\"\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp_x <- adpp %>% filter(\n PPCAT == drug_a,\n PPSPEC == spec\n)\n\nout <- adpp_x %>%\n mutate(PARAM = paste0(PARAM, \" (\", AVALU, \")\")) %>%\n select(TRT01A, USUBJID, AVISIT, PARAM, AVAL) %>%\n unique() %>%\n tidyr::pivot_wider(\n id_cols = c(TRT01A, USUBJID, AVISIT),\n names_from = PARAM,\n values_from = AVAL\n )\n\nvar_labels(out) <- names(out)\nout <- out %>% var_relabel(\n TRT01A = \"Treatment Group\",\n USUBJID = \"Subject ID\",\n AVISIT = \"Visit\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"USUBJID\", \"AVISIT\"),\n disp_cols = names(out),\n main_title = paste(\"Listing of\", drug_a, spec, \"PK Parameters, PK Population\\nProtocol: xxnnnnn\"),\n subtitles = paste(\"Analyte:\", drug_a)\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Plasma Drug X Urine PK Parameters, PK Population\nProtocol: xxnnnnn\nAnalyte: Plasma Drug X\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Group Subject ID Visit Renal CL (L/hr) Renal CL Norm by Dose (L/hr/mg) Amt Rec from T1 to T2 (mg) Pct Rec from T1 to T2 (%)\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X AB12345-BRA-1-id-105 SCREENING 0.0538423152160391 0.00441769893771616 2.15210785813109 17.8220657702531 \n CYCLE 1 DAY 1 0.0480828455497337 0.00418360874479016 1.77968465488986 13.4821873677008 \n CYCLE 1 DAY 2 0.0524191320174391 0.00574562025709617 1.7751362634173 11.7748899262287 \n AB12345-BRA-1-id-134 SCREENING 0.054828756388858 0.00489378524965625 1.69069405572207 14.6782255303037 \n CYCLE 1 DAY 1 0.0463628883891636 0.00281388401660215 1.03364773182262 15.2049132671477 \n CYCLE 1 DAY 2 0.0542853013687975 0.00480239019141706 2.07978470495693 16.6499332185177 \n AB12345-BRA-1-id-42 SCREENING 0.0479776607513692 0.00620670551445586 1.49259200502984 12.4632371401908 \n CYCLE 1 DAY 1 0.060136833920038 0.00423749524975822 2.002399829348 16.1228873656652 \n CYCLE 1 DAY 2 0.0222050225259149 0.0041513339034891 1.65173021070619 10.129985981426 \n AB12345-BRA-1-id-93 SCREENING 0.0429283028076499 0.00450841008626937 0.882348047230192 19.8088728992851 \n CYCLE 1 DAY 1 0.0343747382858835 0.00495342578722049 1.73500915591676 14.8733500411057 \n CYCLE 1 DAY 2 0.0474831008867497 0.00415970555107753 1.30298887256052 14.9616973312841 \n AB12345-BRA-11-id-217 SCREENING 0.0524432563610182 0.00439177770746837 1.16344390767412 16.584779611686 \n CYCLE 1 DAY 1 0.0411628011374518 0.00567801310981526 1.11763922430636 19.3000982041101 \n CYCLE 1 DAY 2 0.0672581292323284 0.00400060865194939 1.45655867480937 10.1596117673893 \n AB12345-BRA-11-id-345 SCREENING 0.044070189259969 0.00561835429596993 1.43739076299198 15.4875095868721 \n CYCLE 1 DAY 1 0.0362275034574886 0.0038765297501434 0.96604915921 17.1567306808389 \n CYCLE 1 DAY 2 0.0416331541840018 0.00462187415243145 1.27070193721417 19.2547757988484 \n AB12345-BRA-11-id-397 SCREENING 0.0379747899730378 0.0047876948377162 1.67729762147252 11.6015615292251 \n CYCLE 1 DAY 1 0.0430467407701829 0.00463308440642305 1.1695965192594 12.5511219923965 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:30 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 rlistings_0.2.7.9011 tibble_3.2.1 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Excluding Empty Age Groups\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadex <- df_explicit_na(adex)\n\n# Simulate ADEX records with PARAMCD == \"TDURD\" as they are not in sample scda dataset.\nset.seed(1, kind = \"Mersenne-Twister\")\nadex2 <- adex %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE)\n ) %>%\n bind_rows(adex)\n\n# Now pre-processing steps are carried out.\nanl <- adex2 %>%\n filter(\n PARAMCD == \"TDURD\",\n PARCAT2 == \"Drug A\",\n SAFFL == \"Y\"\n ) %>%\n mutate(\n AGEGR1 = factor(ifelse(AGE < 65, \"<65\", \">=65\")),\n AGEGR2 = factor(case_when(\n AGE < 18 ~ \"< 18\",\n AGE >= 18 & AGE <= 40 ~ \"18 - 40\",\n AGE > 40 & AGE <= 64 ~ \"41 - 64\",\n TRUE ~ \">=65\"\n ), levels = c(\"< 18\", \"18 - 40\", \"41 - 64\", \">=65\")),\n SEX = factor(case_when(\n SEX == \"F\" ~ \"Female\",\n SEX == \"M\" ~ \"Male\"\n ))\n )\n\nadsl_f <- adsl %>%\n filter(adsl$SAFFL == \"Y\") %>%\n mutate(SEX = factor(case_when(\n SEX == \"F\" ~ \"Female\",\n SEX == \"M\" ~ \"Male\"\n )))\n\n\n\n\n\nCodelyt <- basic_table(\n title = \"Extent of Exposure by Age Group and Gender: Safety-Evaluable Patients\",\n main_footer = \"* Patient Time is the sum of exposure across all patients in days.\"\n) %>%\n split_cols_by(\"SEX\", split_fun = add_overall_level(\"Total\", first = FALSE)) %>%\n summarize_patients_exposure_in_cols(\n var = \"AVAL\", col_split = TRUE,\n .labels = c(n_patients = \"Number of Patients\", sum_exposure = \"Patient Time*\"),\n custom_label = \"Total Number of Patients and Patient Time\"\n ) %>%\n analyze_patients_exposure_in_cols(\n var = \"AGEGR1\",\n col_split = FALSE\n ) %>%\n append_topleft(c(\"\", \"Age group (years)\"))\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_f)\nresult\n\nExtent of Exposure by Age Group and Gender: Safety-Evaluable Patients\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Female Male Total \nAge group (years) Number of Patients Patient Time* Number of Patients Patient Time* Number of Patients Patient Time*\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal Number of Patients and Patient Time 134 (58.0%) 12591 83 (49.1%) 8050 217 (54.2%) 20641 \n <65 134 (58.0%) 12591 82 (48.5%) 7970 216 (54.0%) 20561 \n >=65 0 (0.0%) 0 1 (0.6%) 80 1 (0.2%) 80 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n* Patient Time is the sum of exposure across all patients in days.\n\n\n\n\n\nCodelyt <- basic_table(\n title = \"Duration of Exposure: Safety-Evaluable Patients\",\n main_footer = \"* Patient Time is the sum of exposure across all patients in days.\"\n) %>%\n split_cols_by(\"SEX\", split_fun = add_overall_level(\"Total\", first = FALSE)) %>%\n summarize_patients_exposure_in_cols(\n var = \"AVAL\", col_split = TRUE,\n .labels = c(n_patients = \"Number of Patients\", sum_exposure = \"Patient Time*\"),\n custom_label = \"Total Number of Patients and Patient Time\"\n ) %>%\n analyze_patients_exposure_in_cols(\n var = \"AGEGR2\",\n col_split = FALSE\n ) %>%\n append_topleft(c(\"\", \"Age group (years)\"))\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_f) %>%\n prune_table()\nresult\n\nDuration of Exposure: Safety-Evaluable Patients\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Female Male Total \nAge group (years) Number of Patients Patient Time* Number of Patients Patient Time* Number of Patients Patient Time*\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal Number of Patients and Patient Time 134 (58.0%) 12591 83 (49.1%) 8050 217 (54.2%) 20641 \n 18 - 40 118 (51.1%) 11203 60 (35.5%) 5787 178 (44.5%) 16990 \n 41 - 64 16 (6.9%) 1388 22 (13.0%) 2183 38 (9.5%) 3571 \n >=65 0 (0.0%) 0 1 (0.6%) 80 1 (0.2%) 80 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n* Patient Time is the sum of exposure across all patients in days.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEX <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n labels <- col_labels(ADEX)\n set.seed(1, kind = \"Mersenne-Twister\")\n\n labels <- col_labels(ADEX)\n ADEX <- ADEX %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE),\n AVALU = \"Days\",\n SEX = factor(case_when(\n SEX == \"F\" ~ \"Female\",\n SEX == \"M\" ~ \"Male\"\n ))\n ) %>%\n bind_rows(ADEX)\n\n col_labels(ADEX) <- labels\n\n ADEX <- ADEX %>%\n mutate(\n AGEGR1 = factor(ifelse(AGE < 65, \"<65\", \">=65\")) %>% with_label(\"Age group (years)\"),\n AGEGR2 = factor(case_when(\n AGE < 18 ~ \"< 18\",\n AGE >= 18 & AGE <= 40 ~ \"18 - 40\",\n AGE > 40 & AGE <= 64 ~ \"41 - 64\",\n TRUE ~ \">=65\"\n ), levels = c(\"< 18\", \"18 - 40\", \"41 - 64\", \">=65\")) %>% with_label(\"Age group (years)\")\n )\n\n ADSL <- ADSL %>%\n mutate(SEX = factor(case_when(\n SEX == \"F\" ~ \"Female\",\n SEX == \"M\" ~ \"Male\"\n )) %>% with_label(\"Sex\"))\n})\ndatanames <- c(\"ADSL\", \"ADEX\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADEX <- data[[\"ADEX\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_exposure(\n label = \"Duration of Exposure Table\",\n dataname = \"ADEX\",\n paramcd = choices_selected(\n choices = value_choices(ADEX, \"PARAMCD\", \"PARAM\"),\n selected = \"TDURD\"\n ),\n col_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"ARM\")),\n selected = \"ARM\"\n ),\n row_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"AGEGR1\", \"AGEGR2\")),\n selected = \"AGEGR1\"\n ),\n parcat = choices_selected(\n choices = value_choices(ADEX, \"PARCAT2\"),\n selected = \"Drug A\"\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:50:18 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Pharmacokinetic", - "PKPL02" + "Tables", + "Risk Management Plan", + "RMPT03" ] }, { @@ -360,7 +374,7 @@ "href": "tables/risk-management-plan/rmpt06.html", "title": "RMPT06", "section": "", - "text": "Data Setup\nStandard Table\nTable Selecting Sections to Display\nTable with Differences\nTable Modifying Alpha Level and Type of Confidence Interval\nTable by SMQ\nteal App\nReproducibility\n\n\n\nThe adae and adsl datasets need to undergo data processing before table production. Some new variables are added to these datasets to create the desired tables.\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(\n adae,\n omit_columns = c(\"SMQ01NAM\", \"SMQ01SC\", \"SMQ02NAM\", \"SMQ02SC\", \"CQ01NAM\", \"STUDYID\", \"USUBJID\")\n)\n\ndf_max <- aggregate(as.numeric(AETOXGR) ~ USUBJID, data = adae, FUN = max, drop = FALSE)\ncolnames(df_max) <- c(\"USUBJID\", \"WTOXGR\")\n\nadae <- adae %>%\n left_join(df_max, by = c(\"USUBJID\")) %>%\n mutate(\n WTOXGR = factor(WTOXGR, levels = c(\"1\", \"2\", \"3\", \"4\", \"5\")),\n fl_ser = AESER == \"Y\"\n ) %>%\n mutate(\n WTOXGR = forcats::fct_recode(\n WTOXGR,\n \"Grade 1\" = \"1\",\n \"Grade 2\" = \"2\",\n \"Grade 3\" = \"3\",\n \"Grade 4\" = \"4\",\n \"Grade 5\" = \"5\"\n ),\n AEOUT = forcats::fct_recode(\n AEOUT,\n \"Fatal outcome\" = \"FATAL\",\n \"Unresolved\" = \"NOT RECOVERED/NOT RESOLVED\",\n \"Recovered/Resolved\" = \"RECOVERED/RESOLVED\",\n \"Resolved with sequelae\" = \"RECOVERED/RESOLVED WITH SEQUELAE\",\n \"Recovering/Resolving\" = \"RECOVERING/RESOLVING\",\n \"Unknown outcome\" = \"UNKNOWN\"\n )\n ) %>%\n var_relabel(\n WTOXGR = \"Worst overall grade\",\n fl_ser = \"Number of patients with at least one serious AE\"\n )\n\n# Add AE flag to adsl.\nadsl1 <- adsl %>%\n mutate(AEFL = ifelse(USUBJID %in% adae$USUBJID, TRUE, FALSE)) %>%\n var_relabel(AEFL = \"At least one AE\")\n\n\n\n\nPlease note that by default the percentage analysis uses Wald’s confidence interval with continuity correction and the default confidence interval for percentage is 95%. To use a different method for confidence interval calculation, the method name needs to be provided to method argument.\n\nCodelyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n estimate_proportion(\n vars = \"AEFL\",\n method = \"clopper-pearson\",\n .labels = c(\n n_prop = \"Number of patients with at least one adverse event\",\n prop_ci = \"95% CI for % of patients with at least one AE (Clopper-Pearson)\"\n ),\n table_names = \"est_prop\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_values(\n \"STUDYID\",\n values = as.character(unique(adae$STUDYID)),\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences(\n \"WTOXGR\",\n var_labels = \"Number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"fl_ser\"\n ) %>%\n count_occurrences(\n \"AEOUT\",\n denom = \"n\",\n var_labels = \"Number of patients with at least one AE by outcome\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adsl,\n result_adae[seq_len(nrow(result_adae)), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nNumber of patients with at least one adverse event 122 (91.0%) 123 (91.8%) 120 (90.9%) \n95% CI for % of patients with at least one AE (Clopper-Pearson) (84.9, 95.3) (85.8, 95.8) (84.7, 95.2) \nTotal number of AEs 609 622 703 \nNumber of patients with at least one AE by worst grade \n Grade 1 7 (5.2%) 9 (6.7%) 4 (3.0%) \n Grade 2 6 (4.5%) 10 (7.5%) 7 (5.3%) \n Grade 3 18 (13.4%) 14 (10.4%) 16 (12.1%) \n Grade 4 15 (11.2%) 20 (14.9%) 18 (13.6%) \n Grade 5 76 (56.7%) 70 (52.2%) 75 (56.8%) \nNumber of patients with at least one serious AE 104 (85.2%) 101 (82.1%) 99 (82.5%) \nNumber of patients with at least one AE by outcome \n Fatal outcome 76 (62.3%) 70 (56.9%) 75 (62.5%) \n Unresolved 66 (54.1%) 64 (52.0%) 70 (58.3%) \n Recovered/Resolved 73 (59.8%) 83 (67.5%) 88 (73.3%) \n Resolved with sequelae 44 (36.1%) 40 (32.5%) 43 (35.8%) \n Recovering/Resolving 81 (66.4%) 84 (68.3%) 88 (73.3%) \n Unknown outcome 38 (31.1%) 49 (39.8%) 44 (36.7%) \n\n\n\n\n\nCodelyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n estimate_proportion(\n vars = \"AEFL\",\n method = \"clopper-pearson\",\n .labels = c(\n n_prop = \"Number of patients with at least one adverse event\",\n prop_ci = \"95% CI for % of patients with at least one AE (Clopper-Pearson)\"\n ),\n table_names = \"est_prop\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_values(\n \"STUDYID\",\n values = as.character(unique(adae$STUDYID)),\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences(\n \"WTOXGR\",\n var_labels = \"Number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"fl_ser\",\n denom = \"N_col\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adsl,\n result_adae[seq_len(nrow(result_adae)), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nNumber of patients with at least one adverse event 122 (91.0%) 123 (91.8%) 120 (90.9%) \n95% CI for % of patients with at least one AE (Clopper-Pearson) (84.9, 95.3) (85.8, 95.8) (84.7, 95.2) \nTotal number of AEs 609 622 703 \nNumber of patients with at least one AE by worst grade \n Grade 1 7 (5.2%) 9 (6.7%) 4 (3.0%) \n Grade 2 6 (4.5%) 10 (7.5%) 7 (5.3%) \n Grade 3 18 (13.4%) 14 (10.4%) 16 (12.1%) \n Grade 4 15 (11.2%) 20 (14.9%) 18 (13.6%) \n Grade 5 76 (56.7%) 70 (52.2%) 75 (56.8%) \nNumber of patients with at least one serious AE 104 (77.6%) 101 (75.4%) 99 (75.0%) \n\n\n\n\nPlease note that by default the percentage difference analysis also uses Wald’s confidence interval with continuity correction and the default confidence interval is 95%.\n\nCodelyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"AEFL\",\n method = \"clopper-pearson\",\n .labels = c(\n n_prop = \"Number of patients with at least one adverse event\",\n prop_ci = \"95% CI for % of patients with at least one AE\"\n ),\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"AEFL\",\n .labels = c(\n diff = \"Difference in % of patients with at least one AE\",\n diff_ci = \"95% CI of difference (Wald, with correction)\"\n ),\n table_names = \"est_prop_diff\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_values(\n \"STUDYID\",\n values = as.character(unique(adae$STUDYID)),\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences(\n \"WTOXGR\",\n var_labels = \"Number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"fl_ser\",\n denom = \"N_col\"\n ) %>%\n count_occurrences(\n \"AEOUT\",\n denom = \"n\",\n var_labels = \"Number of patients with at least one AE by outcome\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adsl,\n result_adae[seq_len(nrow(result_adae)), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————\nNumber of patients with at least one adverse event 122 (91.0%) 123 (91.8%) 120 (90.9%) \n95% CI for % of patients with at least one AE (84.9, 95.3) (85.8, 95.8) (84.7, 95.2) \nDifference in % of patients with at least one AE 0.7 -0.1 \n 95% CI of difference (Wald, with correction) (-6.7, 8.2) (-7.8, 7.5) \nTotal number of AEs 609 622 703 \nNumber of patients with at least one AE by worst grade \n Grade 1 7 (5.2%) 9 (6.7%) 4 (3.0%) \n Grade 2 6 (4.5%) 10 (7.5%) 7 (5.3%) \n Grade 3 18 (13.4%) 14 (10.4%) 16 (12.1%) \n Grade 4 15 (11.2%) 20 (14.9%) 18 (13.6%) \n Grade 5 76 (56.7%) 70 (52.2%) 75 (56.8%) \nNumber of patients with at least one serious AE 104 (77.6%) 101 (75.4%) 99 (75.0%) \nNumber of patients with at least one AE by outcome \n Fatal outcome 76 (62.3%) 70 (56.9%) 75 (62.5%) \n Unresolved 66 (54.1%) 64 (52.0%) 70 (58.3%) \n Recovered/Resolved 73 (59.8%) 83 (67.5%) 88 (73.3%) \n Resolved with sequelae 44 (36.1%) 40 (32.5%) 43 (35.8%) \n Recovering/Resolving 81 (66.4%) 84 (68.3%) 88 (73.3%) \n Unknown outcome 38 (31.1%) 49 (39.8%) 44 (36.7%) \n\n\n\n\nThe confidence level can be changed through the conf_level argument.\n\nCodelyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"AEFL\",\n conf_level = 0.90,\n method = \"clopper-pearson\",\n .labels = c(\n n_prop = \"Number of patients with at least one adverse event\",\n prop_ci = \"90% CI for % of patients with at least one AE (Clopper-Pearson)\"\n ),\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"AEFL\",\n conf_level = 0.90,\n method = \"newcombe\",\n .labels = c(\n diff = \"Difference in % of patients with at least one AE\",\n diff_ci = \"90% CI of difference (Newcombe)\"\n ),\n table_names = \"est_prop_diff\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_values(\n \"STUDYID\",\n values = as.character(unique(adae$STUDYID)),\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences(\n \"WTOXGR\",\n var_labels = \"Number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"fl_ser\",\n denom = \"N_col\"\n ) %>%\n count_occurrences(\n \"AEOUT\",\n denom = \"n\",\n var_labels = \"Number of patients with at least one AE by outcome\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adsl,\n result_adae[seq_len(nrow(result_adae)), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nNumber of patients with at least one adverse event 122 (91.0%) 123 (91.8%) 120 (90.9%) \n90% CI for % of patients with at least one AE (Clopper-Pearson) (85.9, 94.8) (86.8, 95.3) (85.7, 94.7) \nDifference in % of patients with at least one AE 0.7 -0.1 \n 90% CI of difference (Newcombe) (-5.1, 6.6) (-6.1, 5.8) \nTotal number of AEs 609 622 703 \nNumber of patients with at least one AE by worst grade \n Grade 1 7 (5.2%) 9 (6.7%) 4 (3.0%) \n Grade 2 6 (4.5%) 10 (7.5%) 7 (5.3%) \n Grade 3 18 (13.4%) 14 (10.4%) 16 (12.1%) \n Grade 4 15 (11.2%) 20 (14.9%) 18 (13.6%) \n Grade 5 76 (56.7%) 70 (52.2%) 75 (56.8%) \nNumber of patients with at least one serious AE 104 (77.6%) 101 (75.4%) 99 (75.0%) \nNumber of patients with at least one AE by outcome \n Fatal outcome 76 (62.3%) 70 (56.9%) 75 (62.5%) \n Unresolved 66 (54.1%) 64 (52.0%) 70 (58.3%) \n Recovered/Resolved 73 (59.8%) 83 (67.5%) 88 (73.3%) \n Resolved with sequelae 44 (36.1%) 40 (32.5%) 43 (35.8%) \n Recovering/Resolving 81 (66.4%) 84 (68.3%) 88 (73.3%) \n Unknown outcome 38 (31.1%) 49 (39.8%) 44 (36.7%) \n\n\n\n\n\nCode# In progress\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:11 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 dplyr_1.1.4 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Selecting Sections to Display\nTable with Differences\nTable Modifying Alpha Level and Type of Confidence Interval\nTable by SMQ\nteal App\nReproducibility\n\n\n\nThe adae and adsl datasets need to undergo data processing before table production. Some new variables are added to these datasets to create the desired tables.\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(\n adae,\n omit_columns = c(\"SMQ01NAM\", \"SMQ01SC\", \"SMQ02NAM\", \"SMQ02SC\", \"CQ01NAM\", \"STUDYID\", \"USUBJID\")\n)\n\ndf_max <- aggregate(as.numeric(AETOXGR) ~ USUBJID, data = adae, FUN = max, drop = FALSE)\ncolnames(df_max) <- c(\"USUBJID\", \"WTOXGR\")\n\nadae <- adae %>%\n left_join(df_max, by = c(\"USUBJID\")) %>%\n mutate(\n WTOXGR = factor(WTOXGR, levels = c(\"1\", \"2\", \"3\", \"4\", \"5\")),\n fl_ser = AESER == \"Y\"\n ) %>%\n mutate(\n WTOXGR = forcats::fct_recode(\n WTOXGR,\n \"Grade 1\" = \"1\",\n \"Grade 2\" = \"2\",\n \"Grade 3\" = \"3\",\n \"Grade 4\" = \"4\",\n \"Grade 5\" = \"5\"\n ),\n AEOUT = forcats::fct_recode(\n AEOUT,\n \"Fatal outcome\" = \"FATAL\",\n \"Unresolved\" = \"NOT RECOVERED/NOT RESOLVED\",\n \"Recovered/Resolved\" = \"RECOVERED/RESOLVED\",\n \"Resolved with sequelae\" = \"RECOVERED/RESOLVED WITH SEQUELAE\",\n \"Recovering/Resolving\" = \"RECOVERING/RESOLVING\",\n \"Unknown outcome\" = \"UNKNOWN\"\n )\n ) %>%\n var_relabel(\n WTOXGR = \"Worst overall grade\",\n fl_ser = \"Number of patients with at least one serious AE\"\n )\n\n# Add AE flag to adsl.\nadsl1 <- adsl %>%\n mutate(AEFL = ifelse(USUBJID %in% adae$USUBJID, TRUE, FALSE)) %>%\n var_relabel(AEFL = \"At least one AE\")\n\n\n\n\nPlease note that by default the percentage analysis uses Wald’s confidence interval with continuity correction and the default confidence interval for percentage is 95%. To use a different method for confidence interval calculation, the method name needs to be provided to method argument.\n\nCodelyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n estimate_proportion(\n vars = \"AEFL\",\n method = \"clopper-pearson\",\n .labels = c(\n n_prop = \"Number of patients with at least one adverse event\",\n prop_ci = \"95% CI for % of patients with at least one AE (Clopper-Pearson)\"\n ),\n table_names = \"est_prop\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_values(\n \"STUDYID\",\n values = as.character(unique(adae$STUDYID)),\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences(\n \"WTOXGR\",\n var_labels = \"Number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"fl_ser\"\n ) %>%\n count_occurrences(\n \"AEOUT\",\n denom = \"n\",\n var_labels = \"Number of patients with at least one AE by outcome\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adsl,\n result_adae[seq_len(nrow(result_adae)), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nNumber of patients with at least one adverse event 122 (91.0%) 123 (91.8%) 120 (90.9%) \n95% CI for % of patients with at least one AE (Clopper-Pearson) (84.9, 95.3) (85.8, 95.8) (84.7, 95.2) \nTotal number of AEs 609 622 703 \nNumber of patients with at least one AE by worst grade \n Grade 1 7 (5.2%) 9 (6.7%) 4 (3.0%) \n Grade 2 6 (4.5%) 10 (7.5%) 7 (5.3%) \n Grade 3 18 (13.4%) 14 (10.4%) 16 (12.1%) \n Grade 4 15 (11.2%) 20 (14.9%) 18 (13.6%) \n Grade 5 76 (56.7%) 70 (52.2%) 75 (56.8%) \nNumber of patients with at least one serious AE 104 (85.2%) 101 (82.1%) 99 (82.5%) \nNumber of patients with at least one AE by outcome \n Fatal outcome 76 (62.3%) 70 (56.9%) 75 (62.5%) \n Unresolved 66 (54.1%) 64 (52.0%) 70 (58.3%) \n Recovered/Resolved 73 (59.8%) 83 (67.5%) 88 (73.3%) \n Resolved with sequelae 44 (36.1%) 40 (32.5%) 43 (35.8%) \n Recovering/Resolving 81 (66.4%) 84 (68.3%) 88 (73.3%) \n Unknown outcome 38 (31.1%) 49 (39.8%) 44 (36.7%) \n\n\n\n\n\nCodelyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n estimate_proportion(\n vars = \"AEFL\",\n method = \"clopper-pearson\",\n .labels = c(\n n_prop = \"Number of patients with at least one adverse event\",\n prop_ci = \"95% CI for % of patients with at least one AE (Clopper-Pearson)\"\n ),\n table_names = \"est_prop\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_values(\n \"STUDYID\",\n values = as.character(unique(adae$STUDYID)),\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences(\n \"WTOXGR\",\n var_labels = \"Number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"fl_ser\",\n denom = \"N_col\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adsl,\n result_adae[seq_len(nrow(result_adae)), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nNumber of patients with at least one adverse event 122 (91.0%) 123 (91.8%) 120 (90.9%) \n95% CI for % of patients with at least one AE (Clopper-Pearson) (84.9, 95.3) (85.8, 95.8) (84.7, 95.2) \nTotal number of AEs 609 622 703 \nNumber of patients with at least one AE by worst grade \n Grade 1 7 (5.2%) 9 (6.7%) 4 (3.0%) \n Grade 2 6 (4.5%) 10 (7.5%) 7 (5.3%) \n Grade 3 18 (13.4%) 14 (10.4%) 16 (12.1%) \n Grade 4 15 (11.2%) 20 (14.9%) 18 (13.6%) \n Grade 5 76 (56.7%) 70 (52.2%) 75 (56.8%) \nNumber of patients with at least one serious AE 104 (77.6%) 101 (75.4%) 99 (75.0%) \n\n\n\n\nPlease note that by default the percentage difference analysis also uses Wald’s confidence interval with continuity correction and the default confidence interval is 95%.\n\nCodelyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"AEFL\",\n method = \"clopper-pearson\",\n .labels = c(\n n_prop = \"Number of patients with at least one adverse event\",\n prop_ci = \"95% CI for % of patients with at least one AE\"\n ),\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"AEFL\",\n .labels = c(\n diff = \"Difference in % of patients with at least one AE\",\n diff_ci = \"95% CI of difference (Wald, with correction)\"\n ),\n table_names = \"est_prop_diff\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_values(\n \"STUDYID\",\n values = as.character(unique(adae$STUDYID)),\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences(\n \"WTOXGR\",\n var_labels = \"Number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"fl_ser\",\n denom = \"N_col\"\n ) %>%\n count_occurrences(\n \"AEOUT\",\n denom = \"n\",\n var_labels = \"Number of patients with at least one AE by outcome\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adsl,\n result_adae[seq_len(nrow(result_adae)), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————\nNumber of patients with at least one adverse event 122 (91.0%) 123 (91.8%) 120 (90.9%) \n95% CI for % of patients with at least one AE (84.9, 95.3) (85.8, 95.8) (84.7, 95.2) \nDifference in % of patients with at least one AE 0.7 -0.1 \n 95% CI of difference (Wald, with correction) (-6.7, 8.2) (-7.8, 7.5) \nTotal number of AEs 609 622 703 \nNumber of patients with at least one AE by worst grade \n Grade 1 7 (5.2%) 9 (6.7%) 4 (3.0%) \n Grade 2 6 (4.5%) 10 (7.5%) 7 (5.3%) \n Grade 3 18 (13.4%) 14 (10.4%) 16 (12.1%) \n Grade 4 15 (11.2%) 20 (14.9%) 18 (13.6%) \n Grade 5 76 (56.7%) 70 (52.2%) 75 (56.8%) \nNumber of patients with at least one serious AE 104 (77.6%) 101 (75.4%) 99 (75.0%) \nNumber of patients with at least one AE by outcome \n Fatal outcome 76 (62.3%) 70 (56.9%) 75 (62.5%) \n Unresolved 66 (54.1%) 64 (52.0%) 70 (58.3%) \n Recovered/Resolved 73 (59.8%) 83 (67.5%) 88 (73.3%) \n Resolved with sequelae 44 (36.1%) 40 (32.5%) 43 (35.8%) \n Recovering/Resolving 81 (66.4%) 84 (68.3%) 88 (73.3%) \n Unknown outcome 38 (31.1%) 49 (39.8%) 44 (36.7%) \n\n\n\n\nThe confidence level can be changed through the conf_level argument.\n\nCodelyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"AEFL\",\n conf_level = 0.90,\n method = \"clopper-pearson\",\n .labels = c(\n n_prop = \"Number of patients with at least one adverse event\",\n prop_ci = \"90% CI for % of patients with at least one AE (Clopper-Pearson)\"\n ),\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"AEFL\",\n conf_level = 0.90,\n method = \"newcombe\",\n .labels = c(\n diff = \"Difference in % of patients with at least one AE\",\n diff_ci = \"90% CI of difference (Newcombe)\"\n ),\n table_names = \"est_prop_diff\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_values(\n \"STUDYID\",\n values = as.character(unique(adae$STUDYID)),\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences(\n \"WTOXGR\",\n var_labels = \"Number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"fl_ser\",\n denom = \"N_col\"\n ) %>%\n count_occurrences(\n \"AEOUT\",\n denom = \"n\",\n var_labels = \"Number of patients with at least one AE by outcome\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adsl,\n result_adae[seq_len(nrow(result_adae)), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nNumber of patients with at least one adverse event 122 (91.0%) 123 (91.8%) 120 (90.9%) \n90% CI for % of patients with at least one AE (Clopper-Pearson) (85.9, 94.8) (86.8, 95.3) (85.7, 94.7) \nDifference in % of patients with at least one AE 0.7 -0.1 \n 90% CI of difference (Newcombe) (-5.1, 6.6) (-6.1, 5.8) \nTotal number of AEs 609 622 703 \nNumber of patients with at least one AE by worst grade \n Grade 1 7 (5.2%) 9 (6.7%) 4 (3.0%) \n Grade 2 6 (4.5%) 10 (7.5%) 7 (5.3%) \n Grade 3 18 (13.4%) 14 (10.4%) 16 (12.1%) \n Grade 4 15 (11.2%) 20 (14.9%) 18 (13.6%) \n Grade 5 76 (56.7%) 70 (52.2%) 75 (56.8%) \nNumber of patients with at least one serious AE 104 (77.6%) 101 (75.4%) 99 (75.0%) \nNumber of patients with at least one AE by outcome \n Fatal outcome 76 (62.3%) 70 (56.9%) 75 (62.5%) \n Unresolved 66 (54.1%) 64 (52.0%) 70 (58.3%) \n Recovered/Resolved 73 (59.8%) 83 (67.5%) 88 (73.3%) \n Resolved with sequelae 44 (36.1%) 40 (32.5%) 43 (35.8%) \n Recovering/Resolving 81 (66.4%) 84 (68.3%) 88 (73.3%) \n Unknown outcome 38 (31.1%) 49 (39.8%) 44 (36.7%) \n\n\n\n\n\nCode# In progress\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:49:48 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 dplyr_1.1.4 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Risk Management Plan", @@ -368,195 +382,195 @@ ] }, { - "objectID": "tables/risk-management-plan/rmpt01.html", - "href": "tables/risk-management-plan/rmpt01.html", - "title": "RMPT01", + "objectID": "tables/ECG/egt03.html", + "href": "tables/ECG/egt03.html", + "title": "EGT03", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadex <- df_explicit_na(adex)\n\n# Simulate ADEX records with PARAMCD == \"TDURD\" as they are not in sample scda dataset.\nset.seed(1, kind = \"Mersenne-Twister\")\nadex2 <- adex %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE)\n ) %>%\n bind_rows(adex)\n\n# Now pre-processing steps are carried out.\nanl <- adex2 %>%\n filter(\n PARAMCD == \"TDURD\",\n PARCAT2 == \"Drug A\",\n SAFFL == \"Y\"\n ) %>%\n mutate(\n aval_months = day2month(AVAL),\n aval_months_cat = factor(case_when(\n aval_months < 1 ~ \"< 1 month\",\n aval_months >= 1 & aval_months < 3 ~ \"1 to <3 months\",\n aval_months >= 3 & aval_months < 6 ~ \"3 to <6 months\",\n TRUE ~ \">=6 months\"\n ), levels = c(\"< 1 month\", \"1 to <3 months\", \"3 to <6 months\", \">=6 months\"))\n )\n\nadsl_f <- adsl %>% filter(adsl$SAFFL == \"Y\")\n\n\n\n\n\nCodelyt <- basic_table(\n title = \"Duration of Exposure: Safety-Evaluable Patients\",\n main_footer = \"* Patient Time is the sum of exposure across all patients in days.\",\n show_colcounts = TRUE\n) %>%\n summarize_patients_exposure_in_cols(\n var = \"AVAL\", col_split = TRUE,\n .labels = c(n_patients = \"Number of Patients\", sum_exposure = \"Patient Time*\"),\n custom_label = \"Total Number of Patients and Patient Time\"\n ) %>%\n analyze_patients_exposure_in_cols(\n var = \"aval_months_cat\",\n col_split = FALSE\n ) %>%\n append_topleft(c(\"\", \"Duration of exposure\"))\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_f)\nresult\n\nDuration of Exposure: Safety-Evaluable Patients\n\n——————————————————————————————————————————————————————————————————————————————\n Number of Patients Patient Time*\nDuration of exposure (N=400) (N=400) \n——————————————————————————————————————————————————————————————————————————————\nTotal Number of Patients and Patient Time 217 (54.2%) 20641 \n < 1 month 28 (7.0%) 504 \n 1 to <3 months 79 (19.8%) 4727 \n 3 to <6 months 101 (25.2%) 13690 \n >=6 months 9 (2.2%) 1720 \n——————————————————————————————————————————————————————————————————————————————\n\n* Patient Time is the sum of exposure across all patients in days.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEX <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n labels <- col_labels(ADEX)\n set.seed(1, kind = \"Mersenne-Twister\")\n ADEX <- ADEX %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE),\n AVALU = \"Days\"\n ) %>%\n bind_rows(ADEX)\n\n ADEX <- ADEX %>%\n mutate(\n aval_months = day2month(AVAL),\n aval_months_cat = factor(case_when(\n aval_months < 1 ~ \"< 1 month\",\n aval_months >= 1 & aval_months < 3 ~ \"1 to <3 months\",\n aval_months >= 3 & aval_months < 6 ~ \"3 to <6 months\",\n TRUE ~ \">=6 months\"\n ), levels = c(\"< 1 month\", \"1 to <3 months\", \"3 to <6 months\", \">=6 months\")) %>% with_label(\"Overall duration\")\n ) %>%\n select(-aval_months)\n})\ndatanames <- c(\"ADSL\", \"ADEX\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADEX <- data[[\"ADEX\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_exposure(\n label = \"Duration of Exposure Table\",\n dataname = \"ADEX\",\n paramcd = choices_selected(\n choices = value_choices(ADEX, \"PARAMCD\", \"PARAM\"),\n selected = \"TDURD\"\n ),\n col_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"ARM\")),\n selected = \"ARM\"\n ),\n row_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"aval_months_cat\", \"RACE\", \"STRATA1\", \"SEX\")),\n selected = \"aval_months_cat\"\n ),\n parcat = choices_selected(\n choices = value_choices(ADEX, \"PARCAT2\"),\n selected = \"Drug A\"\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:51:48 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nTable of Baseline Versus Minimum Post-Baseline\nTable of Baseline Versus Maximum Post-Baseline\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadeg <- df_explicit_na(adeg)\n\nadeg_labels <- var_labels(adeg)\n\nadeg_f_pbmin <- subset(\n adeg,\n PARAMCD == \"HR\" & # Heart Rate\n SAFFL == \"Y\" & # \"Safety Population Flag\"\n ONTRTFL == \"Y\" & # \"On Treatment Record Flag\"\n AVISIT == \"POST-BASELINE MINIMUM\" # \"Analysis Visit\"\n)\n\nadeg_f_pbmax <- subset(\n adeg,\n PARAMCD == \"HR\" & # Heart Rate\n SAFFL == \"Y\" & # \"Safety Population Flag\"\n ONTRTFL == \"Y\" & # \"On Treatment Record Flag\"\n AVISIT == \"POST-BASELINE MAXIMUM\" # \"Analysis Visit\"\n)\n\nvar_labels(adeg_f_pbmin) <- adeg_labels\nvar_labels(adeg_f_pbmax) <- adeg_labels\n\n\n\n\nFor the EGT03 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N. For illustration purposes, missing data are added to the example dataset.\n\nCodeset.seed(123, kind = \"Mersenne-Twister\")\n\nadeg_f_pbmin$BNRIND <- factor(\n adeg_f_pbmin$BNRIND,\n levels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\"),\n labels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\")\n)\nadeg_f_pbmin$ANRIND <- factor(\n adeg_f_pbmin$ANRIND,\n levels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\"),\n labels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\")\n)\n\nadeg_f_pbmin$BNRIND[sample(seq_len(nrow(adeg_f_pbmin)), size = 5)] <- \"Missing\"\nadeg_f_pbmin$ANRIND[sample(seq_len(nrow(adeg_f_pbmin)), size = 5)] <- \"Missing\"\n\nattr(adeg_f_pbmin$ANRIND, \"label\") <- \"Analysis Reference Range Indicator\"\nattr(adeg_f_pbmin$BNRIND, \"label\") <- \"Baseline Reference Range Indicator\"\n\n# Temporary solution for overarching column\nadeg_f_pbmin <- adeg_f_pbmin %>% mutate(min_label = \"Minimum Post-Baseline Assessment\")\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n split_cols_by(\"min_label\") %>%\n split_cols_by(\"ANRIND\") %>%\n split_rows_by(\"ARMCD\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adeg_f_pbmin$ARMCD)) %>%\n add_rowcounts() %>%\n analyze_vars(\"BNRIND\", denom = \"N_row\", .stats = \"count_fraction\") %>%\n append_varlabels(adeg_f_pbmin, c(\"BNRIND\"), indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adeg_f_pbmin\n)\n\nresult\n\nPlanned Arm Code Minimum Post-Baseline Assessment \n Baseline Reference Range Indicator LOW NORMAL HIGH Missing \n————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n LOW 1 (0.7%) 5 (3.7%) 0 0 \n NORMAL 36 (26.9%) 83 (61.9%) 0 1 (0.7%)\n HIGH 2 (1.5%) 4 (3%) 0 0 \n Missing 1 (0.7%) 0 0 1 (0.7%)\nARM B (N=134) \n LOW 1 (0.7%) 9 (6.7%) 0 0 \n NORMAL 40 (29.9%) 75 (56%) 0 2 (1.5%)\n HIGH 1 (0.7%) 4 (3%) 0 0 \n Missing 1 (0.7%) 1 (0.7%) 0 0 \nARM C (N=132) \n LOW 4 (3%) 11 (8.3%) 0 0 \n NORMAL 31 (23.5%) 75 (56.8%) 0 0 \n HIGH 1 (0.8%) 8 (6.1%) 0 1 (0.8%)\n Missing 1 (0.8%) 0 0 0 \n\n\n\n\nFor the EGT03 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N. For illustration purpose, missing data are added to the example dataset.\n\nCodeset.seed(123, kind = \"Mersenne-Twister\")\n\nadeg_f_pbmax$BNRIND <- factor(\n adeg_f_pbmax$BNRIND,\n levels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\"),\n labels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\")\n)\nadeg_f_pbmax$ANRIND <- factor(\n adeg_f_pbmax$ANRIND,\n levels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\"),\n labels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\")\n)\n\nadeg_f_pbmax$BNRIND[sample(seq_len(nrow(adeg_f_pbmax)), size = 5)] <- \"Missing\"\nadeg_f_pbmax$ANRIND[sample(seq_len(nrow(adeg_f_pbmax)), size = 5)] <- \"Missing\"\n\nattr(adeg_f_pbmax$ANRIND, \"label\") <- \"Analysis Reference Range Indicator\"\nattr(adeg_f_pbmax$BNRIND, \"label\") <- \"Baseline Reference Range Indicator\"\n\n# Temporary solution for overarching column\nadeg_f_pbmax <- adeg_f_pbmax %>% mutate(max_label = \"Maximum Post-Baseline Assessment\")\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n split_cols_by(\"max_label\") %>%\n split_cols_by(\"ANRIND\") %>%\n split_rows_by(\"ARMCD\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adeg_f_pbmax$ARMCD)) %>%\n add_rowcounts() %>%\n analyze_vars(\"BNRIND\", denom = \"N_row\", .stats = \"count_fraction\") %>%\n append_varlabels(adeg_f_pbmax, c(\"BNRIND\"), indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adeg_f_pbmax\n)\n\nresult\n\nPlanned Arm Code Maximum Post-Baseline Assessment \n Baseline Reference Range Indicator LOW NORMAL HIGH Missing \n————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n LOW 0 2 (1.5%) 4 (3%) 0 \n NORMAL 0 88 (65.7%) 31 (23.1%) 1 (0.7%)\n HIGH 0 5 (3.7%) 1 (0.7%) 0 \n Missing 0 0 1 (0.7%) 1 (0.7%)\nARM B (N=134) \n LOW 0 8 (6%) 2 (1.5%) 0 \n NORMAL 0 76 (56.7%) 39 (29.1%) 2 (1.5%)\n HIGH 0 3 (2.2%) 2 (1.5%) 0 \n Missing 0 1 (0.7%) 1 (0.7%) 0 \nARM C (N=132) \n LOW 0 12 (9.1%) 3 (2.3%) 0 \n NORMAL 0 79 (59.8%) 27 (20.5%) 0 \n HIGH 0 5 (3.8%) 4 (3%) 1 (0.8%)\n Missing 0 0 1 (0.8%) 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEG <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n})\ndatanames <- c(\"ADSL\", \"ADEG\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADEG <- data[[\"ADEG\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_shift_by_arm(\n label = \"Shift by Arm Table\",\n dataname = \"ADEG\",\n arm_var = choices_selected(\n variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n paramcd = choices_selected(\n value_choices(ADEG, \"PARAMCD\"),\n selected = \"HR\"\n ),\n visit_var = choices_selected(\n value_choices(ADEG, \"AVISIT\"),\n selected = \"POST-BASELINE MINIMUM\"\n ),\n aval_var = choices_selected(\n variable_choices(ADEG, subset = \"ANRIND\"),\n selected = \"ANRIND\", fixed = TRUE\n ),\n baseline_var = choices_selected(\n variable_choices(ADEG, subset = \"BNRIND\"),\n selected = \"BNRIND\", fixed = TRUE\n ),\n treatment_flag_var = choices_selected(\n variable_choices(ADEG, subset = \"ONTRTFL\"),\n selected = \"ONTRTFL\", fixed = TRUE\n ),\n treatment_flag = choices_selected(\n value_choices(ADEG, \"ONTRTFL\"),\n selected = \"Y\", fixed = TRUE\n )\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:49:24 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Risk Management Plan", - "RMPT01" + "ECG", + "EGT03" ] }, { - "objectID": "tables/lab-results/lbt10.html", - "href": "tables/lab-results/lbt10.html", - "title": "LBT10", + "objectID": "tables/ECG/egt04.html", + "href": "tables/ECG/egt04.html", + "title": "EGT04", "section": "", - "text": "Data Setup\nStandard Table\nTable Selecting Sections\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadhy <- synthetic_cdisc_dataset(\"latest\", \"adhy\")\n\nadhy_liver <- adhy %>%\n filter(PARAMCD %in% c(\n \"BL2AL2CU\", \"BL2AS2CU\", \"BG2AL2CU\", \"BG2AS2CU\", \"B2A2L2CU\", \"B2A2S2CU\", \"B2A5L2CU\", \"B2A5S2CU\"\n )) %>%\n mutate(PARAMCAT = case_when(\n PARAMCD %in% c(\"BL2AL2CU\", \"BL2AS2CU\") ~ \"Total Bilirubin <= 2xULN\",\n PARAMCD %in% c(\"BG2AL2CU\", \"BG2AS2CU\") ~ \"Total Bilirubin > 2xULN\",\n PARAMCD %in% c(\"B2A2L2CU\", \"B2A2S2CU\") ~ \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN\",\n PARAMCD %in% c(\"B2A5L2CU\", \"B2A5S2CU\") ~ \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN\"\n )) %>%\n mutate(AVALC_FORMAT = case_when(\n PARAMCD %in% c(\"BL2AL2CU\", \"BG2AL2CU\", \"B2A2L2CU\", \"B2A5L2CU\") & AVALC == \"Y\" ~ \"ALT >3xULN at 2 Visits\",\n PARAMCD %in% c(\"BL2AS2CU\", \"BG2AS2CU\", \"B2A2S2CU\", \"B2A5S2CU\") & AVALC == \"Y\" ~ \"AST >3xULN at 2 Visits\",\n TRUE ~ \"Criteria not met\"\n ))\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nanl <- df_explicit_na(adhy_liver)\n\n\n\n\n\nCodetbl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_rows_by(\"PARAMCAT\") %>%\n split_rows_by(\"PARAM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\n vars = \"AVALC_FORMAT\",\n .stats = c(\"fraction\"),\n denom = \"n\",\n drop = TRUE\n ) %>%\n build_table(anl, alt_counts_df = adsl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- tbl %>% trim_rows(criteria = criteria_fun)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3xULN at 2 Visits 20/134 (14.9%) 21/134 (15.7%) 20/132 (15.2%)\n AST >3xULN at 2 Visits 30/134 (22.4%) 25/134 (18.7%) 27/132 (20.5%)\nTotal Bilirubin > 2xULN \n ALT >3xULN at 2 Visits 24/134 (17.9%) 32/134 (23.9%) 24/132 (18.2%)\n AST >3xULN at 2 Visits 33/134 (24.6%) 29/134 (21.6%) 25/132 (18.9%)\n\n\n\n\n\nCodetbl2 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_rows_by(\"PARAMCAT\", split_fun = remove_split_levels(\"Total Bilirubin > 2xULN\")) %>%\n split_rows_by(\"PARAM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\n vars = \"AVALC_FORMAT\",\n .stats = c(\"fraction\"),\n denom = \"n\",\n drop = TRUE\n ) %>%\n build_table(anl, alt_counts_df = adsl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- tbl2 %>% trim_rows(criteria = criteria_fun)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3xULN at 2 Visits 20/134 (14.9%) 21/134 (15.7%) 20/132 (15.2%)\n AST >3xULN at 2 Visits 30/134 (22.4%) 25/134 (18.7%) 27/132 (20.5%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:51:18 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\nFor the EGT04 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N. For illustration purposes, missing data are added to the example dataset.\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\nset.seed(123)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadeg <- df_explicit_na(adeg, omit_columns = c(\"AVALC\", \"BASEC\"))\n\nadeg_labels <- var_labels(adeg)\n\nadeg_f <- subset(\n adeg,\n PARAMCD == \"ECGINTP\" & # Analysis in terms of \"NORMAL\"/\"ABNORMAL\" (AVALC)\n SAFFL == \"Y\" & # \"Safety Population Flag\"\n ONTRTFL == \"Y\" & # \"On Treatment Record Flag\"\n WORS02FL == \"Y\" # \"Worst Post-Baseline Observation\"\n)\n\nadeg_f$AVALC[sample(seq_len(nrow(adeg_f)), size = 5)] <- \"Missing\"\nadeg_f$BASEC[sample(seq_len(nrow(adeg_f)), size = 5)] <- \"Missing\"\nadeg_f$AVALC <- factor(\n adeg_f$AVALC,\n levels = c(\"NORMAL\", \"ABNORMAL\", \"Missing\"),\n labels = c(\"Normal\", \"Abnormal\", \"Missing\")\n)\nadeg_f$BASEC <- factor(\n adeg_f$BASEC,\n levels = c(\"NORMAL\", \"ABNORMAL\", \"Missing\"),\n labels = c(\"Normal\", \"Abnormal\", \"Missing\")\n)\n\nvar_labels(adeg_f) <- adeg_labels\nadeg_f <- adeg_f %>%\n var_relabel(BASEC = \"Baseline\")\n\n# Temprary solution for over arching column\nadeg_f <- adeg_f %>% mutate(postbaseline_label = \"Post-Baseline\")\n\n\n\n\nThe EGT04 template consists of a stacked list of contingency tables, one per group. For each group, the n’s across all cells must add up to the group N in the analysis, and percentages are calculated using N as the denominator.\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n split_cols_by(\"postbaseline_label\") %>%\n split_cols_by(\"AVALC\") %>%\n split_rows_by(\"ARM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adeg_f$ARM)) %>%\n add_rowcounts() %>%\n analyze_vars(\n \"BASEC\",\n denom = \"N_row\",\n .stats = \"count_fraction\",\n na.rm = FALSE\n ) %>%\n append_varlabels(adeg_f, c(\"BASEC\"), indent = 1L)\n\nresult <- build_table(lyt, adeg_f)\nresult\n\nDescription of Planned Arm Post-Baseline \n Baseline Normal Abnormal Missing \n———————————————————————————————————————————————————————————————\nA: Drug X (N=134) \n Normal 20 (14.9%) 81 (60.4%) 1 (0.7%)\n Abnormal 11 (8.2%) 19 (14.2%) 0 \n Missing 0 1 (0.7%) 1 (0.7%)\nB: Placebo (N=134) \n Normal 18 (13.4%) 81 (60.4%) 2 (1.5%)\n Abnormal 3 (2.2%) 28 (20.9%) 0 \n Missing 0 2 (1.5%) 0 \nC: Combination (N=132) \n Normal 26 (19.7%) 69 (52.3%) 1 (0.8%)\n Abnormal 6 (4.5%) 29 (22%) 0 \n Missing 1 (0.8%) 0 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:48:47 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9018 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT10" + "ECG", + "EGT04" ] }, { - "objectID": "tables/lab-results/lbt15.html", - "href": "tables/lab-results/lbt15.html", - "title": "LBT15", + "objectID": "tables/pharmacokinetic/pkpt06.html", + "href": "tables/pharmacokinetic/pkpt06.html", + "title": "PKPT06", "section": "", - "text": "Data Setup\nStandard Table\nTable Modifying Cut Point\nteal App\nReproducibility\n\n\n\nBecause the scda dataset adlb doesn’t have the PARCAT1 variable, this variable is created from LBCAT in pre-processing.\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\nlibrary(forcats)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb <- adlb %>%\n mutate(\n PARAM = with_label(.data$PARAM, \"Laboratory Test\"),\n ANRIND = with_label(.data$ANRIND, \"Direction of Abnormality\")\n ) %>%\n mutate(\n PARCAT1 = LBCAT\n ) %>%\n mutate(\n ANRIND = fct_collapse(.data$ATOXGR,\n \"LOW\" = c(\"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-2\", \"-1\", \"0\", \"1\", \"2\"),\n \"HIGH\" = c(\"3\", \"4\")\n ),\n BNRIND = fct_collapse(.data$BTOXGR,\n \"LOW\" = c(\"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-2\", \"-1\", \"0\", \"1\", \"2\"),\n \"HIGH\" = c(\"3\", \"4\")\n ),\n PARCAT1 = LBCAT\n ) %>%\n filter(ONTRTFL == \"Y\")\n\n\nadlb_alt_cut <- adlb %>%\n mutate(\n ANRIND = fct_collapse(.data$ATOXGR,\n \"LOW\" = c(\"-2\", \"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-1\", \"0\", \"1\"),\n \"HIGH\" = c(\"2\", \"3\", \"4\")\n ),\n BNRIND = fct_collapse(.data$BTOXGR,\n \"LOW\" = c(\"-2\", \"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-1\", \"0\", \"1\"),\n \"HIGH\" = c(\"2\", \"3\", \"4\")\n )\n ) %>%\n filter(ONTRTFL == \"Y\")\n\nadlb <- adlb %>% var_relabel(\n PARCAT1 = \"Category for Lab Test\",\n PARAM = \"Parameter\"\n)\n\n\n\n\n\nCode# Argument exclude_base_abn must be TRUE to include patients with normal or abnormal in the opposite\n# direction in the denom.\n# So for \"High\" direction, subjects with baseline grade 3-4 are not in the denom.\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n add_overall_col(\"All Patients\") %>%\n split_rows_by(\n \"PARCAT1\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb$PARCAT1)\n ) %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb$PARAM)\n ) %>%\n count_abnormal(\n var = \"ANRIND\",\n abnormal = list(Low = \"LOW\", High = \"HIGH\"),\n variables = list(id = \"USUBJID\", baseline = \"BNRIND\"),\n exclude_base_abn = TRUE,\n .indent_mods = 4L\n ) %>%\n append_topleft(\" Direction of Abnormality\")\n\nresult <- build_table(lyt, adlb, alt_counts_df = adsl)\nresult\n\nCategory for Lab Test \n Parameter A: Drug X B: Placebo C: Combination All Patients \n Direction of Abnormality (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————\nCHEMISTRY \n Alanine Aminotransferase Measurement \n Low 32/127 (25.2%) 32/128 (25%) 32/128 (25%) 96/383 (25.1%) \n High 0/134 0/134 0/132 0/400 \n C-Reactive Protein Measurement \n Low 36/127 (28.3%) 36/127 (28.3%) 42/123 (34.1%) 114/377 (30.2%)\n High 34/124 (27.4%) 33/128 (25.8%) 31/129 (24%) 98/381 (25.7%) \nIMMUNOLOGY \n Immunoglobulin A Measurement \n Low 0/134 0/134 0/132 0/400 \n High 33/128 (25.8%) 32/124 (25.8%) 28/120 (23.3%) 93/372 (25%) \n\n\n\n\n\nCoderesult <- build_table(lyt, adlb_alt_cut, alt_counts_df = adsl)\nresult\n\nCategory for Lab Test \n Parameter A: Drug X B: Placebo C: Combination All Patients \n Direction of Abnormality (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————\nCHEMISTRY \n Alanine Aminotransferase Measurement \n Low 46/119 (38.7%) 54/123 (43.9%) 47/127 (37%) 147/369 (39.8%)\n High 0/134 0/134 0/132 0/400 \n C-Reactive Protein Measurement \n Low 59/122 (48.4%) 56/118 (47.5%) 58/121 (47.9%) 173/361 (47.9%)\n High 54/122 (44.3%) 46/122 (37.7%) 44/122 (36.1%) 144/366 (39.3%)\nIMMUNOLOGY \n Immunoglobulin A Measurement \n Low 0/134 0/134 0/132 0/400 \n High 47/124 (37.9%) 54/120 (45%) 47/115 (40.9%) 148/359 (41.2%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nThe current module tm_t_abnormality is only displaying rows that are not all-zero, so the result could be a little different from static output where all-zero rows can be shown.\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n library(forcats)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n mutate(\n ANRIND = fct_collapse(ATOXGR,\n \"LOW\" = c(\"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-2\", \"-1\", \"0\", \"1\", \"2\"),\n \"HIGH\" = c(\"3\", \"4\")\n ),\n BNRIND = fct_collapse(.data$BTOXGR,\n \"LOW\" = c(\"-3\", \"-4\"),\n \"MODERATE/NORMAL\" = c(\"-2\", \"-1\", \"0\", \"1\", \"2\"),\n \"HIGH\" = c(\"3\", \"4\")\n )\n ) %>%\n filter(ONTRTFL == \"Y\") %>%\n col_relabel(ANRIND = \"Direction of Abnormality\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_abnormality(\n label = \"Abnormality Table\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"PARAM\")),\n selected = c(\"PARAM\"),\n keep_order = TRUE\n ),\n grade = choices_selected(\n choices = variable_choices(ADLB, subset = \"ANRIND\"),\n selected = \"ANRIND\",\n fixed = TRUE\n ),\n baseline_var = choices_selected(\n choices = variable_choices(ADLB, subset = \"BNRIND\"),\n selected = \"BNRIND\",\n fixed = TRUE\n ),\n abnormal = list(Low = \"LOW\", High = \"HIGH\"),\n exclude_base_abn = TRUE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:51:06 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 forcats_1.0.0 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\nlibrary(stringr)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>%\n filter(AVISIT == \"CYCLE 1 DAY 1\", str_detect(tolower(PARAM), regex(\"norm by dose\", ignore_case = TRUE)))\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_cols_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ARMCD\"),\n split_label = \"Treatment Arm\"\n ) %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\"\n ) %>%\n tern::analyze_vars(\n vars = \"AVAL\",\n .stats = c(\"n\", \"mean_sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"range\"),\n .formats = c(\n n = \"xx.\",\n mean_sd = format_sigfig(3, \"xx (xx)\"),\n cv = \"xx.x\",\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n median = format_sigfig(3),\n range = format_sigfig(3, \"xx - xx\")\n )\n )\n\n\nPlasma Drug X\n\n\nCodeadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\"Summary of Dose-Normalized PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\nresult\n\nSummary of Dose-Normalized PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n———————————————————————————————————————————————————————————————\nPK Parameter ARM A ARM C \n———————————————————————————————————————————————————————————————\nRENALCLD (L/hr/mg) \n n 134 132 \n Mean (SD) 0.00487 (0.000965) 0.00511 (0.000934)\n CV (%) 19.8 18.3 \n Geometric Mean 0.00477 0.00502 \n CV % Geometric Mean 21.2 19.7 \n Median 0.00497 0.00515 \n Min - Max 0.00238 - 0.00726 0.00236 - 0.00741 \n\n\nPlasma Drug Y\n\n\nCodeadpp1 <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp1)\nmain_title(result) <- paste(\"Summary of Dose-Normalized PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp1$PPCAT), \"\\nVisit:\", unique(adpp1$AVISIT))\nresult\n\nSummary of Dose-Normalized PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y \nVisit: CYCLE 1 DAY 1\n\n—————————————————————————————————————————\nPK Parameter ARM C \n—————————————————————————————————————————\nRENALCLD (L/hr/mg) \n n 132 \n Mean (SD) 0.00509 (0.00103)\n CV (%) 20.3 \n Geometric Mean 0.00499 \n CV % Geometric Mean 21.4 \n Median 0.00502 \n Min - Max 0.00236 - 0.00794\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:48:26 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] stringr_1.5.1 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9018 dplyr_1.1.4 \n[7] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT15" + "Pharmacokinetic", + "PKPT06" ] }, { - "objectID": "tables/lab-results/lbt09.html", - "href": "tables/lab-results/lbt09.html", - "title": "LBT09", + "objectID": "tables/pharmacokinetic/pkpt04.html", + "href": "tables/pharmacokinetic/pkpt04.html", + "title": "PKPT04", "section": "", - "text": "Data Setup\nStandard Table\nTable Selecting Sections\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadhy <- synthetic_cdisc_dataset(\"latest\", \"adhy\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadhy_liver <- df_explicit_na(adhy)\n\n# Define values of interest in PARAMCD variable.\nparamcd_tbili_alt <- c(\"BLAL\", \"BGAL\", \"BA2AL\", \"BA5AL\")\nparamcd_tbili_ast <- c(\"BLAS\", \"BGAS\", \"BA2AS\", \"BA5AS\")\n\n# Select LBT09 parameters.\nadhy_liver <- adhy_liver %>%\n filter(\n SAFFL == \"Y\",\n AVISIT %in% c(\"BASELINE\", \"POST-BASELINE\"),\n PARAMCD %in% c(paramcd_tbili_alt, paramcd_tbili_ast)\n )\n\n# Let's be explicit about factor levels for AVISIT and PARAMCD.\nadhy_liver <- adhy_liver %>%\n mutate(\n AVISIT = factor(AVISIT, levels = c(\"BASELINE\", \"POST-BASELINE\")),\n PARAMCD = factor(PARAMCD, levels = c(paramcd_tbili_alt, paramcd_tbili_ast))\n )\n\n# Create indicator and category variables.\nadhy_liver <- adhy_liver %>%\n mutate(\n # Create TBILI_CAT categories variable - this is needed so we get the right nesting in the table.\n TBILI_CAT = factor(\n case_when(\n PARAMCD %in% c(paramcd_tbili_alt[1], paramcd_tbili_ast[1]) ~ \"Total Bilirubin <= 2xULN\",\n PARAMCD %in% c(paramcd_tbili_alt[2], paramcd_tbili_ast[2]) ~ \"Total Bilirubin > 2xULN\",\n PARAMCD %in% c(paramcd_tbili_alt[3], paramcd_tbili_ast[3]) ~\n \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN\",\n PARAMCD %in% c(paramcd_tbili_alt[4], paramcd_tbili_ast[4]) ~\n \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN\"\n ),\n levels = c(\n \"Total Bilirubin <= 2xULN\",\n \"Total Bilirubin > 2xULN\",\n \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN\",\n \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN\"\n )\n ),\n # Create ALTAST_CAT categories variable\n # this will be the labels for different ALT/AST categories displayed in the table.\n ALTAST_CAT = factor(\n case_when(\n PARAMCD %in% paramcd_tbili_alt & AVALC == \">3-5ULN\" ~ \"ALT >3 - <= 5xULN\",\n PARAMCD %in% paramcd_tbili_alt & AVALC == \">5-10ULN\" ~ \"ALT >5 - <= 10xULN\",\n PARAMCD %in% paramcd_tbili_alt & AVALC == \">10-20ULN\" ~ \"ALT >10 - <= 20xULN\",\n PARAMCD %in% paramcd_tbili_alt & AVALC == \">20ULN\" ~ \"ALT > 20xULN\",\n PARAMCD %in% paramcd_tbili_ast & AVALC == \">3-5ULN\" ~ \"AST >3 - <= 5xULN\",\n PARAMCD %in% paramcd_tbili_ast & AVALC == \">5-10ULN\" ~ \"AST >5 - <= 10xULN\",\n PARAMCD %in% paramcd_tbili_ast & AVALC == \">10-20ULN\" ~ \"AST >10 - <= 20xULN\",\n PARAMCD %in% paramcd_tbili_ast & AVALC == \">20ULN\" ~ \"AST > 20xULN\",\n TRUE ~ \"Criteria not met\"\n ),\n levels = c(\n \"ALT >3 - <= 5xULN\", \"ALT >5 - <= 10xULN\", \"ALT >10 - <= 20xULN\",\n \"20\" = \"ALT > 20xULN\",\n \"AST >3 - <= 5xULN\", \"AST >5 - <= 10xULN\", \"AST >10 - <= 20xULN\", \"AST > 20xULN\",\n \"Criteria not met\"\n )\n ),\n ALTAST_ind = factor(\n case_when(\n PARAMCD %in% paramcd_tbili_alt ~ \"ALT\",\n PARAMCD %in% paramcd_tbili_ast ~ \"AST\"\n ),\n levels = c(\"ALT\", \"AST\")\n )\n )\n\nmap <- data.frame(\n ALTAST_ind = c(rep(\"ALT\", 5), rep(\"AST\", 5)),\n ALTAST_CAT = c(\n \"ALT >3 - <= 5xULN\", \"ALT >5 - <= 10xULN\", \"ALT >10 - <= 20xULN\",\n \"20\" = \"ALT > 20xULN\", \"Criteria not met\",\n \"AST >3 - <= 5xULN\", \"AST >5 - <= 10xULN\", \"AST >10 - <= 20xULN\", \"AST > 20xULN\", \"Criteria not met\"\n ),\n stringsAsFactors = FALSE\n)\n\n\n\n\n\nCoderesult <- basic_table() %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"AVISIT\") %>%\n split_rows_by(\"TBILI_CAT\") %>%\n # below split helps us get the right denominator between ALT/AST but it can be hidden\n split_rows_by(\"ALTAST_ind\", split_fun = trim_levels_to_map(map), child_labels = \"hidden\") %>%\n count_occurrences(\n vars = \"ALTAST_CAT\",\n .stats = \"fraction\",\n denom = \"n\",\n drop = FALSE\n ) %>%\n append_topleft(\"Liver Laboratory Test Criterion\") %>%\n build_table(df = adhy_liver)\n\n# trim away rows with criteria not met\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- result %>% trim_rows(criteria = criteria_fun)\nresult\n\n A: Drug X B: Placebo C: Combination \nLiver Laboratory Test Criterion BASELINE POST-BASELINE BASELINE POST-BASELINE BASELINE POST-BASELINE \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3 - <= 5xULN 23/134 (17.2%) 15/134 (11.2%) 25/134 (18.7%) 27/134 (20.1%) 27/132 (20.5%) 30/132 (22.7%)\n ALT >5 - <= 10xULN 28/134 (20.9%) 29/134 (21.6%) 29/134 (21.6%) 19/134 (14.2%) 36/132 (27.3%) 29/132 (22.0%)\n ALT >10 - <= 20xULN 24/134 (17.9%) 30/134 (22.4%) 32/134 (23.9%) 33/134 (24.6%) 28/132 (21.2%) 24/132 (18.2%)\n ALT > 20xULN 32/134 (23.9%) 35/134 (26.1%) 24/134 (17.9%) 23/134 (17.2%) 20/132 (15.2%) 26/132 (19.7%)\n AST >3 - <= 5xULN 31/134 (23.1%) 34/134 (25.4%) 30/134 (22.4%) 26/134 (19.4%) 34/132 (25.8%) 24/132 (18.2%)\n AST >5 - <= 10xULN 25/134 (18.7%) 25/134 (18.7%) 26/134 (19.4%) 26/134 (19.4%) 22/132 (16.7%) 27/132 (20.5%)\n AST >10 - <= 20xULN 22/134 (16.4%) 29/134 (21.6%) 16/134 (11.9%) 22/134 (16.4%) 34/132 (25.8%) 19/132 (14.4%)\n AST > 20xULN 20/134 (14.9%) 16/134 (11.9%) 28/134 (20.9%) 31/134 (23.1%) 21/132 (15.9%) 39/132 (29.5%)\nTotal Bilirubin > 2xULN \n ALT >3 - <= 5xULN 40/134 (29.9%) 28/134 (20.9%) 31/134 (23.1%) 28/134 (20.9%) 18/132 (13.6%) 32/132 (24.2%)\n ALT >5 - <= 10xULN 24/134 (17.9%) 29/134 (21.6%) 30/134 (22.4%) 37/134 (27.6%) 33/132 (25.0%) 24/132 (18.2%)\n ALT >10 - <= 20xULN 24/134 (17.9%) 22/134 (16.4%) 26/134 (19.4%) 18/134 (13.4%) 21/132 (15.9%) 30/132 (22.7%)\n ALT > 20xULN 19/134 (14.2%) 33/134 (24.6%) 23/134 (17.2%) 19/134 (14.2%) 30/132 (22.7%) 22/132 (16.7%)\n AST >3 - <= 5xULN 17/134 (12.7%) 27/134 (20.1%) 36/134 (26.9%) 25/134 (18.7%) 26/132 (19.7%) 34/132 (25.8%)\n AST >5 - <= 10xULN 25/134 (18.7%) 28/134 (20.9%) 24/134 (17.9%) 28/134 (20.9%) 20/132 (15.2%) 23/132 (17.4%)\n AST >10 - <= 20xULN 36/134 (26.9%) 28/134 (20.9%) 16/134 (11.9%) 26/134 (19.4%) 33/132 (25.0%) 26/132 (19.7%)\n AST > 20xULN 30/134 (22.4%) 21/134 (15.7%) 30/134 (22.4%) 24/134 (17.9%) 24/132 (18.2%) 25/132 (18.9%)\nTotal Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN \n ALT >3 - <= 5xULN 24/134 (17.9%) 22/134 (16.4%) 28/134 (20.9%) 23/134 (17.2%) 38/132 (28.8%) 23/132 (17.4%)\n ALT >5 - <= 10xULN 26/134 (19.4%) 25/134 (18.7%) 19/134 (14.2%) 22/134 (16.4%) 32/132 (24.2%) 32/132 (24.2%)\n ALT >10 - <= 20xULN 26/134 (19.4%) 30/134 (22.4%) 31/134 (23.1%) 30/134 (22.4%) 21/132 (15.9%) 27/132 (20.5%)\n ALT > 20xULN 30/134 (22.4%) 28/134 (20.9%) 24/134 (17.9%) 36/134 (26.9%) 20/132 (15.2%) 23/132 (17.4%)\n AST >3 - <= 5xULN 37/134 (27.6%) 25/134 (18.7%) 31/134 (23.1%) 26/134 (19.4%) 24/132 (18.2%) 36/132 (27.3%)\n AST >5 - <= 10xULN 25/134 (18.7%) 32/134 (23.9%) 29/134 (21.6%) 30/134 (22.4%) 26/132 (19.7%) 24/132 (18.2%)\n AST >10 - <= 20xULN 25/134 (18.7%) 31/134 (23.1%) 28/134 (20.9%) 22/134 (16.4%) 29/132 (22.0%) 23/132 (17.4%)\n AST > 20xULN 26/134 (19.4%) 25/134 (18.7%) 23/134 (17.2%) 30/134 (22.4%) 23/132 (17.4%) 24/132 (18.2%)\nTotal Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN \n ALT >3 - <= 5xULN 24/134 (17.9%) 21/134 (15.7%) 30/134 (22.4%) 17/134 (12.7%) 28/132 (21.2%) 31/132 (23.5%)\n ALT >5 - <= 10xULN 36/134 (26.9%) 28/134 (20.9%) 25/134 (18.7%) 27/134 (20.1%) 26/132 (19.7%) 29/132 (22.0%)\n ALT >10 - <= 20xULN 30/134 (22.4%) 21/134 (15.7%) 28/134 (20.9%) 36/134 (26.9%) 25/132 (18.9%) 24/132 (18.2%)\n ALT > 20xULN 14/134 (10.4%) 28/134 (20.9%) 25/134 (18.7%) 27/134 (20.1%) 31/132 (23.5%) 23/132 (17.4%)\n AST >3 - <= 5xULN 21/134 (15.7%) 26/134 (19.4%) 29/134 (21.6%) 31/134 (23.1%) 33/132 (25.0%) 19/132 (14.4%)\n AST >5 - <= 10xULN 29/134 (21.6%) 26/134 (19.4%) 24/134 (17.9%) 26/134 (19.4%) 23/132 (17.4%) 32/132 (24.2%)\n AST >10 - <= 20xULN 29/134 (21.6%) 31/134 (23.1%) 28/134 (20.9%) 22/134 (16.4%) 22/132 (16.7%) 21/132 (15.9%)\n AST > 20xULN 34/134 (25.4%) 21/134 (15.7%) 19/134 (14.2%) 28/134 (20.9%) 21/132 (15.9%) 33/132 (25.0%)\n\n\n\n\n\nCoderesult <- basic_table() %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"AVISIT\") %>%\n split_rows_by(\n \"TBILI_CAT\",\n split_fun = remove_split_levels(\"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN\")\n ) %>%\n # below split helps us get the right denominator between ALT/AST but it can be hidden\n split_rows_by(\n \"ALTAST_ind\",\n split_fun = trim_levels_to_map(map), child_labels = \"hidden\"\n ) %>%\n count_occurrences(\n vars = \"ALTAST_CAT\",\n .stats = \"fraction\",\n denom = \"n\",\n drop = FALSE\n ) %>%\n append_topleft(\"Liver Laboratory Test Criterion\") %>%\n build_table(df = adhy_liver)\n\n# trim away rows with criteria not met\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- result %>% trim_rows(criteria = criteria_fun)\nresult\n\n A: Drug X B: Placebo C: Combination \nLiver Laboratory Test Criterion BASELINE POST-BASELINE BASELINE POST-BASELINE BASELINE POST-BASELINE \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3 - <= 5xULN 23/134 (17.2%) 15/134 (11.2%) 25/134 (18.7%) 27/134 (20.1%) 27/132 (20.5%) 30/132 (22.7%)\n ALT >5 - <= 10xULN 28/134 (20.9%) 29/134 (21.6%) 29/134 (21.6%) 19/134 (14.2%) 36/132 (27.3%) 29/132 (22.0%)\n ALT >10 - <= 20xULN 24/134 (17.9%) 30/134 (22.4%) 32/134 (23.9%) 33/134 (24.6%) 28/132 (21.2%) 24/132 (18.2%)\n ALT > 20xULN 32/134 (23.9%) 35/134 (26.1%) 24/134 (17.9%) 23/134 (17.2%) 20/132 (15.2%) 26/132 (19.7%)\n AST >3 - <= 5xULN 31/134 (23.1%) 34/134 (25.4%) 30/134 (22.4%) 26/134 (19.4%) 34/132 (25.8%) 24/132 (18.2%)\n AST >5 - <= 10xULN 25/134 (18.7%) 25/134 (18.7%) 26/134 (19.4%) 26/134 (19.4%) 22/132 (16.7%) 27/132 (20.5%)\n AST >10 - <= 20xULN 22/134 (16.4%) 29/134 (21.6%) 16/134 (11.9%) 22/134 (16.4%) 34/132 (25.8%) 19/132 (14.4%)\n AST > 20xULN 20/134 (14.9%) 16/134 (11.9%) 28/134 (20.9%) 31/134 (23.1%) 21/132 (15.9%) 39/132 (29.5%)\nTotal Bilirubin > 2xULN \n ALT >3 - <= 5xULN 40/134 (29.9%) 28/134 (20.9%) 31/134 (23.1%) 28/134 (20.9%) 18/132 (13.6%) 32/132 (24.2%)\n ALT >5 - <= 10xULN 24/134 (17.9%) 29/134 (21.6%) 30/134 (22.4%) 37/134 (27.6%) 33/132 (25.0%) 24/132 (18.2%)\n ALT >10 - <= 20xULN 24/134 (17.9%) 22/134 (16.4%) 26/134 (19.4%) 18/134 (13.4%) 21/132 (15.9%) 30/132 (22.7%)\n ALT > 20xULN 19/134 (14.2%) 33/134 (24.6%) 23/134 (17.2%) 19/134 (14.2%) 30/132 (22.7%) 22/132 (16.7%)\n AST >3 - <= 5xULN 17/134 (12.7%) 27/134 (20.1%) 36/134 (26.9%) 25/134 (18.7%) 26/132 (19.7%) 34/132 (25.8%)\n AST >5 - <= 10xULN 25/134 (18.7%) 28/134 (20.9%) 24/134 (17.9%) 28/134 (20.9%) 20/132 (15.2%) 23/132 (17.4%)\n AST >10 - <= 20xULN 36/134 (26.9%) 28/134 (20.9%) 16/134 (11.9%) 26/134 (19.4%) 33/132 (25.0%) 26/132 (19.7%)\n AST > 20xULN 30/134 (22.4%) 21/134 (15.7%) 30/134 (22.4%) 24/134 (17.9%) 24/132 (18.2%) 25/132 (18.9%)\nTotal Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN \n ALT >3 - <= 5xULN 24/134 (17.9%) 21/134 (15.7%) 30/134 (22.4%) 17/134 (12.7%) 28/132 (21.2%) 31/132 (23.5%)\n ALT >5 - <= 10xULN 36/134 (26.9%) 28/134 (20.9%) 25/134 (18.7%) 27/134 (20.1%) 26/132 (19.7%) 29/132 (22.0%)\n ALT >10 - <= 20xULN 30/134 (22.4%) 21/134 (15.7%) 28/134 (20.9%) 36/134 (26.9%) 25/132 (18.9%) 24/132 (18.2%)\n ALT > 20xULN 14/134 (10.4%) 28/134 (20.9%) 25/134 (18.7%) 27/134 (20.1%) 31/132 (23.5%) 23/132 (17.4%)\n AST >3 - <= 5xULN 21/134 (15.7%) 26/134 (19.4%) 29/134 (21.6%) 31/134 (23.1%) 33/132 (25.0%) 19/132 (14.4%)\n AST >5 - <= 10xULN 29/134 (21.6%) 26/134 (19.4%) 24/134 (17.9%) 26/134 (19.4%) 23/132 (17.4%) 32/132 (24.2%)\n AST >10 - <= 20xULN 29/134 (21.6%) 31/134 (23.1%) 28/134 (20.9%) 22/134 (16.4%) 22/132 (16.7%) 21/132 (15.9%)\n AST > 20xULN 34/134 (25.4%) 21/134 (15.7%) 19/134 (14.2%) 28/134 (20.9%) 21/132 (15.9%) 33/132 (25.0%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:50:45 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>% filter(PPSPEC == \"Urine\", AVISIT == \"CYCLE 1 DAY 1\")\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_cols_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ARMCD\"),\n split_label = \"Treatment Arm\"\n ) %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\"\n ) %>%\n tern::analyze_vars(\n vars = \"AVAL\",\n .stats = c(\"n\", \"mean_sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"range\"),\n .formats = c(\n n = \"xx.\",\n mean_sd = format_sigfig(3, \"xx (xx)\"),\n cv = \"xx.x\",\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n median = format_sigfig(3),\n range = format_sigfig(3, \"xx - xx\")\n )\n )\n\n\nPlasma Drug X\n\n\nCodeadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\"Summary of\", unique(adpp0$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n———————————————————————————————————————————————————————————————\nPK Parameter ARM A ARM C \n———————————————————————————————————————————————————————————————\nAe (mg) \n n 268 264 \n Mean (SD) 1.55 (0.338) 1.54 (0.298) \n CV (%) 21.8 19.4 \n Geometric Mean 1.51 1.51 \n CV % Geometric Mean 23.0 20.3 \n Median 1.55 1.55 \n Min - Max 0.702 - 2.46 0.850 - 2.21 \nFe (%) \n n 268 264 \n Mean (SD) 15.7 (3.35) 16.1 (3.10) \n CV (%) 21.3 19.3 \n Geometric Mean 15.3 15.8 \n CV % Geometric Mean 22.2 20.2 \n Median 15.8 16.0 \n Min - Max 8.15 - 24.5 8.50 - 24.4 \nCLR (L/hr) \n n 134 132 \n Mean (SD) 0.0492 (0.00961) 0.0502 (0.0105) \n CV (%) 19.5 20.9 \n Geometric Mean 0.0482 0.0491 \n CV % Geometric Mean 21.0 21.9 \n Median 0.0491 0.0498 \n Min - Max 0.0249 - 0.0751 0.0251 - 0.0856 \nRENALCLD (L/hr/mg) \n n 134 132 \n Mean (SD) 0.00487 (0.000965) 0.00511 (0.000934)\n CV (%) 19.8 18.3 \n Geometric Mean 0.00477 0.00502 \n CV % Geometric Mean 21.2 19.7 \n Median 0.00497 0.00515 \n Min - Max 0.00238 - 0.00726 0.00236 - 0.00741 \n\n\nPlasma Drug Y\n\n\nCodeadpp1 <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp1)\nmain_title(result) <- paste(\"Summary of\", unique(adpp1$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp1$PPCAT), \"\\nVisit:\", unique(adpp1$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y \nVisit: CYCLE 1 DAY 1\n\n—————————————————————————————————————————\nPK Parameter ARM C \n—————————————————————————————————————————\nAe (mg) \n n 264 \n Mean (SD) 1.60 (0.315) \n CV (%) 19.7 \n Geometric Mean 1.56 \n CV % Geometric Mean 21.4 \n Median 1.60 \n Min - Max 0.857 - 2.26 \nFe (%) \n n 264 \n Mean (SD) 15.8 (3.08) \n CV (%) 19.4 \n Geometric Mean 15.5 \n CV % Geometric Mean 20.2 \n Median 15.7 \n Min - Max 8.31 - 23.8 \nCLR (L/hr) \n n 132 \n Mean (SD) 0.0497 (0.0101) \n CV (%) 20.3 \n Geometric Mean 0.0486 \n CV % Geometric Mean 22.0 \n Median 0.0491 \n Min - Max 0.0184 - 0.0776 \nRENALCLD (L/hr/mg) \n n 132 \n Mean (SD) 0.00509 (0.00103)\n CV (%) 20.3 \n Geometric Mean 0.00499 \n CV % Geometric Mean 21.4 \n Median 0.00502 \n Min - Max 0.00236 - 0.00794\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:48:14 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT09" + "Pharmacokinetic", + "PKPT04" ] }, { - "objectID": "tables/lab-results/lbt01.html", - "href": "tables/lab-results/lbt01.html", - "title": "LBT01", + "objectID": "tables/pharmacokinetic/pkpt07.html", + "href": "tables/pharmacokinetic/pkpt07.html", + "title": "PKPT07", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\nIn order to generate the LBT01 standard tabulation, the adlb dataset may be pre-processed so as to discriminate baseline from follow-up visits.\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb) %>%\n filter(ANL01FL == \"Y\")\n\n# For illustration purpose, the example focuses on \"Alanine Aminotransferase\n# Measurement\" starting from baseline, while excluding visit at week 1 for\n# subjects who were prescribed a placebo.\nadlb_f <- adlb %>%\n dplyr::filter(\n PARAM == \"Alanine Aminotransferase Measurement\" &\n !(ACTARM == \"B: Placebo\" & AVISIT == \"WEEK 1 DAY 8\") &\n AVISIT != \"SCREENING\"\n )\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nafun <- function(x, .var, .spl_context, ...) {\n n_fun <- sum(!is.na(x), na.rm = TRUE)\n if (n_fun == 0) {\n mean_sd_fun <- c(NA, NA)\n median_fun <- NA\n min_max_fun <- c(NA, NA)\n } else {\n mean_sd_fun <- c(mean(x, na.rm = TRUE), sd(x, na.rm = TRUE))\n median_fun <- median(x, na.rm = TRUE)\n min_max_fun <- c(min(x), max(x))\n }\n is_chg <- .var == \"CHG\"\n is_baseline <- .spl_context$value[which(.spl_context$split == \"AVISIT\")] == \"BASELINE\"\n if (is_baseline && is_chg) n_fun <- mean_sd_fun <- median_fun <- min_max_fun <- NULL\n\n in_rows(\n \"n\" = n_fun,\n \"Mean (SD)\" = mean_sd_fun,\n \"Median\" = median_fun,\n \"Min - Max\" = min_max_fun,\n .formats = list(\"n\" = \"xx\", \"Mean (SD)\" = \"xx.xx (xx.xx)\", \"Median\" = \"xx.xx\", \"Min - Max\" = \"xx.xx - xx.xx\"),\n .format_na_strs = list(\"n\" = \"NE\", \"Mean (SD)\" = \"NE (NE)\", \"Median\" = \"NE\", \"Min - Max\" = \"NE - NE\")\n )\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f$PARAM)) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f$AVISIT)) %>%\n split_cols_by_multivar(\n vars = c(\"AVAL\", \"CHG\"),\n varlabels = c(\"Value at Visit\", \"Change from\\nBaseline\")\n ) %>%\n analyze_colvars(afun = afun)\n\nresult <- build_table(lyt, adlb_f)\nresult\n\n A: Drug X B: Placebo C: Combination \n Change from Change from Change from \nParameter Value at Visit Baseline Value at Visit Baseline Value at Visit Baseline \n Analysis Visit (N=804) (N=804) (N=670) (N=670) (N=792) (N=792) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n BASELINE \n n 134 134 132 \n Mean (SD) 17.74 (9.93) 18.71 (9.83) 19.46 (9.08) \n Median 17.46 18.19 18.97 \n Min - Max 0.00 - 44.06 1.48 - 54.40 0.57 - 39.81 \n WEEK 1 DAY 8 \n n 134 134 0 0 132 132 \n Mean (SD) 16.75 (9.08) -0.99 (13.49) NE (NE) NE (NE) 19.61 (9.27) 0.14 (12.85) \n Median 16.02 -1.28 NE NE 19.00 0.06 \n Min - Max 0.05 - 36.30 -31.31 - 27.89 NE - NE NE - NE 0.91 - 44.75 -32.45 - 38.85\n WEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 17.82 (9.60) 0.08 (14.15) 18.82 (9.73) 0.11 (14.45) 16.55 (8.15) -2.92 (12.64) \n Median 15.92 0.28 17.96 -0.93 17.02 -1.11 \n Min - Max 0.40 - 44.33 -32.89 - 40.55 0.18 - 44.34 -45.93 - 29.85 0.35 - 34.69 -28.36 - 23.98\n WEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 18.37 (9.30) 0.63 (13.85) 17.65 (9.58) -1.06 (13.58) 16.75 (9.54) -2.71 (13.22) \n Median 18.11 1.13 17.68 -0.49 15.10 -2.66 \n Min - Max 0.59 - 41.73 -40.09 - 31.24 0.02 - 38.61 -46.30 - 31.38 0.48 - 39.23 -30.63 - 26.51\n WEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 19.17 (10.95) 1.44 (15.39) 17.22 (10.64) -1.48 (15.20) 17.92 (9.32) -1.54 (12.63) \n Median 17.41 0.88 15.88 -2.96 17.71 -1.53 \n Min - Max 0.93 - 54.24 -32.93 - 46.98 0.39 - 47.96 -41.45 - 43.08 0.25 - 41.27 -30.33 - 27.99\n WEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 19.22 (9.47) 1.48 (14.49) 18.01 (9.92) -0.69 (14.65) 18.51 (9.43) -0.95 (12.92) \n Median 19.80 2.31 18.28 1.82 19.26 -2.48 \n Min - Max 0.01 - 43.42 -40.08 - 30.07 0.11 - 40.64 -47.60 - 26.04 0.02 - 37.46 -29.78 - 25.00\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADLB <- df_explicit_na(ADLB)\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Laboratory Test Results and Change from Baseline by Visit\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADLB, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"AVISIT\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADLB, c(\"AVAL\", \"CHG\")),\n selected = c(\"AVAL\", \"CHG\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = \"ALT\"\n ),\n parallel_vars = TRUE\n )\n ),\n filter = teal_slices(teal_slice(\"ADLB\", \"AVAL\", selected = NULL))\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADLB-filter-ADLB_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:50:14 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table – Urine\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\nlibrary(stringr)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>%\n filter(AVISIT == \"CYCLE 1 DAY 1\", str_detect(tolower(PARAM), regex(\"norm by dose\", ignore_case = TRUE)))\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_rows_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ARMCD\"),\n label_pos = \"topleft\",\n split_label = \"Treatment Arm\"\n ) %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\",\n child_labels = \"hidden\"\n ) %>%\n analyze_vars_in_cols(\n vars = \"AVAL\",\n .stats = c(\n \"n\", \"mean\", \"sd\", \"cv\",\n \"geom_mean\", \"geom_cv\", \"median\",\n \"min\", \"max\"\n ),\n .labels = c(\n n = \"n\",\n mean = \"Mean\",\n sd = \"SD\",\n cv = \"CV (%)\",\n geom_mean = \"Geometric Mean\",\n geom_cv = \"CV % Geometric Mean\",\n median = \"Median\",\n min = \"Minimum\",\n max = \"Maximum\"\n ),\n .formats = c(\n n = \"xx.\",\n mean = format_sigfig(3),\n sd = format_sigfig(3),\n cv = \"xx.x\",\n median = format_sigfig(3),\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n min = format_sigfig(3),\n max = format_sigfig(3)\n )\n )\n\n\nPlasma Drug X\n\n\nCodeadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\"Summary of\", unique(adpp0$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A \n RENALCLD (L/hr/mg) 134 0.00487 0.000965 19.8 0.00477 21.2 0.00497 0.00238 0.00726\nARM C \n RENALCLD (L/hr/mg) 132 0.00511 0.000934 18.3 0.00502 19.7 0.00515 0.00236 0.00741\n\n\nPlasma Drug Y\n\n\nCodeadpp1 <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp1)\nmain_title(result) <- paste(\"Summary of\", unique(adpp1$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp1$PPCAT), \"\\nVisit:\", unique(adpp1$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y \nVisit: CYCLE 1 DAY 1\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM C \n RENALCLD (L/hr/mg) 132 0.00509 0.00103 20.3 0.00499 21.4 0.00502 0.00236 0.00794\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:48:00 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] stringr_1.5.1 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9018 dplyr_1.1.4 \n[7] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT01" + "Pharmacokinetic", + "PKPT07" ] }, { - "objectID": "tables/lab-results/lbt03.html", - "href": "tables/lab-results/lbt03.html", - "title": "LBT03", + "objectID": "tables/pharmacokinetic/pkpt03.html", + "href": "tables/pharmacokinetic/pkpt03.html", + "title": "PKPT03", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\nFor illustration purposes, this example focuses on “C-Reactive Protein Measurement” starting from baseline, while excluding visit at week 1 for subjects who were randomized to the placebo group.\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\nsaved_labels <- var_labels(adlb)\n\nadlb_f <- adlb %>%\n filter(\n PARAM == \"C-Reactive Protein Measurement\",\n !(ARM == \"B: Placebo\" & AVISIT == \"WEEK 1 DAY 8\"),\n AVISIT != \"SCREENING\"\n ) %>%\n dplyr::mutate(\n AVISIT = droplevels(AVISIT),\n ABLFLL = ABLFL == \"Y\"\n )\n\nvar_labels(adlb_f) <- c(saved_labels, \"\")\n\n\n\n\nThe LBT03 template is the result of a junction between the analysis of AVAL at baseline and CHG at visit time. AVAL is summarized for baseline visits and and CHG is summarized for post-baseline visits.\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f$AVISIT)) %>%\n summarize_change(\n \"CHG\",\n variables = list(value = \"AVAL\", baseline_flag = \"ABLFLL\"),\n na.rm = TRUE\n )\n\nresult <- build_table(\n lyt = lyt,\n df = adlb_f,\n alt_counts_df = adsl\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\nAnalysis Visit (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————\nBASELINE \n n 134 134 132 \n Mean (SD) 9.06 (0.93) 8.99 (0.98) 8.98 (0.89) \n Median 9.07 8.92 8.96 \n Min - Max 6.21 - 11.87 6.23 - 11.63 6.24 - 11.18 \nWEEK 1 DAY 8 \n n 134 0 132 \n Mean (SD) -0.05 (1.38) NA -0.02 (1.30) \n Median -0.17 NA 0.02 \n Min - Max -3.56 - 3.48 NA -3.28 - 3.33 \nWEEK 2 DAY 15 \n n 134 134 132 \n Mean (SD) -0.19 (1.47) 0.01 (1.45) 0.15 (1.25) \n Median -0.27 -0.00 0.15 \n Min - Max -4.53 - 4.45 -3.79 - 3.43 -2.92 - 3.28 \nWEEK 3 DAY 22 \n n 134 134 132 \n Mean (SD) 0.03 (1.38) -0.02 (1.49) 0.02 (1.34) \n Median 0.15 -0.04 0.20 \n Min - Max -3.95 - 2.99 -4.28 - 4.24 -2.76 - 3.26 \nWEEK 4 DAY 29 \n n 134 134 132 \n Mean (SD) -0.26 (1.45) 0.05 (1.24) -0.01 (1.17) \n Median -0.37 0.10 -0.06 \n Min - Max -3.74 - 4.15 -3.34 - 3.71 -3.06 - 3.22 \nWEEK 5 DAY 36 \n n 134 134 132 \n Mean (SD) -0.02 (1.50) 0.07 (1.34) 0.03 (1.27) \n Median 0.01 0.15 0.05 \n Min - Max -4.15 - 3.96 -3.50 - 3.53 -3.63 - 4.78 \n\n\nIn the final step, a new variable is derived from AVISIT that can specify the method of estimation of the evaluated change.\n\nCodeadlb_f <- adlb_f %>% mutate(AVISIT_header = recode(AVISIT,\n \"BASELINE\" = \"BASELINE\",\n \"WEEK 1 DAY 8\" = \"WEEK 1 DAY 8 value minus baseline\",\n \"WEEK 2 DAY 15\" = \"WEEK 2 DAY 15 value minus baseline\",\n \"WEEK 3 DAY 22\" = \"WEEK 3 DAY 22 value minus baseline\",\n \"WEEK 4 DAY 29\" = \"WEEK 4 DAY 29 value minus baseline\",\n \"WEEK 5 DAY 36\" = \"WEEK 5 DAY 36 value minus baseline\"\n))\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\"AVISIT_header\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adlb_f$AVISIT)\n ) %>%\n summarize_change(\n \"CHG\",\n variables = list(value = \"AVAL\", baseline_flag = \"ABLFLL\"),\n na.rm = TRUE\n )\n\nresult <- build_table(\n lyt = lyt,\n df = adlb_f,\n alt_counts_df = adsl\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\nAnalysis Visit (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————\nBASELINE \n n 134 134 132 \n Mean (SD) 9.06 (0.93) 8.99 (0.98) 8.98 (0.89) \n Median 9.07 8.92 8.96 \n Min - Max 6.21 - 11.87 6.23 - 11.63 6.24 - 11.18 \nWEEK 1 DAY 8 value minus baseline \n n 134 0 132 \n Mean (SD) -0.05 (1.38) NA -0.02 (1.30) \n Median -0.17 NA 0.02 \n Min - Max -3.56 - 3.48 NA -3.28 - 3.33 \nWEEK 2 DAY 15 value minus baseline \n n 134 134 132 \n Mean (SD) -0.19 (1.47) 0.01 (1.45) 0.15 (1.25) \n Median -0.27 -0.00 0.15 \n Min - Max -4.53 - 4.45 -3.79 - 3.43 -2.92 - 3.28 \nWEEK 3 DAY 22 value minus baseline \n n 134 134 132 \n Mean (SD) 0.03 (1.38) -0.02 (1.49) 0.02 (1.34) \n Median 0.15 -0.04 0.20 \n Min - Max -3.95 - 2.99 -4.28 - 4.24 -2.76 - 3.26 \nWEEK 4 DAY 29 value minus baseline \n n 134 134 132 \n Mean (SD) -0.26 (1.45) 0.05 (1.24) -0.01 (1.17) \n Median -0.37 0.10 -0.06 \n Min - Max -3.74 - 4.15 -3.34 - 3.71 -3.06 - 3.22 \nWEEK 5 DAY 36 value minus baseline \n n 134 134 132 \n Mean (SD) -0.02 (1.50) 0.07 (1.34) 0.03 (1.27) \n Median 0.01 0.15 0.05 \n Min - Max -4.15 - 3.96 -3.50 - 3.53 -3.63 - 4.78 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nHere, we pre-process and manually define the variable “Baseline or Absolute Change from Baseline”.\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- df_explicit_na(synthetic_cdisc_dataset(\"latest\", \"adsl\"))\n ADLB <- df_explicit_na(synthetic_cdisc_dataset(\"latest\", \"adlb\")) %>%\n filter(\n !(ARM == \"B: Placebo\" & AVISIT == \"WEEK 1 DAY 8\"),\n AVISIT != \"SCREENING\"\n ) %>%\n mutate(\n AVISIT = droplevels(AVISIT),\n ABLFLL = ABLFL == \"Y\",\n AVISIT_header = recode(AVISIT,\n \"BASELINE\" = \"BASELINE\",\n \"WEEK 1 DAY 8\" = \"WEEK 1 DAY 8 value minus baseline\",\n \"WEEK 2 DAY 15\" = \"WEEK 2 DAY 15 value minus baseline\",\n \"WEEK 3 DAY 22\" = \"WEEK 3 DAY 22 value minus baseline\",\n \"WEEK 4 DAY 29\" = \"WEEK 4 DAY 29 value minus baseline\",\n \"WEEK 5 DAY 36\" = \"WEEK 5 DAY 36 value minus baseline\"\n )\n ) %>%\n group_by(USUBJID, PARAM) %>%\n mutate(\n AVAL_CHG = AVAL - (!ABLFLL) * sum(AVAL * ABLFLL)\n ) %>%\n ungroup() %>%\n col_relabel(\n AVAL_CHG = \"Baseline or Absolute Change from Baseline\",\n ABLFLL = \"Baseline Flag (TRUE/FALSE)\",\n AVISIT_header = \"Analysis Visit\"\n )\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Laboratory Test Results Change from Baseline by Visit\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n # note: order matters here. If `PARAM` is first, the split will be first by `PARAM`and then by `AVISIT`\n choices = variable_choices(ADLB, c(\"PARAM\", \"AVISIT_header\")),\n selected = c(\"PARAM\", \"AVISIT_header\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADLB, c(\"AVAL\", \"CHG\", \"AVAL_CHG\")),\n selected = c(\"AVAL_CHG\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = \"CRP\"\n )\n )\n ),\n filter = teal_slices(teal_slice(\"ADLB\", \"AVAL\", selected = NULL))\n)\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADLB-filter-ADLB_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:49:53 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\n# Preprocess analysis data ----\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>%\n filter(PPSPEC == \"Plasma\") %>%\n filter(AVISIT %in% c(\"CYCLE 1 DAY 1\", \"CYCLE 1 DAY 2\")) %>%\n h_pkparam_sort() %>%\n mutate(PARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PARAM = reorder(PARAM, TLG_ORDER))\n\n# Preprocess subject-level data ----\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# Workaround needed to include (N=xx) population counts\n# Repeat ADSL by the number of levels in AVISIT\n# Include AVISIT and dummy PARAM as it's needed for trim_levels_in_group\nadsl_tmp <- adsl %>%\n select(STUDYID, USUBJID, ARMCD) %>%\n unique() %>%\n mutate(PARAM = factor(NA_character_, levels = levels(adpp$PARAM)))\n\n# Data for Plasma Drug X example ----\nadpp_x <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n # Please do not replicate mutate statement below!\n # It is used to make the random data in this example more realistic\n # as not all parameters are always available across all visits.\n mutate(\n AVAL = if_else(\n ARMCD == \"ARM A\" & AVISIT == \"CYCLE 1 DAY 1\" & PARAM == \"Cmax (ug/mL)\",\n NA_real_, AVAL\n )\n )\n\nadpp_x_tmp <- adpp_x %>%\n select(STUDYID, USUBJID, ARMCD, AVISIT) %>%\n unique()\n\nadsl_x_splitvars <- adsl_tmp %>%\n left_join(adpp_x_tmp, by = c(\"STUDYID\", \"USUBJID\", \"ARMCD\")) %>%\n filter(!is.na(AVISIT))\n\n# Data for Plasma Drug Y example ----\nadpp_y <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\")\n\nadpp_y_tmp <- adpp_y %>%\n select(STUDYID, USUBJID, ARMCD, AVISIT) %>%\n unique()\n\nadsl_y_splitvars <- adsl_tmp %>%\n left_join(adpp_y_tmp, by = c(\"STUDYID\", \"USUBJID\", \"ARMCD\")) %>%\n filter(!is.na(AVISIT))\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_rows_by(\n var = \"AVISIT\",\n split_fun = drop_split_levels,\n split_label = \"Visit\",\n page_by = TRUE\n ) %>%\n split_rows_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"PARAM\"),\n label_pos = \"topleft\",\n split_label = \"Treatment Arm\"\n ) %>%\n add_rowcounts(alt_counts = TRUE) %>%\n split_rows_by(\n var = \"PARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\",\n child_labels = \"hidden\"\n ) %>%\n analyze_vars_in_cols(\n vars = \"AVAL\",\n .stats = c(\n \"n\", \"mean\", \"sd\", \"cv\",\n \"geom_mean\", \"geom_cv\", \"median\",\n \"min\", \"max\"\n ),\n .labels = c(\n n = \"n\",\n mean = \"Mean\",\n sd = \"SD\",\n cv = \"CV (%)\",\n geom_mean = \"Geometric Mean\",\n geom_cv = \"CV % Geometric Mean\",\n median = \"Median\",\n min = \"Minimum\",\n max = \"Maximum\"\n ),\n .formats = c(\n n = \"xx.\",\n mean = format_sigfig(3),\n sd = format_sigfig(3),\n cv = \"xx.x\",\n median = format_sigfig(3),\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n min = format_sigfig(3),\n max = format_sigfig(3)\n ),\n na_str = \"NE\"\n )\n\n\nPlasma Drug X\n\nCoderesult <- build_table(lyt, df = adpp_x, alt_counts_df = adsl_x_splitvars)\nmain_title(result) <- paste(\"Summary of\", unique(adpp_x$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp_x$PPCAT))\nresult <- paginate_table(result, landscape = TRUE)\nresult\n\n$`CYCLE 1 DAY 1`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X\nVisit: CYCLE 1 DAY 1\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n Cmax (ug/mL) 0 NE NE NE NE NE NE NE NE \n AUCinf obs (day*ug/mL) 134 203 37.7 18.6 199 18.7 197 125 311 \n CL obs (ml/day/kg) 134 5.04 1.04 20.6 4.93 22.4 5.08 2.25 7.39 \nARM C (N=132) \n Cmax (ug/mL) 132 30.0 5.46 18.2 29.5 18.9 29.8 15.9 47.6 \n AUCinf obs (day*ug/mL) 132 195 37.8 19.4 192 20.1 196 103 315 \n CL obs (ml/day/kg) 132 5.01 0.985 19.7 4.91 21.1 4.97 2.10 7.49 \n\n$`CYCLE 1 DAY 2`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X\nVisit: CYCLE 1 DAY 2\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n Cmax (ug/mL) 134 29.4 6.22 21.2 28.6 24.4 29.8 10.1 43.5 \n AUCinf obs (day*ug/mL) 134 202 41.2 20.4 197 21.4 200 105 294 \n CL obs (ml/day/kg) 134 5.04 1.04 20.7 4.92 22.6 5.01 2.39 7.18 \nARM C (N=132) \n Cmax (ug/mL) 132 30.4 6.03 19.9 29.7 21.7 30.5 12.4 45.5 \n AUCinf obs (day*ug/mL) 132 191 43.0 22.5 186 24.7 189 74.8 296 \n CL obs (ml/day/kg) 132 5.07 1.07 21.1 4.96 22.4 5.01 2.48 7.50 \n\n\nPlasma Drug X: Remove Rows with 0s\n\nCoderesult <- build_table(lyt, df = adpp_x, alt_counts_df = adsl_x_splitvars) %>%\n prune_table()\n\nmain_title(result) <- paste(\"Summary of\", unique(adpp_x$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp_x$PPCAT))\nresult <- paginate_table(result, landscape = TRUE)\nresult\n\n$`CYCLE 1 DAY 1`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X\nVisit: CYCLE 1 DAY 1\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n AUCinf obs (day*ug/mL) 134 203 37.7 18.6 199 18.7 197 125 311 \n CL obs (ml/day/kg) 134 5.04 1.04 20.6 4.93 22.4 5.08 2.25 7.39 \nARM C (N=132) \n Cmax (ug/mL) 132 30.0 5.46 18.2 29.5 18.9 29.8 15.9 47.6 \n AUCinf obs (day*ug/mL) 132 195 37.8 19.4 192 20.1 196 103 315 \n CL obs (ml/day/kg) 132 5.01 0.985 19.7 4.91 21.1 4.97 2.10 7.49 \n\n$`CYCLE 1 DAY 2`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X\nVisit: CYCLE 1 DAY 2\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n Cmax (ug/mL) 134 29.4 6.22 21.2 28.6 24.4 29.8 10.1 43.5 \n AUCinf obs (day*ug/mL) 134 202 41.2 20.4 197 21.4 200 105 294 \n CL obs (ml/day/kg) 134 5.04 1.04 20.7 4.92 22.6 5.01 2.39 7.18 \nARM C (N=132) \n Cmax (ug/mL) 132 30.4 6.03 19.9 29.7 21.7 30.5 12.4 45.5 \n AUCinf obs (day*ug/mL) 132 191 43.0 22.5 186 24.7 189 74.8 296 \n CL obs (ml/day/kg) 132 5.07 1.07 21.1 4.96 22.4 5.01 2.48 7.50 \n\n\nPlasma Drug Y\n\nCoderesult <- build_table(lyt, df = adpp_y, alt_counts_df = adsl_y_splitvars)\nmain_title(result) <- paste(\"Summary of\", unique(adpp_y$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp_y$PPCAT))\nresult <- paginate_table(result, landscape = TRUE)\nresult\n\n$`CYCLE 1 DAY 1`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y\nVisit: CYCLE 1 DAY 1\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM C (N=132) \n Cmax (ug/mL) 132 29.9 5.55 18.6 29.4 20.1 29.7 14.1 43.4 \n AUCinf obs (day*ug/mL) 132 199 37.9 19.1 195 18.9 195 126 318 \n CL obs (ml/day/kg) 132 4.96 0.895 18.1 4.87 18.7 4.94 2.99 7.21 \n\n$`CYCLE 1 DAY 2`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y\nVisit: CYCLE 1 DAY 2\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM C (N=132) \n Cmax (ug/mL) 132 30.7 6.12 19.9 30.1 21.9 31.4 12.9 48.3 \n AUCinf obs (day*ug/mL) 132 199 40.0 20.1 194 22.2 197 79.2 295 \n CL obs (ml/day/kg) 132 4.99 0.984 19.7 4.89 20.9 4.96 2.58 8.39 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:47:48 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT03" + "Pharmacokinetic", + "PKPT03" ] }, { - "objectID": "tables/lab-results/lbt10_bl.html", - "href": "tables/lab-results/lbt10_bl.html", - "title": "LBT10_BL", + "objectID": "tables/pharmacokinetic/pkpt08.html", + "href": "tables/pharmacokinetic/pkpt08.html", + "title": "PKPT08", "section": "", - "text": "Data Setup\nStandard Table\nTable Selecting Sections\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadhy <- synthetic_cdisc_dataset(\"latest\", \"adhy\")\n\nadhy_liver <- adhy %>%\n filter(PARAMCD %in% c(\n \"BL2AL2CB\", \"BL2AS2CB\", \"BG2AL2CB\", \"BG2AS2CB\", \"B2A2L2CB\", \"B2A2S2CB\", \"B2A5L2CB\", \"B2A5S2CB\"\n )) %>%\n mutate(PARAMCAT = case_when(\n PARAMCD %in% c(\"BL2AL2CB\", \"BL2AS2CB\") ~ \"Total Bilirubin <= 2xULN\",\n PARAMCD %in% c(\"BG2AL2CB\", \"BG2AS2CB\") ~ \"Total Bilirubin > 2xULN\",\n PARAMCD %in% c(\"B2A2L2CB\", \"B2A2S2CB\") ~ \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN\",\n PARAMCD %in% c(\"B2A5L2CB\", \"B2A5S2CB\") ~ \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN\"\n )) %>%\n mutate(AVALC_FORMAT = case_when(\n PARAMCD %in% c(\"BL2AL2CB\", \"BG2AL2CB\", \"B2A2L2CB\", \"B2A5L2CB\") & AVALC == \"Y\" ~ \"ALT >3xULN at 2 Visits\",\n PARAMCD %in% c(\"BL2AS2CB\", \"BG2AS2CB\", \"B2A2S2CB\", \"B2A5S2CB\") & AVALC == \"Y\" ~ \"AST >3xULN at 2 Visits\",\n TRUE ~ \"Criteria not met\"\n ))\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nanl <- df_explicit_na(adhy_liver)\n\n\n\n\n\nCodetbl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_rows_by(\"PARAMCAT\") %>%\n split_rows_by(\"PARAM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\n vars = \"AVALC_FORMAT\",\n .stats = c(\"fraction\"),\n denom = \"n\",\n drop = TRUE\n ) %>%\n build_table(anl, alt_counts_df = adsl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- tbl %>% trim_rows(criteria = criteria_fun)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3xULN at 2 Visits 25/134 (18.7%) 20/134 (14.9%) 27/132 (20.5%)\n AST >3xULN at 2 Visits 22/134 (16.4%) 14/134 (10.4%) 37/132 (28.0%)\nTotal Bilirubin > 2xULN \n ALT >3xULN at 2 Visits 26/134 (19.4%) 31/134 (23.1%) 23/132 (17.4%)\n AST >3xULN at 2 Visits 30/134 (22.4%) 27/134 (20.1%) 26/132 (19.7%)\n\n\n\n\n\nCodetbl2 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_rows_by(\"PARAMCAT\", split_fun = remove_split_levels(\"Total Bilirubin > 2xULN\")) %>%\n split_rows_by(\"PARAM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\n vars = \"AVALC_FORMAT\",\n .stats = c(\"fraction\"),\n denom = \"n\",\n drop = TRUE\n ) %>%\n build_table(anl, alt_counts_df = adsl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- tbl2 %>% trim_rows(criteria = criteria_fun)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3xULN at 2 Visits 25/134 (18.7%) 20/134 (14.9%) 27/132 (20.5%)\n AST >3xULN at 2 Visits 22/134 (16.4%) 14/134 (10.4%) 37/132 (28.0%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:49:31 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table – Plasma\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(tern)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\nadpp <- adpp %>%\n filter(PPSTINT != \"NA\" & PPENINT != \"NA\") %>%\n mutate(PPINT = factor(paste0(gsub(\"[PH]\", \"\", PPSTINT), \"-\", gsub(\"[PH]\", \"\", PPENINT))))\n\n\n\n\n\n\nCode# create layout\nlyt <- basic_table() %>%\n add_overall_col(\"Accumulation Interval (hours)\") %>%\n split_cols_by(var = \"PPINT\") %>%\n split_cols_by(var = \"PKPARAM\") %>%\n split_rows_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ACTARM\"),\n label_pos = \"topleft\",\n split_label = \"Treatment Arm\"\n ) %>%\n analyze_vars(\n vars = \"AVAL\",\n .stats = c(\n \"n\", \"mean\", \"sd\", \"cv\",\n \"median\", \"min\", \"max\"\n ),\n .labels = c(\n n = \"n\",\n mean = \"Mean\",\n sd = \"SD\",\n cv = \"CV (%)\",\n median = \"Median\",\n min = \"Minimum\",\n max = \"Maximum\"\n ),\n .formats = c(\n n = \"xx.\",\n mean = format_sigfig(3),\n sd = format_sigfig(3),\n cv = \"xx.x\",\n median = format_sigfig(3),\n min = format_sigfig(3),\n max = format_sigfig(3)\n )\n )\n\nadpp0 <- adpp %>%\n filter(\n AVISIT == \"CYCLE 1 DAY 1\",\n PPCAT == \"Plasma Drug X\"\n ) %>%\n h_pkparam_sort() %>%\n mutate(\n PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))\n )\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\n \"Summary of Cumulative Amount and Percentage of\", unique(adpp0$PPSPEC), \"Recovered from\\n\",\n unique(adpp0$PPCAT), \"following\", unique(adpp0$REGIMEN), \"Administration for\",\n unique(adpp0$PPINT)[length(unique(adpp0$PPINT))], \"hours, PK Population\"\n)\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\n\ncat(rtables::toString(result, indent_size = 10))\n\nSummary of Cumulative Amount and Percentage of Urine Recovered from\n Plasma Drug X following BID Administration for 0-24 hours, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n——————————————————————————————————————————————————————————\n Accumulation Interval (hours) \n 0-12 0-24 \nTreatment Arm Ae (mg) Fe (%) Ae (mg) Fe (%)\n——————————————————————————————————————————————————————————\nARM A \n n 134 134 134 134 \n Mean 1.55 15.7 1.55 15.7 \n SD 0.339 3.35 0.339 3.35 \n CV (%) 21.9 21.4 21.9 21.4 \n Median 1.55 15.8 1.55 15.8 \n Minimum 0.702 8.15 0.702 8.15 \n Maximum 2.46 24.5 2.46 24.5 \nARM C \n n 132 132 132 132 \n Mean 1.54 16.1 1.54 16.1 \n SD 0.298 3.11 0.298 3.11 \n CV (%) 19.4 19.3 19.4 19.3 \n Median 1.55 16.0 1.55 16.0 \n Minimum 0.850 8.50 0.850 8.50 \n Maximum 2.21 24.4 2.21 24.4 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:47:28 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT10_BL" + "Pharmacokinetic", + "PKPT08" ] }, { - "objectID": "tables/lab-results/lbt02.html", - "href": "tables/lab-results/lbt02.html", - "title": "LBT02", + "objectID": "tables/disclosures/eudrat02.html", + "href": "tables/disclosures/eudrat02.html", + "title": "EUDRAT02", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCode# Preparation of an illustrative dataset\nlibrary(scda)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_labels <- var_labels(adlb)\n\n# For illustration purposes, the example focuses on ALT\n# Measurements starting from baseline and excluding all screening visits\nadlb <- subset(adlb, AVISIT != \"SCREENING\" & PARAMCD == \"ALT\")\nadlb$AVISIT <- droplevels(adlb$AVISIT)\n\nvar_labels(adlb) <- adlb_labels\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n add_overall_col(\"All Patients\") %>%\n split_rows_by(\n var = \"AVISIT\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adlb$AVISIT)\n ) %>%\n analyze_vars(vars = \"AVAL\")\n\nresult <- build_table(l,\n df = adlb,\n alt_counts_df = adsl\n)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\nAnalysis Visit (N=134) (N=134) (N=132) (N=400) \n——————————————————————————————————————————————————————————————————————————\nBASELINE \n n 134 134 132 400 \n Mean (SD) 17.7 (9.9) 18.7 (9.8) 19.5 (9.1) 18.6 (9.6) \n Median 17.5 18.2 19.0 18.0 \n Min - Max 0.0 - 44.1 1.5 - 54.4 0.6 - 39.8 0.0 - 54.4 \nWEEK 1 DAY 8 \n n 134 134 132 400 \n Mean (SD) 16.8 (9.1) 18.9 (9.2) 19.6 (9.3) 18.4 (9.2) \n Median 16.0 18.2 19.0 18.0 \n Min - Max 0.1 - 36.3 0.7 - 39.9 0.9 - 44.7 0.1 - 44.7 \nWEEK 2 DAY 15 \n n 134 134 132 400 \n Mean (SD) 17.8 (9.6) 18.8 (9.7) 16.5 (8.2) 17.7 (9.2) \n Median 15.9 18.0 17.0 17.0 \n Min - Max 0.4 - 44.3 0.2 - 44.3 0.3 - 34.7 0.2 - 44.3 \nWEEK 3 DAY 22 \n n 134 134 132 400 \n Mean (SD) 18.4 (9.3) 17.6 (9.6) 16.8 (9.5) 17.6 (9.5) \n Median 18.1 17.7 15.1 17.2 \n Min - Max 0.6 - 41.7 0.0 - 38.6 0.5 - 39.2 0.0 - 41.7 \nWEEK 4 DAY 29 \n n 134 134 132 400 \n Mean (SD) 19.2 (11.0) 17.2 (10.6) 17.9 (9.3) 18.1 (10.3) \n Median 17.4 15.9 17.7 17.3 \n Min - Max 0.9 - 54.2 0.4 - 48.0 0.2 - 41.3 0.2 - 54.2 \nWEEK 5 DAY 36 \n n 134 134 132 400 \n Mean (SD) 19.2 (9.5) 18.0 (9.9) 18.5 (9.4) 18.6 (9.6) \n Median 19.8 18.3 19.3 19.0 \n Min - Max 0.0 - 43.4 0.1 - 40.6 0.0 - 37.5 0.0 - 43.4 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADLB <- df_explicit_na(ADLB)\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Laboratory Test Results by Visit\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n # note: order matters here. If `PARAM` is first, the split will be first by `PARAM`and then by `AVISIT`\n choices = variable_choices(ADLB, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"PARAM\", \"AVISIT\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADLB, c(\"AVAL\")),\n selected = c(\"AVAL\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = \"ALT\"\n )\n )\n ),\n filter = teal_slices(teal_slice(\"ADLB\", \"AVAL\", selected = NULL))\n)\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADLB-filter-ADLB_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:49:08 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] dplyr_1.1.4 teal.modules.clinical_0.9.0.9014\n [3] teal.transform_0.5.0.9004 teal_0.15.2.9019 \n [5] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 \n [7] teal.code_0.5.0.9004 shiny_1.8.0 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\nFor illustrative purposes, the adae data is filtered by arm A: Drug X here.\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadae <- df_explicit_na(adae)\n\nadae_serious <- adae %>% filter(AESER == \"Y\", SAFFL == \"Y\")\nadae_serious_arm <- adae_serious %>% filter(ARM == \"A: Drug X\")\n\nfilters_list <- list(\n related = with_label(c(AEREL = \"Y\"), \"Events (Related)\"),\n fatal = with_label(c(AESDTH = \"Y\"), \"Events (Fatal)\"),\n fatal_related = with_label(c(AEREL = \"Y\", AESDTH = \"Y\"), \"Events (Fatal & Related)\")\n)\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n summarize_patients_events_in_cols(\n filters_list = filters_list,\n empty_stats = c(\"all\", \"related\", \"fatal\", \"fatal_related\"),\n custom_label = \"Total number of patients with at least one serious adverse event\"\n ) %>%\n split_rows_by(\"AEBODSYS\",\n nested = FALSE,\n split_fun = split_fun,\n indent_mod = -1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae_serious_arm$AEBODSYS)\n ) %>%\n split_rows_by(\"AEDECOD\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae_serious_arm$AEDECOD)\n ) %>%\n summarize_patients_events_in_cols(\n filters_list = filters_list,\n col_split = FALSE\n )\n\nresult <- build_table(lyt, adae_serious_arm)\nresult\n\nBody System or Organ Class \n Dictionary-Derived Term Patients (All) Events (All) Events (Related) Events (Fatal) Events (Fatal & Related)\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one serious adverse event 104 \ncl A.1 \n dcd A.1.1.1.2 48 68 0 0 0 \ncl B.1 \n dcd B.1.1.1.1 47 56 56 56 56 \ncl B.2 \n dcd B.2.2.3.1 48 64 0 0 0 \ncl D.1 \n dcd D.1.1.1.1 50 61 61 61 61 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:47:17 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT02" + "Disclosures", + "EUDRAT02" ] }, { - "objectID": "tables/lab-results/lbt04.html", - "href": "tables/lab-results/lbt04.html", - "title": "LBT04", + "objectID": "tables/disposition/pdt01.html", + "href": "tables/disposition/pdt01.html", + "title": "PDT01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\nadlb_f <- adlb %>%\n filter(ONTRTFL == \"Y\", ANRIND != \"<Missing>\") %>%\n var_relabel(\n PARAM = \"Laboratory Test\",\n ANRIND = \"Direction of Abnormality\"\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = obj_label(adlb_f$PARAM)\n ) %>%\n count_abnormal(\n var = \"ANRIND\",\n abnormal = list(Low = c(\"LOW\", \"LOW LOW\"), High = c(\"HIGH\", \"HIGH HIGH\")),\n exclude_base_abn = TRUE\n ) %>%\n append_varlabels(adlb_f, \"ANRIND\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adlb_f, alt_counts_df = adsl)\n\nresult\n\nLaboratory Test A: Drug X B: Placebo C: Combination\n Direction of Abnormality (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Low 57/113 (50.4%) 62/117 (53%) 61/123 (49.6%)\n High 0/134 0/134 0/132 \nC-Reactive Protein Measurement \n Low 78/119 (65.5%) 71/113 (62.8%) 62/112 (55.4%)\n High 69/114 (60.5%) 57/112 (50.9%) 58/115 (50.4%)\nImmunoglobulin A Measurement \n Low 0/134 0/134 0/132 \n High 64/119 (53.8%) 62/116 (53.4%) 62/113 (54.9%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n col_relabel(PARAM = \"Laboratory Test\", ANRIND = \"Direction of Abnormality\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_abnormality(\n label = \"Abnormality Table\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"LBCAT\", \"PARAM\", \"AVISIT\")),\n selected = c(\"LBCAT\", \"PARAM\"),\n keep_order = TRUE\n ),\n grade = choices_selected(\n choices = variable_choices(ADLB, subset = \"ANRIND\"),\n selected = \"ANRIND\",\n fixed = TRUE\n ),\n abnormal = list(low = \"LOW\", high = \"HIGH\"),\n exclude_base_abn = TRUE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:48:36 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\naddv <- synthetic_cdisc_dataset(\"latest\", \"addv\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\naddv <- df_explicit_na(addv)\n\naddv <- addv %>%\n var_relabel(\n DVDECOD = \"Category\",\n DVTERM = \"Description\"\n )\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one major protocol deviation\",\n nonunique = \"Total number of major protocol deviations\"\n )\n ) %>%\n split_rows_by(\n \"DVDECOD\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(addv$DVDECOD)\n ) %>%\n count_occurrences(vars = \"DVTERM\") %>%\n append_varlabels(addv, \"DVTERM\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = addv, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(path = c(\"DVDECOD\", \"*\", \"DVTERM\"), scorefun = score_occurrences)\n\nresult\n\nCategory A: Drug X B: Placebo C: Combination\n Description (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one major protocol deviation 28 (20.9%) 22 (16.4%) 18 (13.6%) \nTotal number of major protocol deviations 49 35 35 \nEXCLUSION CRITERIA \n Active or untreated or other excluded cns metastases 2 (1.5%) 4 (3.0%) 1 (0.8%) \n Pregnancy criteria 3 (2.2%) 3 (2.2%) 1 (0.8%) \n History of other malignancies within the last 5 years 3 (2.2%) 1 (0.7%) 1 (0.8%) \n Uncontrolled concurrent condition 2 (1.5%) 0 3 (2.3%) \n Other exclusion criteria 1 (0.7%) 0 2 (1.5%) \n Received prior prohibited therapy or medication 2 (1.5%) 1 (0.7%) 0 \nINCLUSION CRITERIA \n No signed ICF at study entry 5 (3.7%) 0 6 (4.5%) \n Ineligible cancer type or current cancer stage 3 (2.2%) 2 (1.5%) 4 (3.0%) \n Inclusion lab values outside allowed limits 4 (3.0%) 1 (0.7%) 0 \n Does not meet prior therapy requirements 2 (1.5%) 1 (0.7%) 1 (0.8%) \n Inclusion-related test not done/out of window 1 (0.7%) 1 (0.7%) 0 \nMEDICATION \n Discontinued study drug for unspecified reason 3 (2.2%) 2 (1.5%) 1 (0.8%) \n Significant deviation from planned dose 3 (2.2%) 1 (0.7%) 2 (1.5%) \n Received incorrect study medication 0 3 (2.2%) 1 (0.8%) \n Received prohibited concomitant medication 1 (0.7%) 2 (1.5%) 1 (0.8%) \n Dose missed or significantly out of window 2 (1.5%) 0 1 (0.8%) \nPROCEDURAL \n Eligibility-related test not done/out of window 2 (1.5%) 4 (3.0%) 3 (2.3%) \n Omission of screening tumor assessment 4 (3.0%) 1 (0.7%) 3 (2.3%) \n Missed assessment affecting safety/study outcomes 2 (1.5%) 3 (2.2%) 1 (0.8%) \n Failure to sign updated ICF within two visits 2 (1.5%) 1 (0.7%) 1 (0.8%) \n Missed 2 or more efficacy assessments 1 (0.7%) 2 (1.5%) 0 \n Omission of complete lab panel required by protocol 0 0 1 (0.8%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADDV <- synthetic_cdisc_dataset(\"latest\", \"addv\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADDV <- df_explicit_na(ADDV)\n})\ndatanames <- c(\"ADSL\", \"ADDV\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADDV <- data[[\"ADDV\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Major Protocol Deviations Table\",\n dataname = \"ADDV\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADDV, c(\"DVTERM\")),\n selected = c(\"DVTERM\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADDV, c(\"DVDECOD\")),\n selected = \"DVDECOD\"\n ),\n add_total = TRUE,\n event_type = \"major protocol deviation\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:47:02 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT04" + "Disposition", + "PDT01" ] }, { - "objectID": "tables/lab-results/lbt07.html", - "href": "tables/lab-results/lbt07.html", - "title": "LBT07", + "objectID": "tables/disposition/pdt02.html", + "href": "tables/disposition/pdt02.html", + "title": "PDT02", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\nlibrary(forcats)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_labels <- var_labels(adlb)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\n# Select worst post-baseline records.\nadlb_f <- adlb %>%\n filter(ATOXGR != \"<Missing>\") %>%\n filter(ONTRTFL == \"Y\") %>%\n filter(WGRLOFL == \"Y\" | WGRHIFL == \"Y\")\n\nvar_labels(adlb_f) <- adlb_labels\n\n# Derive GRADE_DIR and GRADE_ANL to use in layout from ATOXGR\nadlb_f <- adlb_f %>%\n mutate(\n GRADE_DIR = factor(\n case_when(\n ATOXGR %in% c(\"-1\", \"-2\", \"-3\", \"-4\") & .data$WGRLOFL == \"Y\" ~ \"LOW\",\n ATOXGR == \"0\" ~ \"ZERO\",\n ATOXGR %in% c(\"1\", \"2\", \"3\", \"4\") & .data$WGRHIFL == \"Y\" ~ \"HIGH\",\n TRUE ~ \"NONE\"\n ),\n levels = c(\"LOW\", \"ZERO\", \"HIGH\", \"NONE\")\n ),\n GRADE_ANL = forcats::fct_relevel(\n forcats::fct_recode(ATOXGR,\n `1` = \"-1\", `2` = \"-2\", `3` = \"-3\", `4` = \"-4\"\n ),\n c(\"0\", \"1\", \"2\", \"3\", \"4\")\n )\n ) %>%\n var_relabel(\n GRADE_DIR = \"Direction of Abnormality\",\n GRADE_ANL = \"Analysis Grade\"\n )\n\n# Construct analysis map\nmap <- expand.grid(\n PARAM = levels(adlb$PARAM),\n GRADE_DIR = c(\"LOW\", \"HIGH\"),\n GRADE_ANL = as.character(1:4),\n stringsAsFactors = FALSE\n) %>%\n arrange(PARAM, desc(GRADE_DIR), GRADE_ANL)\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n label_pos = \"topleft\",\n split_label = obj_label(adlb_f$PARAM)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n required = \"ATOXGR\",\n .stats = \"unique_count\"\n ) %>%\n split_rows_by(\n \"GRADE_DIR\",\n label_pos = \"topleft\",\n split_label = obj_label(adlb_f$GRADE_DIR),\n split_fun = trim_levels_to_map(map)\n ) %>%\n count_abnormal_by_worst_grade(\n var = \"GRADE_ANL\",\n variables = list(id = \"USUBJID\", param = \"PARAM\", grade_dir = \"GRADE_DIR\"),\n .indent_mods = 4L\n ) %>%\n append_topleft(\" Highest NCI CTCAE Grade\")\n\nresult <- build_table(lyt = lyt, df = adlb_f, alt_counts_df = adsl)\nresult <- result %>% prune_table()\n\nresult\n\nParameter \n Direction of Abnormality A: Drug X B: Placebo C: Combination\n Highest NCI CTCAE Grade (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement (n) 134 134 132 \n LOW \n 1 15 (11.2%) 11 (8.2%) 15 (11.4%) \n 2 18 (13.4%) 24 (17.9%) 17 (12.9%) \n 3 16 (11.9%) 24 (17.9%) 16 (12.1%) \n 4 17 (12.7%) 10 (7.5%) 18 (13.6%) \n Any 66 (49.3%) 69 (51.5%) 66 (50%) \nC-Reactive Protein Measurement (n) 134 134 132 \n LOW \n 1 21 (15.7%) 22 (16.4%) 12 (9.1%) \n 2 24 (17.9%) 22 (16.4%) 18 (13.6%) \n 3 29 (21.6%) 21 (15.7%) 25 (18.9%) \n 4 10 (7.5%) 16 (11.9%) 22 (16.7%) \n Any 84 (62.7%) 81 (60.4%) 77 (58.3%) \n HIGH \n 1 20 (14.9%) 22 (16.4%) 22 (16.7%) \n 2 21 (15.7%) 15 (11.2%) 14 (10.6%) \n 3 25 (18.7%) 16 (11.9%) 20 (15.2%) \n 4 13 (9.7%) 20 (14.9%) 11 (8.3%) \n Any 79 (59%) 73 (54.5%) 67 (50.8%) \nImmunoglobulin A Measurement (n) 134 134 132 \n HIGH \n 1 19 (14.2%) 12 (9%) 18 (13.6%) \n 2 17 (12.7%) 24 (17.9%) 19 (14.4%) \n 3 21 (15.7%) 23 (17.2%) 23 (17.4%) \n 4 13 (9.7%) 13 (9.7%) 9 (6.8%) \n Any 70 (52.2%) 72 (53.7%) 69 (52.3%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n filter(!AVISIT %in% c(\"SCREENING\", \"BASELINE\"))\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_abnormality_by_worst_grade(\n label = \"Laboratory Test Results with Highest Grade Post-Baseline\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = c(\"ALT\", \"CRP\", \"IGA\")\n ),\n add_total = FALSE\n )\n ),\n filter = (\n teal_slices(\n teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"),\n teal_slice(\"ADLB\", \"ONTRTFL\", selected = \"Y\")\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:48:15 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 forcats_1.0.0 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\naddv <- synthetic_cdisc_dataset(\"latest\", \"addv\")\n\nadsl <- df_explicit_na(adsl)\naddv <- df_explicit_na(addv)\n\naddv_pan <- addv %>%\n filter(AEPRELFL == \"Y\" & DVCAT == \"MAJOR\") %>%\n var_relabel(\n DVREAS = \"Primary Reason\",\n DVTERM = \"Description\"\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one major protocol deviation related to epidemic/pandemic\",\n nonunique = \"Total number of major protocol deviations related to epidemic/pandemic\"\n )\n ) %>%\n split_rows_by(\n \"DVREAS\",\n split_fun = drop_split_levels,\n nested = FALSE,\n label_pos = \"topleft\",\n split_label = obj_label(addv_pan$DVREAS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = \"Site action due to epidemic/pandemic\"\n ) %>%\n count_occurrences(vars = \"DVTERM\") %>%\n append_varlabels(addv_pan, \"DVTERM\", indent = 1L)\n\nresult <- build_table(lyt, addv_pan, alt_counts_df = adsl)\nresult\n\nPrimary Reason A: Drug X B: Placebo C: Combination\n Description (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one major protocol deviation related to epidemic/pandemic 8 (6.0%) 4 (3.0%) 4 (3.0%) \nTotal number of major protocol deviations related to epidemic/pandemic 8 5 4 \nSite action due to epidemic/pandemic 8 (6.0%) 4 (3.0%) 4 (3.0%) \n Dose missed or significantly out of window 2 (1.5%) 0 1 (0.8%) \n Failure to sign updated ICF within two visits 2 (1.5%) 1 (0.7%) 1 (0.8%) \n Missed 2 or more efficacy assessments 1 (0.7%) 2 (1.5%) 0 \n Significant deviation from planned dose 3 (2.2%) 1 (0.7%) 2 (1.5%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:46:33 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9018 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT07" + "Disposition", + "PDT02" ] }, { - "objectID": "tables/medical-history/mht01.html", - "href": "tables/medical-history/mht01.html", - "title": "MHT01", + "objectID": "tables/adverse-events/aet01.html", + "href": "tables/adverse-events/aet01.html", + "title": "AET01", "section": "", - "text": "Data Setup\nStandard Table\nTable of History Prior to Study\nTable with Total Number of Conditions Suppressed\nTable with Total Number of Conditions Per Body System After The Summary of Patients\nTable Showing Additional “All Patients” Column\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadmh <- synthetic_cdisc_dataset(\"latest\", \"admh\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadmh <- df_explicit_na(admh)\n\nadsl_f <- adsl %>%\n filter(SAFFL == \"Y\") %>%\n select(USUBJID, ACTARM)\n\nadmh_f <- admh %>%\n filter(SAFFL == \"Y\" & MHBODSYS != \"\" & MHDECOD != \"\") %>%\n var_relabel(\n MHBODSYS = \"MedDRA System Organ Class\",\n MHDECOD = \"MedDRA Preferred Term\"\n )\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\"Total number of patients with at least one condition\", \"Total number of conditions\")\n ) %>%\n split_rows_by(\n var = \"MHBODSYS\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(admh_f$MHBODSYS)\n ) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\"Total number of patients with at least one condition\", \"Total number of conditions\"),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(vars = \"MHDECOD\") %>%\n append_varlabels(admh_f, \"MHDECOD\", indent = 1L)\n\nresult <- build_table(lyt, admh_f, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one condition 122 (91.0%) 123 (91.8%) 120 (90.9%) \nTotal number of conditions 609 622 703 \ncl A \n Total number of patients with at least one condition 78 (58.2%) 75 (56.0%) 89 (67.4%) \n Total number of conditions 132 130 160 \n trm A_1/2 50 (37.3%) 45 (33.6%) 63 (47.7%) \n trm A_2/2 48 (35.8%) 48 (35.8%) 50 (37.9%) \ncl B \n Total number of patients with at least one condition 96 (71.6%) 89 (66.4%) 97 (73.5%) \n Total number of conditions 185 198 205 \n trm B_1/3 47 (35.1%) 49 (36.6%) 43 (32.6%) \n trm B_2/3 49 (36.6%) 44 (32.8%) 52 (39.4%) \n trm B_3/3 48 (35.8%) 54 (40.3%) 51 (38.6%) \ncl C \n Total number of patients with at least one condition 67 (50.0%) 75 (56.0%) 79 (59.8%) \n Total number of conditions 103 116 129 \n trm C_1/2 43 (32.1%) 46 (34.3%) 43 (32.6%) \n trm C_2/2 35 (26.1%) 48 (35.8%) 55 (41.7%) \ncl D \n Total number of patients with at least one condition 96 (71.6%) 90 (67.2%) 98 (74.2%) \n Total number of conditions 189 178 209 \n trm D_1/3 50 (37.3%) 42 (31.3%) 51 (38.6%) \n trm D_2/3 48 (35.8%) 42 (31.3%) 50 (37.9%) \n trm D_3/3 47 (35.1%) 58 (43.3%) 57 (43.2%) \n\n\n\n\n\nCodeadmh_f_prior <- admh_f %>%\n filter(ASTDY <= 0)\n\nresult <- build_table(lyt, admh_f_prior, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one condition 0 0 1 (0.8%) \nTotal number of conditions 0 0 1 \ncl D \n Total number of patients with at least one condition 0 0 1 (0.8%) \n Total number of conditions 0 0 1 \n trm D_2/3 0 0 1 (0.8%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\"Total number of patients with at least one condition\")\n ) %>%\n split_rows_by(\n var = \"MHBODSYS\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(admh_f$MHBODSYS)\n ) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\"Total number of patients with at least one condition\"),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(vars = \"MHDECOD\") %>%\n append_varlabels(admh_f, \"MHDECOD\", indent = 1L)\n\nresult <- build_table(lyt, admh_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one condition 122 (91.0%) 123 (91.8%) 120 (90.9%) \ncl A \n Total number of patients with at least one condition 78 (58.2%) 75 (56.0%) 89 (67.4%) \n trm A_1/2 50 (37.3%) 45 (33.6%) 63 (47.7%) \n trm A_2/2 48 (35.8%) 48 (35.8%) 50 (37.9%) \ncl B \n Total number of patients with at least one condition 96 (71.6%) 89 (66.4%) 97 (73.5%) \n trm B_1/3 47 (35.1%) 49 (36.6%) 43 (32.6%) \n trm B_2/3 49 (36.6%) 44 (32.8%) 52 (39.4%) \n trm B_3/3 48 (35.8%) 54 (40.3%) 51 (38.6%) \ncl C \n Total number of patients with at least one condition 67 (50.0%) 75 (56.0%) 79 (59.8%) \n trm C_1/2 43 (32.1%) 46 (34.3%) 43 (32.6%) \n trm C_2/2 35 (26.1%) 48 (35.8%) 55 (41.7%) \ncl D \n Total number of patients with at least one condition 96 (71.6%) 90 (67.2%) 98 (74.2%) \n trm D_1/3 50 (37.3%) 42 (31.3%) 51 (38.6%) \n trm D_2/3 48 (35.8%) 42 (31.3%) 50 (37.9%) \n trm D_3/3 47 (35.1%) 58 (43.3%) 57 (43.2%) \n\n\n\n\nNot currently supported by rtables. Users, please notify us if this variation is important to you.\n\n\nConditions are further sorted by decreasing high level terms and low level terms.\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n add_overall_col(\"All Patients\") %>%\n analyze_num_patients(\n \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(unique = \"Total number of patients with at least one event\", nonunique = \"Total number of conditions\")\n ) %>%\n split_rows_by(\n var = \"MHBODSYS\",\n split_fun = split_fun,\n child_labels = \"visible\",\n label_pos = \"topleft\",\n split_label = obj_label(admh_f$MHBODSYS)\n ) %>%\n summarize_num_patients(\n \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(unique = \"Total number of patients with at least one event\", nonunique = \"Total number of conditions\")\n ) %>%\n count_occurrences(vars = \"MHDECOD\", .indent_mods = -1L) %>%\n append_varlabels(admh_f, \"MHDECOD\", indent = 1L)\n\nscorefun_hlt <- cont_n_allcols\nscorefun_llt <- score_occurrences_cols(col_indices = nlevels(adsl_f$ACTARM) + 1)\n\nresult <- build_table(lyt, admh_f, alt_counts_df = adsl_f) %>%\n prune_table() %>%\n sort_at_path(path = c(\"MHBODSYS\"), scorefun = scorefun_hlt) %>%\n sort_at_path(path = c(\"MHBODSYS\", \"*\", \"MHDECOD\"), scorefun = scorefun_llt)\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination All Patients\n MedDRA Preferred Term (N=134) (N=134) (N=132) (N=400) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one event 122 (91.0%) 123 (91.8%) 120 (90.9%) 365 (91.2%) \nTotal number of conditions 609 622 703 1934 \ncl D \n Total number of patients with at least one event 96 (71.6%) 90 (67.2%) 98 (74.2%) 284 (71.0%) \n Total number of conditions 189 178 209 576 \n trm D_3/3 47 (35.1%) 58 (43.3%) 57 (43.2%) 162 (40.5%) \n trm D_1/3 50 (37.3%) 42 (31.3%) 51 (38.6%) 143 (35.8%) \n trm D_2/3 48 (35.8%) 42 (31.3%) 50 (37.9%) 140 (35.0%) \ncl B \n Total number of patients with at least one event 96 (71.6%) 89 (66.4%) 97 (73.5%) 282 (70.5%) \n Total number of conditions 185 198 205 588 \n trm B_3/3 48 (35.8%) 54 (40.3%) 51 (38.6%) 153 (38.2%) \n trm B_2/3 49 (36.6%) 44 (32.8%) 52 (39.4%) 145 (36.2%) \n trm B_1/3 47 (35.1%) 49 (36.6%) 43 (32.6%) 139 (34.8%) \ncl A \n Total number of patients with at least one event 78 (58.2%) 75 (56.0%) 89 (67.4%) 242 (60.5%) \n Total number of conditions 132 130 160 422 \n trm A_1/2 50 (37.3%) 45 (33.6%) 63 (47.7%) 158 (39.5%) \n trm A_2/2 48 (35.8%) 48 (35.8%) 50 (37.9%) 146 (36.5%) \ncl C \n Total number of patients with at least one event 67 (50.0%) 75 (56.0%) 79 (59.8%) 221 (55.2%) \n Total number of conditions 103 116 129 348 \n trm C_2/2 35 (26.1%) 48 (35.8%) 55 (41.7%) 138 (34.5%) \n trm C_1/2 43 (32.1%) 46 (34.3%) 43 (32.6%) 132 (33.0%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>%\n filter(SAFFL == \"Y\")\n ADMH <- synthetic_cdisc_dataset(\"latest\", \"admh\") %>%\n filter(SAFFL == \"Y\" & MHBODSYS != \"\" & MHDECOD != \"\")\n})\ndatanames <- c(\"ADSL\", \"ADMH\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADMH <- data[[\"ADMH\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Medical History Table\",\n dataname = \"ADMH\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADMH, c(\"MHTERM\", \"MHDECOD\")),\n selected = c(\"MHDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADMH, c(\"MHBODSYS\", \"MHSOC\")),\n selected = \"MHBODSYS\"\n ),\n add_total = TRUE,\n event_type = \"condition\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:47:33 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable with Medical Concepts Section\nTable with Modified Rows\nTable with Rows Counting Events & Additional Sections\nteal App\nReproducibility\n\n\n\nTo illustrate, additional variables such as flags (TRUE/FALSE) for select AEs of interest and select AE baskets are added to the adae dataset.\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(\n adae,\n omit_columns = c(\"SMQ01NAM\", \"SMQ01SC\", \"SMQ02NAM\", \"SMQ02SC\", \"CQ01NAM\", \"STUDYID\", \"USUBJID\")\n)\n\nset.seed(99)\n\nadae <- adae %>%\n mutate(\n AEDECOD = with_label(as.character(AEDECOD), \"Dictionary-Derived Term\"),\n AESDTH = with_label(\n sample(c(\"N\", \"Y\"), size = nrow(adae), replace = TRUE, prob = c(0.99, 0.01)),\n \"Results in Death\"\n ),\n AEACN = with_label(\n sample(\n c(\"DOSE NOT CHANGED\", \"DOSE INCREASED\", \"DRUG INTERRUPTED\", \"DRUG WITHDRAWN\"),\n size = nrow(adae),\n replace = TRUE, prob = c(0.68, 0.02, 0.25, 0.05)\n ),\n \"Action Taken with Study Treatment\"\n ),\n FATAL = with_label(AESDTH == \"Y\", \"AE with fatal outcome\"),\n SEV = with_label(AESEV == \"SEVERE\", \"Severe AE (at greatest intensity)\"),\n SER = with_label(AESER == \"Y\", \"Serious AE\"),\n SERWD = with_label(AESER == \"Y\" & AEACN == \"DRUG WITHDRAWN\", \"Serious AE leading to withdrawal from treatment\"),\n SERDSM = with_label(\n AESER == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Serious AE leading to dose modification/interruption\"\n ),\n RELSER = with_label(AESER == \"Y\" & AEREL == \"Y\", \"Related Serious AE\"),\n WD = with_label(AEACN == \"DRUG WITHDRAWN\", \"AE leading to withdrawal from treatment\"),\n DSM = with_label(\n AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"), \"AE leading to dose modification/interruption\"\n ),\n REL = with_label(AEREL == \"Y\", \"Related AE\"),\n RELWD = with_label(AEREL == \"Y\" & AEACN == \"DRUG WITHDRAWN\", \"Related AE leading to withdrawal from treatment\"),\n RELDSM = with_label(\n AEREL == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Related AE leading to dose modification/interruption\"\n ),\n CTC35 = with_label(AETOXGR %in% c(\"3\", \"4\", \"5\"), \"Grade 3-5 AE\"),\n CTC45 = with_label(AETOXGR %in% c(\"4\", \"5\"), \"Grade 4/5 AE\"),\n SMQ01 = with_label(SMQ01NAM != \"\", aesi_label(adae$SMQ01NAM, adae$SMQ01SC)),\n SMQ02 = with_label(SMQ02NAM != \"\", aesi_label(adae$SMQ02NAM, adae$SMQ02SC)),\n CQ01 = with_label(CQ01NAM != \"\", aesi_label(adae$CQ01NAM)),\n USUBJID_AESEQ = paste(USUBJID, AESEQ, sep = \"@@\") # Create unique ID per AE in dataset.\n ) %>%\n filter(ANL01FL == \"Y\")\n\n\n\n\n\n\nCodeaesi_vars <- c(\"FATAL\", \"SER\", \"SERWD\", \"SERDSM\", \"RELSER\", \"WD\", \"DSM\", \"REL\", \"RELWD\", \"RELDSM\", \"SEV\")\n\n# Layout for variables from adsl dataset.\nlyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DTHFL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of deaths\")\n ) %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DCSREAS\" = \"ADVERSE EVENT\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients withdrawn from study due to an AE\"),\n table_names = \"tot_wd\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl, alt_counts_df = adsl)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one AE\",\n nonunique = \"Total number of AEs\"\n ),\n .formats = list(unique = format_count_fraction_fixed_dp, nonunique = \"xx\"),\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_vars,\n denom = \"N_col\",\n var_labels = \"Total number of patients with at least one\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adae[1:2, ],\n result_adsl,\n result_adae[3:nrow(result_adae), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) \nTotal number of patients withdrawn from study due to an AE 3 (2.2%) 6 (4.5%) 5 (3.8%) \nTotal number of patients with at least one \n AE with fatal outcome 5 (3.7%) 5 (3.7%) 6 (4.5%) \n Serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n Serious AE leading to withdrawal from treatment 6 (4.5%) 12 (9.0%) 9 (6.8%) \n Serious AE leading to dose modification/interruption 36 (26.9%) 40 (29.9%) 47 (35.6%) \n Related Serious AE 64 (47.8%) 52 (38.8%) 64 (48.5%) \n AE leading to withdrawal from treatment 20 (14.9%) 24 (17.9%) 26 (19.7%) \n AE leading to dose modification/interruption 63 (47.0%) 70 (52.2%) 77 (58.3%) \n Related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n Related AE leading to withdrawal from treatment 10 (7.5%) 9 (6.7%) 12 (9.1%) \n Related AE leading to dose modification/interruption 44 (32.8%) 44 (32.8%) 51 (38.6%) \n Severe AE (at greatest intensity) 77 (57.5%) 70 (52.2%) 79 (59.8%) \n\n\n\n\n\nCodeaesi_vars <- c(\"FATAL\", \"SER\", \"SERWD\", \"SERDSM\", \"RELSER\", \"WD\", \"DSM\", \"REL\", \"RELWD\", \"RELDSM\", \"CTC35\")\nbasket_vars <- c(\"SMQ01\", \"SMQ02\", \"CQ01\")\n\n# Layout for variables from adsl dataset.\nlyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DTHFL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of deaths\")\n ) %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DCSREAS\" = \"ADVERSE EVENT\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients withdrawn from study due to an AE\"),\n table_names = \"tot_wd\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl, alt_counts_df = adsl)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one AE\",\n nonunique = \"Total number of AEs\"\n ),\n .formats = list(unique = format_count_fraction_fixed_dp, nonunique = \"xx\"),\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_vars,\n denom = \"N_col\",\n var_labels = \"Total number of patients with at least one\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = basket_vars,\n table_names = \"table_aesi\",\n denom = \"N_col\",\n var_labels = \"Total number of patients with at least one\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adae[1:2, ],\n result_adsl,\n result_adae[3:nrow(result_adae), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) \nTotal number of patients withdrawn from study due to an AE 3 (2.2%) 6 (4.5%) 5 (3.8%) \nTotal number of patients with at least one \n AE with fatal outcome 5 (3.7%) 5 (3.7%) 6 (4.5%) \n Serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n Serious AE leading to withdrawal from treatment 6 (4.5%) 12 (9.0%) 9 (6.8%) \n Serious AE leading to dose modification/interruption 36 (26.9%) 40 (29.9%) 47 (35.6%) \n Related Serious AE 64 (47.8%) 52 (38.8%) 64 (48.5%) \n AE leading to withdrawal from treatment 20 (14.9%) 24 (17.9%) 26 (19.7%) \n AE leading to dose modification/interruption 63 (47.0%) 70 (52.2%) 77 (58.3%) \n Related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n Related AE leading to withdrawal from treatment 10 (7.5%) 9 (6.7%) 12 (9.1%) \n Related AE leading to dose modification/interruption 44 (32.8%) 44 (32.8%) 51 (38.6%) \n Grade 3-5 AE 90 (67.2%) 83 (61.9%) 93 (70.5%) \nTotal number of patients with at least one \n C.1.1.1.3/B.2.2.3.1 AESI (BROAD) 58 (43.3%) 60 (44.8%) 66 (50.0%) \n SMQ 02 Reference Name 0 0 0 \n D.2.1.5.3/A.1.1.1.1 AESI 62 (46.3%) 61 (45.5%) 76 (57.6%) \n\n\n\n\n\nCodeaesi_vars <- c(\"FATAL\", \"SER\", \"WD\", \"REL\", \"CTC35\", \"CTC45\")\n# Layout for variables from adsl dataset.\nlyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DTHFL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of deaths\")\n ) %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DCSREAS\" = \"ADVERSE EVENT\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients withdrawn from study due to an AE\"),\n table_names = \"tot_wd\"\n ) %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DCSREAS\" = \"WITHDRAWAL BY SUBJECT\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients withdrawn informed consent\"),\n table_names = \"tot_dscsreas_wd\"\n )\nresult_adsl <- build_table(lyt_adsl, df = adsl, alt_counts_df = adsl)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one AE\",\n nonunique = \"Total number of AEs\"\n ),\n .formats = list(unique = format_count_fraction_fixed_dp, nonunique = \"xx\"),\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_vars,\n denom = \"N_col\",\n var_labels = \"Total number of patients with at least one\",\n show_labels = \"visible\"\n )\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adae[1:2, ],\n result_adsl,\n result_adae[3:nrow(result_adae), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) \nTotal number of patients withdrawn from study due to an AE 3 (2.2%) 6 (4.5%) 5 (3.8%) \nTotal number of patients withdrawn informed consent 1 (0.7%) 1 (0.7%) 1 (0.8%) \nTotal number of patients with at least one \n AE with fatal outcome 5 (3.7%) 5 (3.7%) 6 (4.5%) \n Serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n AE leading to withdrawal from treatment 20 (14.9%) 24 (17.9%) 26 (19.7%) \n Related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n Grade 3-5 AE 90 (67.2%) 83 (61.9%) 93 (70.5%) \n Grade 4/5 AE 77 (57.5%) 70 (52.2%) 79 (59.8%) \n\n\n\n\n\nCodecount_subj_vars <- c(\"FATAL\", \"SER\", \"WD\", \"DSM\", \"REL\", \"CTC35\")\ncount_term_vars <- c(\"SER\", \"DSM\", \"REL\", \"CTC35\", \"CTC45\")\ncount_ae_vars <- c(\"SER\", \"DSM\", \"REL\", \"CTC35\", \"CTC45\")\n\n# Layout for variables from adsl dataset.\nlyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DTHFL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of deaths\")\n ) %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DCSREAS\" = \"ADVERSE EVENT\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients withdrawn from study due to an AE\"),\n table_names = \"tot_wd\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl, alt_counts_df = adsl)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one AE\",\n nonunique = \"Total number of AEs\"\n ),\n .formats = list(unique = format_count_fraction_fixed_dp, nonunique = \"xx\"),\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = count_subj_vars,\n denom = \"N_col\",\n var_labels = \"Total number of patients with at least one\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"AEDECOD\",\n flag_variables = count_term_vars,\n .stats = \"count\",\n .formats = c(count = \"xx\"),\n table_names = \"table_term\",\n var_labels = \"Total number of unique preferred terms which are\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID_AESEQ\",\n flag_variables = count_ae_vars,\n .stats = \"count\",\n .formats = c(count = \"xx\"),\n table_names = \"table_ae\",\n var_labels = \"Total number of adverse events which are\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adae[1:2, ],\n result_adsl,\n result_adae[3:nrow(result_adae), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) \nTotal number of patients withdrawn from study due to an AE 3 (2.2%) 6 (4.5%) 5 (3.8%) \nTotal number of patients with at least one \n AE with fatal outcome 5 (3.7%) 5 (3.7%) 6 (4.5%) \n Serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n AE leading to withdrawal from treatment 20 (14.9%) 24 (17.9%) 26 (19.7%) \n AE leading to dose modification/interruption 63 (47.0%) 70 (52.2%) 77 (58.3%) \n Related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n Grade 3-5 AE 90 (67.2%) 83 (61.9%) 93 (70.5%) \nTotal number of unique preferred terms which are \n Serious AE 4 4 4 \n AE leading to dose modification/interruption 10 10 10 \n Related AE 5 5 5 \n Grade 3-5 AE 5 5 5 \n Grade 4/5 AE 3 3 3 \nTotal number of adverse events which are \n Serious AE 204 194 245 \n AE leading to dose modification/interruption 123 135 158 \n Related AE 231 231 290 \n Grade 3-5 AE 249 229 277 \n Grade 4/5 AE 143 134 168 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n add_event_flags <- function(dat) {\n dat %>%\n mutate(\n TMPFL_SER = AESER == \"Y\",\n TMPFL_REL = AEREL == \"Y\",\n TMPFL_GR5 = AETOXGR == \"5\",\n TMP_SMQ01 = !is.na(SMQ01NAM),\n TMP_SMQ02 = !is.na(SMQ02NAM),\n TMP_CQ01 = !is.na(CQ01NAM)\n ) %>%\n col_relabel(\n TMPFL_SER = \"Serious AE\",\n TMPFL_REL = \"Related AE\",\n TMPFL_GR5 = \"Grade 5 AE\",\n TMP_SMQ01 = aesi_label(dat[[\"SMQ01NAM\"]], dat[[\"SMQ01SC\"]]),\n TMP_SMQ02 = aesi_label(dat[[\"SMQ02NAM\"]], dat[[\"SMQ02SC\"]]),\n TMP_CQ01 = aesi_label(dat[[\"CQ01NAM\"]])\n )\n }\n\n # Generating user-defined event flags.\n ADAE <- ADAE %>% add_event_flags()\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAE <- data[[\"ADAE\"]]\nae_anl_vars <- names(ADAE)[startsWith(names(ADAE), \"TMPFL_\")]\naesi_vars <- names(ADAE)[startsWith(names(ADAE), \"TMP_\")]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_summary(\n label = \"Adverse Events Summary\",\n dataname = \"ADAE\",\n arm_var = choices_selected(\n choices = variable_choices(\"ADSL\", c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n flag_var_anl = choices_selected(\n choices = variable_choices(\"ADAE\", ae_anl_vars),\n selected = ae_anl_vars[1],\n keep_order = TRUE,\n fixed = FALSE\n ),\n flag_var_aesi = choices_selected(\n choices = variable_choices(\"ADAE\", aesi_vars),\n selected = aesi_vars[1],\n keep_order = TRUE,\n fixed = FALSE\n ),\n add_total = TRUE\n )\n )\n)\n\nWarning in rlang::hash(list(data = data, modules = modules)):\n'package:teal.modules.clinical' may not be available when loading\n\nCodeshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:45:55 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Medical History", - "MHT01" + "Adverse Events", + "AET01" ] }, { - "objectID": "tables/vital-signs/vst02.html", - "href": "tables/vital-signs/vst02.html", - "title": "VST02", + "objectID": "tables/adverse-events/aet09.html", + "href": "tables/adverse-events/aet09.html", + "title": "AET09", "section": "", - "text": "Data Setup\nVST02_1 – Table of Abnormalities Regardless of Abnormality at Baseline\nVST02_2 – Table of Abnormalities Among Subjects Without Abnormality at Baseline\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadvs <- synthetic_cdisc_dataset(\"latest\", \"advs\")\n\n# Ensure character variables are converted to factors and empty strings\n# and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadvs <- df_explicit_na(advs)\n\n# Note: We keep only post-baseline for analysis.\nadvs_f <- advs %>%\n filter(ONTRTFL == \"Y\", ANRIND != \"<Missing>\") %>%\n var_relabel(\n PARAM = \"Assessment\",\n ANRIND = \"Abnormality\"\n )\n\nsplit_fun <- drop_split_levels\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n add_overall_col(\"All Patients\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(advs_f$PARAM)) %>%\n count_abnormal(\n \"ANRIND\",\n abnormal = list(Low = c(\"LOW\", \"LOW LOW\"), High = c(\"HIGH\", \"HIGH HIGH\")),\n exclude_base_abn = FALSE\n ) %>%\n append_varlabels(advs_f, \"ANRIND\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = advs_f, alt_counts_df = adsl)\n\nresult\n\nAssessment A: Drug X B: Placebo C: Combination All Patients \n Abnormality (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————————\nDiastolic Blood Pressure \n Low 66/134 (49.3%) 86/134 (64.2%) 78/132 (59.1%) 230/400 (57.5%)\n High 88/134 (65.7%) 70/134 (52.2%) 76/132 (57.6%) 234/400 (58.5%)\nPulse Rate \n Low 58/134 (43.3%) 32/134 (23.9%) 48/132 (36.4%) 138/400 (34.5%)\n High 53/134 (39.6%) 49/134 (36.6%) 44/132 (33.3%) 146/400 (36.5%)\nRespiratory Rate \n Low 97/134 (72.4%) 84/134 (62.7%) 98/132 (74.2%) 279/400 (69.8%)\n High 96/134 (71.6%) 98/134 (73.1%) 98/132 (74.2%) 292/400 (73%) \nSystolic Blood Pressure \n Low 71/134 (53%) 77/134 (57.5%) 73/132 (55.3%) 221/400 (55.2%)\n High 78/134 (58.2%) 74/134 (55.2%) 73/132 (55.3%) 225/400 (56.2%)\nTemperature \n Low 108/134 (80.6%) 110/134 (82.1%) 108/132 (81.8%) 326/400 (81.5%)\n High 112/134 (83.6%) 106/134 (79.1%) 107/132 (81.1%) 325/400 (81.2%)\nWeight \n Low 43/134 (32.1%) 39/134 (29.1%) 39/132 (29.5%) 121/400 (30.2%)\n High 46/134 (34.3%) 43/134 (32.1%) 44/132 (33.3%) 133/400 (33.2%)\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n add_overall_col(\"All Patients\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(advs_f$PARAM)) %>%\n count_abnormal(\n \"ANRIND\",\n abnormal = list(Low = c(\"LOW\", \"LOW LOW\"), High = c(\"HIGH\", \"HIGH HIGH\")),\n exclude_base_abn = TRUE\n ) %>%\n append_varlabels(advs_f, \"ANRIND\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = advs_f, alt_counts_df = adsl)\n\nresult\n\nAssessment A: Drug X B: Placebo C: Combination All Patients \n Abnormality (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————————————————————————————————\nDiastolic Blood Pressure \n Low 54/108 (50%) 76/116 (65.5%) 68/114 (59.6%) 198/338 (58.6%)\n High 74/114 (64.9%) 56/109 (51.4%) 62/106 (58.5%) 192/329 (58.4%)\nPulse Rate \n Low 53/121 (43.8%) 30/125 (24%) 42/119 (35.3%) 125/365 (34.2%)\n High 48/123 (39%) 45/116 (38.8%) 39/120 (32.5%) 132/359 (36.8%)\nRespiratory Rate \n Low 72/100 (72%) 72/110 (65.5%) 79/102 (77.5%) 223/312 (71.5%)\n High 77/107 (72%) 78/108 (72.2%) 79/109 (72.5%) 234/324 (72.2%)\nSystolic Blood Pressure \n Low 62/117 (53%) 63/114 (55.3%) 57/103 (55.3%) 182/334 (54.5%)\n High 64/110 (58.2%) 67/120 (55.8%) 68/115 (59.1%) 199/345 (57.7%)\nTemperature \n Low 77/96 (80.2%) 78/94 (83%) 74/90 (82.2%) 229/280 (81.8%)\n High 78/93 (83.9%) 73/92 (79.3%) 81/100 (81%) 232/285 (81.4%)\nWeight \n Low 42/129 (32.6%) 37/125 (29.6%) 37/123 (30.1%) 116/377 (30.8%)\n High 41/126 (32.5%) 41/124 (33.1%) 42/121 (34.7%) 124/371 (33.4%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADVS <- synthetic_cdisc_dataset(\"latest\", \"advs\") %>%\n mutate(ONTRTFL = ifelse(AVISIT %in% c(\"SCREENING\", \"BASELINE\"), \"\", \"Y\")) %>%\n col_relabel(ONTRTFL = \"On Treatment Record Flag\")\n})\ndatanames <- c(\"ADSL\", \"ADVS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADVS <- data[[\"ADVS\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_abnormality(\n label = \"Abnormality Table\",\n dataname = \"ADVS\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADVS, subset = c(\"VSCAT\", \"PARAM\", \"AVISIT\")),\n selected = c(\"PARAM\"),\n keep_order = TRUE\n ),\n grade = choices_selected(\n choices = variable_choices(ADVS, subset = \"ANRIND\"),\n selected = \"ANRIND\",\n fixed = TRUE\n ),\n abnormal = list(Low = c(\"LOW\", \"LOW LOW\"), High = c(\"HIGH\", \"HIGH HIGH\")),\n exclude_base_abn = FALSE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:46:47 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Including High-Level Terms\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nadae_labels <- var_labels(adae)\n\nadae_f <- adae %>%\n filter(AEREL == \"Y\")\n\nvar_labels(adae_f) <- adae_labels\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event related to study drug\",\n nonunique = \"Overall total number of events related to study drug\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae_f$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event related to study drug\",\n nonunique = \"Total number of events related to study drug\"\n )\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = -1L\n ) %>%\n append_varlabels(adae_f, \"AEDECOD\", indent = 1L)\n\ntbl1 <- build_table(\n lyt = lyt,\n df = adae_f,\n alt_counts_df = adsl\n) %>%\n prune_table()\n\nresult <- tbl1 %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nBody System or Organ Class A: Drug X B: Placebo C: Combination All Patients\n Dictionary-Derived Term (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event related to study drug 105 (78.4%) 108 (80.6%) 109 (82.6%) 322 (80.5%) \nOverall total number of events related to study drug 282 299 336 917 \ncl D.2 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 58 (43.3%) 57 (43.2%) 162 (40.5%) \n Total number of events related to study drug 62 72 74 208 \n dcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%) 162 (40.5%) \ncl D.1 \n Total number of patients with at least one adverse event related to study drug 50 (37.3%) 42 (31.3%) 51 (38.6%) 143 (35.8%) \n Total number of events related to study drug 61 51 71 183 \n dcd D.1.1.1.1 50 (37.3%) 42 (31.3%) 51 (38.6%) 143 (35.8%) \ncl B.1 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 49 (36.6%) 43 (32.6%) 139 (34.8%) \n Total number of events related to study drug 56 60 62 178 \n dcd B.1.1.1.1 47 (35.1%) 49 (36.6%) 43 (32.6%) 139 (34.8%) \ncl C.2 \n Total number of patients with at least one adverse event related to study drug 35 (26.1%) 48 (35.8%) 55 (41.7%) 138 (34.5%) \n Total number of events related to study drug 48 53 65 166 \n dcd C.2.1.2.1 35 (26.1%) 48 (35.8%) 55 (41.7%) 138 (34.5%) \ncl C.1 \n Total number of patients with at least one adverse event related to study drug 43 (32.1%) 46 (34.3%) 43 (32.6%) 132 (33.0%) \n Total number of events related to study drug 55 63 64 182 \n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%) 132 (33.0%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event related to study drug\",\n nonunique = \"Overall total number of events related to study drug\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n indent_mod = 1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae_f$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event related to study drug\",\n nonunique = \"Total number of events related to study drug\"\n )\n ) %>%\n split_rows_by(\n \"AEHLT\",\n child_labels = \"visible\",\n nested = TRUE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae_f$AEHLT)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event related to study drug\",\n nonunique = \"Total number of events related to study drug\"\n )\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = -1L\n ) %>%\n append_varlabels(adae_f, c(\"AEDECOD\"), indent = 2L)\n\ntbl2 <- build_table(\n lyt = lyt,\n df = adae_f,\n alt_counts_df = adsl\n) %>%\n prune_table()\n\nresult <- tbl2 %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nBody System or Organ Class \n High Level Term A: Drug X B: Placebo C: Combination\n Dictionary-Derived Term (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event related to study drug 105 (78.4%) 108 (80.6%) 109 (82.6%) \nOverall total number of events related to study drug 282 299 336 \n cl D.2 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 58 (43.3%) 57 (43.2%) \n Total number of events related to study drug 62 72 74 \n hlt D.2.1.5 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 58 (43.3%) 57 (43.2%) \n Total number of events related to study drug 62 72 74 \n dcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%) \n cl D.1 \n Total number of patients with at least one adverse event related to study drug 50 (37.3%) 42 (31.3%) 51 (38.6%) \n Total number of events related to study drug 61 51 71 \n hlt D.1.1.1 \n Total number of patients with at least one adverse event related to study drug 50 (37.3%) 42 (31.3%) 51 (38.6%) \n Total number of events related to study drug 61 51 71 \n dcd D.1.1.1.1 50 (37.3%) 42 (31.3%) 51 (38.6%) \n cl B.1 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 49 (36.6%) 43 (32.6%) \n Total number of events related to study drug 56 60 62 \n hlt B.1.1.1 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 49 (36.6%) 43 (32.6%) \n Total number of events related to study drug 56 60 62 \n dcd B.1.1.1.1 47 (35.1%) 49 (36.6%) 43 (32.6%) \n cl C.2 \n Total number of patients with at least one adverse event related to study drug 35 (26.1%) 48 (35.8%) 55 (41.7%) \n Total number of events related to study drug 48 53 65 \n hlt C.2.1.2 \n Total number of patients with at least one adverse event related to study drug 35 (26.1%) 48 (35.8%) 55 (41.7%) \n Total number of events related to study drug 48 53 65 \n dcd C.2.1.2.1 35 (26.1%) 48 (35.8%) 55 (41.7%) \n cl C.1 \n Total number of patients with at least one adverse event related to study drug 43 (32.1%) 46 (34.3%) 43 (32.6%) \n Total number of events related to study drug 55 63 64 \n hlt C.1.1.1 \n Total number of patients with at least one adverse event related to study drug 43 (32.1%) 46 (34.3%) 43 (32.6%) \n Total number of events related to study drug 55 63 64 \n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAE <- df_explicit_na(ADAE)\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Adverse Events Related to Study Drug\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AEHLT\")),\n selected = c(\"AEBODSYS\")\n ),\n add_total = FALSE,\n event_type = \"adverse event related to study drug\", # define event type here\n )\n ),\n filter = teal_slices(teal_slice(\"ADAE\", \"AEREL\", selected = \"Y\")) # related AEs only\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:45:22 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Vital Signs", - "VST02" + "Adverse Events", + "AET09" ] }, { - "objectID": "tables/adverse-events/aet01_aesi.html", - "href": "tables/adverse-events/aet01_aesi.html", - "title": "AET01_AESI", + "objectID": "tables/adverse-events/aet10.html", + "href": "tables/adverse-events/aet10.html", + "title": "AET10", "section": "", - "text": "Data Setup\nStandard Table\nTable with Optional Lines\nTable For Studies with Multiple Drugs\nTable of AEs by SMQ\nteal App\nReproducibility\n\n\n\nTo illustrate, additional variables such as flags (TRUE/FALSE) for selected AEs of interest. Please consult your SAP on how to handle missing AE grades.\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nadsl <- filter(adsl, SAFFL == \"Y\")\nadae <- filter(adae, ANL01FL == \"Y\" & SAFFL == \"Y\")\n\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nnot_resolved <- adae %>%\n filter(!(AEOUT %in% c(\"RECOVERED/RESOLVED\", \"FATAL\", \"RECOVERED/RESOLVED WITH SEQUELAE\"))) %>%\n distinct(USUBJID) %>%\n mutate(NOT_RESOLVED = \"Y\")\n\nadae <- adae %>%\n left_join(not_resolved, by = c(\"USUBJID\")) %>%\n mutate(\n ALL_RESOLVED = with_label(\n is.na(NOT_RESOLVED),\n \"Total number of patients with all non-fatal AEs resolved\"\n ),\n NOT_RESOLVED = with_label(\n !is.na(NOT_RESOLVED),\n \"Total number of patients with at least one unresolved or ongoing non-fatal AE\"\n )\n )\n\nadae <- adae %>%\n mutate(\n AEDECOD = as.character(AEDECOD),\n WD = with_label(\n AEACN == \"DRUG WITHDRAWN\",\n \"Total number of patients with study drug withdrawn due to AE\"\n ),\n DSM = with_label(\n AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Total number of patients with dose modified/interrupted due to AE\"\n ),\n CONTRT = with_label(\n AECONTRT == \"Y\",\n \"Total number of patients with treatment received for AE\"\n ),\n SER = with_label(\n AESER == \"Y\",\n \"Total number of patients with at least one serious AE\"\n ),\n REL = with_label(\n AEREL == \"Y\",\n \"Total number of patients with at least one related AE\"\n ),\n ALL_RESOLVED_WD = with_label(\n WD == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with study drug withdrawn due to resolved AE\"\n ),\n ALL_RESOLVED_DSM = with_label(\n DSM == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with dose modified/interrupted due to resolved AE\"\n ),\n ALL_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with treatment received for resolved AE\"\n ),\n NOT_RESOLVED_WD = with_label(\n WD == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with study drug withdrawn due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_DSM = with_label(\n DSM == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with dose modified/interrupted due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with treatment received for unresolved or ongoing AE\"\n ),\n SERWD = with_label(\n AESER == \"Y\" & AEACN == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug withdrawn due to serious AE\"\n ),\n SERCONTRT = with_label(\n AECONTRT == \"Y\" & AESER == \"Y\",\n \"No. of patients with dose modified/interrupted due to serious AE\"\n ),\n SERDSM = with_label(\n AESER == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with treatment received for serious AE\"\n ),\n RELWD = with_label(\n AEREL == \"Y\" & AEACN == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug withdrawn due to related AE\"\n ),\n RELDSM = with_label(\n AEREL == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose modified/interrupted due to related AE\"\n ),\n RELCONTRT = with_label(\n AECONTRT == \"Y\" & AEREL == \"Y\",\n \"No. of patients with treatment received for related AE\"\n ),\n RELSER = with_label(\n AESER == \"Y\" & AEREL == \"Y\",\n \"No. of patients with serious, related AE\"\n )\n )\n\nadae <- adae %>%\n mutate(\n AETOXGR = forcats::fct_recode(AETOXGR,\n \"Grade 1\" = \"1\",\n \"Grade 2\" = \"2\",\n \"Grade 3\" = \"3\",\n \"Grade 4\" = \"4\",\n \"Grade 5 (fatal outcome)\" = \"5\"\n )\n )\n\n\n\n\n\nCodeaesi_vars <- c(\"WD\", \"DSM\", \"CONTRT\", \"ALL_RESOLVED\", \"NOT_RESOLVED\", \"SER\", \"REL\")\n\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n vars = \"USUBJID\",\n filters = c(\"ANL01FL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients with at least one AE\")\n ) %>%\n count_values(\n \"ANL01FL\",\n values = \"Y\",\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n var_labels = \"Total number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\"USUBJID\", flag_variables = aesi_vars, denom = \"N_col\")\n\nresult <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of patients with at least one AE by worst grade \n Grade 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n Grade 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n Grade 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 (fatal outcome) 64 (47.8%) 52 (38.8%) 64 (48.5%) \nTotal number of patients with study drug withdrawn due to AE 22 (16.4%) 21 (15.7%) 28 (21.2%) \nTotal number of patients with dose modified/interrupted due to AE 55 (41.0%) 62 (46.3%) 64 (48.5%) \nTotal number of patients with treatment received for AE 80 (59.7%) 80 (59.7%) 89 (67.4%) \nTotal number of patients with all non-fatal AEs resolved 17 (12.7%) 12 (9.0%) 11 (8.3%) \nTotal number of patients with at least one unresolved or ongoing non-fatal AE 83 (61.9%) 86 (64.2%) 92 (69.7%) \nTotal number of patients with at least one serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \nTotal number of patients with at least one related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n\n\n\n\n\nCodeaesi_vars <- c(\"WD\", \"DSM\", \"CONTRT\")\naesi_resolved <- c(\"ALL_RESOLVED\", \"ALL_RESOLVED_WD\", \"ALL_RESOLVED_DSM\", \"ALL_RESOLVED_CONTRT\")\naesi_not_resolved <- c(\"NOT_RESOLVED\", \"NOT_RESOLVED_WD\", \"NOT_RESOLVED_DSM\", \"NOT_RESOLVED_CONTRT\")\naesi_ser <- c(\"SER\", \"SERWD\", \"SERDSM\", \"SERCONTRT\")\naesi_rel <- c(\"REL\", \"RELWD\", \"RELDSM\", \"RELCONTRT\", \"RELSER\")\n\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n vars = \"USUBJID\",\n filters = c(\"ANL01FL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients with at least one AE\")\n ) %>%\n count_values(\n \"ANL01FL\",\n values = \"Y\",\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n var_labels = \"Total number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(aesi_vars, aesi_resolved[1]), denom = \"N_col\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_resolved[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_res\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_not_resolved[1], denom = \"N_col\", table_names = \"fl_notres_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_not_resolved[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_notres\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_ser[1], denom = \"N_col\", table_names = \"fl_ser_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_ser[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_ser\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel[1], denom = \"N_col\", table_names = \"fl_rel_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_rel\"\n )\n\nresult <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of patients with at least one AE by worst grade \n Grade 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n Grade 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n Grade 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 (fatal outcome) 64 (47.8%) 52 (38.8%) 64 (48.5%) \nTotal number of patients with study drug withdrawn due to AE 22 (16.4%) 21 (15.7%) 28 (21.2%) \nTotal number of patients with dose modified/interrupted due to AE 55 (41.0%) 62 (46.3%) 64 (48.5%) \nTotal number of patients with treatment received for AE 80 (59.7%) 80 (59.7%) 89 (67.4%) \nTotal number of patients with all non-fatal AEs resolved 17 (12.7%) 12 (9.0%) 11 (8.3%) \n No. of patients with study drug withdrawn due to resolved AE 0 1 (0.7%) 2 (1.5%) \n No. of patients with dose modified/interrupted due to resolved AE 3 (2.2%) 4 (3.0%) 2 (1.5%) \n No. of patients with treatment received for resolved AE 9 (6.7%) 7 (5.2%) 7 (5.3%) \nTotal number of patients with at least one unresolved or ongoing non-fatal AE 83 (61.9%) 86 (64.2%) 92 (69.7%) \n No. of patients with study drug withdrawn due to unresolved or ongoing AE 22 (16.4%) 20 (14.9%) 26 (19.7%) \n No. of patients with dose modified/interrupted due to unresolved or ongoing AE 52 (38.8%) 58 (43.3%) 62 (47.0%) \n No. of patients with treatment received for unresolved or ongoing AE 71 (53.0%) 73 (54.5%) 82 (62.1%) \nTotal number of patients with at least one serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n No. of patients with study drug withdrawn due to serious AE 9 (6.7%) 4 (3.0%) 10 (7.6%) \n No. of patients with treatment received for serious AE 21 (15.7%) 22 (16.4%) 28 (21.2%) \n No. of patients with dose modified/interrupted due to serious AE 59 (44.0%) 58 (43.3%) 53 (40.2%) \nTotal number of patients with at least one related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n No. of patients with study drug withdrawn due to related AE 5 (3.7%) 10 (7.5%) 7 (5.3%) \n No. of patients with dose modified/interrupted due to related AE 24 (17.9%) 32 (23.9%) 34 (25.8%) \n No. of patients with treatment received for related AE 53 (39.6%) 58 (43.3%) 60 (45.5%) \n No. of patients with serious, related AE 64 (47.8%) 52 (38.8%) 64 (48.5%) \n\n\n\n\n\nCodeadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae_mult <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nadsl <- filter(adsl, SAFFL == \"Y\")\nadae_mult <- filter(adae_mult, ANL01FL == \"Y\" & SAFFL == \"Y\")\n\nadsl <- df_explicit_na(adsl)\nadae_mult <- df_explicit_na(adae_mult)\n\n# for illustration purposes only, create AEREL1, AEREL2, AEACN1, AEACN2 from respective variables\nadae_mult <- adae_mult %>%\n mutate(\n AEREL1 = AEREL,\n AEREL2 = AEREL,\n AEACN1 = AEACN,\n AEACN2 = AEACN\n )\n\nnot_resolved <- adae_mult %>%\n filter(!(AEOUT %in% c(\"RECOVERED/RESOLVED\", \"FATAL\", \"RECOVERED/RESOLVED WITH SEQUELAE\"))) %>%\n distinct(USUBJID) %>%\n mutate(NOT_RESOLVED = \"Y\")\n\nadae_mult <- adae_mult %>%\n left_join(not_resolved, by = c(\"USUBJID\")) %>%\n mutate(\n ALL_RESOLVED = with_label(\n is.na(NOT_RESOLVED),\n \"Total number of patients with all non-fatal AEs resolved\"\n ),\n NOT_RESOLVED = with_label(\n !is.na(NOT_RESOLVED),\n \"Total number of patients with at least one non-fatal unresolved or ongoing AE\"\n )\n )\n\nadae_mult <- adae_mult %>%\n mutate(\n AEDECOD = as.character(AEDECOD),\n WD1 = with_label(\n AEACN1 == \"DRUG WITHDRAWN\",\n \"Total number of patients with study drug 1 withdrawn due to AE\"\n ),\n WD2 = with_label(\n AEACN2 == \"DRUG WITHDRAWN\",\n \"Total number of patients with study drug 2 withdrawn due to AE\"\n ),\n DSM1 = with_label(\n AEACN1 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Total number of patients with dose of study drug 1 modified/interrupted due to AE\"\n ),\n DSM2 = with_label(\n AEACN2 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Total number of patients with dose of study drug 2 modified/interrupted due to AE\"\n ),\n CONTRT = with_label(\n AECONTRT == \"Y\",\n \"Total number of patients with treatment received for AE\"\n ),\n SER = with_label(\n AESER == \"Y\",\n \"Total number of patients with at least one serious AE\"\n ),\n REL1 = with_label(\n AEREL1 == \"Y\",\n \"Total number of patients with at least one AE related to study drug 1\"\n ),\n REL2 = with_label(\n AEREL2 == \"Y\",\n \"Total number of patients with at least one AE related to study drug 2\"\n ),\n ALL_RESOLVED_WD1 = with_label(\n WD1 == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with study drug 1 withdrawn due to resolved AE\"\n ),\n ALL_RESOLVED_DSM1 = with_label(\n DSM1 == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with dose of study drug 1 modified/interrupted due to resolved AE\"\n ),\n ALL_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with treatment received for resolved AE\"\n ),\n ALL_RESOLVED_WD2 = with_label(\n WD2 == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with study drug 2 withdrawn due to resolved AE\"\n ),\n ALL_RESOLVED_DSM2 = with_label(\n DSM2 == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with dose of study drug 2 modified/interrupted due to resolved AE\"\n ),\n NOT_RESOLVED_WD1 = with_label(\n WD1 == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with study drug 1 withdrawn due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_DSM1 = with_label(\n DSM1 == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with dose of study drug 1 modified/interrupted due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with treatment received for unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_WD2 = with_label(\n WD2 == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with study drug 2 withdrawn due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_DSM2 = with_label(\n DSM2 == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with dose of study drug 2 modified/interrupted due to unresolved or ongoing AE\"\n ),\n SERWD1 = with_label(\n AESER == \"Y\" & AEACN1 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 1 withdrawn due to serious AE\"\n ),\n SERWD2 = with_label(\n AESER == \"Y\" & AEACN2 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 2 withdrawn due to serious AE\"\n ),\n SERCONTRT = with_label(\n AECONTRT == \"Y\" & AESER == \"Y\",\n \"No. of patients with treatment received for serious AE\"\n ),\n SERDSM1 = with_label(\n AESER == \"Y\" & AEACN1 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 1 modified/interrupted due to serious AE\"\n ),\n SERDSM2 = with_label(\n AESER == \"Y\" & AEACN2 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 2 modified/interrupted due to serious AE\"\n ),\n REL1WD1 = with_label(\n AEREL1 == \"Y\" & AEACN1 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 1 withdrawn due to AE related to study drug 1\"\n ),\n REL1WD2 = with_label(\n AEREL1 == \"Y\" & AEACN2 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 1 withdrawn due to AE related to study drug 2\"\n ),\n REL2WD1 = with_label(\n AEREL1 == \"Y\" & AEACN1 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 2 withdrawn due to AE related to study drug 1\"\n ),\n REL2WD2 = with_label(\n AEREL1 == \"Y\" & AEACN2 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 2 withdrawn due to AE related to study drug 2\"\n ),\n REL1DSM1 = with_label(\n AEREL1 == \"Y\" & AEACN1 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 1 modified/interrupted due to AE related to study drug 1\"\n ),\n REL2DSM1 = with_label(\n AEREL2 == \"Y\" & AEACN1 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 2 modified/interrupted due to AE related to study drug 1\"\n ),\n REL1DSM2 = with_label(\n AEREL1 == \"Y\" & AEACN2 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 1 modified/interrupted due to AE related to study drug 2\"\n ),\n REL2DSM2 = with_label(\n AEREL2 == \"Y\" & AEACN2 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 2 modified/interrupted due to AE related to study drug 2\"\n ),\n REL1CONTRT = with_label(\n AECONTRT == \"Y\" & AEREL1 == \"Y\",\n \"No. of patients with treatment received for AE related to study drug 1\"\n ),\n REL2CONTRT = with_label(\n AECONTRT == \"Y\" & AEREL2 == \"Y\",\n \"No. of patients with treatment received for AE related to study drug 2\"\n ),\n REL1SER = with_label(\n AESER == \"Y\" & AEREL1 == \"Y\",\n \"No. of patients with serious AE related to study drug 1\"\n ),\n REL2SER = with_label(\n AESER == \"Y\" & AEREL2 == \"Y\",\n \"No. of patients with serious AE related to study drug 2\"\n )\n )\n\nadae_mult <- adae_mult %>%\n mutate(AETOXGR = forcats::fct_recode(\n AETOXGR,\n \"Grade 1\" = \"1\",\n \"Grade 2\" = \"2\",\n \"Grade 3\" = \"3\",\n \"Grade 4\" = \"4\",\n \"Grade 5 (fatal outcome)\" = \"5\"\n ))\n\naesi_vars <- c(\"WD1\", \"WD2\", \"DSM1\", \"DSM2\", \"CONTRT\")\naesi_res <- c(\n \"ALL_RESOLVED\",\n \"ALL_RESOLVED_WD1\",\n \"ALL_RESOLVED_WD2\",\n \"ALL_RESOLVED_DSM1\",\n \"ALL_RESOLVED_DSM2\",\n \"ALL_RESOLVED_CONTRT\"\n)\naesi_not_res <- c(\n \"NOT_RESOLVED\",\n \"NOT_RESOLVED_WD1\",\n \"NOT_RESOLVED_WD2\",\n \"NOT_RESOLVED_DSM1\",\n \"NOT_RESOLVED_DSM2\",\n \"NOT_RESOLVED_CONTRT\"\n)\naesi_ser <- c(\"SER\", \"SERWD1\", \"SERWD2\", \"SERDSM1\", \"SERDSM2\", \"SERCONTRT\")\naesi_rel1 <- c(\"REL1\", \"REL1WD1\", \"REL1WD2\", \"REL1DSM1\", \"REL1DSM2\", \"REL1CONTRT\", \"REL1SER\")\naesi_rel2 <- c(\"REL2\", \"REL2WD1\", \"REL2WD2\", \"REL2DSM1\", \"REL2DSM2\", \"REL2CONTRT\", \"REL2SER\")\n\nlyt_adae_mult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n vars = \"USUBJID\",\n filters = c(\"ANL01FL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients with at least one AE\")\n ) %>%\n count_values(\n \"ANL01FL\",\n values = \"Y\",\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n var_labels = \"Total number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(aesi_vars, aesi_res[1]), denom = \"N_col\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_res[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_res\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_not_res[1], denom = \"N_col\", table_names = \"fl_notres_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_not_res[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_notres\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_ser[1], denom = \"N_col\", table_names = \"fl_ser_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_ser[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_ser\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel1[1], denom = \"N_col\", table_names = \"fl_rel1_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel1[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_rel1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel2[1], denom = \"N_col\", table_names = \"fl_rel2_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel2[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_rel2\"\n )\n\nresult <- build_table(lyt_adae_mult, df = adae_mult, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of patients with at least one AE by worst grade \n Grade 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n Grade 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n Grade 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 (fatal outcome) 64 (47.8%) 52 (38.8%) 64 (48.5%) \nTotal number of patients with study drug 1 withdrawn due to AE 22 (16.4%) 21 (15.7%) 28 (21.2%) \nTotal number of patients with study drug 2 withdrawn due to AE 22 (16.4%) 21 (15.7%) 28 (21.2%) \nTotal number of patients with dose of study drug 1 modified/interrupted due to AE 55 (41.0%) 62 (46.3%) 64 (48.5%) \nTotal number of patients with dose of study drug 2 modified/interrupted due to AE 55 (41.0%) 62 (46.3%) 64 (48.5%) \nTotal number of patients with treatment received for AE 80 (59.7%) 80 (59.7%) 89 (67.4%) \nTotal number of patients with all non-fatal AEs resolved 17 (12.7%) 12 (9.0%) 11 (8.3%) \n No. of patients with study drug 1 withdrawn due to resolved AE 0 1 (0.7%) 2 (1.5%) \n No. of patients with study drug 2 withdrawn due to resolved AE 0 1 (0.7%) 2 (1.5%) \n No. of patients with dose of study drug 1 modified/interrupted due to resolved AE 3 (2.2%) 4 (3.0%) 2 (1.5%) \n No. of patients with dose of study drug 2 modified/interrupted due to resolved AE 3 (2.2%) 4 (3.0%) 2 (1.5%) \n No. of patients with treatment received for resolved AE 9 (6.7%) 7 (5.2%) 7 (5.3%) \nTotal number of patients with at least one non-fatal unresolved or ongoing AE 83 (61.9%) 86 (64.2%) 92 (69.7%) \n No. of patients with study drug 1 withdrawn due to unresolved or ongoing AE 22 (16.4%) 20 (14.9%) 26 (19.7%) \n No. of patients with study drug 2 withdrawn due to unresolved or ongoing AE 22 (16.4%) 20 (14.9%) 26 (19.7%) \n No. of patients with dose of study drug 1 modified/interrupted due to unresolved or ongoing AE 52 (38.8%) 58 (43.3%) 62 (47.0%) \n No. of patients with dose of study drug 2 modified/interrupted due to unresolved or ongoing AE 52 (38.8%) 58 (43.3%) 62 (47.0%) \n No. of patients with treatment received for unresolved or ongoing AE 71 (53.0%) 73 (54.5%) 82 (62.1%) \nTotal number of patients with at least one serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n No. of patients with study drug 1 withdrawn due to serious AE 9 (6.7%) 4 (3.0%) 10 (7.6%) \n No. of patients with study drug 2 withdrawn due to serious AE 9 (6.7%) 4 (3.0%) 10 (7.6%) \n No. of patients with dose of study drug 1 modified/interrupted due to serious AE 21 (15.7%) 22 (16.4%) 28 (21.2%) \n No. of patients with dose of study drug 2 modified/interrupted due to serious AE 21 (15.7%) 22 (16.4%) 28 (21.2%) \n No. of patients with treatment received for serious AE 59 (44.0%) 58 (43.3%) 53 (40.2%) \nTotal number of patients with at least one AE related to study drug 1 86 (64.2%) 85 (63.4%) 92 (69.7%) \n No. of patients with study drug 1 withdrawn due to AE related to study drug 1 5 (3.7%) 10 (7.5%) 7 (5.3%) \n No. of patients with study drug 1 withdrawn due to AE related to study drug 2 5 (3.7%) 10 (7.5%) 7 (5.3%) \n No. of patients with dose of study drug 1 modified/interrupted due to AE related to study drug 1 24 (17.9%) 32 (23.9%) 34 (25.8%) \n No. of patients with dose of study drug 1 modified/interrupted due to AE related to study drug 2 24 (17.9%) 32 (23.9%) 34 (25.8%) \n No. of patients with treatment received for AE related to study drug 1 53 (39.6%) 58 (43.3%) 60 (45.5%) \n No. of patients with serious AE related to study drug 1 64 (47.8%) 52 (38.8%) 64 (48.5%) \nTotal number of patients with at least one AE related to study drug 2 86 (64.2%) 85 (63.4%) 92 (69.7%) \n No. of patients with study drug 2 withdrawn due to AE related to study drug 1 5 (3.7%) 10 (7.5%) 7 (5.3%) \n No. of patients with study drug 2 withdrawn due to AE related to study drug 2 5 (3.7%) 10 (7.5%) 7 (5.3%) \n No. of patients with dose of study drug 2 modified/interrupted due to AE related to study drug 1 24 (17.9%) 32 (23.9%) 34 (25.8%) \n No. of patients with dose of study drug 2 modified/interrupted due to AE related to study drug 2 24 (17.9%) 32 (23.9%) 34 (25.8%) \n No. of patients with treatment received for AE related to study drug 2 53 (39.6%) 58 (43.3%) 60 (45.5%) \n No. of patients with serious AE related to study drug 2 64 (47.8%) 52 (38.8%) 64 (48.5%) \n\n\n\n\n\nCodeadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nadsl <- filter(adsl, SAFFL == \"Y\")\nadae <- filter(adae, ANL01FL == \"Y\" & SAFFL == \"Y\")\n\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nstack_adae_by_smq <- function(adae, smq) {\n adae_labels <- c(var_labels(adae), \"Standardized MedDRA Query\")\n l_df <- lapply(smq, function(ae_grp) {\n ae_scope <- gsub(\"NAM\", \"SC\", ae_grp)\n keep <- adae[[ae_grp]] != \"<Missing>\"\n df <- adae[keep, ]\n if (substr(ae_grp, 1, 3) == \"SMQ\") {\n df[[\"SMQ\"]] <- aesi_label(as.character(df[[ae_grp]]), scope = as.character(df[[ae_scope]]))\n } else {\n df[[\"SMQ\"]] <- df[[ae_grp]]\n }\n df\n })\n result <- do.call(rbind, l_df)\n var_labels(result) <- adae_labels\n result\n}\n\nadae_smq <- stack_adae_by_smq(adae, c(\"SMQ01NAM\", \"SMQ02NAM\", \"CQ01NAM\"))\n\nnot_resolved <- adae_smq %>%\n filter(!(AEOUT %in% c(\"RECOVERED/RESOLVED\", \"FATAL\", \"RECOVERED/RESOLVED WITH SEQUELAE\"))) %>%\n distinct(USUBJID) %>%\n mutate(NOT_RESOLVED = \"Y\")\n\nadae_smq <- adae_smq %>%\n left_join(not_resolved, by = c(\"USUBJID\")) %>%\n mutate(\n ALL_RESOLVED = with_label(\n is.na(NOT_RESOLVED),\n \"Total number of patients with all non-fatal AEs resolved\"\n ),\n NOT_RESOLVED = with_label(\n !is.na(NOT_RESOLVED),\n \"Total number of patients with at least one non-fatal unresolved or ongoing AE\"\n )\n )\n\nadae_smq <- adae_smq %>%\n mutate(\n AEDECOD = as.character(AEDECOD),\n WD = with_label(\n AEACN == \"DRUG WITHDRAWN\",\n \"Total number of patients with study drug withdrawn due to AE\"\n ),\n DSM = with_label(\n AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Total number of patients with dose modified/interrupted due to AE\"\n ),\n CONTRT = with_label(\n AECONTRT == \"Y\",\n \"Total number of patients with treatment received for AE\"\n ),\n SER = with_label(\n AESER == \"Y\",\n \"Total number of patients with at least one serious AE\"\n ),\n REL = with_label(\n AEREL == \"Y\",\n \"Total number of patients with at least one related AE\"\n ),\n ALL_RESOLVED_WD = with_label(\n WD == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with study drug withdrawn due to resolved AE\"\n ),\n ALL_RESOLVED_DSM = with_label(\n DSM == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with dose modified/interrupted due to resolved AE\"\n ),\n ALL_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with treatment received for resolved AE\"\n ),\n NOT_RESOLVED_WD = with_label(\n WD == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with study drug withdrawn due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_DSM = with_label(\n DSM == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with dose modified/interrupted due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with treatment received for unresolved or ongoing AE\"\n ),\n SERWD = with_label(\n AESER == \"Y\" & AEACN == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug withdrawn due to serious AE\"\n ),\n SERCONTRT = with_label(\n AECONTRT == \"Y\" & AESER == \"Y\",\n \"No. of patients with treatment received for serious AE\"\n ),\n SERDSM = with_label(\n AESER == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose modified/interrupted due to serious AE\"\n ),\n RELWD = with_label(\n AEREL == \"Y\" & AEACN == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug withdrawn due to related AE\"\n ),\n RELDSM = with_label(\n AEREL == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose modified/interrupted due to related AE\"\n ),\n RELCONTRT = with_label(\n AECONTRT == \"Y\" & AEREL == \"Y\",\n \"No. of patients with treatment received for related AE\"\n ),\n RELSER = with_label(\n AESER == \"Y\" & AEREL == \"Y\",\n \"No. of patients with serious, related AE\"\n )\n )\n\nadae_smq <- adae_smq %>%\n mutate(\n AETOXGR = forcats::fct_recode(AETOXGR,\n \"Grade 1\" = \"1\",\n \"Grade 2\" = \"2\",\n \"Grade 3\" = \"3\",\n \"Grade 4\" = \"4\",\n \"Grade 5 (fatal outcome)\" = \"5\"\n )\n )\n\nsplit_fun <- remove_split_levels(\"<Missing>\")\naesi_vars <- c(\"WD\", \"DSM\", \"CONTRT\", \"ALL_RESOLVED\", \"NOT_RESOLVED\", \"SER\", \"REL\")\n\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n split_fun = split_fun,\n split_label = \"Standardized MedDRA Query\",\n label_pos = \"topleft\"\n ) %>%\n count_patients_with_event(\n vars = \"USUBJID\",\n filters = c(\"ANL01FL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients with at least one AE\")\n ) %>%\n count_values(\n \"ANL01FL\",\n values = \"Y\",\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n var_labels = \"Total number of patients with at least one AE by worst grade\",\n .show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\"USUBJID\", flag_variables = aesi_vars, denom = \"N_col\")\n\nresult <- build_table(lyt_adae, df = adae_smq, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination\nStandardized MedDRA Query (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nC.1.1.1.3/B.2.2.3.1 AESI (BROAD) \n Total number of patients with at least one AE 58 (43.3%) 60 (44.8%) 66 (50.0%) \n Total number of AEs 97 106 122 \n Total number of patients with at least one AE by worst grade \n Grade 1 22 (16.4%) 26 (19.4%) 30 (22.7%) \n Grade 2 0 0 0 \n Grade 3 0 0 0 \n Grade 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 5 (fatal outcome) 0 0 0 \n Total number of patients with study drug withdrawn due to AE 5 (3.7%) 6 (4.5%) 9 (6.8%) \n Total number of patients with dose modified/interrupted due to AE 21 (15.7%) 21 (15.7%) 24 (18.2%) \n Total number of patients with treatment received for AE 32 (23.9%) 35 (26.1%) 44 (33.3%) \n Total number of patients with all non-fatal AEs resolved 7 (5.2%) 9 (6.7%) 8 (6.1%) \n Total number of patients with at least one non-fatal unresolved or ongoing AE 51 (38.1%) 51 (38.1%) 58 (43.9%) \n Total number of patients with at least one serious AE 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Total number of patients with at least one related AE 36 (26.9%) 34 (25.4%) 36 (27.3%) \nD.2.1.5.3/A.1.1.1.1 AESI \n Total number of patients with at least one AE 62 (46.3%) 61 (45.5%) 76 (57.6%) \n Total number of AEs 106 100 139 \n Total number of patients with at least one AE by worst grade \n Grade 1 62 (46.3%) 61 (45.5%) 76 (57.6%) \n Grade 2 0 0 0 \n Grade 3 0 0 0 \n Grade 4 0 0 0 \n Grade 5 (fatal outcome) 0 0 0 \n Total number of patients with study drug withdrawn due to AE 6 (4.5%) 8 (6.0%) 4 (3.0%) \n Total number of patients with dose modified/interrupted due to AE 23 (17.2%) 20 (14.9%) 26 (19.7%) \n Total number of patients with treatment received for AE 33 (24.6%) 37 (27.6%) 33 (25.0%) \n Total number of patients with all non-fatal AEs resolved 4 (3.0%) 5 (3.7%) 14 (10.6%) \n Total number of patients with at least one non-fatal unresolved or ongoing AE 58 (43.3%) 56 (41.8%) 62 (47.0%) \n Total number of patients with at least one serious AE 0 0 0 \n Total number of patients with at least one related AE 37 (27.6%) 46 (34.3%) 50 (37.9%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n ADAE <- filter(ADAE, ANL01FL == \"Y\" & SAFFL == \"Y\")\n\n not_resolved <- ADAE %>%\n filter(!(AEOUT %in% c(\"RECOVERED/RESOLVED\", \"FATAL\", \"RECOVERED/RESOLVED WITH SEQUELAE\"))) %>%\n distinct(USUBJID) %>%\n mutate(NOT_RESOLVED = \"Y\")\n\n ADAE <- ADAE %>%\n left_join(not_resolved, by = c(\"USUBJID\")) %>%\n mutate(\n ALL_RESOLVED = with_label(is.na(NOT_RESOLVED), \"All non-fatal AEs resolved\"),\n NOT_RESOLVED = with_label(!is.na(NOT_RESOLVED), \"At least one non-fatal unresolved or ongoing AE\")\n )\n\n ADAE <- ADAE %>%\n mutate(\n AEDECOD = as.character(AEDECOD),\n WD = with_label(AEACN == \"DRUG WITHDRAWN\", \"AE that led to study drug withdrawal\"),\n DSM = with_label(\n AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"AE that led to study drug dose modified/interrupted\"\n ),\n CONTRT = with_label(AECONTRT == \"Y\", \"AE that required treatment\"),\n SER = with_label(AESER == \"Y\", \"Serious AE\"),\n REL = with_label(AEREL == \"Y\", \"Related AE\"),\n ALL_RESOLVED_WD = with_label(\n WD == TRUE & ALL_RESOLVED == TRUE,\n \"Resolved AE that led to study drug withdrawal\"\n ),\n ALL_RESOLVED_DSM = with_label(\n DSM == TRUE & ALL_RESOLVED == TRUE,\n \"Resolved AE that led to study drug dose modified/interrupted\"\n ),\n ALL_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & ALL_RESOLVED == TRUE,\n \"Resolved AE that required treatment\"\n ),\n NOT_RESOLVED_WD = with_label(\n WD == TRUE & NOT_RESOLVED == TRUE,\n \"Unresolved AE that led to study drug withdrawal\"\n ),\n NOT_RESOLVED_DSM = with_label(\n DSM == TRUE & NOT_RESOLVED == TRUE,\n \"Unresolved AE that led to study drug dose modified/interrupted\"\n ),\n NOT_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & NOT_RESOLVED == TRUE,\n \"Unresolved AE that required treatment\"\n ),\n SERWD = with_label(\n AESER == \"Y\" & AEACN == \"DRUG WITHDRAWN\",\n \"Serious AE that led to study drug withdrawal\"\n ),\n SERCONTRT = with_label(\n AECONTRT == \"Y\" & AESER == \"Y\",\n \"Serious AE that required treatment\"\n ),\n SERDSM = with_label(\n AESER == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Serious AE that led to study drug dose modified/interrupted\"\n ),\n RELWD = with_label(\n AEREL == \"Y\" & AEACN == \"DRUG WITHDRAWN\", \"Related AE that led to study drug withdrawal\"\n ),\n RELDSM = with_label(\n AEREL == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Related AE that led to study drug dose modified/interrupted\"\n ),\n RELCONTRT = with_label(AECONTRT == \"Y\" & AEREL == \"Y\", \"Related AE that required treatment\"),\n RELSER = with_label(AESER == \"Y\" & AEREL == \"Y\", \"Serious related AE\")\n )\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\naesi_vars <- c(\n \"WD\", \"DSM\", \"CONTRT\", \"ALL_RESOLVED_WD\", \"ALL_RESOLVED_DSM\", \"ALL_RESOLVED_CONTRT\",\n \"NOT_RESOLVED_WD\", \"NOT_RESOLVED_DSM\", \"NOT_RESOLVED_CONTRT\", \"SER\", \"SERWD\", \"SERDSM\",\n \"SERCONTRT\", \"REL\", \"RELWD\", \"RELDSM\", \"RELCONTRT\", \"RELSER\"\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_summary(\n label = \"Adverse Events Summary\",\n dataname = \"ADAE\",\n arm_var = choices_selected(\n choices = variable_choices(\"ADSL\", c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n flag_var_anl = choices_selected(\n choices = variable_choices(\"ADAE\", aesi_vars),\n selected = aesi_vars[1],\n keep_order = TRUE,\n fixed = FALSE\n ),\n add_total = TRUE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:46:13 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nMost Common (\\(\\geq\\) 35%) Adverse Events (setting threshold)\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\n\n\n\nThe “All Patients” column is not required in this table but for illustrative purposes we include it to show correct sorting.\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n var = \"ARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_occurrences(vars = \"AEDECOD\")\n\ntbl1 <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n)\n\ntbl2 <- prune_table(\n tt = tbl1,\n prune_func = keep_rows(\n has_fraction_in_any_col(\n atleast = 0.05, # specify threshold\n col_names = levels(adsl$ARM)\n )\n )\n)\n\nresult <- sort_at_path(\n tbl2,\n path = c(\"AEDECOD\"),\n scorefun = score_occurrences\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————\ndcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%) 162 (40.5%) \ndcd A.1.1.1.1 50 (37.3%) 45 (33.6%) 63 (47.7%) 158 (39.5%) \ndcd B.2.2.3.1 48 (35.8%) 54 (40.3%) 51 (38.6%) 153 (38.2%) \ndcd A.1.1.1.2 48 (35.8%) 48 (35.8%) 50 (37.9%) 146 (36.5%) \ndcd B.2.1.2.1 49 (36.6%) 44 (32.8%) 52 (39.4%) 145 (36.2%) \ndcd D.1.1.1.1 50 (37.3%) 42 (31.3%) 51 (38.6%) 143 (35.8%) \ndcd D.1.1.4.2 48 (35.8%) 42 (31.3%) 50 (37.9%) 140 (35.0%) \ndcd B.1.1.1.1 47 (35.1%) 49 (36.6%) 43 (32.6%) 139 (34.8%) \ndcd C.2.1.2.1 35 (26.1%) 48 (35.8%) 55 (41.7%) 138 (34.5%) \ndcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%) 132 (33.0%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n var = \"ARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_occurrences(vars = \"AEDECOD\")\n\ntbl1 <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n)\n\ntbl2 <- prune_table(\n tt = tbl1,\n prune_func = keep_rows(\n has_fraction_in_any_col(\n atleast = 0.35, # specify threshold\n col_names = levels(adsl$ARM)\n )\n )\n)\n\nresult <- sort_at_path(\n tbl2,\n path = c(\"AEDECOD\"),\n scorefun = score_occurrences\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————\ndcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%) 162 (40.5%) \ndcd A.1.1.1.1 50 (37.3%) 45 (33.6%) 63 (47.7%) 158 (39.5%) \ndcd B.2.2.3.1 48 (35.8%) 54 (40.3%) 51 (38.6%) 153 (38.2%) \ndcd A.1.1.1.2 48 (35.8%) 48 (35.8%) 50 (37.9%) 146 (36.5%) \ndcd B.2.1.2.1 49 (36.6%) 44 (32.8%) 52 (39.4%) 145 (36.2%) \ndcd D.1.1.1.1 50 (37.3%) 42 (31.3%) 51 (38.6%) 143 (35.8%) \ndcd D.1.1.4.2 48 (35.8%) 42 (31.3%) 50 (37.9%) 140 (35.0%) \ndcd B.1.1.1.1 47 (35.1%) 49 (36.6%) 43 (32.6%) 139 (34.8%) \ndcd C.2.1.2.1 35 (26.1%) 48 (35.8%) 55 (41.7%) 138 (34.5%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nThe desired frequency is specified in prune_freq. For illustration, frequency is set to \\(\\geq\\) 35%.\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAE <- df_explicit_na(ADAE)\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Adverse Event Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = NULL\n ),\n add_total = TRUE,\n event_type = \"adverse event\",\n prune_freq = 35,\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:44:49 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", - "AET01_AESI" + "AET10" ] }, { - "objectID": "tables/adverse-events/aet02_smq.html", - "href": "tables/adverse-events/aet02_smq.html", - "title": "AET02_SMQ", + "objectID": "tables/adverse-events/aet07.html", + "href": "tables/adverse-events/aet07.html", + "title": "AET07", "section": "", - "text": "Data Setup\nStandard Table\nTable with Customized Queries\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\nlibrary(stringr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\n# Simulate a random AAG dataset.\naag <- data.frame(\n NAMVAR = c(\"SMQ01NAM\", \"SMQ01NAM\", \"SMQ02NAM\", \"CQ01NAM\", \"CQ01NAM\"),\n SRCVAR = rep(\"AEDECOD\", 5),\n GRPTYPE = c(\"SMQ\", \"SMQ\", \"SMQ\", \"CUSTOM\", \"CUSTOM\"),\n REFID = c(1, 1, 2, 3, 3),\n REFNAME = c(rep(\"C.1.1.1.3/B.2.2.3.1 AESI\", 2), \"non observed SMQ02NAM level\", rep(\"D.2.1.5.3/A.1.1.1.1 AESI\", 2)),\n SCOPE = c(\"BROAD\", \"BROAD\", \"BROAD\", \"\", \"\"),\n REFTERM = c(\"C.1.1.1.3\", \"B.2.2.3.1\", \"Z.9.9.9.9\", \"D.2.1.5.3\", \"A.1.1.1.1\"),\n stringsAsFactors = FALSE\n)\n\n# Create summary AAG dataset (used for labelling).\n# Note it's important to incorporate SCOPE into the basket names for SMQs so as to\n# match the flags present in ADAE.\naag_summary <- aag %>%\n select(NAMVAR, REFNAME, SCOPE) %>%\n unique() %>%\n mutate(\n REFNAME_SCOPE = ifelse(SCOPE == \"\", REFNAME, paste0(REFNAME, \"(\", SCOPE, \")\"))\n ) %>%\n rename(basket = NAMVAR, basket_name = REFNAME_SCOPE) %>%\n select(basket, basket_name)\n\n# Make a summary of the full ADAE based on AAG by using h_stack_by_baskets helper function\nadae_smq_all <- h_stack_by_baskets(\n df = adae,\n aag_summary = aag_summary,\n keys = c(\"STUDYID\", \"USUBJID\", \"ACTARMCD\", \"AEDECOD\")\n)\n\n# Post-process adae_smq_all to keep only certain baskets of interest for variant 1\n# Not need to drop baskets for variant 2 as all baskets will be considered.\nbaskets_to_drop_variant <- aag_summary$basket_name[!aag_summary$basket %in% c(\"SMQ01NAM\")]\n\n# Adjust the analysis dataset based on basket subset for variant 1.\nadae_smq_1 <- adae_smq_all %>%\n filter(!adae_smq_all$SMQ %in% baskets_to_drop_variant) %>%\n mutate(\n SMQ = tern::fct_discard(SMQ, discard = baskets_to_drop_variant)\n )\n\n\n\n\n\nCodecriteria_fun <- function(tr) !is(tr, \"ContentRow\") && all_zero_or_na(tr)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\"\n )\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = -1L,\n drop = FALSE\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt,\n df = adae_smq_1,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = cont_n_allcols) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\nStandardized MedDRA Query ARM A ARM B ARM C \n Dictionary-Derived Term (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 72 (53.7%) 79 (59.0%) 75 (56.8%)\nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 72 (53.7%) 79 (59.0%) 75 (56.8%)\n Total number of events 119 139 141 \n dcd B.2.2.3.1 48 (35.8%) 54 (40.3%) 51 (38.6%)\n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%)\n\n\n\n\n\nCodecriteria_fun <- function(tr) {\n !is(tr, \"ContentRow\") && all_zero_or_na(tr) && !grepl(\"Total number of\", obj_label(tr))\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\"\n )\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n ),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n drop = FALSE\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nscore_ae_pts <- function(tt) {\n count_vals <- cell_values(tree_children(tt)[[\"USUBJID\"]])[[1]]\n sum(matrix(unlist(count_vals), nrow = length(count_vals), byrow = TRUE)[, 1])\n}\n\nresult <- build_table(\n lyt,\n df = adae_smq_all,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = score_ae_pts) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\nStandardized MedDRA Query ARM A ARM B ARM C \n Dictionary-Derived Term (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 95 (70.9%) 103 (76.9%) 108 (81.8%)\nD.2.1.5.3/A.1.1.1.1 AESI \n Total number of patients with at least one adverse event 74 (55.2%) 80 (59.7%) 87 (65.9%) \n Total number of events 126 134 162 \n dcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%) \n dcd A.1.1.1.1 50 (37.3%) 45 (33.6%) 63 (47.7%) \nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 72 (53.7%) 79 (59.0%) 75 (56.8%) \n Total number of events 119 139 141 \n dcd B.2.2.3.1 48 (35.8%) 54 (40.3%) 51 (38.6%) \n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%) \nnon observed SMQ02NAM level(BROAD) \n Total number of patients with at least one adverse event 0 0 0 \n Total number of events 0 0 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAE <- data[[\"ADAE\"]]\nnames_baskets <- grep(\"^(SMQ|CQ).*NAM$\", names(ADAE), value = TRUE)\nnames_scopes <- grep(\"^SMQ.*SC$\", names(ADAE), value = TRUE)\n\ncs_baskets <- choices_selected(\n choices = variable_choices(ADAE, subset = names_baskets),\n selected = names_baskets\n)\ncs_scopes <- choices_selected(\n choices = variable_choices(ADAE, subset = names_scopes),\n selected = names_scopes,\n fixed = TRUE\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_smq(\n label = \"Adverse events by `SMQ` Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"SEX\")),\n selected = \"ARM\"\n ),\n add_total = FALSE,\n baskets = cs_baskets,\n scopes = cs_scopes,\n llt = choices_selected(\n choices = variable_choices(ADAE, subset = c(\"AEDECOD\")),\n selected = \"AEDECOD\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:45:32 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 stringr_1.5.1 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable with Fill-In of Treatment Groups without Deaths\nteal App\nReproducibility\n\n\n\nFor illustrative purposes, we will pre-process AESDTH in ADAE so there are no deaths in arm A and concatenate AEBODSYS and AEDECOD as per GDSR output standards for AET07.\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nadae_f <- adae %>%\n mutate(\n AESDTH = as.character(AESDTH), # characterizing AESDTH for next step\n AESDTH = case_when(\n ARM == \"A: Drug X\" ~ NA_character_, # For demonstration purpose only,\n TRUE ~ AESDTH\n ), # make \"A: Drug X\" as the arm without AE leading to death\n AESDTH = as.factor(AESDTH),\n SOC_PT = factor(paste(AEBODSYS, \"/\", AEDECOD))\n ) %>%\n filter(AESDTH == \"Y\") %>%\n mutate(ARM = droplevels(ARM))\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", split_fun = drop_split_levels) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = \"unique\",\n .labels = c(unique = \"Total number of deaths\"),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(\n vars = \"SOC_PT\"\n ) %>%\n append_topleft(\"MedDRA SOC and Preferred Term\")\n\nresult <- build_table(\n lyt = lyt,\n df = adae_f,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = \"SOC_PT\",\n scorefun = score_occurrences,\n decreasing = TRUE\n )\n\nresult\n\n B: Placebo C: Combination\nMedDRA SOC and Preferred Term (N=134) (N=132) \n———————————————————————————————————————————————————————————\nTotal number of deaths 70 (52.2%) 75 (56.8%) \ncl D.1 / dcd D.1.1.1.1 42 (31.3%) 51 (38.6%) \ncl B.1 / dcd B.1.1.1.1 49 (36.6%) 43 (32.6%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = \"unique\",\n .labels = c(unique = \"Total number of deaths\"),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(\n vars = \"SOC_PT\"\n ) %>%\n append_topleft(\"MedDRA SOC and Preferred Term\")\n\nresult <- build_table(\n lyt = lyt,\n df = adae_f,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = \"SOC_PT\",\n scorefun = score_occurrences,\n decreasing = TRUE\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination\nMedDRA SOC and Preferred Term (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————\nTotal number of deaths 0 70 (52.2%) 75 (56.8%) \ncl D.1 / dcd D.1.1.1.1 0 42 (31.3%) 51 (38.6%) \ncl B.1 / dcd B.1.1.1.1 0 49 (36.6%) 43 (32.6%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAE <- df_explicit_na(ADAE)\n\n ADSL <- ADSL %>%\n mutate(\n DTHFL = case_when(\n !is.na(DTHDT) ~ \"Y\",\n TRUE ~ \"\"\n )\n ) %>%\n col_relabel(\n DTHFL = \"Subject Death Flag\"\n )\n\n ADAE <- ADAE %>%\n mutate(\n AESDTH = as.character(AESDTH), # characterizing AESDTH for next step\n AESDTH = case_when(\n ARM == \"A: Drug X\" ~ NA_character_, # For demonstration purpose only,\n TRUE ~ AESDTH\n ), # make \"A: Drug X\" as the arm without AE leading to death\n AESDTH = as.factor(AESDTH),\n SOC_PT = factor(paste(AEBODSYS, \"/\", AEDECOD))\n ) %>%\n filter(AESDTH == \"Y\") %>%\n mutate(ARM = droplevels(ARM)) %>%\n col_relabel(SOC_PT = \"MedDRA SOC and Preferred Term\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Adverse Event Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\", \"SOC_PT\")),\n selected = c(\"SOC_PT\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\", \"SOC_PT\")),\n selected = NULL\n ),\n add_total = FALSE,\n event_type = \"adverse event\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:44:11 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", - "AET02_SMQ" + "AET07" ] }, { - "objectID": "tables/adverse-events/aet05.html", - "href": "tables/adverse-events/aet05.html", - "title": "AET05", + "objectID": "tables/adverse-events/aet06_smq.html", + "href": "tables/adverse-events/aet06_smq.html", + "title": "AET06_SMQ", "section": "", - "text": "Data Setup\nStandard Table\nTable Setting Type of Confidence Interval\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadaette <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadaette <- df_explicit_na(adaette)\n\nanl <- adaette %>%\n dplyr::filter(PARAM == \"Time to first occurrence of any adverse event\") %>%\n dplyr::mutate(is_event = CNSR == 0) %>%\n dplyr::mutate(n_events = as.integer(is_event))\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n estimate_incidence_rate(\n vars = \"AVAL\",\n n_events = \"n_events\",\n control = control_incidence_rate(num_pt_year = 100)\n )\n\nresult <- build_table(lyt, anl, alt_counts_df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nTotal patient-years at risk 162.4 103.9 172.6 \nNumber of adverse events observed 78 104 67 \nAE rate per 100 patient-years 48.03 100.14 38.82 \n95% CI (37.37, 58.69) (80.89, 119.38) (29.53, 48.12)\n\n\n\n\nThe type of confidence interval can be specified through the conf_type argument.\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n estimate_incidence_rate(\n vars = \"AVAL\",\n n_events = \"n_events\",\n control = control_incidence_rate(\n conf_level = 0.95,\n conf_type = \"exact\",\n num_pt_year = 100\n )\n )\n\nresult <- build_table(lyt, anl, alt_counts_df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nTotal patient-years at risk 162.4 103.9 172.6 \nNumber of adverse events observed 78 104 67 \nAE rate per 100 patient-years 48.03 100.14 38.82 \n95% CI (37.97, 59.94) (81.82, 121.34) (30.09, 49.30)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAETTE <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAETTE <- df_explicit_na(ADAETTE)\n\n ADAETTE <- ADAETTE %>%\n filter(PARAMCD %in% c(\"AETTE1\", \"AETTE2\", \"AETTE3\")) %>%\n mutate(is_event = CNSR == 0) %>%\n mutate(n_events = as.integer(is_event))\n})\ndatanames <- c(\"ADSL\", \"ADAETTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAETTE <- data[[\"ADAETTE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_patyear(\n label = \"AE rate adjusted for patient-years at risk Table\",\n dataname = \"ADAETTE\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARMCD\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADAETTE, \"PARAMCD\", \"PARAM\"),\n selected = \"AETTE1\"\n ),\n events_var = choices_selected(\n choices = variable_choices(ADAETTE, \"n_events\"),\n selected = \"n_events\",\n fixed = TRUE\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:45:01 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 scda_0.1.6.9017 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nAdverse Events by Sex, by SMQ and Preferred Term\nAdverse Events by Sex, by SMQ and Preferred Term (with Customized Queries)\nAdverse Events by Other Baseline Characteristics (e.g. Age Group)\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\nlibrary(stringr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nadsl_labels <- var_labels(adsl)\nadae_labels <- var_labels(adae)\n\nadsl <- adsl %>%\n mutate(\n AGE65 = case_when(\n AGE >= 65 ~ \">= 65\",\n TRUE ~ \"< 65\"\n ),\n AGE65 = factor(\n AGE65,\n levels = c(\"< 65\", \">= 65\")\n )\n )\n\nadae <- adae %>%\n mutate(\n AGE65 = case_when(\n AGE >= 65 ~ \">= 65\",\n TRUE ~ \"< 65\"\n ),\n AGE65 = factor(\n AGE65,\n levels = c(\"< 65\", \">= 65\")\n )\n )\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing\n# levels. For details, refer to Teal and Study Data article.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\n# Simulate a random AAG dataset.\naag <- data.frame(\n NAMVAR = c(\"SMQ01NAM\", \"SMQ01NAM\", \"SMQ02NAM\", \"CQ01NAM\", \"CQ01NAM\"),\n SRCVAR = rep(\"AEDECOD\", 5),\n GRPTYPE = c(\"SMQ\", \"SMQ\", \"SMQ\", \"CUSTOM\", \"CUSTOM\"),\n REFID = c(1, 1, 2, 3, 3),\n REFNAME = c(rep(\"C.1.1.1.3/B.2.2.3.1 AESI\", 2), \"non observed SMQ02NAM level\", rep(\"D.2.1.5.3/A.1.1.1.1 AESI\", 2)),\n SCOPE = c(\"BROAD\", \"BROAD\", \"BROAD\", \"\", \"\"),\n REFTERM = c(\"C.1.1.1.3\", \"B.2.2.3.1\", \"Z.9.9.9.9\", \"D.2.1.5.3\", \"A.1.1.1.1\"),\n stringsAsFactors = FALSE\n)\n\n# Create summary AAG dataset (used for labelling).\n# Note it's important to incorporate SCOPE into the basket names for SMQs so as to\n# match the flags present in ADAE.\naag_summary <- aag %>%\n select(NAMVAR, REFNAME, SCOPE) %>%\n unique() %>%\n mutate(\n REFNAME_SCOPE = ifelse(SCOPE == \"\", REFNAME, paste0(REFNAME, \"(\", SCOPE, \")\"))\n ) %>%\n rename(basket = NAMVAR, basket_name = REFNAME_SCOPE) %>%\n select(basket, basket_name)\n\n# Make a summary of the full ADAE based on AAG by using h_stack_by_baskets helper function\nadae_smq_all <- h_stack_by_baskets(\n df = adae,\n aag_summary = aag_summary,\n keys = c(\"STUDYID\", \"USUBJID\", \"ACTARMCD\", \"AEDECOD\", \"SEX\", \"AGE65\")\n)\n# Post-process adae_smq_all to keep only certain baskets of interest for variant 1\n# Not need to drop baskets for variant 2 as all baskets will be considered.\nbaskets_to_drop_variant <- aag_summary$basket_name[!aag_summary$basket %in% c(\"SMQ01NAM\")]\n\n# Adjust the analysis dataset based on basket subset for variant 1.\nadae_smq_1 <- adae_smq_all %>%\n filter(!adae_smq_all$SMQ %in% baskets_to_drop_variant) %>%\n mutate(\n SMQ = tern::fct_discard(SMQ, discard = baskets_to_drop_variant)\n )\n\n\n\n\n\nCodecriteria_fun <- function(tr) !is(tr, \"ContentRow\") && all_zero_or_na(tr)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_cols_by(\"SEX\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(unique = \"Total number of patients with at least one adverse event\")\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", drop = FALSE) %>%\n append_varlabels(adae_smq_1, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae_smq_1,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = cont_n_allcols) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\n ARM A ARM B ARM C \nStandardized MedDRA Query F M F M F M \n Dictionary-Derived Term (N=79) (N=55) (N=82) (N=52) (N=70) (N=62) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 47 (59.5%) 25 (45.5%) 51 (62.2%) 28 (53.8%) 42 (60.0%) 33 (53.2%)\nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 47 (59.5%) 25 (45.5%) 51 (62.2%) 28 (53.8%) 42 (60.0%) 33 (53.2%)\n Total number of events 79 40 95 44 81 60 \n dcd B.2.2.3.1 30 (38.0%) 18 (32.7%) 32 (39.0%) 22 (42.3%) 26 (37.1%) 25 (40.3%)\n dcd C.1.1.1.3 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n\n\n\n\n\nCodecriteria_fun <- function(tr) {\n !is(tr, \"ContentRow\") && all_zero_or_na(tr) && !grepl(\"Total number of\", obj_label(tr))\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_cols_by(\"SEX\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(unique = \"Total number of patients with at least one adverse event\")\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n ),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(vars = \"AEDECOD\", drop = FALSE) %>%\n append_varlabels(adae_smq_all, \"AEDECOD\", indent = 1L)\n\nscore_ae_pts <- function(tt) {\n count_vals <- cell_values(tree_children(tt)[[\"USUBJID\"]])[[1]]\n sum(matrix(unlist(count_vals), nrow = length(count_vals), byrow = TRUE)[, 1])\n}\n\nresult <- build_table(\n lyt = lyt,\n df = adae_smq_all,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = score_ae_pts) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\n ARM A ARM B ARM C \nStandardized MedDRA Query F M F M F M \n Dictionary-Derived Term (N=79) (N=55) (N=82) (N=52) (N=70) (N=62) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 59 (74.7%) 36 (65.5%) 68 (82.9%) 35 (67.3%) 61 (87.1%) 47 (75.8%)\nD.2.1.5.3/A.1.1.1.1 AESI \n Total number of patients with at least one adverse event 45 (57.0%) 29 (52.7%) 54 (65.9%) 26 (50.0%) 50 (71.4%) 37 (59.7%)\n Total number of events 78 48 91 43 88 74 \n dcd D.2.1.5.3 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\n dcd A.1.1.1.1 34 (43.0%) 16 (29.1%) 31 (37.8%) 14 (26.9%) 33 (47.1%) 30 (48.4%)\nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 47 (59.5%) 25 (45.5%) 51 (62.2%) 28 (53.8%) 42 (60.0%) 33 (53.2%)\n Total number of events 79 40 95 44 81 60 \n dcd B.2.2.3.1 30 (38.0%) 18 (32.7%) 32 (39.0%) 22 (42.3%) 26 (37.1%) 25 (40.3%)\n dcd C.1.1.1.3 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\nnon observed SMQ02NAM level(BROAD) \n Total number of patients with at least one adverse event 0 0 0 0 0 0 \n Total number of events 0 0 0 0 0 0 \n\n\n\n\n\nCodecriteria_fun <- function(tr) !is(tr, \"ContentRow\") && all_zero_or_na(tr)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_cols_by(\"AGE65\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(unique = \"Total number of patients with at least one adverse event\")\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", drop = FALSE) %>%\n append_varlabels(adae_smq_1, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae_smq_1,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = cont_n_allcols) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\n ARM A ARM B ARM C \nStandardized MedDRA Query < 65 >= 65 < 65 >= 65 < 65 >= 65\n Dictionary-Derived Term (N=134) (N=0) (N=134) (N=0) (N=131) (N=1)\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 72 (53.7%) 0 79 (59.0%) 0 75 (57.3%) 0 \nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 72 (53.7%) 0 79 (59.0%) 0 75 (57.3%) 0 \n Total number of events 119 0 139 0 141 0 \n dcd B.2.2.3.1 48 (35.8%) 0 54 (40.3%) 0 51 (38.9%) 0 \n dcd C.1.1.1.3 43 (32.1%) 0 46 (34.3%) 0 43 (32.8%) 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>%\n mutate(\n AGE65 = case_when(\n AGE >= 65 ~ \">= 65\",\n TRUE ~ \"< 65\"\n ),\n AGE65 = factor(\n AGE65,\n levels = c(\"< 65\", \">= 65\")\n )\n )\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\") %>%\n mutate(\n AGE65 = case_when(\n AGE >= 65 ~ \">= 65\",\n TRUE ~ \"< 65\"\n ),\n AGE65 = factor(\n AGE65,\n levels = c(\"< 65\", \">= 65\")\n )\n )\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAE <- data[[\"ADAE\"]]\n\nnames_baskets <- grep(\"^(SMQ|CQ).*NAM$\", names(ADAE), value = TRUE)\nnames_scopes <- grep(\"^SMQ.*SC$\", names(ADAE), value = TRUE)\n\ncs_baskets <- choices_selected(\n choices = variable_choices(ADAE, subset = names_baskets),\n selected = names_baskets\n)\ncs_scopes <- choices_selected(\n choices = variable_choices(ADAE, subset = names_scopes),\n selected = names_scopes,\n fixed = TRUE\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_smq(\n label = \"Adverse events by `SMQ` Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"SEX\", \"AGE65\")),\n selected = c(\"ARM\", \"SEX\")\n ),\n add_total = FALSE,\n baskets = cs_baskets,\n scopes = cs_scopes,\n llt = choices_selected(\n choices = variable_choices(ADAE, subset = c(\"AEDECOD\")),\n selected = \"AEDECOD\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:43:39 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 stringr_1.5.1 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", - "AET05" + "AET06_SMQ" ] }, { - "objectID": "tables/adverse-events/aet09.html", - "href": "tables/adverse-events/aet09.html", - "title": "AET09", + "objectID": "tables/adverse-events/aet05_all.html", + "href": "tables/adverse-events/aet05_all.html", + "title": "AET05_ALL", "section": "", - "text": "Data Setup\nStandard Table\nTable Including High-Level Terms\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nadae_labels <- var_labels(adae)\n\nadae_f <- adae %>%\n filter(AEREL == \"Y\")\n\nvar_labels(adae_f) <- adae_labels\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event related to study drug\",\n nonunique = \"Overall total number of events related to study drug\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae_f$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event related to study drug\",\n nonunique = \"Total number of events related to study drug\"\n )\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = -1L\n ) %>%\n append_varlabels(adae_f, \"AEDECOD\", indent = 1L)\n\ntbl1 <- build_table(\n lyt = lyt,\n df = adae_f,\n alt_counts_df = adsl\n) %>%\n prune_table()\n\nresult <- tbl1 %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nBody System or Organ Class A: Drug X B: Placebo C: Combination All Patients\n Dictionary-Derived Term (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event related to study drug 105 (78.4%) 108 (80.6%) 109 (82.6%) 322 (80.5%) \nOverall total number of events related to study drug 282 299 336 917 \ncl D.2 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 58 (43.3%) 57 (43.2%) 162 (40.5%) \n Total number of events related to study drug 62 72 74 208 \n dcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%) 162 (40.5%) \ncl D.1 \n Total number of patients with at least one adverse event related to study drug 50 (37.3%) 42 (31.3%) 51 (38.6%) 143 (35.8%) \n Total number of events related to study drug 61 51 71 183 \n dcd D.1.1.1.1 50 (37.3%) 42 (31.3%) 51 (38.6%) 143 (35.8%) \ncl B.1 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 49 (36.6%) 43 (32.6%) 139 (34.8%) \n Total number of events related to study drug 56 60 62 178 \n dcd B.1.1.1.1 47 (35.1%) 49 (36.6%) 43 (32.6%) 139 (34.8%) \ncl C.2 \n Total number of patients with at least one adverse event related to study drug 35 (26.1%) 48 (35.8%) 55 (41.7%) 138 (34.5%) \n Total number of events related to study drug 48 53 65 166 \n dcd C.2.1.2.1 35 (26.1%) 48 (35.8%) 55 (41.7%) 138 (34.5%) \ncl C.1 \n Total number of patients with at least one adverse event related to study drug 43 (32.1%) 46 (34.3%) 43 (32.6%) 132 (33.0%) \n Total number of events related to study drug 55 63 64 182 \n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%) 132 (33.0%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event related to study drug\",\n nonunique = \"Overall total number of events related to study drug\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n indent_mod = 1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae_f$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event related to study drug\",\n nonunique = \"Total number of events related to study drug\"\n )\n ) %>%\n split_rows_by(\n \"AEHLT\",\n child_labels = \"visible\",\n nested = TRUE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae_f$AEHLT)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event related to study drug\",\n nonunique = \"Total number of events related to study drug\"\n )\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = -1L\n ) %>%\n append_varlabels(adae_f, c(\"AEDECOD\"), indent = 2L)\n\ntbl2 <- build_table(\n lyt = lyt,\n df = adae_f,\n alt_counts_df = adsl\n) %>%\n prune_table()\n\nresult <- tbl2 %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nBody System or Organ Class \n High Level Term A: Drug X B: Placebo C: Combination\n Dictionary-Derived Term (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event related to study drug 105 (78.4%) 108 (80.6%) 109 (82.6%) \nOverall total number of events related to study drug 282 299 336 \n cl D.2 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 58 (43.3%) 57 (43.2%) \n Total number of events related to study drug 62 72 74 \n hlt D.2.1.5 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 58 (43.3%) 57 (43.2%) \n Total number of events related to study drug 62 72 74 \n dcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%) \n cl D.1 \n Total number of patients with at least one adverse event related to study drug 50 (37.3%) 42 (31.3%) 51 (38.6%) \n Total number of events related to study drug 61 51 71 \n hlt D.1.1.1 \n Total number of patients with at least one adverse event related to study drug 50 (37.3%) 42 (31.3%) 51 (38.6%) \n Total number of events related to study drug 61 51 71 \n dcd D.1.1.1.1 50 (37.3%) 42 (31.3%) 51 (38.6%) \n cl B.1 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 49 (36.6%) 43 (32.6%) \n Total number of events related to study drug 56 60 62 \n hlt B.1.1.1 \n Total number of patients with at least one adverse event related to study drug 47 (35.1%) 49 (36.6%) 43 (32.6%) \n Total number of events related to study drug 56 60 62 \n dcd B.1.1.1.1 47 (35.1%) 49 (36.6%) 43 (32.6%) \n cl C.2 \n Total number of patients with at least one adverse event related to study drug 35 (26.1%) 48 (35.8%) 55 (41.7%) \n Total number of events related to study drug 48 53 65 \n hlt C.2.1.2 \n Total number of patients with at least one adverse event related to study drug 35 (26.1%) 48 (35.8%) 55 (41.7%) \n Total number of events related to study drug 48 53 65 \n dcd C.2.1.2.1 35 (26.1%) 48 (35.8%) 55 (41.7%) \n cl C.1 \n Total number of patients with at least one adverse event related to study drug 43 (32.1%) 46 (34.3%) 43 (32.6%) \n Total number of events related to study drug 55 63 64 \n hlt C.1.1.1 \n Total number of patients with at least one adverse event related to study drug 43 (32.1%) 46 (34.3%) 43 (32.6%) \n Total number of events related to study drug 55 63 64 \n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAE <- df_explicit_na(ADAE)\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Adverse Events Related to Study Drug\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AEHLT\")),\n selected = c(\"AEBODSYS\")\n ),\n add_total = FALSE,\n event_type = \"adverse event related to study drug\", # define event type here\n )\n ),\n filter = teal_slices(teal_slice(\"ADAE\", \"AEREL\", selected = \"Y\")) # related AEs only\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:44:31 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Setting Type of Confidence Interval\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadaette <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadaette <- df_explicit_na(adaette)\n\n# Create analysis dataset anl from the 2 parameters AEREPTTE & AETOT1\nanl_events <- adaette %>%\n filter(PARAMCD == \"AETOT1\") %>%\n select(USUBJID, ARM, ARMCD, n_events = AVAL) %>%\n mutate(n_events = as.integer(n_events))\n\nanl_tte <- adaette %>%\n filter(PARAMCD == \"AEREPTTE\") %>%\n select(USUBJID, ARM, ARMCD, AVAL)\n\nanl <- full_join(anl_tte, anl_events, by = c(\"USUBJID\", \"ARM\", \"ARMCD\"))\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n estimate_incidence_rate(\n vars = \"AVAL\",\n n_events = \"n_events\",\n control = control_incidence_rate(num_pt_year = 100)\n )\n\nresult <- build_table(lyt, anl, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————\nTotal patient-years at risk 337.9 331.8 341.6 \nNumber of adverse events observed 343 380 397 \nAE rate per 100 patient-years 101.51 114.51 116.22 \n95% CI (90.77, 112.25) (103.00, 126.02) (104.79, 127.65)\n\n\n\n\nThe type of confidence interval can be specified through the conf_type argument.\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n estimate_incidence_rate(\n vars = \"AVAL\",\n n_events = \"n_events\",\n control = control_incidence_rate(conf_type = \"exact\", num_pt_year = 100)\n )\n\nresult <- build_table(lyt, anl, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————\nTotal patient-years at risk 337.9 331.8 341.6 \nNumber of adverse events observed 343 380 397 \nAE rate per 100 patient-years 101.51 114.51 116.22 \n95% CI (91.05, 112.84) (103.28, 126.62) (105.07, 128.24)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAETTE <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAETTE <- df_explicit_na(ADAETTE)\n\n # Create analysis dataset anl from the 2 parameters AEREPTTE & AETOT1\n anl_events <- ADAETTE %>%\n filter(PARAMCD %in% c(\"AETOT1\", \"AETOT2\", \"AETOT3\")) %>%\n select(USUBJID, STUDYID, PARAMCD, ARM, ARMCD, n_events = AVAL) %>%\n mutate(n_events = as.integer(n_events))\n\n anl_tte <- ADAETTE %>%\n filter(PARAMCD == \"AEREPTTE\") %>%\n select(USUBJID, STUDYID, ARM, ARMCD, AVAL, AVALU)\n\n ADAETTE <- full_join(anl_tte, anl_events, by = c(\"USUBJID\", \"STUDYID\", \"ARM\", \"ARMCD\"))\n})\ndatanames <- c(\"ADSL\", \"ADAETTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAETTE <- data[[\"ADAETTE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_patyear(\n label = \"AE Rate Adjusted for Patient-Years at Risk - All Occurrences Table\",\n dataname = \"ADAETTE\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARMCD\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADAETTE, \"PARAMCD\"),\n selected = \"AETOT1\"\n ),\n events_var = choices_selected(\n choices = variable_choices(ADAETTE, \"n_events\"),\n selected = \"n_events\",\n fixed = TRUE\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:43:00 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", - "AET09" + "AET05_ALL" ] }, { @@ -564,7 +578,7 @@ "href": "tables/adverse-events/aet06.html", "title": "AET06", "section": "", - "text": "Data Setup\nAdverse Events by Sex\nAdverse Events by Other Baseline Characteristics (e.g. Biomarker Group)\nAdverse Events by Baseline Characteristic from ADSUB (e.g. BMI Category)\nAdverse Events by Regrouped Baseline Characteristics (e.g. Race)\nAdverse Events by Baseline Characteristics (e.g. Sex) Including High-Level Terms\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\nadsub <- synthetic_cdisc_dataset(\"latest\", \"adsub\")\n\nadsub_bmi <- adsub %>%\n filter(PARAMCD == \"BBMISI\") %>%\n select(STUDYID, USUBJID, AVALCAT1) %>%\n mutate(\n AVALCAT1 = factor(AVALCAT1, levels = c(\"<18.5\", \"18.5 - 24.9\", \"25 - 29.9\", \">30\"))\n )\n\nadsl <- adsl %>%\n mutate(\n RACE1 = case_when(\n RACE == \"WHITE\" ~ \"WHITE\",\n TRUE ~ \"NON-WHITE\"\n ),\n RACE1 = factor(\n RACE1,\n levels = c(\"WHITE\", \"NON-WHITE\")\n )\n ) %>%\n left_join(\n y = adsub_bmi,\n by = c(\"STUDYID\", \"USUBJID\")\n )\n\nadae_labels <- var_labels(adae)\n\nadae <- adae %>%\n mutate(\n RACE1 = case_when(\n RACE == \"WHITE\" ~ \"WHITE\",\n TRUE ~ \"NON-WHITE\"\n ),\n RACE1 = factor(\n RACE1,\n levels = c(\"WHITE\", \"NON-WHITE\")\n )\n ) %>%\n left_join(\n y = adsub_bmi,\n by = c(\"STUDYID\", \"USUBJID\")\n )\n\nvar_labels(adae) <- c(adae_labels, \"RACE1\" = \"RACE WHITE/NON-WHITE\", \"AVALCAT1\" = \"Baseline BMI Category\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\nadsub_bmi <- df_explicit_na(adsub_bmi)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"SEX\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sorted by decreasing frequency across all groups by System Organ Class and Preferred Term.\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination \nBody System or Organ Class F M F M F M \n Dictionary-Derived Term (N=79) (N=55) (N=82) (N=52) (N=70) (N=62) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 72 (91.1%) 50 (90.9%) 77 (93.9%) 46 (88.5%) 65 (92.9%) 55 (88.7%)\nOverall total number of events 377 232 419 203 378 325 \ncl A.1 \n Total number of patients with at least one adverse event 53 (67.1%) 25 (45.5%) 51 (62.2%) 24 (46.2%) 43 (61.4%) 46 (74.2%)\n Total number of events 85 47 93 37 86 74 \n dcd A.1.1.1.1 34 (43.0%) 16 (29.1%) 31 (37.8%) 14 (26.9%) 33 (47.1%) 30 (48.4%)\n dcd A.1.1.1.2 32 (40.5%) 16 (29.1%) 33 (40.2%) 15 (28.8%) 24 (34.3%) 26 (41.9%)\ncl B.2 \n Total number of patients with at least one adverse event 46 (58.2%) 33 (60.0%) 45 (54.9%) 29 (55.8%) 44 (62.9%) 41 (66.1%)\n Total number of events 81 48 86 52 64 79 \n dcd B.2.2.3.1 30 (38.0%) 18 (32.7%) 32 (39.0%) 22 (42.3%) 26 (37.1%) 25 (40.3%)\n dcd B.2.1.2.1 29 (36.7%) 20 (36.4%) 30 (36.6%) 14 (26.9%) 22 (31.4%) 30 (48.4%)\ncl D.1 \n Total number of patients with at least one adverse event 45 (57.0%) 34 (61.8%) 40 (48.8%) 27 (51.9%) 41 (58.6%) 39 (62.9%)\n Total number of events 72 55 64 42 73 62 \n dcd D.1.1.1.1 25 (31.6%) 25 (45.5%) 29 (35.4%) 13 (25.0%) 27 (38.6%) 24 (38.7%)\n dcd D.1.1.4.2 30 (38.0%) 18 (32.7%) 22 (26.8%) 20 (38.5%) 27 (38.6%) 23 (37.1%)\ncl D.2 \n Total number of patients with at least one adverse event 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\n Total number of events 35 27 49 23 43 31 \n dcd D.2.1.5.3 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\ncl B.1 \n Total number of patients with at least one adverse event 28 (35.4%) 19 (34.5%) 33 (40.2%) 16 (30.8%) 24 (34.3%) 19 (30.6%)\n Total number of events 33 23 36 24 35 27 \n dcd B.1.1.1.1 28 (35.4%) 19 (34.5%) 33 (40.2%) 16 (30.8%) 24 (34.3%) 19 (30.6%)\ncl C.2 \n Total number of patients with at least one adverse event 23 (29.1%) 12 (21.8%) 36 (43.9%) 12 (23.1%) 30 (42.9%) 25 (40.3%)\n Total number of events 32 16 39 14 33 32 \n dcd C.2.1.2.1 23 (29.1%) 12 (21.8%) 36 (43.9%) 12 (23.1%) 30 (42.9%) 25 (40.3%)\ncl C.1 \n Total number of patients with at least one adverse event 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n Total number of events 39 16 52 11 44 20 \n dcd C.1.1.1.3 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"BMRKR2\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sorted by decreasing frequency across all groups by System Organ Class and Preferred Term.\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination \nBody System or Organ Class LOW MEDIUM HIGH LOW MEDIUM HIGH LOW MEDIUM HIGH \n Dictionary-Derived Term (N=50) (N=37) (N=47) (N=45) (N=56) (N=33) (N=40) (N=42) (N=50) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 46 (92.0%) 34 (91.9%) 42 (89.4%) 40 (88.9%) 53 (94.6%) 30 (90.9%) 36 (90.0%) 39 (92.9%) 45 (90.0%)\nOverall total number of events 248 166 195 196 261 165 220 258 225 \ncl A.1 \n Total number of patients with at least one adverse event 31 (62.0%) 19 (51.4%) 28 (59.6%) 25 (55.6%) 31 (55.4%) 19 (57.6%) 28 (70.0%) 30 (71.4%) 31 (62.0%)\n Total number of events 53 34 45 46 54 30 61 51 48 \n dcd A.1.1.1.1 22 (44.0%) 10 (27.0%) 18 (38.3%) 14 (31.1%) 20 (35.7%) 11 (33.3%) 21 (52.5%) 24 (57.1%) 18 (36.0%)\n dcd A.1.1.1.2 17 (34.0%) 13 (35.1%) 18 (38.3%) 18 (40.0%) 18 (32.1%) 12 (36.4%) 18 (45.0%) 14 (33.3%) 18 (36.0%)\ncl B.2 \n Total number of patients with at least one adverse event 34 (68.0%) 21 (56.8%) 24 (51.1%) 23 (51.1%) 33 (58.9%) 18 (54.5%) 24 (60.0%) 27 (64.3%) 34 (68.0%)\n Total number of events 53 37 39 40 61 37 40 47 56 \n dcd B.2.2.3.1 21 (42.0%) 13 (35.1%) 14 (29.8%) 18 (40.0%) 22 (39.3%) 14 (42.4%) 16 (40.0%) 15 (35.7%) 20 (40.0%)\n dcd B.2.1.2.1 21 (42.0%) 11 (29.7%) 17 (36.2%) 11 (24.4%) 21 (37.5%) 12 (36.4%) 13 (32.5%) 17 (40.5%) 22 (44.0%)\ncl D.1 \n Total number of patients with at least one adverse event 34 (68.0%) 21 (56.8%) 24 (51.1%) 18 (40.0%) 33 (58.9%) 16 (48.5%) 25 (62.5%) 31 (73.8%) 24 (48.0%)\n Total number of events 51 35 41 27 49 30 45 53 37 \n dcd D.1.1.1.1 19 (38.0%) 16 (43.2%) 15 (31.9%) 13 (28.9%) 19 (33.9%) 10 (30.3%) 14 (35.0%) 22 (52.4%) 15 (30.0%)\n dcd D.1.1.4.2 21 (42.0%) 9 (24.3%) 18 (38.3%) 9 (20.0%) 20 (35.7%) 13 (39.4%) 17 (42.5%) 18 (42.9%) 15 (30.0%)\ncl D.2 \n Total number of patients with at least one adverse event 20 (40.0%) 12 (32.4%) 15 (31.9%) 19 (42.2%) 22 (39.3%) 17 (51.5%) 13 (32.5%) 23 (54.8%) 21 (42.0%)\n Total number of events 27 13 22 23 26 23 17 33 24 \n dcd D.2.1.5.3 20 (40.0%) 12 (32.4%) 15 (31.9%) 19 (42.2%) 22 (39.3%) 17 (51.5%) 13 (32.5%) 23 (54.8%) 21 (42.0%)\ncl B.1 \n Total number of patients with at least one adverse event 14 (28.0%) 14 (37.8%) 19 (40.4%) 15 (33.3%) 24 (42.9%) 10 (30.3%) 14 (35.0%) 15 (35.7%) 14 (28.0%)\n Total number of events 16 19 21 18 25 17 19 25 18 \n dcd B.1.1.1.1 14 (28.0%) 14 (37.8%) 19 (40.4%) 15 (33.3%) 24 (42.9%) 10 (30.3%) 14 (35.0%) 15 (35.7%) 14 (28.0%)\ncl C.2 \n Total number of patients with at least one adverse event 18 (36.0%) 8 (21.6%) 9 (19.1%) 15 (33.3%) 22 (39.3%) 11 (33.3%) 18 (45.0%) 17 (40.5%) 20 (40.0%)\n Total number of events 27 9 12 18 23 12 20 20 25 \n dcd C.2.1.2.1 18 (36.0%) 8 (21.6%) 9 (19.1%) 15 (33.3%) 22 (39.3%) 11 (33.3%) 18 (45.0%) 17 (40.5%) 20 (40.0%)\ncl C.1 \n Total number of patients with at least one adverse event 17 (34.0%) 14 (37.8%) 12 (25.5%) 17 (37.8%) 17 (30.4%) 12 (36.4%) 12 (30.0%) 17 (40.5%) 14 (28.0%)\n Total number of events 21 19 15 24 23 16 18 29 17 \n dcd C.1.1.1.3 17 (34.0%) 14 (37.8%) 12 (25.5%) 17 (37.8%) 17 (30.4%) 12 (36.4%) 12 (30.0%) 17 (40.5%) 14 (28.0%)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"AVALCAT1\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sorted by decreasing frequency across all groups by System Organ Class and Preferred Term.\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination \nBody System or Organ Class <18.5 18.5 - 24.9 25 - 29.9 >30 <18.5 18.5 - 24.9 25 - 29.9 >30 <18.5 18.5 - 24.9 25 - 29.9 >30 \n Dictionary-Derived Term (N=44) (N=17) (N=11) (N=62) (N=37) (N=18) (N=10) (N=69) (N=28) (N=20) (N=18) (N=66) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 41 (93.2%) 14 (82.4%) 11 (100%) 56 (90.3%) 35 (94.6%) 16 (88.9%) 9 (90.0%) 63 (91.3%) 25 (89.3%) 19 (95.0%) 15 (83.3%) 61 (92.4%)\nOverall total number of events 186 80 66 277 174 89 47 312 137 129 100 337 \ncl A.1 \n Total number of patients with at least one adverse event 23 (52.3%) 12 (70.6%) 7 (63.6%) 36 (58.1%) 19 (51.4%) 10 (55.6%) 6 (60.0%) 40 (58.0%) 16 (57.1%) 13 (65.0%) 14 (77.8%) 46 (69.7%)\n Total number of events 38 22 13 59 35 22 6 67 30 23 30 77 \n dcd A.1.1.1.1 14 (31.8%) 7 (41.2%) 3 (27.3%) 26 (41.9%) 12 (32.4%) 6 (33.3%) 4 (40.0%) 23 (33.3%) 12 (42.9%) 7 (35.0%) 13 (72.2%) 31 (47.0%)\n dcd A.1.1.1.2 15 (34.1%) 8 (47.1%) 5 (45.5%) 20 (32.3%) 12 (32.4%) 8 (44.4%) 2 (20.0%) 26 (37.7%) 9 (32.1%) 7 (35.0%) 7 (38.9%) 27 (40.9%)\ncl B.2 \n Total number of patients with at least one adverse event 23 (52.3%) 10 (58.8%) 8 (72.7%) 38 (61.3%) 21 (56.8%) 8 (44.4%) 7 (70.0%) 38 (55.1%) 16 (57.1%) 16 (80.0%) 12 (66.7%) 41 (62.1%)\n Total number of events 37 19 12 61 41 18 12 67 28 28 18 69 \n dcd B.2.2.3.1 13 (29.5%) 7 (41.2%) 6 (54.5%) 22 (35.5%) 14 (37.8%) 7 (38.9%) 6 (60.0%) 27 (39.1%) 7 (25.0%) 13 (65.0%) 5 (27.8%) 26 (39.4%)\n dcd B.2.1.2.1 14 (31.8%) 8 (47.1%) 4 (36.4%) 23 (37.1%) 14 (37.8%) 6 (33.3%) 4 (40.0%) 20 (29.0%) 13 (46.4%) 8 (40.0%) 8 (44.4%) 23 (34.8%)\ncl D.1 \n Total number of patients with at least one adverse event 24 (54.5%) 9 (52.9%) 8 (72.7%) 38 (61.3%) 18 (48.6%) 5 (27.8%) 7 (70.0%) 37 (53.6%) 15 (53.6%) 12 (60.0%) 11 (61.1%) 42 (63.6%)\n Total number of events 38 11 17 61 30 11 14 51 30 23 16 66 \n dcd D.1.1.1.1 13 (29.5%) 7 (41.2%) 7 (63.6%) 23 (37.1%) 13 (35.1%) 3 (16.7%) 4 (40.0%) 22 (31.9%) 12 (42.9%) 6 (30.0%) 8 (44.4%) 25 (37.9%)\n dcd D.1.1.4.2 16 (36.4%) 4 (23.5%) 6 (54.5%) 22 (35.5%) 10 (27.0%) 4 (22.2%) 5 (50.0%) 23 (33.3%) 10 (35.7%) 9 (45.0%) 6 (33.3%) 25 (37.9%)\ncl D.2 \n Total number of patients with at least one adverse event 14 (31.8%) 7 (41.2%) 5 (45.5%) 21 (33.9%) 14 (37.8%) 10 (55.6%) 4 (40.0%) 30 (43.5%) 13 (46.4%) 10 (50.0%) 7 (38.9%) 27 (40.9%)\n Total number of events 20 7 10 25 17 14 5 36 18 15 10 31 \n dcd D.2.1.5.3 14 (31.8%) 7 (41.2%) 5 (45.5%) 21 (33.9%) 14 (37.8%) 10 (55.6%) 4 (40.0%) 30 (43.5%) 13 (46.4%) 10 (50.0%) 7 (38.9%) 27 (40.9%)\ncl B.1 \n Total number of patients with at least one adverse event 17 (38.6%) 5 (29.4%) 7 (63.6%) 18 (29.0%) 14 (37.8%) 8 (44.4%) 4 (40.0%) 23 (33.3%) 7 (25.0%) 10 (50.0%) 7 (38.9%) 19 (28.8%)\n Total number of events 22 5 7 22 16 11 4 29 11 12 8 31 \n dcd B.1.1.1.1 17 (38.6%) 5 (29.4%) 7 (63.6%) 18 (29.0%) 14 (37.8%) 8 (44.4%) 4 (40.0%) 23 (33.3%) 7 (25.0%) 10 (50.0%) 7 (38.9%) 19 (28.8%)\ncl C.2 \n Total number of patients with at least one adverse event 14 (31.8%) 4 (23.5%) 2 (18.2%) 15 (24.2%) 15 (40.5%) 5 (27.8%) 4 (40.0%) 24 (34.8%) 10 (35.7%) 13 (65.0%) 8 (44.4%) 24 (36.4%)\n Total number of events 17 9 3 19 15 6 5 27 12 16 9 28 \n dcd C.2.1.2.1 14 (31.8%) 4 (23.5%) 2 (18.2%) 15 (24.2%) 15 (40.5%) 5 (27.8%) 4 (40.0%) 24 (34.8%) 10 (35.7%) 13 (65.0%) 8 (44.4%) 24 (36.4%)\ncl C.1 \n Total number of patients with at least one adverse event 11 (25.0%) 4 (23.5%) 4 (36.4%) 24 (38.7%) 13 (35.1%) 6 (33.3%) 1 (10.0%) 26 (37.7%) 6 (21.4%) 7 (35.0%) 6 (33.3%) 24 (36.4%)\n Total number of events 14 7 4 30 20 7 1 35 8 12 9 35 \n dcd C.1.1.1.3 11 (25.0%) 4 (23.5%) 4 (36.4%) 24 (38.7%) 13 (35.1%) 6 (33.3%) 1 (10.0%) 26 (37.7%) 6 (21.4%) 7 (35.0%) 6 (33.3%) 24 (36.4%)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"RACE1\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n prune_table() %>%\n # Sorted by decreasing frequency across all groups by System Organ Class and Preferred Term.\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination \nBody System or Organ Class WHITE NON-WHITE WHITE NON-WHITE WHITE NON-WHITE \n Dictionary-Derived Term (N=27) (N=107) (N=26) (N=108) (N=21) (N=111) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 26 (96.3%) 96 (89.7%) 25 (96.2%) 98 (90.7%) 21 (100%) 99 (89.2%)\nOverall total number of events 109 500 144 478 114 589 \ncl A.1 \n Total number of patients with at least one adverse event 16 (59.3%) 62 (57.9%) 21 (80.8%) 54 (50.0%) 15 (71.4%) 74 (66.7%)\n Total number of events 30 102 37 93 25 135 \n dcd A.1.1.1.1 9 (33.3%) 41 (38.3%) 14 (53.8%) 31 (28.7%) 10 (47.6%) 53 (47.7%)\n dcd A.1.1.1.2 11 (40.7%) 37 (34.6%) 13 (50.0%) 35 (32.4%) 9 (42.9%) 41 (36.9%)\ncl B.2 \n Total number of patients with at least one adverse event 15 (55.6%) 64 (59.8%) 16 (61.5%) 58 (53.7%) 12 (57.1%) 73 (65.8%)\n Total number of events 18 111 28 110 17 126 \n dcd B.2.2.3.1 4 (14.8%) 44 (41.1%) 10 (38.5%) 44 (40.7%) 5 (23.8%) 46 (41.4%)\n dcd B.2.1.2.1 12 (44.4%) 37 (34.6%) 9 (34.6%) 35 (32.4%) 7 (33.3%) 45 (40.5%)\ncl D.1 \n Total number of patients with at least one adverse event 18 (66.7%) 61 (57.0%) 15 (57.7%) 52 (48.1%) 14 (66.7%) 66 (59.5%)\n Total number of events 27 100 23 83 27 108 \n dcd D.1.1.1.1 11 (40.7%) 39 (36.4%) 14 (53.8%) 28 (25.9%) 12 (57.1%) 39 (35.1%)\n dcd D.1.1.4.2 11 (40.7%) 37 (34.6%) 7 (26.9%) 35 (32.4%) 9 (42.9%) 41 (36.9%)\ncl D.2 \n Total number of patients with at least one adverse event 6 (22.2%) 41 (38.3%) 15 (57.7%) 43 (39.8%) 9 (42.9%) 48 (43.2%)\n Total number of events 6 56 18 54 12 62 \n dcd D.2.1.5.3 6 (22.2%) 41 (38.3%) 15 (57.7%) 43 (39.8%) 9 (42.9%) 48 (43.2%)\ncl B.1 \n Total number of patients with at least one adverse event 12 (44.4%) 35 (32.7%) 7 (26.9%) 42 (38.9%) 6 (28.6%) 37 (33.3%)\n Total number of events 15 41 8 52 8 54 \n dcd B.1.1.1.1 12 (44.4%) 35 (32.7%) 7 (26.9%) 42 (38.9%) 6 (28.6%) 37 (33.3%)\ncl C.2 \n Total number of patients with at least one adverse event 5 (18.5%) 30 (28.0%) 11 (42.3%) 37 (34.3%) 11 (52.4%) 44 (39.6%)\n Total number of events 8 40 12 41 12 53 \n dcd C.2.1.2.1 5 (18.5%) 30 (28.0%) 11 (42.3%) 37 (34.3%) 11 (52.4%) 44 (39.6%)\ncl C.1 \n Total number of patients with at least one adverse event 5 (18.5%) 38 (35.5%) 13 (50.0%) 33 (30.6%) 8 (38.1%) 35 (31.5%)\n Total number of events 5 50 18 45 13 51 \n dcd C.1.1.1.3 5 (18.5%) 38 (35.5%) 13 (50.0%) 33 (30.6%) 8 (38.1%) 35 (31.5%)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"SEX\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEHLT\",\n child_labels = \"visible\",\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEHLT)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(\"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 2L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sorted by decreasing frequency across all groups by System Organ Class, High-Level Term and Preferred Term.\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nBody System or Organ Class A: Drug X B: Placebo C: Combination \n High Level Term F M F M F M \n Dictionary-Derived Term (N=79) (N=55) (N=82) (N=52) (N=70) (N=62) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 72 (91.1%) 50 (90.9%) 77 (93.9%) 46 (88.5%) 65 (92.9%) 55 (88.7%)\nOverall total number of events 377 232 419 203 378 325 \ncl A.1 \n Total number of patients with at least one adverse event 53 (67.1%) 25 (45.5%) 51 (62.2%) 24 (46.2%) 43 (61.4%) 46 (74.2%)\n Total number of events 85 47 93 37 86 74 \n hlt A.1.1.1 \n Total number of patients with at least one adverse event 53 (67.1%) 25 (45.5%) 51 (62.2%) 24 (46.2%) 43 (61.4%) 46 (74.2%)\n Total number of events 85 47 93 37 86 74 \n dcd A.1.1.1.1 34 (43.0%) 16 (29.1%) 31 (37.8%) 14 (26.9%) 33 (47.1%) 30 (48.4%)\n dcd A.1.1.1.2 32 (40.5%) 16 (29.1%) 33 (40.2%) 15 (28.8%) 24 (34.3%) 26 (41.9%)\ncl B.2 \n Total number of patients with at least one adverse event 46 (58.2%) 33 (60.0%) 45 (54.9%) 29 (55.8%) 44 (62.9%) 41 (66.1%)\n Total number of events 81 48 86 52 64 79 \n hlt B.2.2.3 \n Total number of patients with at least one adverse event 30 (38.0%) 18 (32.7%) 32 (39.0%) 22 (42.3%) 26 (37.1%) 25 (40.3%)\n Total number of events 40 24 43 33 37 40 \n dcd B.2.2.3.1 30 (38.0%) 18 (32.7%) 32 (39.0%) 22 (42.3%) 26 (37.1%) 25 (40.3%)\n hlt B.2.1.2 \n Total number of patients with at least one adverse event 29 (36.7%) 20 (36.4%) 30 (36.6%) 14 (26.9%) 22 (31.4%) 30 (48.4%)\n Total number of events 41 24 43 19 27 39 \n dcd B.2.1.2.1 29 (36.7%) 20 (36.4%) 30 (36.6%) 14 (26.9%) 22 (31.4%) 30 (48.4%)\ncl D.1 \n Total number of patients with at least one adverse event 45 (57.0%) 34 (61.8%) 40 (48.8%) 27 (51.9%) 41 (58.6%) 39 (62.9%)\n Total number of events 72 55 64 42 73 62 \n hlt D.1.1.1 \n Total number of patients with at least one adverse event 25 (31.6%) 25 (45.5%) 29 (35.4%) 13 (25.0%) 27 (38.6%) 24 (38.7%)\n Total number of events 32 29 36 15 39 32 \n dcd D.1.1.1.1 25 (31.6%) 25 (45.5%) 29 (35.4%) 13 (25.0%) 27 (38.6%) 24 (38.7%)\n hlt D.1.1.4 \n Total number of patients with at least one adverse event 30 (38.0%) 18 (32.7%) 22 (26.8%) 20 (38.5%) 27 (38.6%) 23 (37.1%)\n Total number of events 40 26 28 27 34 30 \n dcd D.1.1.4.2 30 (38.0%) 18 (32.7%) 22 (26.8%) 20 (38.5%) 27 (38.6%) 23 (37.1%)\ncl D.2 \n Total number of patients with at least one adverse event 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\n Total number of events 35 27 49 23 43 31 \n hlt D.2.1.5 \n Total number of patients with at least one adverse event 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\n Total number of events 35 27 49 23 43 31 \n dcd D.2.1.5.3 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\ncl B.1 \n Total number of patients with at least one adverse event 28 (35.4%) 19 (34.5%) 33 (40.2%) 16 (30.8%) 24 (34.3%) 19 (30.6%)\n Total number of events 33 23 36 24 35 27 \n hlt B.1.1.1 \n Total number of patients with at least one adverse event 28 (35.4%) 19 (34.5%) 33 (40.2%) 16 (30.8%) 24 (34.3%) 19 (30.6%)\n Total number of events 33 23 36 24 35 27 \n dcd B.1.1.1.1 28 (35.4%) 19 (34.5%) 33 (40.2%) 16 (30.8%) 24 (34.3%) 19 (30.6%)\ncl C.2 \n Total number of patients with at least one adverse event 23 (29.1%) 12 (21.8%) 36 (43.9%) 12 (23.1%) 30 (42.9%) 25 (40.3%)\n Total number of events 32 16 39 14 33 32 \n hlt C.2.1.2 \n Total number of patients with at least one adverse event 23 (29.1%) 12 (21.8%) 36 (43.9%) 12 (23.1%) 30 (42.9%) 25 (40.3%)\n Total number of events 32 16 39 14 33 32 \n dcd C.2.1.2.1 23 (29.1%) 12 (21.8%) 36 (43.9%) 12 (23.1%) 30 (42.9%) 25 (40.3%)\ncl C.1 \n Total number of patients with at least one adverse event 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n Total number of events 39 16 52 11 44 20 \n hlt C.1.1.1 \n Total number of patients with at least one adverse event 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n Total number of events 39 16 52 11 44 20 \n dcd C.1.1.1.3 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAE <- df_explicit_na(ADAE)\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Adverse Event Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\", \"SEX\"), c(\"ARM\", \"SEX\")),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = \"AEBODSYS\"\n ),\n add_total = TRUE,\n event_type = \"adverse event\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:43:59 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nAdverse Events by Sex\nAdverse Events by Other Baseline Characteristics (e.g. Biomarker Group)\nAdverse Events by Baseline Characteristic from ADSUB (e.g. BMI Category)\nAdverse Events by Regrouped Baseline Characteristics (e.g. Race)\nAdverse Events by Baseline Characteristics (e.g. Sex) Including High-Level Terms\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\nadsub <- synthetic_cdisc_dataset(\"latest\", \"adsub\")\n\nadsub_bmi <- adsub %>%\n filter(PARAMCD == \"BBMISI\") %>%\n select(STUDYID, USUBJID, AVALCAT1) %>%\n mutate(\n AVALCAT1 = factor(AVALCAT1, levels = c(\"<18.5\", \"18.5 - 24.9\", \"25 - 29.9\", \">30\"))\n )\n\nadsl <- adsl %>%\n mutate(\n RACE1 = case_when(\n RACE == \"WHITE\" ~ \"WHITE\",\n TRUE ~ \"NON-WHITE\"\n ),\n RACE1 = factor(\n RACE1,\n levels = c(\"WHITE\", \"NON-WHITE\")\n )\n ) %>%\n left_join(\n y = adsub_bmi,\n by = c(\"STUDYID\", \"USUBJID\")\n )\n\nadae_labels <- var_labels(adae)\n\nadae <- adae %>%\n mutate(\n RACE1 = case_when(\n RACE == \"WHITE\" ~ \"WHITE\",\n TRUE ~ \"NON-WHITE\"\n ),\n RACE1 = factor(\n RACE1,\n levels = c(\"WHITE\", \"NON-WHITE\")\n )\n ) %>%\n left_join(\n y = adsub_bmi,\n by = c(\"STUDYID\", \"USUBJID\")\n )\n\nvar_labels(adae) <- c(adae_labels, \"RACE1\" = \"RACE WHITE/NON-WHITE\", \"AVALCAT1\" = \"Baseline BMI Category\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\nadsub_bmi <- df_explicit_na(adsub_bmi)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"SEX\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sorted by decreasing frequency across all groups by System Organ Class and Preferred Term.\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination \nBody System or Organ Class F M F M F M \n Dictionary-Derived Term (N=79) (N=55) (N=82) (N=52) (N=70) (N=62) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 72 (91.1%) 50 (90.9%) 77 (93.9%) 46 (88.5%) 65 (92.9%) 55 (88.7%)\nOverall total number of events 377 232 419 203 378 325 \ncl A.1 \n Total number of patients with at least one adverse event 53 (67.1%) 25 (45.5%) 51 (62.2%) 24 (46.2%) 43 (61.4%) 46 (74.2%)\n Total number of events 85 47 93 37 86 74 \n dcd A.1.1.1.1 34 (43.0%) 16 (29.1%) 31 (37.8%) 14 (26.9%) 33 (47.1%) 30 (48.4%)\n dcd A.1.1.1.2 32 (40.5%) 16 (29.1%) 33 (40.2%) 15 (28.8%) 24 (34.3%) 26 (41.9%)\ncl B.2 \n Total number of patients with at least one adverse event 46 (58.2%) 33 (60.0%) 45 (54.9%) 29 (55.8%) 44 (62.9%) 41 (66.1%)\n Total number of events 81 48 86 52 64 79 \n dcd B.2.2.3.1 30 (38.0%) 18 (32.7%) 32 (39.0%) 22 (42.3%) 26 (37.1%) 25 (40.3%)\n dcd B.2.1.2.1 29 (36.7%) 20 (36.4%) 30 (36.6%) 14 (26.9%) 22 (31.4%) 30 (48.4%)\ncl D.1 \n Total number of patients with at least one adverse event 45 (57.0%) 34 (61.8%) 40 (48.8%) 27 (51.9%) 41 (58.6%) 39 (62.9%)\n Total number of events 72 55 64 42 73 62 \n dcd D.1.1.1.1 25 (31.6%) 25 (45.5%) 29 (35.4%) 13 (25.0%) 27 (38.6%) 24 (38.7%)\n dcd D.1.1.4.2 30 (38.0%) 18 (32.7%) 22 (26.8%) 20 (38.5%) 27 (38.6%) 23 (37.1%)\ncl D.2 \n Total number of patients with at least one adverse event 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\n Total number of events 35 27 49 23 43 31 \n dcd D.2.1.5.3 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\ncl B.1 \n Total number of patients with at least one adverse event 28 (35.4%) 19 (34.5%) 33 (40.2%) 16 (30.8%) 24 (34.3%) 19 (30.6%)\n Total number of events 33 23 36 24 35 27 \n dcd B.1.1.1.1 28 (35.4%) 19 (34.5%) 33 (40.2%) 16 (30.8%) 24 (34.3%) 19 (30.6%)\ncl C.2 \n Total number of patients with at least one adverse event 23 (29.1%) 12 (21.8%) 36 (43.9%) 12 (23.1%) 30 (42.9%) 25 (40.3%)\n Total number of events 32 16 39 14 33 32 \n dcd C.2.1.2.1 23 (29.1%) 12 (21.8%) 36 (43.9%) 12 (23.1%) 30 (42.9%) 25 (40.3%)\ncl C.1 \n Total number of patients with at least one adverse event 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n Total number of events 39 16 52 11 44 20 \n dcd C.1.1.1.3 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"BMRKR2\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sorted by decreasing frequency across all groups by System Organ Class and Preferred Term.\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination \nBody System or Organ Class LOW MEDIUM HIGH LOW MEDIUM HIGH LOW MEDIUM HIGH \n Dictionary-Derived Term (N=50) (N=37) (N=47) (N=45) (N=56) (N=33) (N=40) (N=42) (N=50) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 46 (92.0%) 34 (91.9%) 42 (89.4%) 40 (88.9%) 53 (94.6%) 30 (90.9%) 36 (90.0%) 39 (92.9%) 45 (90.0%)\nOverall total number of events 248 166 195 196 261 165 220 258 225 \ncl A.1 \n Total number of patients with at least one adverse event 31 (62.0%) 19 (51.4%) 28 (59.6%) 25 (55.6%) 31 (55.4%) 19 (57.6%) 28 (70.0%) 30 (71.4%) 31 (62.0%)\n Total number of events 53 34 45 46 54 30 61 51 48 \n dcd A.1.1.1.1 22 (44.0%) 10 (27.0%) 18 (38.3%) 14 (31.1%) 20 (35.7%) 11 (33.3%) 21 (52.5%) 24 (57.1%) 18 (36.0%)\n dcd A.1.1.1.2 17 (34.0%) 13 (35.1%) 18 (38.3%) 18 (40.0%) 18 (32.1%) 12 (36.4%) 18 (45.0%) 14 (33.3%) 18 (36.0%)\ncl B.2 \n Total number of patients with at least one adverse event 34 (68.0%) 21 (56.8%) 24 (51.1%) 23 (51.1%) 33 (58.9%) 18 (54.5%) 24 (60.0%) 27 (64.3%) 34 (68.0%)\n Total number of events 53 37 39 40 61 37 40 47 56 \n dcd B.2.2.3.1 21 (42.0%) 13 (35.1%) 14 (29.8%) 18 (40.0%) 22 (39.3%) 14 (42.4%) 16 (40.0%) 15 (35.7%) 20 (40.0%)\n dcd B.2.1.2.1 21 (42.0%) 11 (29.7%) 17 (36.2%) 11 (24.4%) 21 (37.5%) 12 (36.4%) 13 (32.5%) 17 (40.5%) 22 (44.0%)\ncl D.1 \n Total number of patients with at least one adverse event 34 (68.0%) 21 (56.8%) 24 (51.1%) 18 (40.0%) 33 (58.9%) 16 (48.5%) 25 (62.5%) 31 (73.8%) 24 (48.0%)\n Total number of events 51 35 41 27 49 30 45 53 37 \n dcd D.1.1.1.1 19 (38.0%) 16 (43.2%) 15 (31.9%) 13 (28.9%) 19 (33.9%) 10 (30.3%) 14 (35.0%) 22 (52.4%) 15 (30.0%)\n dcd D.1.1.4.2 21 (42.0%) 9 (24.3%) 18 (38.3%) 9 (20.0%) 20 (35.7%) 13 (39.4%) 17 (42.5%) 18 (42.9%) 15 (30.0%)\ncl D.2 \n Total number of patients with at least one adverse event 20 (40.0%) 12 (32.4%) 15 (31.9%) 19 (42.2%) 22 (39.3%) 17 (51.5%) 13 (32.5%) 23 (54.8%) 21 (42.0%)\n Total number of events 27 13 22 23 26 23 17 33 24 \n dcd D.2.1.5.3 20 (40.0%) 12 (32.4%) 15 (31.9%) 19 (42.2%) 22 (39.3%) 17 (51.5%) 13 (32.5%) 23 (54.8%) 21 (42.0%)\ncl B.1 \n Total number of patients with at least one adverse event 14 (28.0%) 14 (37.8%) 19 (40.4%) 15 (33.3%) 24 (42.9%) 10 (30.3%) 14 (35.0%) 15 (35.7%) 14 (28.0%)\n Total number of events 16 19 21 18 25 17 19 25 18 \n dcd B.1.1.1.1 14 (28.0%) 14 (37.8%) 19 (40.4%) 15 (33.3%) 24 (42.9%) 10 (30.3%) 14 (35.0%) 15 (35.7%) 14 (28.0%)\ncl C.2 \n Total number of patients with at least one adverse event 18 (36.0%) 8 (21.6%) 9 (19.1%) 15 (33.3%) 22 (39.3%) 11 (33.3%) 18 (45.0%) 17 (40.5%) 20 (40.0%)\n Total number of events 27 9 12 18 23 12 20 20 25 \n dcd C.2.1.2.1 18 (36.0%) 8 (21.6%) 9 (19.1%) 15 (33.3%) 22 (39.3%) 11 (33.3%) 18 (45.0%) 17 (40.5%) 20 (40.0%)\ncl C.1 \n Total number of patients with at least one adverse event 17 (34.0%) 14 (37.8%) 12 (25.5%) 17 (37.8%) 17 (30.4%) 12 (36.4%) 12 (30.0%) 17 (40.5%) 14 (28.0%)\n Total number of events 21 19 15 24 23 16 18 29 17 \n dcd C.1.1.1.3 17 (34.0%) 14 (37.8%) 12 (25.5%) 17 (37.8%) 17 (30.4%) 12 (36.4%) 12 (30.0%) 17 (40.5%) 14 (28.0%)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"AVALCAT1\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sorted by decreasing frequency across all groups by System Organ Class and Preferred Term.\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination \nBody System or Organ Class <18.5 18.5 - 24.9 25 - 29.9 >30 <18.5 18.5 - 24.9 25 - 29.9 >30 <18.5 18.5 - 24.9 25 - 29.9 >30 \n Dictionary-Derived Term (N=44) (N=17) (N=11) (N=62) (N=37) (N=18) (N=10) (N=69) (N=28) (N=20) (N=18) (N=66) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 41 (93.2%) 14 (82.4%) 11 (100%) 56 (90.3%) 35 (94.6%) 16 (88.9%) 9 (90.0%) 63 (91.3%) 25 (89.3%) 19 (95.0%) 15 (83.3%) 61 (92.4%)\nOverall total number of events 186 80 66 277 174 89 47 312 137 129 100 337 \ncl A.1 \n Total number of patients with at least one adverse event 23 (52.3%) 12 (70.6%) 7 (63.6%) 36 (58.1%) 19 (51.4%) 10 (55.6%) 6 (60.0%) 40 (58.0%) 16 (57.1%) 13 (65.0%) 14 (77.8%) 46 (69.7%)\n Total number of events 38 22 13 59 35 22 6 67 30 23 30 77 \n dcd A.1.1.1.1 14 (31.8%) 7 (41.2%) 3 (27.3%) 26 (41.9%) 12 (32.4%) 6 (33.3%) 4 (40.0%) 23 (33.3%) 12 (42.9%) 7 (35.0%) 13 (72.2%) 31 (47.0%)\n dcd A.1.1.1.2 15 (34.1%) 8 (47.1%) 5 (45.5%) 20 (32.3%) 12 (32.4%) 8 (44.4%) 2 (20.0%) 26 (37.7%) 9 (32.1%) 7 (35.0%) 7 (38.9%) 27 (40.9%)\ncl B.2 \n Total number of patients with at least one adverse event 23 (52.3%) 10 (58.8%) 8 (72.7%) 38 (61.3%) 21 (56.8%) 8 (44.4%) 7 (70.0%) 38 (55.1%) 16 (57.1%) 16 (80.0%) 12 (66.7%) 41 (62.1%)\n Total number of events 37 19 12 61 41 18 12 67 28 28 18 69 \n dcd B.2.2.3.1 13 (29.5%) 7 (41.2%) 6 (54.5%) 22 (35.5%) 14 (37.8%) 7 (38.9%) 6 (60.0%) 27 (39.1%) 7 (25.0%) 13 (65.0%) 5 (27.8%) 26 (39.4%)\n dcd B.2.1.2.1 14 (31.8%) 8 (47.1%) 4 (36.4%) 23 (37.1%) 14 (37.8%) 6 (33.3%) 4 (40.0%) 20 (29.0%) 13 (46.4%) 8 (40.0%) 8 (44.4%) 23 (34.8%)\ncl D.1 \n Total number of patients with at least one adverse event 24 (54.5%) 9 (52.9%) 8 (72.7%) 38 (61.3%) 18 (48.6%) 5 (27.8%) 7 (70.0%) 37 (53.6%) 15 (53.6%) 12 (60.0%) 11 (61.1%) 42 (63.6%)\n Total number of events 38 11 17 61 30 11 14 51 30 23 16 66 \n dcd D.1.1.1.1 13 (29.5%) 7 (41.2%) 7 (63.6%) 23 (37.1%) 13 (35.1%) 3 (16.7%) 4 (40.0%) 22 (31.9%) 12 (42.9%) 6 (30.0%) 8 (44.4%) 25 (37.9%)\n dcd D.1.1.4.2 16 (36.4%) 4 (23.5%) 6 (54.5%) 22 (35.5%) 10 (27.0%) 4 (22.2%) 5 (50.0%) 23 (33.3%) 10 (35.7%) 9 (45.0%) 6 (33.3%) 25 (37.9%)\ncl D.2 \n Total number of patients with at least one adverse event 14 (31.8%) 7 (41.2%) 5 (45.5%) 21 (33.9%) 14 (37.8%) 10 (55.6%) 4 (40.0%) 30 (43.5%) 13 (46.4%) 10 (50.0%) 7 (38.9%) 27 (40.9%)\n Total number of events 20 7 10 25 17 14 5 36 18 15 10 31 \n dcd D.2.1.5.3 14 (31.8%) 7 (41.2%) 5 (45.5%) 21 (33.9%) 14 (37.8%) 10 (55.6%) 4 (40.0%) 30 (43.5%) 13 (46.4%) 10 (50.0%) 7 (38.9%) 27 (40.9%)\ncl B.1 \n Total number of patients with at least one adverse event 17 (38.6%) 5 (29.4%) 7 (63.6%) 18 (29.0%) 14 (37.8%) 8 (44.4%) 4 (40.0%) 23 (33.3%) 7 (25.0%) 10 (50.0%) 7 (38.9%) 19 (28.8%)\n Total number of events 22 5 7 22 16 11 4 29 11 12 8 31 \n dcd B.1.1.1.1 17 (38.6%) 5 (29.4%) 7 (63.6%) 18 (29.0%) 14 (37.8%) 8 (44.4%) 4 (40.0%) 23 (33.3%) 7 (25.0%) 10 (50.0%) 7 (38.9%) 19 (28.8%)\ncl C.2 \n Total number of patients with at least one adverse event 14 (31.8%) 4 (23.5%) 2 (18.2%) 15 (24.2%) 15 (40.5%) 5 (27.8%) 4 (40.0%) 24 (34.8%) 10 (35.7%) 13 (65.0%) 8 (44.4%) 24 (36.4%)\n Total number of events 17 9 3 19 15 6 5 27 12 16 9 28 \n dcd C.2.1.2.1 14 (31.8%) 4 (23.5%) 2 (18.2%) 15 (24.2%) 15 (40.5%) 5 (27.8%) 4 (40.0%) 24 (34.8%) 10 (35.7%) 13 (65.0%) 8 (44.4%) 24 (36.4%)\ncl C.1 \n Total number of patients with at least one adverse event 11 (25.0%) 4 (23.5%) 4 (36.4%) 24 (38.7%) 13 (35.1%) 6 (33.3%) 1 (10.0%) 26 (37.7%) 6 (21.4%) 7 (35.0%) 6 (33.3%) 24 (36.4%)\n Total number of events 14 7 4 30 20 7 1 35 8 12 9 35 \n dcd C.1.1.1.3 11 (25.0%) 4 (23.5%) 4 (36.4%) 24 (38.7%) 13 (35.1%) 6 (33.3%) 1 (10.0%) 26 (37.7%) 6 (21.4%) 7 (35.0%) 6 (33.3%) 24 (36.4%)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"RACE1\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n prune_table() %>%\n # Sorted by decreasing frequency across all groups by System Organ Class and Preferred Term.\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination \nBody System or Organ Class WHITE NON-WHITE WHITE NON-WHITE WHITE NON-WHITE \n Dictionary-Derived Term (N=27) (N=107) (N=26) (N=108) (N=21) (N=111) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 26 (96.3%) 96 (89.7%) 25 (96.2%) 98 (90.7%) 21 (100%) 99 (89.2%)\nOverall total number of events 109 500 144 478 114 589 \ncl A.1 \n Total number of patients with at least one adverse event 16 (59.3%) 62 (57.9%) 21 (80.8%) 54 (50.0%) 15 (71.4%) 74 (66.7%)\n Total number of events 30 102 37 93 25 135 \n dcd A.1.1.1.1 9 (33.3%) 41 (38.3%) 14 (53.8%) 31 (28.7%) 10 (47.6%) 53 (47.7%)\n dcd A.1.1.1.2 11 (40.7%) 37 (34.6%) 13 (50.0%) 35 (32.4%) 9 (42.9%) 41 (36.9%)\ncl B.2 \n Total number of patients with at least one adverse event 15 (55.6%) 64 (59.8%) 16 (61.5%) 58 (53.7%) 12 (57.1%) 73 (65.8%)\n Total number of events 18 111 28 110 17 126 \n dcd B.2.2.3.1 4 (14.8%) 44 (41.1%) 10 (38.5%) 44 (40.7%) 5 (23.8%) 46 (41.4%)\n dcd B.2.1.2.1 12 (44.4%) 37 (34.6%) 9 (34.6%) 35 (32.4%) 7 (33.3%) 45 (40.5%)\ncl D.1 \n Total number of patients with at least one adverse event 18 (66.7%) 61 (57.0%) 15 (57.7%) 52 (48.1%) 14 (66.7%) 66 (59.5%)\n Total number of events 27 100 23 83 27 108 \n dcd D.1.1.1.1 11 (40.7%) 39 (36.4%) 14 (53.8%) 28 (25.9%) 12 (57.1%) 39 (35.1%)\n dcd D.1.1.4.2 11 (40.7%) 37 (34.6%) 7 (26.9%) 35 (32.4%) 9 (42.9%) 41 (36.9%)\ncl D.2 \n Total number of patients with at least one adverse event 6 (22.2%) 41 (38.3%) 15 (57.7%) 43 (39.8%) 9 (42.9%) 48 (43.2%)\n Total number of events 6 56 18 54 12 62 \n dcd D.2.1.5.3 6 (22.2%) 41 (38.3%) 15 (57.7%) 43 (39.8%) 9 (42.9%) 48 (43.2%)\ncl B.1 \n Total number of patients with at least one adverse event 12 (44.4%) 35 (32.7%) 7 (26.9%) 42 (38.9%) 6 (28.6%) 37 (33.3%)\n Total number of events 15 41 8 52 8 54 \n dcd B.1.1.1.1 12 (44.4%) 35 (32.7%) 7 (26.9%) 42 (38.9%) 6 (28.6%) 37 (33.3%)\ncl C.2 \n Total number of patients with at least one adverse event 5 (18.5%) 30 (28.0%) 11 (42.3%) 37 (34.3%) 11 (52.4%) 44 (39.6%)\n Total number of events 8 40 12 41 12 53 \n dcd C.2.1.2.1 5 (18.5%) 30 (28.0%) 11 (42.3%) 37 (34.3%) 11 (52.4%) 44 (39.6%)\ncl C.1 \n Total number of patients with at least one adverse event 5 (18.5%) 38 (35.5%) 13 (50.0%) 33 (30.6%) 8 (38.1%) 35 (31.5%)\n Total number of events 5 50 18 45 13 51 \n dcd C.1.1.1.3 5 (18.5%) 38 (35.5%) 13 (50.0%) 33 (30.6%) 8 (38.1%) 35 (31.5%)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"SEX\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEHLT\",\n child_labels = \"visible\",\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEHLT)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(\"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 2L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sorted by decreasing frequency across all groups by System Organ Class, High-Level Term and Preferred Term.\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nBody System or Organ Class A: Drug X B: Placebo C: Combination \n High Level Term F M F M F M \n Dictionary-Derived Term (N=79) (N=55) (N=82) (N=52) (N=70) (N=62) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 72 (91.1%) 50 (90.9%) 77 (93.9%) 46 (88.5%) 65 (92.9%) 55 (88.7%)\nOverall total number of events 377 232 419 203 378 325 \ncl A.1 \n Total number of patients with at least one adverse event 53 (67.1%) 25 (45.5%) 51 (62.2%) 24 (46.2%) 43 (61.4%) 46 (74.2%)\n Total number of events 85 47 93 37 86 74 \n hlt A.1.1.1 \n Total number of patients with at least one adverse event 53 (67.1%) 25 (45.5%) 51 (62.2%) 24 (46.2%) 43 (61.4%) 46 (74.2%)\n Total number of events 85 47 93 37 86 74 \n dcd A.1.1.1.1 34 (43.0%) 16 (29.1%) 31 (37.8%) 14 (26.9%) 33 (47.1%) 30 (48.4%)\n dcd A.1.1.1.2 32 (40.5%) 16 (29.1%) 33 (40.2%) 15 (28.8%) 24 (34.3%) 26 (41.9%)\ncl B.2 \n Total number of patients with at least one adverse event 46 (58.2%) 33 (60.0%) 45 (54.9%) 29 (55.8%) 44 (62.9%) 41 (66.1%)\n Total number of events 81 48 86 52 64 79 \n hlt B.2.2.3 \n Total number of patients with at least one adverse event 30 (38.0%) 18 (32.7%) 32 (39.0%) 22 (42.3%) 26 (37.1%) 25 (40.3%)\n Total number of events 40 24 43 33 37 40 \n dcd B.2.2.3.1 30 (38.0%) 18 (32.7%) 32 (39.0%) 22 (42.3%) 26 (37.1%) 25 (40.3%)\n hlt B.2.1.2 \n Total number of patients with at least one adverse event 29 (36.7%) 20 (36.4%) 30 (36.6%) 14 (26.9%) 22 (31.4%) 30 (48.4%)\n Total number of events 41 24 43 19 27 39 \n dcd B.2.1.2.1 29 (36.7%) 20 (36.4%) 30 (36.6%) 14 (26.9%) 22 (31.4%) 30 (48.4%)\ncl D.1 \n Total number of patients with at least one adverse event 45 (57.0%) 34 (61.8%) 40 (48.8%) 27 (51.9%) 41 (58.6%) 39 (62.9%)\n Total number of events 72 55 64 42 73 62 \n hlt D.1.1.1 \n Total number of patients with at least one adverse event 25 (31.6%) 25 (45.5%) 29 (35.4%) 13 (25.0%) 27 (38.6%) 24 (38.7%)\n Total number of events 32 29 36 15 39 32 \n dcd D.1.1.1.1 25 (31.6%) 25 (45.5%) 29 (35.4%) 13 (25.0%) 27 (38.6%) 24 (38.7%)\n hlt D.1.1.4 \n Total number of patients with at least one adverse event 30 (38.0%) 18 (32.7%) 22 (26.8%) 20 (38.5%) 27 (38.6%) 23 (37.1%)\n Total number of events 40 26 28 27 34 30 \n dcd D.1.1.4.2 30 (38.0%) 18 (32.7%) 22 (26.8%) 20 (38.5%) 27 (38.6%) 23 (37.1%)\ncl D.2 \n Total number of patients with at least one adverse event 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\n Total number of events 35 27 49 23 43 31 \n hlt D.2.1.5 \n Total number of patients with at least one adverse event 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\n Total number of events 35 27 49 23 43 31 \n dcd D.2.1.5.3 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\ncl B.1 \n Total number of patients with at least one adverse event 28 (35.4%) 19 (34.5%) 33 (40.2%) 16 (30.8%) 24 (34.3%) 19 (30.6%)\n Total number of events 33 23 36 24 35 27 \n hlt B.1.1.1 \n Total number of patients with at least one adverse event 28 (35.4%) 19 (34.5%) 33 (40.2%) 16 (30.8%) 24 (34.3%) 19 (30.6%)\n Total number of events 33 23 36 24 35 27 \n dcd B.1.1.1.1 28 (35.4%) 19 (34.5%) 33 (40.2%) 16 (30.8%) 24 (34.3%) 19 (30.6%)\ncl C.2 \n Total number of patients with at least one adverse event 23 (29.1%) 12 (21.8%) 36 (43.9%) 12 (23.1%) 30 (42.9%) 25 (40.3%)\n Total number of events 32 16 39 14 33 32 \n hlt C.2.1.2 \n Total number of patients with at least one adverse event 23 (29.1%) 12 (21.8%) 36 (43.9%) 12 (23.1%) 30 (42.9%) 25 (40.3%)\n Total number of events 32 16 39 14 33 32 \n dcd C.2.1.2.1 23 (29.1%) 12 (21.8%) 36 (43.9%) 12 (23.1%) 30 (42.9%) 25 (40.3%)\ncl C.1 \n Total number of patients with at least one adverse event 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n Total number of events 39 16 52 11 44 20 \n hlt C.1.1.1 \n Total number of patients with at least one adverse event 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n Total number of events 39 16 52 11 44 20 \n dcd C.1.1.1.3 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAE <- df_explicit_na(ADAE)\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Adverse Event Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\", \"SEX\"), c(\"ARM\", \"SEX\")),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = \"AEBODSYS\"\n ),\n add_total = TRUE,\n event_type = \"adverse event\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:42:16 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", @@ -572,686 +586,684 @@ ] }, { - "objectID": "tables/adverse-events/aet09_smq.html", - "href": "tables/adverse-events/aet09_smq.html", - "title": "AET09_SMQ", + "objectID": "tables/adverse-events/aet01_aesi.html", + "href": "tables/adverse-events/aet01_aesi.html", + "title": "AET01_AESI", "section": "", - "text": "Data Setup\nStandard Table\nTable with Customized Queries\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\nlibrary(stringr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing\n# levels. For details, refer to Teal and Study Data article.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\n# AEs are filtered for relatedness to study drug.\nadae_rel <- adae %>% filter(AEREL == \"Y\")\n\n# Simulate a random AAG dataset.\naag <- data.frame(\n NAMVAR = c(\"SMQ01NAM\", \"SMQ01NAM\", \"SMQ02NAM\", \"CQ01NAM\", \"CQ01NAM\"),\n SRCVAR = rep(\"AEDECOD\", 5),\n GRPTYPE = c(\"SMQ\", \"SMQ\", \"SMQ\", \"CUSTOM\", \"CUSTOM\"),\n REFID = c(1, 1, 2, 3, 3),\n REFNAME = c(rep(\"C.1.1.1.3/B.2.2.3.1 AESI\", 2), \"non observed SMQ02NAM level\", rep(\"D.2.1.5.3/A.1.1.1.1 AESI\", 2)),\n SCOPE = c(\"BROAD\", \"BROAD\", \"BROAD\", \"\", \"\"),\n REFTERM = c(\"C.1.1.1.3\", \"B.2.2.3.1\", \"Z.9.9.9.9\", \"D.2.1.5.3\", \"A.1.1.1.1\"),\n stringsAsFactors = FALSE\n)\n\n# Create summary AAG dataset (used for labelling).\n# Note it's important to incorporate SCOPE into the basket names for SMQs so as to\n# match the flags present in ADAE.\naag_summary <- aag %>%\n select(NAMVAR, REFNAME, SCOPE) %>%\n unique() %>%\n mutate(\n REFNAME_SCOPE = ifelse(SCOPE == \"\", REFNAME, paste0(REFNAME, \"(\", SCOPE, \")\"))\n ) %>%\n rename(basket = NAMVAR, basket_name = REFNAME_SCOPE) %>%\n select(basket, basket_name)\n\n# Make a summary of the full ADAE based on AAG by using h_stack_by_baskets helper function\nadae_smq_all <- h_stack_by_baskets(\n df = adae_rel,\n aag_summary = aag_summary,\n keys = c(\"STUDYID\", \"USUBJID\", \"ACTARMCD\", \"AEDECOD\")\n)\n\n# Post-process adae_smq_all to keep only certain baskets of interest for variant 1\n# Not need to drop baskets for variant 2 as all baskets will be considered.\nbaskets_to_drop_variant <- aag_summary$basket_name[!aag_summary$basket %in% c(\"SMQ01NAM\")]\n\n# Adjust the analysis dataset based on basket subset for variant 1.\nadae_smq_1 <- adae_smq_all %>%\n filter(!adae_smq_all$SMQ %in% baskets_to_drop_variant) %>%\n mutate(\n SMQ = tern::fct_discard(SMQ, discard = baskets_to_drop_variant)\n )\n\n\n\n\n\nCodecriteria_fun <- function(tr) !is(tr, \"ContentRow\") && all_zero_or_na(tr)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\"\n )\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = -1L,\n drop = FALSE\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt,\n df = adae_smq_1,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = cont_n_allcols) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\nStandardized MedDRA Query ARM A ARM B ARM C \n Dictionary-Derived Term (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 43 (32.1%) 46 (34.3%) 43 (32.6%)\nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 43 (32.1%) 46 (34.3%) 43 (32.6%)\n Total number of events 55 63 64 \n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%)\n\n\n\n\n\nCodecriteria_fun <- function(tr) {\n !is(tr, \"ContentRow\") && all_zero_or_na(tr) && !grepl(\"Total number of\", obj_label(tr))\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\"\n )\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n ),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n drop = FALSE\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nscore_ae_pts <- function(tt) {\n count_vals <- cell_values(tree_children(tt)[[\"USUBJID\"]])[[1]]\n sum(matrix(unlist(count_vals), nrow = length(count_vals), byrow = TRUE)[, 1])\n}\n\nresult <- build_table(\n lyt,\n df = adae_smq_all,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = score_ae_pts) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\nStandardized MedDRA Query ARM A ARM B ARM C \n Dictionary-Derived Term (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 69 (51.5%) 78 (58.2%) 77 (58.3%)\nD.2.1.5.3/A.1.1.1.1 AESI \n Total number of patients with at least one adverse event 47 (35.1%) 58 (43.3%) 57 (43.2%)\n Total number of events 62 72 74 \n dcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%)\nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 43 (32.1%) 46 (34.3%) 43 (32.6%)\n Total number of events 55 63 64 \n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%)\nnon observed SMQ02NAM level(BROAD) \n Total number of patients with at least one adverse event 0 0 0 \n Total number of events 0 0 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nNote that filtering AEs for relatedness to study drug is not a necessary data pre-processing step for the module. It can be achieved using the teal module filter panel. The example here pre-sets the filters using AEREL = \"Y\" in adae.\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAE <- data[[\"ADAE\"]]\n\nnames_baskets <- grep(\"^(SMQ|CQ).*NAM$\", names(ADAE), value = TRUE)\nnames_scopes <- grep(\"^SMQ.*SC$\", names(ADAE), value = TRUE)\n\ncs_baskets <- choices_selected(\n choices = variable_choices(ADAE, subset = names_baskets),\n selected = names_baskets\n)\ncs_scopes <- choices_selected(\n choices = variable_choices(ADAE, subset = names_scopes),\n selected = names_scopes,\n fixed = TRUE\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_smq(\n label = \"Adverse Events by SMQ Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"SEX\")),\n selected = \"ARM\"\n ),\n add_total = FALSE,\n baskets = cs_baskets,\n scopes = cs_scopes,\n llt = choices_selected(\n choices = variable_choices(ADAE, subset = c(\"AEDECOD\")),\n selected = \"AEDECOD\"\n )\n )\n ),\n filter = teal_slices(teal_slice(\"ADAE\", \"AEREL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:43:10 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 stringr_1.5.1 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable with Optional Lines\nTable For Studies with Multiple Drugs\nTable of AEs by SMQ\nteal App\nReproducibility\n\n\n\nTo illustrate, additional variables such as flags (TRUE/FALSE) for selected AEs of interest. Please consult your SAP on how to handle missing AE grades.\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nadsl <- filter(adsl, SAFFL == \"Y\")\nadae <- filter(adae, ANL01FL == \"Y\" & SAFFL == \"Y\")\n\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nnot_resolved <- adae %>%\n filter(!(AEOUT %in% c(\"RECOVERED/RESOLVED\", \"FATAL\", \"RECOVERED/RESOLVED WITH SEQUELAE\"))) %>%\n distinct(USUBJID) %>%\n mutate(NOT_RESOLVED = \"Y\")\n\nadae <- adae %>%\n left_join(not_resolved, by = c(\"USUBJID\")) %>%\n mutate(\n ALL_RESOLVED = with_label(\n is.na(NOT_RESOLVED),\n \"Total number of patients with all non-fatal AEs resolved\"\n ),\n NOT_RESOLVED = with_label(\n !is.na(NOT_RESOLVED),\n \"Total number of patients with at least one unresolved or ongoing non-fatal AE\"\n )\n )\n\nadae <- adae %>%\n mutate(\n AEDECOD = as.character(AEDECOD),\n WD = with_label(\n AEACN == \"DRUG WITHDRAWN\",\n \"Total number of patients with study drug withdrawn due to AE\"\n ),\n DSM = with_label(\n AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Total number of patients with dose modified/interrupted due to AE\"\n ),\n CONTRT = with_label(\n AECONTRT == \"Y\",\n \"Total number of patients with treatment received for AE\"\n ),\n SER = with_label(\n AESER == \"Y\",\n \"Total number of patients with at least one serious AE\"\n ),\n REL = with_label(\n AEREL == \"Y\",\n \"Total number of patients with at least one related AE\"\n ),\n ALL_RESOLVED_WD = with_label(\n WD == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with study drug withdrawn due to resolved AE\"\n ),\n ALL_RESOLVED_DSM = with_label(\n DSM == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with dose modified/interrupted due to resolved AE\"\n ),\n ALL_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with treatment received for resolved AE\"\n ),\n NOT_RESOLVED_WD = with_label(\n WD == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with study drug withdrawn due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_DSM = with_label(\n DSM == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with dose modified/interrupted due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with treatment received for unresolved or ongoing AE\"\n ),\n SERWD = with_label(\n AESER == \"Y\" & AEACN == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug withdrawn due to serious AE\"\n ),\n SERCONTRT = with_label(\n AECONTRT == \"Y\" & AESER == \"Y\",\n \"No. of patients with dose modified/interrupted due to serious AE\"\n ),\n SERDSM = with_label(\n AESER == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with treatment received for serious AE\"\n ),\n RELWD = with_label(\n AEREL == \"Y\" & AEACN == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug withdrawn due to related AE\"\n ),\n RELDSM = with_label(\n AEREL == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose modified/interrupted due to related AE\"\n ),\n RELCONTRT = with_label(\n AECONTRT == \"Y\" & AEREL == \"Y\",\n \"No. of patients with treatment received for related AE\"\n ),\n RELSER = with_label(\n AESER == \"Y\" & AEREL == \"Y\",\n \"No. of patients with serious, related AE\"\n )\n )\n\nadae <- adae %>%\n mutate(\n AETOXGR = forcats::fct_recode(AETOXGR,\n \"Grade 1\" = \"1\",\n \"Grade 2\" = \"2\",\n \"Grade 3\" = \"3\",\n \"Grade 4\" = \"4\",\n \"Grade 5 (fatal outcome)\" = \"5\"\n )\n )\n\n\n\n\n\nCodeaesi_vars <- c(\"WD\", \"DSM\", \"CONTRT\", \"ALL_RESOLVED\", \"NOT_RESOLVED\", \"SER\", \"REL\")\n\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n vars = \"USUBJID\",\n filters = c(\"ANL01FL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients with at least one AE\")\n ) %>%\n count_values(\n \"ANL01FL\",\n values = \"Y\",\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n var_labels = \"Total number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\"USUBJID\", flag_variables = aesi_vars, denom = \"N_col\")\n\nresult <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of patients with at least one AE by worst grade \n Grade 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n Grade 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n Grade 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 (fatal outcome) 64 (47.8%) 52 (38.8%) 64 (48.5%) \nTotal number of patients with study drug withdrawn due to AE 22 (16.4%) 21 (15.7%) 28 (21.2%) \nTotal number of patients with dose modified/interrupted due to AE 55 (41.0%) 62 (46.3%) 64 (48.5%) \nTotal number of patients with treatment received for AE 80 (59.7%) 80 (59.7%) 89 (67.4%) \nTotal number of patients with all non-fatal AEs resolved 17 (12.7%) 12 (9.0%) 11 (8.3%) \nTotal number of patients with at least one unresolved or ongoing non-fatal AE 83 (61.9%) 86 (64.2%) 92 (69.7%) \nTotal number of patients with at least one serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \nTotal number of patients with at least one related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n\n\n\n\n\nCodeaesi_vars <- c(\"WD\", \"DSM\", \"CONTRT\")\naesi_resolved <- c(\"ALL_RESOLVED\", \"ALL_RESOLVED_WD\", \"ALL_RESOLVED_DSM\", \"ALL_RESOLVED_CONTRT\")\naesi_not_resolved <- c(\"NOT_RESOLVED\", \"NOT_RESOLVED_WD\", \"NOT_RESOLVED_DSM\", \"NOT_RESOLVED_CONTRT\")\naesi_ser <- c(\"SER\", \"SERWD\", \"SERDSM\", \"SERCONTRT\")\naesi_rel <- c(\"REL\", \"RELWD\", \"RELDSM\", \"RELCONTRT\", \"RELSER\")\n\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n vars = \"USUBJID\",\n filters = c(\"ANL01FL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients with at least one AE\")\n ) %>%\n count_values(\n \"ANL01FL\",\n values = \"Y\",\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n var_labels = \"Total number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(aesi_vars, aesi_resolved[1]), denom = \"N_col\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_resolved[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_res\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_not_resolved[1], denom = \"N_col\", table_names = \"fl_notres_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_not_resolved[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_notres\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_ser[1], denom = \"N_col\", table_names = \"fl_ser_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_ser[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_ser\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel[1], denom = \"N_col\", table_names = \"fl_rel_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_rel\"\n )\n\nresult <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of patients with at least one AE by worst grade \n Grade 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n Grade 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n Grade 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 (fatal outcome) 64 (47.8%) 52 (38.8%) 64 (48.5%) \nTotal number of patients with study drug withdrawn due to AE 22 (16.4%) 21 (15.7%) 28 (21.2%) \nTotal number of patients with dose modified/interrupted due to AE 55 (41.0%) 62 (46.3%) 64 (48.5%) \nTotal number of patients with treatment received for AE 80 (59.7%) 80 (59.7%) 89 (67.4%) \nTotal number of patients with all non-fatal AEs resolved 17 (12.7%) 12 (9.0%) 11 (8.3%) \n No. of patients with study drug withdrawn due to resolved AE 0 1 (0.7%) 2 (1.5%) \n No. of patients with dose modified/interrupted due to resolved AE 3 (2.2%) 4 (3.0%) 2 (1.5%) \n No. of patients with treatment received for resolved AE 9 (6.7%) 7 (5.2%) 7 (5.3%) \nTotal number of patients with at least one unresolved or ongoing non-fatal AE 83 (61.9%) 86 (64.2%) 92 (69.7%) \n No. of patients with study drug withdrawn due to unresolved or ongoing AE 22 (16.4%) 20 (14.9%) 26 (19.7%) \n No. of patients with dose modified/interrupted due to unresolved or ongoing AE 52 (38.8%) 58 (43.3%) 62 (47.0%) \n No. of patients with treatment received for unresolved or ongoing AE 71 (53.0%) 73 (54.5%) 82 (62.1%) \nTotal number of patients with at least one serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n No. of patients with study drug withdrawn due to serious AE 9 (6.7%) 4 (3.0%) 10 (7.6%) \n No. of patients with treatment received for serious AE 21 (15.7%) 22 (16.4%) 28 (21.2%) \n No. of patients with dose modified/interrupted due to serious AE 59 (44.0%) 58 (43.3%) 53 (40.2%) \nTotal number of patients with at least one related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n No. of patients with study drug withdrawn due to related AE 5 (3.7%) 10 (7.5%) 7 (5.3%) \n No. of patients with dose modified/interrupted due to related AE 24 (17.9%) 32 (23.9%) 34 (25.8%) \n No. of patients with treatment received for related AE 53 (39.6%) 58 (43.3%) 60 (45.5%) \n No. of patients with serious, related AE 64 (47.8%) 52 (38.8%) 64 (48.5%) \n\n\n\n\n\nCodeadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae_mult <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nadsl <- filter(adsl, SAFFL == \"Y\")\nadae_mult <- filter(adae_mult, ANL01FL == \"Y\" & SAFFL == \"Y\")\n\nadsl <- df_explicit_na(adsl)\nadae_mult <- df_explicit_na(adae_mult)\n\n# for illustration purposes only, create AEREL1, AEREL2, AEACN1, AEACN2 from respective variables\nadae_mult <- adae_mult %>%\n mutate(\n AEREL1 = AEREL,\n AEREL2 = AEREL,\n AEACN1 = AEACN,\n AEACN2 = AEACN\n )\n\nnot_resolved <- adae_mult %>%\n filter(!(AEOUT %in% c(\"RECOVERED/RESOLVED\", \"FATAL\", \"RECOVERED/RESOLVED WITH SEQUELAE\"))) %>%\n distinct(USUBJID) %>%\n mutate(NOT_RESOLVED = \"Y\")\n\nadae_mult <- adae_mult %>%\n left_join(not_resolved, by = c(\"USUBJID\")) %>%\n mutate(\n ALL_RESOLVED = with_label(\n is.na(NOT_RESOLVED),\n \"Total number of patients with all non-fatal AEs resolved\"\n ),\n NOT_RESOLVED = with_label(\n !is.na(NOT_RESOLVED),\n \"Total number of patients with at least one non-fatal unresolved or ongoing AE\"\n )\n )\n\nadae_mult <- adae_mult %>%\n mutate(\n AEDECOD = as.character(AEDECOD),\n WD1 = with_label(\n AEACN1 == \"DRUG WITHDRAWN\",\n \"Total number of patients with study drug 1 withdrawn due to AE\"\n ),\n WD2 = with_label(\n AEACN2 == \"DRUG WITHDRAWN\",\n \"Total number of patients with study drug 2 withdrawn due to AE\"\n ),\n DSM1 = with_label(\n AEACN1 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Total number of patients with dose of study drug 1 modified/interrupted due to AE\"\n ),\n DSM2 = with_label(\n AEACN2 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Total number of patients with dose of study drug 2 modified/interrupted due to AE\"\n ),\n CONTRT = with_label(\n AECONTRT == \"Y\",\n \"Total number of patients with treatment received for AE\"\n ),\n SER = with_label(\n AESER == \"Y\",\n \"Total number of patients with at least one serious AE\"\n ),\n REL1 = with_label(\n AEREL1 == \"Y\",\n \"Total number of patients with at least one AE related to study drug 1\"\n ),\n REL2 = with_label(\n AEREL2 == \"Y\",\n \"Total number of patients with at least one AE related to study drug 2\"\n ),\n ALL_RESOLVED_WD1 = with_label(\n WD1 == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with study drug 1 withdrawn due to resolved AE\"\n ),\n ALL_RESOLVED_DSM1 = with_label(\n DSM1 == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with dose of study drug 1 modified/interrupted due to resolved AE\"\n ),\n ALL_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with treatment received for resolved AE\"\n ),\n ALL_RESOLVED_WD2 = with_label(\n WD2 == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with study drug 2 withdrawn due to resolved AE\"\n ),\n ALL_RESOLVED_DSM2 = with_label(\n DSM2 == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with dose of study drug 2 modified/interrupted due to resolved AE\"\n ),\n NOT_RESOLVED_WD1 = with_label(\n WD1 == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with study drug 1 withdrawn due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_DSM1 = with_label(\n DSM1 == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with dose of study drug 1 modified/interrupted due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with treatment received for unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_WD2 = with_label(\n WD2 == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with study drug 2 withdrawn due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_DSM2 = with_label(\n DSM2 == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with dose of study drug 2 modified/interrupted due to unresolved or ongoing AE\"\n ),\n SERWD1 = with_label(\n AESER == \"Y\" & AEACN1 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 1 withdrawn due to serious AE\"\n ),\n SERWD2 = with_label(\n AESER == \"Y\" & AEACN2 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 2 withdrawn due to serious AE\"\n ),\n SERCONTRT = with_label(\n AECONTRT == \"Y\" & AESER == \"Y\",\n \"No. of patients with treatment received for serious AE\"\n ),\n SERDSM1 = with_label(\n AESER == \"Y\" & AEACN1 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 1 modified/interrupted due to serious AE\"\n ),\n SERDSM2 = with_label(\n AESER == \"Y\" & AEACN2 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 2 modified/interrupted due to serious AE\"\n ),\n REL1WD1 = with_label(\n AEREL1 == \"Y\" & AEACN1 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 1 withdrawn due to AE related to study drug 1\"\n ),\n REL1WD2 = with_label(\n AEREL1 == \"Y\" & AEACN2 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 1 withdrawn due to AE related to study drug 2\"\n ),\n REL2WD1 = with_label(\n AEREL1 == \"Y\" & AEACN1 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 2 withdrawn due to AE related to study drug 1\"\n ),\n REL2WD2 = with_label(\n AEREL1 == \"Y\" & AEACN2 == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug 2 withdrawn due to AE related to study drug 2\"\n ),\n REL1DSM1 = with_label(\n AEREL1 == \"Y\" & AEACN1 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 1 modified/interrupted due to AE related to study drug 1\"\n ),\n REL2DSM1 = with_label(\n AEREL2 == \"Y\" & AEACN1 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 2 modified/interrupted due to AE related to study drug 1\"\n ),\n REL1DSM2 = with_label(\n AEREL1 == \"Y\" & AEACN2 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 1 modified/interrupted due to AE related to study drug 2\"\n ),\n REL2DSM2 = with_label(\n AEREL2 == \"Y\" & AEACN2 %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose of study drug 2 modified/interrupted due to AE related to study drug 2\"\n ),\n REL1CONTRT = with_label(\n AECONTRT == \"Y\" & AEREL1 == \"Y\",\n \"No. of patients with treatment received for AE related to study drug 1\"\n ),\n REL2CONTRT = with_label(\n AECONTRT == \"Y\" & AEREL2 == \"Y\",\n \"No. of patients with treatment received for AE related to study drug 2\"\n ),\n REL1SER = with_label(\n AESER == \"Y\" & AEREL1 == \"Y\",\n \"No. of patients with serious AE related to study drug 1\"\n ),\n REL2SER = with_label(\n AESER == \"Y\" & AEREL2 == \"Y\",\n \"No. of patients with serious AE related to study drug 2\"\n )\n )\n\nadae_mult <- adae_mult %>%\n mutate(AETOXGR = forcats::fct_recode(\n AETOXGR,\n \"Grade 1\" = \"1\",\n \"Grade 2\" = \"2\",\n \"Grade 3\" = \"3\",\n \"Grade 4\" = \"4\",\n \"Grade 5 (fatal outcome)\" = \"5\"\n ))\n\naesi_vars <- c(\"WD1\", \"WD2\", \"DSM1\", \"DSM2\", \"CONTRT\")\naesi_res <- c(\n \"ALL_RESOLVED\",\n \"ALL_RESOLVED_WD1\",\n \"ALL_RESOLVED_WD2\",\n \"ALL_RESOLVED_DSM1\",\n \"ALL_RESOLVED_DSM2\",\n \"ALL_RESOLVED_CONTRT\"\n)\naesi_not_res <- c(\n \"NOT_RESOLVED\",\n \"NOT_RESOLVED_WD1\",\n \"NOT_RESOLVED_WD2\",\n \"NOT_RESOLVED_DSM1\",\n \"NOT_RESOLVED_DSM2\",\n \"NOT_RESOLVED_CONTRT\"\n)\naesi_ser <- c(\"SER\", \"SERWD1\", \"SERWD2\", \"SERDSM1\", \"SERDSM2\", \"SERCONTRT\")\naesi_rel1 <- c(\"REL1\", \"REL1WD1\", \"REL1WD2\", \"REL1DSM1\", \"REL1DSM2\", \"REL1CONTRT\", \"REL1SER\")\naesi_rel2 <- c(\"REL2\", \"REL2WD1\", \"REL2WD2\", \"REL2DSM1\", \"REL2DSM2\", \"REL2CONTRT\", \"REL2SER\")\n\nlyt_adae_mult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n vars = \"USUBJID\",\n filters = c(\"ANL01FL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients with at least one AE\")\n ) %>%\n count_values(\n \"ANL01FL\",\n values = \"Y\",\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n var_labels = \"Total number of patients with at least one AE by worst grade\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(aesi_vars, aesi_res[1]), denom = \"N_col\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_res[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_res\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_not_res[1], denom = \"N_col\", table_names = \"fl_notres_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_not_res[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_notres\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_ser[1], denom = \"N_col\", table_names = \"fl_ser_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_ser[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_ser\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel1[1], denom = \"N_col\", table_names = \"fl_rel1_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel1[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_rel1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel2[1], denom = \"N_col\", table_names = \"fl_rel2_main\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_rel2[-1], denom = \"N_col\", .indent_mods = 1L, table_names = \"fl_rel2\"\n )\n\nresult <- build_table(lyt_adae_mult, df = adae_mult, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of patients with at least one AE by worst grade \n Grade 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n Grade 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n Grade 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 (fatal outcome) 64 (47.8%) 52 (38.8%) 64 (48.5%) \nTotal number of patients with study drug 1 withdrawn due to AE 22 (16.4%) 21 (15.7%) 28 (21.2%) \nTotal number of patients with study drug 2 withdrawn due to AE 22 (16.4%) 21 (15.7%) 28 (21.2%) \nTotal number of patients with dose of study drug 1 modified/interrupted due to AE 55 (41.0%) 62 (46.3%) 64 (48.5%) \nTotal number of patients with dose of study drug 2 modified/interrupted due to AE 55 (41.0%) 62 (46.3%) 64 (48.5%) \nTotal number of patients with treatment received for AE 80 (59.7%) 80 (59.7%) 89 (67.4%) \nTotal number of patients with all non-fatal AEs resolved 17 (12.7%) 12 (9.0%) 11 (8.3%) \n No. of patients with study drug 1 withdrawn due to resolved AE 0 1 (0.7%) 2 (1.5%) \n No. of patients with study drug 2 withdrawn due to resolved AE 0 1 (0.7%) 2 (1.5%) \n No. of patients with dose of study drug 1 modified/interrupted due to resolved AE 3 (2.2%) 4 (3.0%) 2 (1.5%) \n No. of patients with dose of study drug 2 modified/interrupted due to resolved AE 3 (2.2%) 4 (3.0%) 2 (1.5%) \n No. of patients with treatment received for resolved AE 9 (6.7%) 7 (5.2%) 7 (5.3%) \nTotal number of patients with at least one non-fatal unresolved or ongoing AE 83 (61.9%) 86 (64.2%) 92 (69.7%) \n No. of patients with study drug 1 withdrawn due to unresolved or ongoing AE 22 (16.4%) 20 (14.9%) 26 (19.7%) \n No. of patients with study drug 2 withdrawn due to unresolved or ongoing AE 22 (16.4%) 20 (14.9%) 26 (19.7%) \n No. of patients with dose of study drug 1 modified/interrupted due to unresolved or ongoing AE 52 (38.8%) 58 (43.3%) 62 (47.0%) \n No. of patients with dose of study drug 2 modified/interrupted due to unresolved or ongoing AE 52 (38.8%) 58 (43.3%) 62 (47.0%) \n No. of patients with treatment received for unresolved or ongoing AE 71 (53.0%) 73 (54.5%) 82 (62.1%) \nTotal number of patients with at least one serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n No. of patients with study drug 1 withdrawn due to serious AE 9 (6.7%) 4 (3.0%) 10 (7.6%) \n No. of patients with study drug 2 withdrawn due to serious AE 9 (6.7%) 4 (3.0%) 10 (7.6%) \n No. of patients with dose of study drug 1 modified/interrupted due to serious AE 21 (15.7%) 22 (16.4%) 28 (21.2%) \n No. of patients with dose of study drug 2 modified/interrupted due to serious AE 21 (15.7%) 22 (16.4%) 28 (21.2%) \n No. of patients with treatment received for serious AE 59 (44.0%) 58 (43.3%) 53 (40.2%) \nTotal number of patients with at least one AE related to study drug 1 86 (64.2%) 85 (63.4%) 92 (69.7%) \n No. of patients with study drug 1 withdrawn due to AE related to study drug 1 5 (3.7%) 10 (7.5%) 7 (5.3%) \n No. of patients with study drug 1 withdrawn due to AE related to study drug 2 5 (3.7%) 10 (7.5%) 7 (5.3%) \n No. of patients with dose of study drug 1 modified/interrupted due to AE related to study drug 1 24 (17.9%) 32 (23.9%) 34 (25.8%) \n No. of patients with dose of study drug 1 modified/interrupted due to AE related to study drug 2 24 (17.9%) 32 (23.9%) 34 (25.8%) \n No. of patients with treatment received for AE related to study drug 1 53 (39.6%) 58 (43.3%) 60 (45.5%) \n No. of patients with serious AE related to study drug 1 64 (47.8%) 52 (38.8%) 64 (48.5%) \nTotal number of patients with at least one AE related to study drug 2 86 (64.2%) 85 (63.4%) 92 (69.7%) \n No. of patients with study drug 2 withdrawn due to AE related to study drug 1 5 (3.7%) 10 (7.5%) 7 (5.3%) \n No. of patients with study drug 2 withdrawn due to AE related to study drug 2 5 (3.7%) 10 (7.5%) 7 (5.3%) \n No. of patients with dose of study drug 2 modified/interrupted due to AE related to study drug 1 24 (17.9%) 32 (23.9%) 34 (25.8%) \n No. of patients with dose of study drug 2 modified/interrupted due to AE related to study drug 2 24 (17.9%) 32 (23.9%) 34 (25.8%) \n No. of patients with treatment received for AE related to study drug 2 53 (39.6%) 58 (43.3%) 60 (45.5%) \n No. of patients with serious AE related to study drug 2 64 (47.8%) 52 (38.8%) 64 (48.5%) \n\n\n\n\n\nCodeadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nadsl <- filter(adsl, SAFFL == \"Y\")\nadae <- filter(adae, ANL01FL == \"Y\" & SAFFL == \"Y\")\n\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nstack_adae_by_smq <- function(adae, smq) {\n adae_labels <- c(var_labels(adae), \"Standardized MedDRA Query\")\n l_df <- lapply(smq, function(ae_grp) {\n ae_scope <- gsub(\"NAM\", \"SC\", ae_grp)\n keep <- adae[[ae_grp]] != \"<Missing>\"\n df <- adae[keep, ]\n if (substr(ae_grp, 1, 3) == \"SMQ\") {\n df[[\"SMQ\"]] <- aesi_label(as.character(df[[ae_grp]]), scope = as.character(df[[ae_scope]]))\n } else {\n df[[\"SMQ\"]] <- df[[ae_grp]]\n }\n df\n })\n result <- do.call(rbind, l_df)\n var_labels(result) <- adae_labels\n result\n}\n\nadae_smq <- stack_adae_by_smq(adae, c(\"SMQ01NAM\", \"SMQ02NAM\", \"CQ01NAM\"))\n\nnot_resolved <- adae_smq %>%\n filter(!(AEOUT %in% c(\"RECOVERED/RESOLVED\", \"FATAL\", \"RECOVERED/RESOLVED WITH SEQUELAE\"))) %>%\n distinct(USUBJID) %>%\n mutate(NOT_RESOLVED = \"Y\")\n\nadae_smq <- adae_smq %>%\n left_join(not_resolved, by = c(\"USUBJID\")) %>%\n mutate(\n ALL_RESOLVED = with_label(\n is.na(NOT_RESOLVED),\n \"Total number of patients with all non-fatal AEs resolved\"\n ),\n NOT_RESOLVED = with_label(\n !is.na(NOT_RESOLVED),\n \"Total number of patients with at least one non-fatal unresolved or ongoing AE\"\n )\n )\n\nadae_smq <- adae_smq %>%\n mutate(\n AEDECOD = as.character(AEDECOD),\n WD = with_label(\n AEACN == \"DRUG WITHDRAWN\",\n \"Total number of patients with study drug withdrawn due to AE\"\n ),\n DSM = with_label(\n AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Total number of patients with dose modified/interrupted due to AE\"\n ),\n CONTRT = with_label(\n AECONTRT == \"Y\",\n \"Total number of patients with treatment received for AE\"\n ),\n SER = with_label(\n AESER == \"Y\",\n \"Total number of patients with at least one serious AE\"\n ),\n REL = with_label(\n AEREL == \"Y\",\n \"Total number of patients with at least one related AE\"\n ),\n ALL_RESOLVED_WD = with_label(\n WD == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with study drug withdrawn due to resolved AE\"\n ),\n ALL_RESOLVED_DSM = with_label(\n DSM == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with dose modified/interrupted due to resolved AE\"\n ),\n ALL_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & ALL_RESOLVED == TRUE,\n \"No. of patients with treatment received for resolved AE\"\n ),\n NOT_RESOLVED_WD = with_label(\n WD == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with study drug withdrawn due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_DSM = with_label(\n DSM == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with dose modified/interrupted due to unresolved or ongoing AE\"\n ),\n NOT_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & NOT_RESOLVED == TRUE,\n \"No. of patients with treatment received for unresolved or ongoing AE\"\n ),\n SERWD = with_label(\n AESER == \"Y\" & AEACN == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug withdrawn due to serious AE\"\n ),\n SERCONTRT = with_label(\n AECONTRT == \"Y\" & AESER == \"Y\",\n \"No. of patients with treatment received for serious AE\"\n ),\n SERDSM = with_label(\n AESER == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose modified/interrupted due to serious AE\"\n ),\n RELWD = with_label(\n AEREL == \"Y\" & AEACN == \"DRUG WITHDRAWN\",\n \"No. of patients with study drug withdrawn due to related AE\"\n ),\n RELDSM = with_label(\n AEREL == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"No. of patients with dose modified/interrupted due to related AE\"\n ),\n RELCONTRT = with_label(\n AECONTRT == \"Y\" & AEREL == \"Y\",\n \"No. of patients with treatment received for related AE\"\n ),\n RELSER = with_label(\n AESER == \"Y\" & AEREL == \"Y\",\n \"No. of patients with serious, related AE\"\n )\n )\n\nadae_smq <- adae_smq %>%\n mutate(\n AETOXGR = forcats::fct_recode(AETOXGR,\n \"Grade 1\" = \"1\",\n \"Grade 2\" = \"2\",\n \"Grade 3\" = \"3\",\n \"Grade 4\" = \"4\",\n \"Grade 5 (fatal outcome)\" = \"5\"\n )\n )\n\nsplit_fun <- remove_split_levels(\"<Missing>\")\naesi_vars <- c(\"WD\", \"DSM\", \"CONTRT\", \"ALL_RESOLVED\", \"NOT_RESOLVED\", \"SER\", \"REL\")\n\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n split_fun = split_fun,\n split_label = \"Standardized MedDRA Query\",\n label_pos = \"topleft\"\n ) %>%\n count_patients_with_event(\n vars = \"USUBJID\",\n filters = c(\"ANL01FL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients with at least one AE\")\n ) %>%\n count_values(\n \"ANL01FL\",\n values = \"Y\",\n .stats = \"count\",\n .labels = c(count = \"Total number of AEs\"),\n table_names = \"total_aes\"\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n var_labels = \"Total number of patients with at least one AE by worst grade\",\n .show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\"USUBJID\", flag_variables = aesi_vars, denom = \"N_col\")\n\nresult <- build_table(lyt_adae, df = adae_smq, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination\nStandardized MedDRA Query (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nC.1.1.1.3/B.2.2.3.1 AESI (BROAD) \n Total number of patients with at least one AE 58 (43.3%) 60 (44.8%) 66 (50.0%) \n Total number of AEs 97 106 122 \n Total number of patients with at least one AE by worst grade \n Grade 1 22 (16.4%) 26 (19.4%) 30 (22.7%) \n Grade 2 0 0 0 \n Grade 3 0 0 0 \n Grade 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 5 (fatal outcome) 0 0 0 \n Total number of patients with study drug withdrawn due to AE 5 (3.7%) 6 (4.5%) 9 (6.8%) \n Total number of patients with dose modified/interrupted due to AE 21 (15.7%) 21 (15.7%) 24 (18.2%) \n Total number of patients with treatment received for AE 32 (23.9%) 35 (26.1%) 44 (33.3%) \n Total number of patients with all non-fatal AEs resolved 7 (5.2%) 9 (6.7%) 8 (6.1%) \n Total number of patients with at least one non-fatal unresolved or ongoing AE 51 (38.1%) 51 (38.1%) 58 (43.9%) \n Total number of patients with at least one serious AE 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Total number of patients with at least one related AE 36 (26.9%) 34 (25.4%) 36 (27.3%) \nD.2.1.5.3/A.1.1.1.1 AESI \n Total number of patients with at least one AE 62 (46.3%) 61 (45.5%) 76 (57.6%) \n Total number of AEs 106 100 139 \n Total number of patients with at least one AE by worst grade \n Grade 1 62 (46.3%) 61 (45.5%) 76 (57.6%) \n Grade 2 0 0 0 \n Grade 3 0 0 0 \n Grade 4 0 0 0 \n Grade 5 (fatal outcome) 0 0 0 \n Total number of patients with study drug withdrawn due to AE 6 (4.5%) 8 (6.0%) 4 (3.0%) \n Total number of patients with dose modified/interrupted due to AE 23 (17.2%) 20 (14.9%) 26 (19.7%) \n Total number of patients with treatment received for AE 33 (24.6%) 37 (27.6%) 33 (25.0%) \n Total number of patients with all non-fatal AEs resolved 4 (3.0%) 5 (3.7%) 14 (10.6%) \n Total number of patients with at least one non-fatal unresolved or ongoing AE 58 (43.3%) 56 (41.8%) 62 (47.0%) \n Total number of patients with at least one serious AE 0 0 0 \n Total number of patients with at least one related AE 37 (27.6%) 46 (34.3%) 50 (37.9%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n ADAE <- filter(ADAE, ANL01FL == \"Y\" & SAFFL == \"Y\")\n\n not_resolved <- ADAE %>%\n filter(!(AEOUT %in% c(\"RECOVERED/RESOLVED\", \"FATAL\", \"RECOVERED/RESOLVED WITH SEQUELAE\"))) %>%\n distinct(USUBJID) %>%\n mutate(NOT_RESOLVED = \"Y\")\n\n ADAE <- ADAE %>%\n left_join(not_resolved, by = c(\"USUBJID\")) %>%\n mutate(\n ALL_RESOLVED = with_label(is.na(NOT_RESOLVED), \"All non-fatal AEs resolved\"),\n NOT_RESOLVED = with_label(!is.na(NOT_RESOLVED), \"At least one non-fatal unresolved or ongoing AE\")\n )\n\n ADAE <- ADAE %>%\n mutate(\n AEDECOD = as.character(AEDECOD),\n WD = with_label(AEACN == \"DRUG WITHDRAWN\", \"AE that led to study drug withdrawal\"),\n DSM = with_label(\n AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"AE that led to study drug dose modified/interrupted\"\n ),\n CONTRT = with_label(AECONTRT == \"Y\", \"AE that required treatment\"),\n SER = with_label(AESER == \"Y\", \"Serious AE\"),\n REL = with_label(AEREL == \"Y\", \"Related AE\"),\n ALL_RESOLVED_WD = with_label(\n WD == TRUE & ALL_RESOLVED == TRUE,\n \"Resolved AE that led to study drug withdrawal\"\n ),\n ALL_RESOLVED_DSM = with_label(\n DSM == TRUE & ALL_RESOLVED == TRUE,\n \"Resolved AE that led to study drug dose modified/interrupted\"\n ),\n ALL_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & ALL_RESOLVED == TRUE,\n \"Resolved AE that required treatment\"\n ),\n NOT_RESOLVED_WD = with_label(\n WD == TRUE & NOT_RESOLVED == TRUE,\n \"Unresolved AE that led to study drug withdrawal\"\n ),\n NOT_RESOLVED_DSM = with_label(\n DSM == TRUE & NOT_RESOLVED == TRUE,\n \"Unresolved AE that led to study drug dose modified/interrupted\"\n ),\n NOT_RESOLVED_CONTRT = with_label(\n CONTRT == TRUE & NOT_RESOLVED == TRUE,\n \"Unresolved AE that required treatment\"\n ),\n SERWD = with_label(\n AESER == \"Y\" & AEACN == \"DRUG WITHDRAWN\",\n \"Serious AE that led to study drug withdrawal\"\n ),\n SERCONTRT = with_label(\n AECONTRT == \"Y\" & AESER == \"Y\",\n \"Serious AE that required treatment\"\n ),\n SERDSM = with_label(\n AESER == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Serious AE that led to study drug dose modified/interrupted\"\n ),\n RELWD = with_label(\n AEREL == \"Y\" & AEACN == \"DRUG WITHDRAWN\", \"Related AE that led to study drug withdrawal\"\n ),\n RELDSM = with_label(\n AEREL == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Related AE that led to study drug dose modified/interrupted\"\n ),\n RELCONTRT = with_label(AECONTRT == \"Y\" & AEREL == \"Y\", \"Related AE that required treatment\"),\n RELSER = with_label(AESER == \"Y\" & AEREL == \"Y\", \"Serious related AE\")\n )\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\naesi_vars <- c(\n \"WD\", \"DSM\", \"CONTRT\", \"ALL_RESOLVED_WD\", \"ALL_RESOLVED_DSM\", \"ALL_RESOLVED_CONTRT\",\n \"NOT_RESOLVED_WD\", \"NOT_RESOLVED_DSM\", \"NOT_RESOLVED_CONTRT\", \"SER\", \"SERWD\", \"SERDSM\",\n \"SERCONTRT\", \"REL\", \"RELWD\", \"RELDSM\", \"RELCONTRT\", \"RELSER\"\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_summary(\n label = \"Adverse Events Summary\",\n dataname = \"ADAE\",\n arm_var = choices_selected(\n choices = variable_choices(\"ADSL\", c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n flag_var_anl = choices_selected(\n choices = variable_choices(\"ADAE\", aesi_vars),\n selected = aesi_vars[1],\n keep_order = TRUE,\n fixed = FALSE\n ),\n add_total = TRUE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:41:38 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", - "AET09_SMQ" + "AET01_AESI" ] }, { - "objectID": "tables/adverse-events/aet02.html", - "href": "tables/adverse-events/aet02.html", - "title": "AET02", + "objectID": "tables/efficacy/ratet01.html", + "href": "tables/efficacy/ratet01.html", + "title": "RATET01", "section": "", - "text": "Data Setup\nStandard Table\nTable with Event Totals\nTable with High-Level Term\nTable with Preferred Terms Only\nTable with Fill-In of Treatment Groups\nTable of AEs with an Incidence Rate \\(\\geq\\) 5% in Any Treatment Group (subsetting preferred terms based on frequency)\nTable of AEs with an Incidence Rate \\(\\geq\\) 5% in Any Treatment Group (subsetting preferred terms based on frequency with high-level terms)\nTable of AEs with an Incidence Rate \\(\\geq\\) 10% in Any Treatment Group (subsetting preferred terms based on frequency)\nTable of AEs with an Incidence Rate \\(\\geq\\) 3 Patients in Any Treatment Group (subsetting preferred terms based on number of patients)\nTable of AEs with a Difference in Incidence Rate \\(\\geq\\) 5% Between Any Treatment (subsetting preferred terms based on difference in percentage between treatment groups)\nTable of AEs with an Incidence Rate \\(\\geq\\) 5% in B: Placebo (subsetting preferred terms based on frequency for a particular treatment group)\nTable of AEs with a Difference in Incidence Rate \\(\\geq\\) 5% Between Arm A and Arm B or Arm C (displaying preferred terms with a difference of at least x% between selected treatment groups)\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae) %>%\n var_relabel(\n AEBODSYS = \"MedDRA System Organ Class\",\n AEDECOD = \"MedDRA Preferred Term\"\n ) %>%\n filter(ANL01FL == \"Y\")\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = -1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl)\n\n\nThe variable result corresponds to the adverse events table. However, it includes many empty rows accounting for events which were not reported. The table can be post-processed to prune empty rows and to sort rows, for example by occurrence.\n\nCoderesult <- result %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination All Patients\n MedDRA Preferred Term (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 100 (74.6%) 98 (73.1%) 103 (78.0%) 301 (75.2%) \nOverall total number of events 502 480 604 1586 \ncl A.1 \n Total number of patients with at least one adverse event 68 (50.7%) 58 (43.3%) 76 (57.6%) 202 (50.5%) \n Total number of events 115 99 137 351 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) 128 (32.0%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) 122 (30.5%) \ncl B.2 \n Total number of patients with at least one adverse event 62 (46.3%) 56 (41.8%) 74 (56.1%) 192 (48.0%) \n Total number of events 102 106 127 335 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) 123 (30.8%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) 119 (29.8%) \ncl D.1 \n Total number of patients with at least one adverse event 64 (47.8%) 54 (40.3%) 68 (51.5%) 186 (46.5%) \n Total number of events 106 84 114 304 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) 120 (30.0%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) 112 (28.0%) \ncl D.2 \n Total number of patients with at least one adverse event 37 (27.6%) 46 (34.3%) 50 (37.9%) 133 (33.2%) \n Total number of events 49 57 65 171 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) 133 (33.2%) \ncl C.2 \n Total number of patients with at least one adverse event 28 (20.9%) 36 (26.9%) 48 (36.4%) 112 (28.0%) \n Total number of events 39 40 57 136 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) 112 (28.0%) \ncl B.1 \n Total number of patients with at least one adverse event 38 (28.4%) 37 (27.6%) 36 (27.3%) 111 (27.8%) \n Total number of events 44 43 50 137 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) 111 (27.8%) \ncl C.1 \n Total number of patients with at least one adverse event 36 (26.9%) 34 (25.4%) 36 (27.3%) 106 (26.5%) \n Total number of events 47 51 54 152 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) 106 (26.5%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L) %>%\n count_values(\n \"STUDYID\",\n values = as.character(unique(adae$STUDYID)),\n .stats = \"count\",\n .labels = c(count = \"Total number of events\"),\n .indent_mods = c(count = -1L)\n )\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n )\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination All Patients\n MedDRA Preferred Term (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 100 (74.6%) 98 (73.1%) 103 (78.0%) 301 (75.2%) \nOverall total number of events 502 480 604 1586 \ncl A.1 \n Total number of patients with at least one adverse event 68 (50.7%) 58 (43.3%) 76 (57.6%) 202 (50.5%) \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) 128 (32.0%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) 122 (30.5%) \n Total number of events 115 99 137 351 \ncl B.2 \n Total number of patients with at least one adverse event 62 (46.3%) 56 (41.8%) 74 (56.1%) 192 (48.0%) \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) 123 (30.8%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) 119 (29.8%) \n Total number of events 102 106 127 335 \ncl D.1 \n Total number of patients with at least one adverse event 64 (47.8%) 54 (40.3%) 68 (51.5%) 186 (46.5%) \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) 120 (30.0%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) 112 (28.0%) \n Total number of events 106 84 114 304 \ncl D.2 \n Total number of patients with at least one adverse event 37 (27.6%) 46 (34.3%) 50 (37.9%) 133 (33.2%) \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) 133 (33.2%) \n Total number of events 49 57 65 171 \ncl C.2 \n Total number of patients with at least one adverse event 28 (20.9%) 36 (26.9%) 48 (36.4%) 112 (28.0%) \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) 112 (28.0%) \n Total number of events 39 40 57 136 \ncl B.1 \n Total number of patients with at least one adverse event 38 (28.4%) 37 (27.6%) 36 (27.3%) 111 (27.8%) \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) 111 (27.8%) \n Total number of events 44 43 50 137 \ncl C.1 \n Total number of patients with at least one adverse event 36 (26.9%) 34 (25.4%) 36 (27.3%) 106 (26.5%) \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) 106 (26.5%) \n Total number of events 47 51 54 152 \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEHLT\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n indent_mod = -1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEHLT)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, c(\"AEDECOD\"), indent = 2L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedDRA System Organ Class \n High Level Term A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 100 (74.6%) 98 (73.1%) 103 (78.0%) \nOverall total number of events 502 480 604 \ncl A.1 \n Total number of patients with at least one adverse event 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Total number of events 115 99 137 \n hlt A.1.1.1 \n Total number of patients with at least one adverse event 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Total number of events 115 99 137 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n Total number of patients with at least one adverse event 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Total number of events 102 106 127 \n hlt B.2.2.3 \n Total number of patients with at least one adverse event 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Total number of events 50 55 68 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n hlt B.2.1.2 \n Total number of patients with at least one adverse event 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Total number of events 52 51 59 \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n Total number of patients with at least one adverse event 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Total number of events 106 84 114 \n hlt D.1.1.1 \n Total number of patients with at least one adverse event 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Total number of events 52 40 64 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n hlt D.1.1.4 \n Total number of patients with at least one adverse event 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Total number of events 54 44 50 \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n Total number of patients with at least one adverse event 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Total number of events 49 57 65 \n hlt D.2.1.5 \n Total number of patients with at least one adverse event 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Total number of events 49 57 65 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n Total number of patients with at least one adverse event 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Total number of events 39 40 57 \n hlt C.2.1.2 \n Total number of patients with at least one adverse event 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Total number of events 39 40 57 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n Total number of patients with at least one adverse event 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Total number of events 44 43 50 \n hlt B.1.1.1 \n Total number of patients with at least one adverse event 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Total number of events 44 43 50 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n Total number of patients with at least one adverse event 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Total number of events 47 51 54 \n hlt C.1.1.1 \n Total number of patients with at least one adverse event 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Total number of events 47 51 54 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n ),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(vars = \"AEDECOD\") %>%\n append_varlabels(adae, \"AEDECOD\")\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n sort_at_path(\n path = c(\"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination\nMedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of events 502 480 604 \ndcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ndcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \ndcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \ndcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ndcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \ndcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ndcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ndcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ndcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ndcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodeadae_5 <- adae %>% dplyr::filter(ACTARM != \"C: Combination\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae_5, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 100 (74.6%) 98 (73.1%) 0 \nOverall total number of events 502 480 0 \ncl A.1 \n Total number of patients with at least one adverse event 68 (50.7%) 58 (43.3%) 0 \n Total number of events 115 99 0 \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 0 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 0 \ncl B.2 \n Total number of patients with at least one adverse event 62 (46.3%) 56 (41.8%) 0 \n Total number of events 102 106 0 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 0 \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 0 \ncl D.1 \n Total number of patients with at least one adverse event 64 (47.8%) 54 (40.3%) 0 \n Total number of events 106 84 0 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 0 \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 0 \ncl D.2 \n Total number of patients with at least one adverse event 37 (27.6%) 46 (34.3%) 0 \n Total number of events 49 57 0 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 0 \ncl B.1 \n Total number of patients with at least one adverse event 38 (28.4%) 37 (27.6%) 0 \n Total number of events 44 43 0 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 0 \ncl C.1 \n Total number of patients with at least one adverse event 36 (26.9%) 34 (25.4%) 0 \n Total number of events 47 51 0 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 0 \ncl C.2 \n Total number of patients with at least one adverse event 28 (20.9%) 36 (26.9%) 0 \n Total number of events 39 40 0 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 0 \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_fraction_in_any_col(\n atleast = 0.05,\n col_names = names(table(adsl$ACTARM))\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n split_rows_by(\n \"AEHLT\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEHLT)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(vars = \"AEDECOD\") %>%\n append_varlabels(adae, c(\"AEDECOD\"), indent = 2L)\n\nresult <- build_table(lyt, adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\"),\n scorefun = cont_n_allcols,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences,\n decreasing = TRUE\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_fraction_in_any_col(\n atleast = 0.05,\n col_names = names(table(adsl$ACTARM))\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class \n High Level Term A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n hlt A.1.1.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n hlt B.2.2.3 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n hlt B.2.1.2 \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n hlt D.1.1.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n hlt D.1.1.4 \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n hlt D.2.1.5 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n hlt C.2.1.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n hlt B.1.1.1 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n hlt C.1.1.1 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_fraction_in_any_col(\n atleast = 0.10,\n col_names = names(table(adsl$ACTARM))\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n split_label = obj_label(adae$AEBODSYS),\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_count_in_any_col(\n atleast = 3,\n col_names = names(table(adsl$ACTARM))\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_fractions_difference(\n atleast = 0.05,\n col_names = levels(adsl$ACTARM)\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_fraction_in_cols(\n atleast = 0.05,\n col_names = c(\"B: Placebo\")\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition1 <- has_fractions_difference(atleast = 0.05, col_names = c(\"A: Drug X\", \"B: Placebo\"))\nrow_condition2 <- has_fractions_difference(atleast = 0.05, col_names = c(\"A: Drug X\", \"C: Combination\"))\nrow_condition <- row_condition1 | row_condition2\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAE <- df_explicit_na(ADAE)\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Adverse Event Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = \"AEBODSYS\"\n ),\n add_total = TRUE,\n event_type = \"adverse event\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:42:38 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "This example will focus on data from a single visit “WEEK 1 DAY 8” and a single endpoint “FKSI-FWB”. Only evaluable populations will be analyzed.\n\n\nData Setup\nCustomized Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nanl <- synthetic_cdisc_dataset(\"latest\", \"adtte\") %>%\n filter(PARAMCD == \"TNE\")\n\n# Ensure number of exacerbation is a factor and NAs are explicit missing levels.\nanl$AVAL_f <- as.factor(anl$AVAL)\nanl <- df_explicit_na(anl)\n\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"B: Placebo\", split_fun = ref_group_position(\"first\")) %>%\n analyze_vars(\n \"AVAL_f\",\n var_labels = \"Number of exacerbations per patient\",\n .stats = c(\"count_fraction\"),\n .formats = c(\"count_fraction\" = \"xx (xx.xx%)\"),\n .labels = c(\"Number of exacerbations per patient\")\n ) %>%\n summarize_glm_count(\n vars = \"AVAL\",\n variables = list(arm = \"ARM\", offset = \"lgTMATRSK\", covariates = NULL),\n conf_level = 0.95,\n distribution = \"poisson\",\n rate_mean_method = \"emmeans\",\n var_labels = \"Unadjusted exacerbation rate (per year)\",\n table_names = \"unadj\",\n .stats = c(\"rate\"),\n .labels = c(rate = \"Rate\")\n ) %>%\n summarize_glm_count(\n vars = \"AVAL\",\n variables = list(arm = \"ARM\", offset = \"lgTMATRSK\", covariates = c(\"REGION1\")),\n conf_level = 0.95,\n distribution = \"quasipoisson\",\n rate_mean_method = \"ppmeans\",\n var_labels = \"Adjusted (QP) exacerbation rate (per year)\",\n table_names = \"adj-qp\",\n .stats = c(\"rate\", \"rate_ci\", \"rate_ratio\", \"rate_ratio_ci\", \"pval\"),\n .labels = c(\n rate = \"Rate\", rate_ci = \"Rate CI\", rate_ratio = \"Rate Ratio\",\n rate_ratio_ci = \"Rate Ratio CI\", pval = \"p value\"\n )\n ) %>%\n summarize_glm_count(\n vars = \"AVAL\",\n variables = list(arm = \"ARM\", offset = \"lgTMATRSK\", covariates = c(\"REGION1\")),\n conf_level = 0.95,\n distribution = \"negbin\",\n rate_mean_method = \"emmeans\",\n var_labels = \"Adjusted (NB) exacerbation rate (per year)\",\n table_names = \"adj-nb\",\n .stats = c(\"rate\", \"rate_ci\", \"rate_ratio\", \"rate_ratio_ci\", \"pval\"),\n .labels = c(\n rate = \"Rate\", rate_ci = \"Rate CI\", rate_ratio = \"Rate Ratio\",\n rate_ratio_ci = \"Rate Ratio CI\", pval = \"p value\"\n )\n )\nresult <- build_table(\n lyt = lyt,\n df = anl\n)\nresult\n\n B: Placebo A: Drug X C: Combination \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nNumber of exacerbations per patient \n 0 10 (7.46%) 6 (4.48%) 11 (8.33%) \n 1 25 (18.66%) 21 (15.67%) 14 (10.61%) \n 2 38 (28.36%) 41 (30.60%) 33 (25.00%) \n 3 22 (16.42%) 26 (19.40%) 21 (15.91%) \n 4 13 (9.70%) 18 (13.43%) 30 (22.73%) \n 5 11 (8.21%) 10 (7.46%) 12 (9.09%) \n 6 10 (7.46%) 7 (5.22%) 7 (5.30%) \n 7 3 (2.24%) 4 (2.99%) 3 (2.27%) \n 8 1 (0.75%) 1 (0.75%) 1 (0.76%) \n 9 1 (0.75%) 0 (0.00%) 0 (0.00%) \nUnadjusted exacerbation rate (per year) \n Rate 7.2364 8.2148 9.8131 \nAdjusted (QP) exacerbation rate (per year) \n Rate 2.4550 2.8514 3.4304 \n Rate CI (1.6194, 3.7219) (1.8974, 4.2850) (2.2946, 5.1284)\n Rate Ratio 1.1615 1.3973 \n Rate Ratio CI (0.6462, 2.0877) (0.7789, 2.5067)\n p value 0.6169 0.2619 \nAdjusted (NB) exacerbation rate (per year) \n Rate 2.7374 2.8150 2.9789 \n Rate CI (2.3932, 3.1311) (2.4681, 3.2106) (2.6152, 3.3932)\n Rate Ratio 1.0283 1.0882 \n Rate Ratio CI (0.8856, 1.1941) (0.9381, 1.2624)\n p value 0.7140 0.2643 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In Progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:41:04 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9018 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] sandwich_3.1-0 utf8_1.2.4 generics_0.1.3 tidyr_1.3.1 \n [5] stringi_1.8.3 lattice_0.22-6 digest_0.6.35 evaluate_0.23 \n [9] grid_4.3.3 estimability_1.5 mvtnorm_1.2-4 fastmap_1.1.1 \n[13] jsonlite_1.8.8 Matrix_1.6-5 backports_1.4.1 brio_1.1.4 \n[17] survival_3.5-8 multcomp_1.4-25 purrr_1.0.2 fansi_1.0.6 \n[21] scales_1.3.0 TH.data_1.1-2 codetools_0.2-19 Rdpack_2.6 \n[25] cli_3.6.2 rlang_1.1.3 rbibutils_2.2.16 munsell_0.5.0 \n[29] splines_4.3.3 yaml_2.3.8 tools_4.3.3 checkmate_2.3.1 \n[33] coda_0.19-4.1 colorspace_2.1-0 ggplot2_3.5.0 forcats_1.0.0 \n[37] broom_1.0.5 vctrs_0.6.5 R6_2.5.1 zoo_1.8-12 \n[41] lifecycle_1.0.4 emmeans_1.10.0 htmlwidgets_1.6.4 MASS_7.3-60.0.1 \n[45] pkgconfig_2.0.3 pillar_1.9.0 gtable_0.3.4 glue_1.7.0 \n[49] xfun_0.42 tibble_3.2.1 tidyselect_1.2.1 knitr_1.45 \n[53] xtable_1.8-4 htmltools_0.5.7 rmarkdown_2.26 testthat_3.2.1 \n[57] compiler_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Adverse Events", - "AET02" + "Efficacy", + "RATET01" ] }, { - "objectID": "tables/adverse-events/aet10.html", - "href": "tables/adverse-events/aet10.html", - "title": "AET10", + "objectID": "tables/efficacy/aovt01.html", + "href": "tables/efficacy/aovt01.html", + "title": "AOVT01", "section": "", - "text": "Data Setup\nStandard Table\nMost Common (\\(\\geq\\) 35%) Adverse Events (setting threshold)\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\n\n\n\nThe “All Patients” column is not required in this table but for illustrative purposes we include it to show correct sorting.\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n var = \"ARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_occurrences(vars = \"AEDECOD\")\n\ntbl1 <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n)\n\ntbl2 <- prune_table(\n tt = tbl1,\n prune_func = keep_rows(\n has_fraction_in_any_col(\n atleast = 0.05, # specify threshold\n col_names = levels(adsl$ARM)\n )\n )\n)\n\nresult <- sort_at_path(\n tbl2,\n path = c(\"AEDECOD\"),\n scorefun = score_occurrences\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————\ndcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%) 162 (40.5%) \ndcd A.1.1.1.1 50 (37.3%) 45 (33.6%) 63 (47.7%) 158 (39.5%) \ndcd B.2.2.3.1 48 (35.8%) 54 (40.3%) 51 (38.6%) 153 (38.2%) \ndcd A.1.1.1.2 48 (35.8%) 48 (35.8%) 50 (37.9%) 146 (36.5%) \ndcd B.2.1.2.1 49 (36.6%) 44 (32.8%) 52 (39.4%) 145 (36.2%) \ndcd D.1.1.1.1 50 (37.3%) 42 (31.3%) 51 (38.6%) 143 (35.8%) \ndcd D.1.1.4.2 48 (35.8%) 42 (31.3%) 50 (37.9%) 140 (35.0%) \ndcd B.1.1.1.1 47 (35.1%) 49 (36.6%) 43 (32.6%) 139 (34.8%) \ndcd C.2.1.2.1 35 (26.1%) 48 (35.8%) 55 (41.7%) 138 (34.5%) \ndcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%) 132 (33.0%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n var = \"ARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_occurrences(vars = \"AEDECOD\")\n\ntbl1 <- build_table(\n lyt = lyt,\n df = adae,\n alt_counts_df = adsl\n)\n\ntbl2 <- prune_table(\n tt = tbl1,\n prune_func = keep_rows(\n has_fraction_in_any_col(\n atleast = 0.35, # specify threshold\n col_names = levels(adsl$ARM)\n )\n )\n)\n\nresult <- sort_at_path(\n tbl2,\n path = c(\"AEDECOD\"),\n scorefun = score_occurrences\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————\ndcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%) 162 (40.5%) \ndcd A.1.1.1.1 50 (37.3%) 45 (33.6%) 63 (47.7%) 158 (39.5%) \ndcd B.2.2.3.1 48 (35.8%) 54 (40.3%) 51 (38.6%) 153 (38.2%) \ndcd A.1.1.1.2 48 (35.8%) 48 (35.8%) 50 (37.9%) 146 (36.5%) \ndcd B.2.1.2.1 49 (36.6%) 44 (32.8%) 52 (39.4%) 145 (36.2%) \ndcd D.1.1.1.1 50 (37.3%) 42 (31.3%) 51 (38.6%) 143 (35.8%) \ndcd D.1.1.4.2 48 (35.8%) 42 (31.3%) 50 (37.9%) 140 (35.0%) \ndcd B.1.1.1.1 47 (35.1%) 49 (36.6%) 43 (32.6%) 139 (34.8%) \ndcd C.2.1.2.1 35 (26.1%) 48 (35.8%) 55 (41.7%) 138 (34.5%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nThe desired frequency is specified in prune_freq. For illustration, frequency is set to \\(\\geq\\) 35%.\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAE <- df_explicit_na(ADAE)\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Adverse Event Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = NULL\n ),\n add_total = TRUE,\n event_type = \"adverse event\",\n prune_freq = 35,\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:42:01 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadqs <- df_explicit_na(adqs)\n\nadqs_multi <- filter(adqs, AVISIT == \"WEEK 1 DAY 8\")\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nl <- basic_table() %>%\n split_cols_by(\"ARMCD\", ref_group = \"ARM A\") %>%\n split_rows_by(\"PARAMCD\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adqs_multi$PARAMCD)\n ) %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(\n arm = \"ARMCD\",\n covariates = c(\"BASE\", \"STRATA1\")\n ),\n conf_level = 0.95,\n var_labels = \"Adjusted mean\"\n )\n\nresult <- build_table(\n lyt = l,\n df = adqs_multi,\n alt_counts_df = adsl\n)\n\nresult\n\nParameter Code ARM A ARM B ARM C \n————————————————————————————————————————————————————————————————————————\nBFIALL \n Adjusted mean \n n 134 134 132 \n Adjusted Mean 4.47 6.33 4.02 \n Difference in Adjusted Means 1.85 -0.46 \n 95% CI (-0.14, 3.85) (-2.45, 1.54)\n p-value 0.0679 0.6539 \nFATIGI \n Adjusted mean \n n 134 134 132 \n Adjusted Mean 5.42 4.83 4.56 \n Difference in Adjusted Means -0.59 -0.86 \n 95% CI (-2.58, 1.41) (-2.87, 1.15)\n p-value 0.5644 0.4026 \nFKSI-FWB \n Adjusted mean \n n 134 134 132 \n Adjusted Mean 4.29 3.51 3.06 \n Difference in Adjusted Means -0.79 -1.24 \n 95% CI (-2.71, 1.14) (-3.17, 0.69)\n p-value 0.4221 0.2088 \nFKSI-TSE \n Adjusted mean \n n 134 134 132 \n Adjusted Mean 4.70 3.84 4.45 \n Difference in Adjusted Means -0.86 -0.25 \n 95% CI (-2.80, 1.09) (-2.20, 1.70)\n p-value 0.3858 0.8007 \nFKSIALL \n Adjusted mean \n n 134 134 132 \n Adjusted Mean 5.03 5.82 6.44 \n Difference in Adjusted Means 0.79 1.42 \n 95% CI (-1.17, 2.76) (-0.56, 3.39)\n p-value 0.4288 0.1591 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADQS <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADQS <- df_explicit_na(ADQS)\n})\ndatanames <- c(\"ADSL\", \"ADQS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADQS <- data[[\"ADQS\"]]\narm_ref_comp <- list(\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n ),\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_ancova(\n label = \"ANCOVA table\",\n dataname = \"ADQS\",\n avisit = choices_selected(\n choices = value_choices(ADQS, \"AVISIT\"),\n selected = \"WEEK 1 DAY 8\"\n ),\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ACTARMCD\")),\n selected = \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n aval_var = choices_selected(\n choices = variable_choices(ADQS, c(\"CHG\", \"AVAL\")),\n selected = \"CHG\"\n ),\n cov_var = choices_selected(\n choices = variable_choices(ADQS, c(\"BASE\", \"STRATA1\", \"SEX\")),\n selected = \"STRATA1\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADQS, \"PARAMCD\", \"PARAM\"),\n selected = c(\"FKSI-FWB\", \"BFIALL\")\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:40:39 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Adverse Events", - "AET10" + "Efficacy", + "AOVT01" ] }, { - "objectID": "tables/disposition/pdt02.html", - "href": "tables/disposition/pdt02.html", - "title": "PDT02", + "objectID": "tables/efficacy/aovt02.html", + "href": "tables/efficacy/aovt02.html", + "title": "AOVT02", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\naddv <- synthetic_cdisc_dataset(\"latest\", \"addv\")\n\nadsl <- df_explicit_na(adsl)\naddv <- df_explicit_na(addv)\n\naddv_pan <- addv %>%\n filter(AEPRELFL == \"Y\" & DVCAT == \"MAJOR\") %>%\n var_relabel(\n DVREAS = \"Primary Reason\",\n DVTERM = \"Description\"\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one major protocol deviation related to epidemic/pandemic\",\n nonunique = \"Total number of major protocol deviations related to epidemic/pandemic\"\n )\n ) %>%\n split_rows_by(\n \"DVREAS\",\n split_fun = drop_split_levels,\n nested = FALSE,\n label_pos = \"topleft\",\n split_label = obj_label(addv_pan$DVREAS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = \"Site action due to epidemic/pandemic\"\n ) %>%\n count_occurrences(vars = \"DVTERM\") %>%\n append_varlabels(addv_pan, \"DVTERM\", indent = 1L)\n\nresult <- build_table(lyt, addv_pan, alt_counts_df = adsl)\nresult\n\nPrimary Reason A: Drug X B: Placebo C: Combination\n Description (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one major protocol deviation related to epidemic/pandemic 8 (6.0%) 4 (3.0%) 4 (3.0%) \nTotal number of major protocol deviations related to epidemic/pandemic 8 5 4 \nSite action due to epidemic/pandemic 8 (6.0%) 4 (3.0%) 4 (3.0%) \n Dose missed or significantly out of window 2 (1.5%) 0 1 (0.8%) \n Failure to sign updated ICF within two visits 2 (1.5%) 1 (0.7%) 1 (0.8%) \n Missed 2 or more efficacy assessments 1 (0.7%) 2 (1.5%) 0 \n Significant deviation from planned dose 3 (2.2%) 1 (0.7%) 2 (1.5%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:41:33 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9016 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "This example will focus on data from a single visit “WEEK 1 DAY 8” and a single endpoint “FKSI-FWB”. Only evaluable populations will be analyzed.\n\n\nData Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadqs <- df_explicit_na(adqs)\n\nadqs_single <- adqs %>%\n filter(\n AVISIT == \"WEEK 1 DAY 8\",\n PARAMCD == \"FKSI-FWB\"\n ) %>%\n mutate(CHG = ifelse(BMEASIFL == \"Y\", CHG, NA))\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\", ref_group = \"ARM A\") %>%\n append_varlabels(adqs_single, \"PARAM\") %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(arm = \"ARMCD\", covariates = NULL),\n conf_level = 0.95,\n var_labels = \"Unadjusted comparison\",\n .labels = c(lsmean = \"Mean\", lsmean_diff = \"Difference in Means\"),\n table_names = \"unadjusted\"\n ) %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(arm = \"ARMCD\", covariates = c(\"BASE\", \"STRATA1\")),\n conf_level = 0.95,\n var_labels = \"Adjusted comparison (covariates BASE and STRATA1)\",\n table_names = \"adjusted\"\n )\n\nresult <- build_table(\n lyt = lyt,\n df = adqs_single,\n alt_counts_df = adsl\n)\n\nresult\n\n ARM A ARM B ARM C \nParameter (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————\nUnadjusted comparison \n n 68 73 62 \n Mean 3.68 5.07 3.09 \n Difference in Means 1.38 -0.59 \n 95% CI (-2.76, 5.53) (-4.91, 3.73)\n p-value 0.5113 0.7873 \nAdjusted comparison (covariates BASE and STRATA1) \n n 68 73 62 \n Adjusted Mean 4.06 3.57 3.34 \n Difference in Adjusted Means -0.49 -0.72 \n 95% CI (-3.28, 2.29) (-3.57, 2.12)\n p-value 0.7277 0.6165 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADQS <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADQS <- df_explicit_na(ADQS)\n})\ndatanames <- c(\"ADSL\", \"ADQS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADQS <- data[[\"ADQS\"]]\narm_ref_comp <- list(\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n ),\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_ancova(\n label = \"ANCOVA table\",\n dataname = \"ADQS\",\n avisit = choices_selected(\n choices = value_choices(ADQS, \"AVISIT\"),\n selected = \"WEEK 1 DAY 8\"\n ),\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ACTARMCD\")),\n selected = \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n aval_var = choices_selected(\n choices = variable_choices(ADQS, c(\"CHG\", \"AVAL\")),\n selected = \"CHG\"\n ),\n cov_var = choices_selected(\n choices = variable_choices(ADQS, c(\"BASE\", \"STRATA1\", \"SEX\")),\n selected = \"STRATA1\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADQS, \"PARAMCD\", \"PARAM\"),\n selected = \"FKSI-FWB\"\n )\n )\n )\n)\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:40:12 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Disposition", - "PDT02" + "Efficacy", + "AOVT02" ] }, { - "objectID": "tables/ADA/adat02.html", - "href": "tables/ADA/adat02.html", - "title": "ADAT02", + "objectID": "tables/efficacy/mmrmt01.html", + "href": "tables/efficacy/mmrmt01.html", + "title": "MMRMT01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadab <- df_explicit_na(adab) %>%\n mutate(ADPBLPFL = \"Y\") %>% # temp fix\n filter(\n ADPBLPFL == \"Y\",\n !PARAM %in% c(\n \"NAB interpreted per sample result\",\n \"NAB Status of a patient\",\n \"Treatment enhanced ADA\"\n )\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU, -ARRLT, -NRRLT) %>%\n unique() %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate(\n across(\n any_of(c(\n \"Treatment induced ADA\",\n \"Transient ADA\",\n \"Persistent ADA\"\n )),\n as.logical\n )\n ) %>%\n mutate(\n ADPBLPFL = ADPBLPFL == \"Y\",\n TI_ADA = if (exists(\"Treatment induced ADA\", where = .)) `Treatment induced ADA` else FALSE\n ) %>%\n var_relabel(\n ADPBLPFL = \"Post-baseline evaluable patients\",\n TI_ADA = \"Treatment-induced ADA patients\"\n )\n\nadab_ti <- adab %>%\n filter(TI_ADA)\n\n\n\n\n\nCode# Layout for post-baseline evaluable patient variables from adab dataset.\nlyt_adab <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = drop_split_levels\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"ADPBLPFL\",\n .stats = \"count\",\n table_names = \"post_baseline\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"TI_ADA\"\n )\n\n# Layout for treatment-induced patient variables from adab dataset.\nlyt_adab_ti <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = keep_split_levels(c(\"A: Drug X\", \"C: Combination\", \"<Missing>\")) # temp fix\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"Transient ADA\", \"Persistent ADA\"),\n var_labels = \"Treatment-induced ADA patients with\",\n show_labels = \"visible\"\n ) %>%\n analyze_vars(\n \"Time to onset of ADA\",\n .stats = \"median\",\n nested = FALSE,\n .labels = c(median = \"Median time to onset of ADA (weeks)\")\n ) %>%\n analyze_vars(\n \"Antibody titer units\",\n .stats = \"range\",\n nested = FALSE,\n .labels = c(range = \"ADA titer range (min - max)\")\n )\n\nresult_adab <- build_table(lyt_adab, df = adab, alt_counts_df = adsl)\nresult_adab_ti <- build_table(lyt_adab_ti, df = adab_ti, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adab) <- col_info(result_adab_ti)\nresult <- rbind(\n result_adab,\n result_adab_ti\n)\n\nmain_title(result) <- paste(\n \"Summary of Patients with Treatment-Induced ADA, PK Population\"\n)\nsubtitles(result) <- paste(\"Protocol:\", unique(adab$PARCAT1)[1])\nmain_footer(result) <- paste(\n \"ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic\n Antibodies)\n Treatment-induced ADA = negative or missing baseline.\n ADA result(s) and at least one positive post-baseline ADA result.\n Transient ADA = ADA positive result detected (a) at only one post-baseline\n sampling timepoint (excluding last timepoint) OR (b) at 2 or more timepoints\n during treatment where the first and last ADA positive samples are separated\n by a period of < 16 weeks, irrespective of any negative samples in between.\n Persistent ADA = ADA positive result detected (a) at the last post-baseline\n sampling timepoint, OR (b) at 2 or more time points during treatment where\n the first and last ADA positive samples are separated by a period ≥ 16\n weeks, irrespective of any negative samples in between.\"\n)\nresult\n\nSummary of Patients with Treatment-Induced ADA, PK Population\nProtocol: A: Drug X Antibody\n\n—————————————————————————————————————————————————————————————————————————————\n A: Drug X C: Combination <Missing> \n (N=134) (N=132) (N=0) \n—————————————————————————————————————————————————————————————————————————————\nPost-baseline evaluable patients 134 132 266 \nTreatment-induced ADA patients 0 0 64 (24.1%)\nTreatment-induced ADA patients with \n Transient ADA 0 0 0 \n Persistent ADA 0 0 0 \nMedian time to onset of ADA (weeks) NA NA 0.1 \nADA titer range (min - max) NA NA NA \n—————————————————————————————————————————————————————————————————————————————\n\nADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic\n Antibodies)\n Treatment-induced ADA = negative or missing baseline.\n ADA result(s) and at least one positive post-baseline ADA result.\n Transient ADA = ADA positive result detected (a) at only one post-baseline\n sampling timepoint (excluding last timepoint) OR (b) at 2 or more timepoints\n during treatment where the first and last ADA positive samples are separated\n by a period of < 16 weeks, irrespective of any negative samples in between.\n Persistent ADA = ADA positive result detected (a) at the last post-baseline\n sampling timepoint, OR (b) at 2 or more time points during treatment where\n the first and last ADA positive samples are separated by a period ≥ 16\n weeks, irrespective of any negative samples in between.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:41:12 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 dplyr_1.1.4 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 withr_3.0.0 \n[33] Rdpack_2.6 digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 \n[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nLeast Squares Means\nFixed Effects\nCovariance Matrix\nModel Diagnostics\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern.mmrm)\nlibrary(scda)\nlibrary(broom)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadqs <- df_explicit_na(adqs)\n\nadqs_f <- adqs %>%\n dplyr::filter(PARAMCD == \"FKSI-FWB\" & !AVISIT %in% c(\"BASELINE\", \"SCREENING\")) %>%\n droplevels() %>%\n dplyr::mutate(ARMCD = factor(ARMCD, levels = c(\"ARM B\", \"ARM A\", \"ARM C\"))) %>%\n dplyr::mutate(\n AVISITN = rank(AVISITN) %>%\n as.factor() %>%\n as.numeric() %>%\n as.factor()\n )\nadsl_sub <- adqs_f %>%\n dplyr::filter(!is.na(CHG)) %>%\n distinct(USUBJID) %>%\n left_join(adsl, by = \"USUBJID\")\nvar_labels(adqs_f) <- var_labels(adqs)\n\n\n\n\nConsidering the treatment variable in the model\n\nCodemmrm_results <- fit_mmrm(\n vars = list(\n response = \"CHG\",\n covariates = c(\"BASE\", \"STRATA1\", \"BMRKR2\"),\n id = \"USUBJID\",\n arm = \"ARMCD\",\n visit = \"AVISIT\"\n ),\n data = adqs_f,\n weights_emmeans = \"equal\"\n)\n\ndf <- tidy(mmrm_results)\nattr(df$AVISIT, \"label\") <- \"Visit\"\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\", ref_group = mmrm_results$ref_level) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(df$AVISIT)) %>%\n summarize_lsmeans(show_relative = \"increase\") %>%\n append_topleft(\" Statistics\") %>%\n build_table(df, alt_counts_df = adsl_sub)\n\nresult\n\nVisit ARM B ARM A ARM C \n Statistics (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————\nWEEK 1 DAY 8 \n n 134 134 132 \n Adjusted Mean (SE) 3.488 (0.687) 4.246 (0.687) 3.163 (0.692) \n 95% CI (2.136, 4.839) (2.895, 5.598) (1.803, 4.523) \n Difference in Adjusted Means (SE) 0.759 (0.973) -0.325 (0.976) \n 95% CI (-1.155, 2.672) (-2.243, 1.593) \n Relative Increase (%) 21.8% -9.3% \n p-value (MMRM) 0.4362 0.7393 \nWEEK 2 DAY 15 \n n 134 134 132 \n Adjusted Mean (SE) 9.135 (0.768) 9.018 (0.767) 8.509 (0.773) \n 95% CI (7.626, 10.644) (7.510, 10.527) (6.991, 10.028) \n Difference in Adjusted Means (SE) -0.117 (1.087) -0.626 (1.090) \n 95% CI (-2.253, 2.020) (-2.768, 1.517) \n Relative Increase (%) -1.3% -6.8% \n p-value (MMRM) 0.9147 0.5662 \nWEEK 3 DAY 22 \n n 134 134 132 \n Adjusted Mean (SE) 13.547 (0.871) 16.014 (0.871) 15.789 (0.877) \n 95% CI (11.835, 15.259) (14.303, 17.726) (14.066, 17.513)\n Difference in Adjusted Means (SE) 2.467 (1.232) 2.242 (1.236) \n 95% CI (0.044, 4.890) (-0.187, 4.672) \n Relative Increase (%) 18.2% 16.6% \n p-value (MMRM) 0.0460 0.0704 \nWEEK 4 DAY 29 \n n 134 134 132 \n Adjusted Mean (SE) 18.102 (0.995) 19.479 (0.995) 19.511 (1.002) \n 95% CI (16.146, 20.059) (17.523, 21.435) (17.541, 21.481)\n Difference in Adjusted Means (SE) 1.377 (1.408) 1.409 (1.413) \n 95% CI (-1.392, 4.145) (-1.368, 4.186) \n Relative Increase (%) 7.6% 7.8% \n p-value (MMRM) 0.3288 0.3192 \nWEEK 5 DAY 36 \n n 134 134 132 \n Adjusted Mean (SE) 23.503 (1.058) 24.931 (1.058) 23.704 (1.065) \n 95% CI (21.423, 25.583) (22.851, 27.011) (21.610, 25.798)\n Difference in Adjusted Means (SE) 1.428 (1.497) 0.201 (1.502) \n 95% CI (-1.515, 4.371) (-2.752, 3.153) \n Relative Increase (%) 6.1% 0.9% \n p-value (MMRM) 0.3408 0.8937 \n\n\nNot considering the treatment variable in the model\n\nCodemmrm_results_no_arm <- fit_mmrm(\n vars = list(\n response = \"CHG\",\n covariates = c(\"BMRKR2\", \"STRATA1\"),\n id = \"USUBJID\",\n visit = \"AVISIT\"\n ),\n data = adqs_f,\n weights_emmeans = \"equal\",\n parallel = TRUE\n)\n\ndf_no_arm <- tidy(mmrm_results_no_arm)\nattr(df_no_arm$AVISIT, \"label\") <- \"Visit\"\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n add_overall_col(\"All Patients\") %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(df_no_arm$AVISIT)) %>%\n summarize_lsmeans(arms = FALSE) %>%\n append_topleft(\" Statistics\") %>%\n build_table(df_no_arm, alt_counts_df = adsl_sub)\n\nresult\n\nVisit All Patients \n Statistics (N=400) \n———————————————————————————————————————\nWEEK 1 DAY 8 \n n 400 \n Adjusted Mean (SE) 3.615 (0.620) \n 95% CI (2.396, 4.834) \nWEEK 2 DAY 15 \n n 400 \n Adjusted Mean (SE) 8.870 (0.602) \n 95% CI (7.687, 10.053) \nWEEK 3 DAY 22 \n n 400 \n Adjusted Mean (SE) 15.094 (0.683) \n 95% CI (13.751, 16.437)\nWEEK 4 DAY 29 \n n 400 \n Adjusted Mean (SE) 19.009 (0.717) \n 95% CI (17.599, 20.418)\nWEEK 5 DAY 36 \n n 400 \n Adjusted Mean (SE) 24.028 (0.747) \n 95% CI (22.560, 25.496)\n\n\nAdding baseline rows\nIt may be of interest to summarize some different statistics at the baseline visit or summarize a different variable in the data set not used in the MMRM. For example, the model may use the variable CHG but the baseline visit row may summarize the AVAL variable, thus we would need to create two tables and then combine them to accomplish this.\n\nCode# First have the least-square means table.\na <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\", ref_group = mmrm_results$ref_level) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(df$AVISIT)) %>%\n summarize_lsmeans(show_relative = \"increase\") %>%\n append_topleft(\" Statistics\") %>%\n build_table(df, alt_counts_df = adsl_sub)\n\n# Second prepare the baseline values summary table.\nbaseline_dat <- adqs %>%\n filter(AVISIT == \"BASELINE\") %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n droplevels()\n\nb <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\") %>%\n split_rows_by(\"AVISIT\") %>%\n analyze_vars(\"AVAL\") %>%\n append_topleft(\" Statistics\") %>%\n build_table(baseline_dat, alt_counts_df = adsl_sub)\n\n# Now we can combine them as follows.\ncol_info(b) <- EmptyColInfo\nrbind(b, a)\n\nVisit ARM B ARM A ARM C \n Statistics (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————\nBASELINE \n n 134 134 132 \n Mean (SD) 49.9 (7.4) 49.7 (8.3) 50.3 (9.1) \n Median 48.7 49.3 49.7 \n Min - Max 33.7 - 65.9 25.8 - 71.5 26.0 - 70.0 \nWEEK 1 DAY 8 \n n 134 134 132 \n Adjusted Mean (SE) 3.488 (0.687) 4.246 (0.687) 3.163 (0.692) \n 95% CI (2.136, 4.839) (2.895, 5.598) (1.803, 4.523) \n Difference in Adjusted Means (SE) 0.759 (0.973) -0.325 (0.976) \n 95% CI (-1.155, 2.672) (-2.243, 1.593) \n Relative Increase (%) 21.8% -9.3% \n p-value (MMRM) 0.4362 0.7393 \nWEEK 2 DAY 15 \n n 134 134 132 \n Adjusted Mean (SE) 9.135 (0.768) 9.018 (0.767) 8.509 (0.773) \n 95% CI (7.626, 10.644) (7.510, 10.527) (6.991, 10.028) \n Difference in Adjusted Means (SE) -0.117 (1.087) -0.626 (1.090) \n 95% CI (-2.253, 2.020) (-2.768, 1.517) \n Relative Increase (%) -1.3% -6.8% \n p-value (MMRM) 0.9147 0.5662 \nWEEK 3 DAY 22 \n n 134 134 132 \n Adjusted Mean (SE) 13.547 (0.871) 16.014 (0.871) 15.789 (0.877) \n 95% CI (11.835, 15.259) (14.303, 17.726) (14.066, 17.513)\n Difference in Adjusted Means (SE) 2.467 (1.232) 2.242 (1.236) \n 95% CI (0.044, 4.890) (-0.187, 4.672) \n Relative Increase (%) 18.2% 16.6% \n p-value (MMRM) 0.0460 0.0704 \nWEEK 4 DAY 29 \n n 134 134 132 \n Adjusted Mean (SE) 18.102 (0.995) 19.479 (0.995) 19.511 (1.002) \n 95% CI (16.146, 20.059) (17.523, 21.435) (17.541, 21.481)\n Difference in Adjusted Means (SE) 1.377 (1.408) 1.409 (1.413) \n 95% CI (-1.392, 4.145) (-1.368, 4.186) \n Relative Increase (%) 7.6% 7.8% \n p-value (MMRM) 0.3288 0.3192 \nWEEK 5 DAY 36 \n n 134 134 132 \n Adjusted Mean (SE) 23.503 (1.058) 24.931 (1.058) 23.704 (1.065) \n 95% CI (21.423, 25.583) (22.851, 27.011) (21.610, 25.798)\n Difference in Adjusted Means (SE) 1.428 (1.497) 0.201 (1.502) \n 95% CI (-1.515, 4.371) (-2.752, 3.153) \n Relative Increase (%) 6.1% 0.9% \n p-value (MMRM) 0.3408 0.8937 \n\n\nConsidering visit averages\nIt may also be of interest to summarize several different statistics for an averaged combination of various visits in the MMRM. For example, you may want to see the statistics for the average of the first 2 visits, or the average statistics of all visits combined. This can be accomplished by specifying the averages_emmeans argument when fitting the MMRM model.\n\nCodemmrm_results_avg_visits <- fit_mmrm(\n vars = list(\n response = \"CHG\",\n covariates = c(\"BASE\", \"STRATA1\", \"BMRKR2\"),\n id = \"USUBJID\",\n arm = \"ARMCD\",\n visit = \"AVISIT\"\n ),\n data = adqs_f,\n weights_emmeans = \"equal\",\n averages_emmeans = list(\n \"WEEKS 1-2\" = c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\"),\n \"WEEKS 3-5\" = c(\"WEEK 3 DAY 22\", \"WEEK 4 DAY 29\", \"WEEK 5 DAY 36\"),\n \"ALL VISITS\" = c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\", \"WEEK 3 DAY 22\", \"WEEK 4 DAY 29\", \"WEEK 5 DAY 36\")\n )\n)\n\ndf_avgs <- tidy(mmrm_results_avg_visits)\nattr(df_avgs$AVISIT, \"label\") <- \"Visit\"\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\", ref_group = mmrm_results_avg_visits$ref_level) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(df_avgs$AVISIT)) %>%\n summarize_lsmeans(show_relative = \"increase\") %>%\n append_topleft(\" Statistics\") %>%\n build_table(df_avgs, alt_counts_df = adsl_sub)\n\nresult\n\nVisit ARM B ARM A ARM C \n Statistics (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————\nWEEK 1 DAY 8 \n n 134 134 132 \n Adjusted Mean (SE) 3.488 (0.687) 4.246 (0.687) 3.163 (0.692) \n 95% CI (2.136, 4.839) (2.895, 5.598) (1.803, 4.523) \n Difference in Adjusted Means (SE) 0.759 (0.973) -0.325 (0.976) \n 95% CI (-1.155, 2.672) (-2.243, 1.593) \n Relative Increase (%) 21.8% -9.3% \n p-value (MMRM) 0.4362 0.7393 \nWEEK 2 DAY 15 \n n 134 134 132 \n Adjusted Mean (SE) 9.135 (0.768) 9.018 (0.767) 8.509 (0.773) \n 95% CI (7.626, 10.644) (7.510, 10.527) (6.991, 10.028) \n Difference in Adjusted Means (SE) -0.117 (1.087) -0.626 (1.090) \n 95% CI (-2.253, 2.020) (-2.768, 1.517) \n Relative Increase (%) -1.3% -6.8% \n p-value (MMRM) 0.9147 0.5662 \nWEEK 3 DAY 22 \n n 134 134 132 \n Adjusted Mean (SE) 13.547 (0.871) 16.014 (0.871) 15.789 (0.877) \n 95% CI (11.835, 15.259) (14.303, 17.726) (14.066, 17.513)\n Difference in Adjusted Means (SE) 2.467 (1.232) 2.242 (1.236) \n 95% CI (0.044, 4.890) (-0.187, 4.672) \n Relative Increase (%) 18.2% 16.6% \n p-value (MMRM) 0.0460 0.0704 \nWEEK 4 DAY 29 \n n 134 134 132 \n Adjusted Mean (SE) 18.102 (0.995) 19.479 (0.995) 19.511 (1.002) \n 95% CI (16.146, 20.059) (17.523, 21.435) (17.541, 21.481)\n Difference in Adjusted Means (SE) 1.377 (1.408) 1.409 (1.413) \n 95% CI (-1.392, 4.145) (-1.368, 4.186) \n Relative Increase (%) 7.6% 7.8% \n p-value (MMRM) 0.3288 0.3192 \nWEEK 5 DAY 36 \n n 134 134 132 \n Adjusted Mean (SE) 23.503 (1.058) 24.931 (1.058) 23.704 (1.065) \n 95% CI (21.423, 25.583) (22.851, 27.011) (21.610, 25.798)\n Difference in Adjusted Means (SE) 1.428 (1.497) 0.201 (1.502) \n 95% CI (-1.515, 4.371) (-2.752, 3.153) \n Relative Increase (%) 6.1% 0.9% \n p-value (MMRM) 0.3408 0.8937 \nWEEKS 1-2 \n n 134 134 132 \n Adjusted Mean (SE) 6.311 (0.514) 6.632 (0.514) 5.836 (0.516) \n 95% CI (5.301, 7.322) (5.623, 7.642) (4.821, 6.852) \n Difference in Adjusted Means (SE) 0.321 (0.728) -0.475 (0.729) \n 95% CI (-1.111, 1.753) (-1.909, 0.959) \n Relative Increase (%) 5.1% -7.5% \n p-value (MMRM) 0.6596 0.5151 \nWEEKS 3-5 \n n 134 134 132 \n Adjusted Mean (SE) 18.384 (0.560) 20.141 (0.560) 19.668 (0.563) \n 95% CI (17.284, 19.485) (19.041, 21.241) (18.562, 20.775)\n Difference in Adjusted Means (SE) 1.757 (0.793) 1.284 (0.794) \n 95% CI (0.198, 3.316) (-0.278, 2.846) \n Relative Increase (%) 9.6% 7.0% \n p-value (MMRM) 0.0273 0.1068 \nALL VISITS \n n 134 134 132 \n Adjusted Mean (SE) 13.555 (0.388) 14.738 (0.388) 14.135 (0.389) \n 95% CI (12.792, 14.318) (13.976, 15.500) (13.370, 14.900)\n Difference in Adjusted Means (SE) 1.183 (0.551) 0.580 (0.551) \n 95% CI (0.100, 2.266) (-0.502, 1.663) \n Relative Increase (%) 8.7% 4.3% \n p-value (MMRM) 0.0324 0.2924 \n\n\n\n\n\nConsidering the treatment variable in the model\n\n\nCodeas.rtable(mmrm_results, type = \"fixed\")\n\n Estimate Std. Error t value df Pr(>|t|)\n——————————————————————————————————————————————————————————————————————————————————\n(Intercept) 55.7483 1.5244 36.5713 510 <0.0001 \nBASE -1.0196 0.0246 -41.4362 392 <0.0001 \nSTRATA1B -0.0369 0.5345 -0.0691 392 0.9450 \nSTRATA1C 0.0205 0.5238 0.0392 392 0.9688 \nBMRKR2MEDIUM -0.3840 0.5198 -0.7386 392 0.4606 \nBMRKR2HIGH -1.0056 0.5259 -1.9123 392 0.0566 \nARMCDARM A 0.7587 0.9733 0.7795 396 0.4362 \nARMCDARM C -0.3248 0.9756 -0.3329 394 0.7393 \nAVISITWEEK 2 DAY 15 5.6472 1.0331 5.4665 397 <0.0001 \nAVISITWEEK 3 DAY 22 10.0591 1.0897 9.2311 397 <0.0001 \nAVISITWEEK 4 DAY 29 14.6145 1.2176 12.0027 397 <0.0001 \nAVISITWEEK 5 DAY 36 20.0154 1.2584 15.9057 397 <0.0001 \nARMCDARM A:AVISITWEEK 2 DAY 15 -0.8752 1.4610 -0.5990 397 0.5495 \nARMCDARM C:AVISITWEEK 2 DAY 15 -0.3007 1.4665 -0.2050 397 0.8376 \nARMCDARM A:AVISITWEEK 3 DAY 22 1.7085 1.5411 1.1087 397 0.2682 \nARMCDARM C:AVISITWEEK 3 DAY 22 2.5673 1.5469 1.6597 397 0.0978 \nARMCDARM A:AVISITWEEK 4 DAY 29 0.6181 1.7220 0.3589 397 0.7198 \nARMCDARM C:AVISITWEEK 4 DAY 29 1.7337 1.7285 1.0030 397 0.3165 \nARMCDARM A:AVISITWEEK 5 DAY 36 0.6690 1.7796 0.3759 397 0.7072 \nARMCDARM C:AVISITWEEK 5 DAY 36 0.5257 1.7863 0.2943 397 0.7687 \n\n\nNot considering the treatment variable in the model\n\n\nCodeas.rtable(mmrm_results_no_arm, type = \"fixed\")\n\n Estimate Std. Error t value df Pr(>|t|)\n——————————————————————————————————————————————————————————————————————\n(Intercept) 1.5624 1.1751 1.3296 466 0.1843 \nBMRKR2MEDIUM 1.0924 1.1878 0.9196 395 0.3583 \nBMRKR2HIGH 1.4619 1.1971 1.2212 395 0.2227 \nSTRATA1B 2.6321 1.2180 2.1610 395 0.0313 \nSTRATA1C 0.9717 1.2008 0.8092 395 0.4189 \nAVISITWEEK 2 DAY 15 5.2548 0.5967 8.8061 399 <0.0001 \nAVISITWEEK 3 DAY 22 11.4787 0.6314 18.1802 399 <0.0001 \nAVISITWEEK 4 DAY 29 15.3937 0.7039 21.8696 399 <0.0001 \nAVISITWEEK 5 DAY 36 20.4130 0.7266 28.0921 399 <0.0001 \n\n\n\n\n\n\n\nCodeas.rtable(mmrm_results, type = \"cov\")\n\n WEEK 1 DAY 8 WEEK 2 DAY 15 WEEK 3 DAY 22 WEEK 4 DAY 29 WEEK 5 DAY 36\n————————————————————————————————————————————————————————————————————————————————————————————\nWEEK 1 DAY 8 63.0140 -0.6664 2.5965 -1.6231 0.2589 \nWEEK 2 DAY 15 -0.6664 78.6592 1.7004 -11.8677 -0.4261 \nWEEK 3 DAY 22 2.5965 1.7004 101.2949 -5.8424 7.1145 \nWEEK 4 DAY 29 -1.6231 -11.8677 -5.8424 132.4034 -5.3739 \nWEEK 5 DAY 36 0.2589 -0.4261 7.1145 -5.3739 149.6937 \n\n\n\n\nModel diagnostics are currently available to evaluate choice of covariates for the fixed and random effects. Statistics to evaluate choice of covariance structure are being investigated and will be included in a future release.\n\nCodeas.rtable(mmrm_results, type = \"diagnostic\")\n\n Diagnostic statistic value\n———————————————————————————————————————————\nREML criterion 14835.9968 \nAIC 14865.9968 \nAICc 14866.2412 \nBIC 14925.8688 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADQS <- synthetic_cdisc_dataset(\"latest\", \"adqs\") %>%\n filter(ABLFL != \"Y\" & ABLFL2 != \"Y\") %>%\n filter(AVISIT %in% c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\", \"WEEK 3 DAY 22\")) %>%\n mutate(\n AVISIT = as.factor(AVISIT),\n AVISITN = rank(AVISITN) %>%\n as.factor() %>%\n as.numeric() %>%\n as.factor() # making consecutive numeric factor\n )\n})\ndatanames <- c(\"ADSL\", \"ADQS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADQS <- data[[\"ADQS\"]]\narm_ref_comp <- list(\n ARMCD = list(\n ref = \"ARM A\",\n comp = c(\"ARM B\", \"ARM C\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_a_mmrm(\n label = \"MMRM\",\n dataname = \"ADQS\",\n aval_var = choices_selected(c(\"AVAL\", \"CHG\"), \"CHG\"),\n id_var = choices_selected(c(\"USUBJID\", \"SUBJID\"), \"USUBJID\"),\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARMCD\"),\n visit_var = choices_selected(c(\"AVISIT\", \"AVISITN\"), \"AVISIT\"),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n choices = value_choices(ADQS, \"PARAMCD\", \"PARAM\"),\n selected = \"FKSI-FWB\"\n ),\n cov_var = choices_selected(c(\"BASE\", \"AGE\", \"SEX\", \"BASE:AVISIT\"), NULL),\n conf_level = choices_selected(c(0.95, 0.9, 0.8), 0.95)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:39:39 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 broom_1.0.5 \n [9] scda_0.1.6.9017 tern.mmrm_0.3.0.9005 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9018 \n[15] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 mmrm_0.3.11 formatR_1.14 \n [4] tern.gee_0.1.3.9004 logger_0.3.0 testthat_3.2.1 \n [7] sandwich_3.1-0 rlang_1.1.3 multcomp_1.4-25 \n[10] compiler_4.3.3 callr_3.7.5 vctrs_0.6.5 \n[13] stringr_1.5.1 pkgconfig_2.0.3 fastmap_1.1.1 \n[16] backports_1.4.1 ellipsis_0.3.2 fontawesome_0.5.2 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 purrr_1.0.2 xfun_0.42 \n[25] shinyvalidate_0.1.3 cachem_1.0.8 teal.reporter_0.3.1.9002\n[28] jsonlite_1.8.8 later_1.3.2 parallel_4.3.3 \n[31] R6_2.5.1 bslib_0.6.1 stringi_1.8.3 \n[34] parallelly_1.37.1 brio_1.1.4 jquerylib_0.1.4 \n[37] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[40] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[43] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[46] yaml_2.3.8 TMB_1.9.10 codetools_0.2-19 \n[49] websocket_1.4.1 processx_3.8.4 teal.widgets_0.4.2.9009 \n[52] lattice_0.22-6 tibble_3.2.1 withr_3.0.0 \n[55] coda_0.19-4.1 evaluate_0.23 survival_3.5-8 \n[58] shinycssloaders_1.0.0 pillar_1.9.0 checkmate_2.3.1 \n[61] shinyjs_2.1.0 generics_0.1.3 chromote_0.2.0 \n[64] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[67] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[70] tools_4.3.3 webshot2_0.1.1 webshot_0.5.5 \n[73] forcats_1.0.0 mvtnorm_1.2-4 cowplot_1.1.3 \n[76] grid_4.3.3 tidyr_1.3.1 rbibutils_2.2.16 \n[79] colorspace_2.1-0 nlme_3.1-164 cli_3.6.2 \n[82] fansi_1.0.6 geepack_1.3.10 gtable_0.3.4 \n[85] sass_0.4.9 digest_0.6.35 TH.data_1.1-2 \n[88] htmlwidgets_1.6.4 memoise_2.0.1 htmltools_0.5.7 \n[91] lifecycle_1.0.4 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "ADA", - "ADAT02" + "Efficacy", + "MMRMT01" ] }, { - "objectID": "tables/ADA/adat01.html", - "href": "tables/ADA/adat01.html", - "title": "ADAT01", + "objectID": "tables/efficacy/rbmit01.html", + "href": "tables/efficacy/rbmit01.html", + "title": "RBMIT01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\nlibrary(tibble)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\")\n\ncombodf <- tribble(\n ~valname, ~label, ~levelcombo, ~exargs,\n \"all_X\", \"All Drug X\", c(\"A: Drug X\", \"C: Combination\"), list(),\n \"all_pt\", \"All Patients\", c(\"A: Drug X\", \"B: Placebo\", \"C: Combination\"), list()\n)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadab <- adab %>%\n filter(PARCAT1 == \"A: Drug X Antibody\") %>%\n select(-ARRLT, -NRRLT)\n\n# Baseline Pts\nadab_b <- df_explicit_na(adab) %>%\n filter(\n ABLFL == \"Y\",\n ADABLPFL == \"Y\",\n PARAM %in% c(\"ADA interpreted per sample result\")\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU) %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate_at(\n c(\"ADA interpreted per sample result\"),\n as.logical\n ) %>%\n mutate(\n ADABLPFL = ADABLPFL == \"Y\",\n PADABLPFL = `ADA interpreted per sample result` == \"TRUE\",\n NADABLPFL = `ADA interpreted per sample result` == \"FALSE\"\n ) %>%\n var_relabel(\n ADABLPFL = \"Baseline evaluable patients\",\n PADABLPFL = \"Patient with a positive sample at baseline\",\n NADABLPFL = \"Patient with no positive samples at baseline\"\n )\n\n# Post Baseline Treatment Enhanced NAb positive Pts\nadab_pb <- df_explicit_na(adab) %>%\n filter(\n ABLFL != \"Y\",\n ADPBLPFL == \"Y\",\n PARAM %in% c(\n \"ADA interpreted per sample result\",\n \"Treatment Emergent - Positive\",\n \"Treatment induced ADA\",\n \"Treatment enhanced ADA\",\n \"Treatment Emergent - Negative\",\n \"Treatment unaffected\"\n )\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU) %>%\n unique() %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate(\n across(\n any_of(c(\n \"ADA interpreted per sample result\", \"Treatment Emergent - Positive\",\n \"Treatment induced ADA\", \"Treatment enhanced ADA\",\n \"Treatment Emergent - Negative\", \"Treatment unaffected\"\n )),\n as.logical\n )\n ) %>%\n mutate(\n ADPBLPFL = ADPBLPFL == \"Y\",\n PTEFL = if (exists(\"Treatment Emergent - Positive\", where = .)) {\n `Treatment Emergent - Positive` == \"TRUE\"\n } else {\n FALSE\n },\n TIFL = if (exists(\"Treatment induced ADA\", where = .)) {\n `Treatment induced ADA` == \"TRUE\"\n } else {\n FALSE\n },\n TEFL = if (exists(\"Treatment enhanced ADA\", where = .)) {\n `Treatment enhanced ADA` == \"TRUE\"\n } else {\n FALSE\n },\n NTEFL = if (exists(\"Treatment Emergent - Negative\", where = .)) {\n `Treatment Emergent - Negative` == \"TRUE\"\n } else {\n FALSE\n },\n TUFL = if (exists(\"Treatment unaffected\", where = .)) {\n `Treatment unaffected` == \"TRUE\"\n } else {\n FALSE\n }\n ) %>%\n var_relabel(\n ADPBLPFL = \"Post-baseline evaluable patients\",\n PTEFL = \"Patient positive for Treatment Emergent ADA\",\n TIFL = \"Treatment-induced ADA\",\n TEFL = \"Treatment-enhanced ADA\",\n NTEFL = \"Patient negative for Treatment Emergent ADA\",\n TUFL = \"Treatment unaffected\"\n )\n\n\n\n\n\n\nCode# Layout for Baseline Prevalence of NAbs\nlyt_bl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"ADABLPFL\",\n .stats = \"count\",\n var_labels = \"Baseline Prevalence of ADAs\",\n show_labels = \"visible\",\n table_names = \"t1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"PADABLPFL\",\n table_names = \"t2\",\n .indent_mods = 1L,\n var_labels = \"a\",\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NADABLPFL\",\n .stats = \"count\",\n show_labels = \"hidden\",\n .indent_mods = 1L,\n table_names = \"t3\"\n )\n\n# Layout for incidence of NAbs\nlyt_pb <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"ADPBLPFL\",\n .stats = \"count\",\n var_labels = \"Incidence of Treatment Emergent ADAs\",\n show_labels = \"visible\",\n table_names = \"tb1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"PTEFL\",\n table_names = \"tb2\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"TIFL\", \"TEFL\"),\n .stats = \"count\",\n table_names = \"tb3\",\n .indent_mods = 2L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NTEFL\",\n table_names = \"tb4\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"TUFL\",\n .stats = \"count\",\n table_names = \"tb5\",\n .indent_mods = 2L,\n show_labels = \"hidden\"\n )\n\nresult_1 <- build_table(lyt_bl, df = adab_b, alt_counts_df = adsl)\nresult_2 <- build_table(lyt_pb, df = adab_pb, alt_counts_df = adsl)\n\n# Combine tables.\nresult_1@col_info <- result_2@col_info\nresult <- rbind(result_1, result_2)\n\n# Change the column order.\nresult <- cbind_rtables(result[, 1], result[, 3]) %>%\n cbind_rtables(result[, 4]) %>%\n cbind_rtables(result[, 2]) %>%\n cbind_rtables(result[, 5])\n\nmain_title(result) <- paste(\n \"Baseline Prevalence and Incidence of Treatment Emergent ADA\"\n)\n\nmain_footer(result) <- \"ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient = a patient with an ADA assay result from a baseline sample(s)\n Post-baseline evaluable patient = a patient with an ADA assay result from at least one post-baseline sample Number of patients positive for Treatment Emergent\n ADA = the number (and percentage) of post-baseline evaluable patients determined to have treatment-induced ADA or treatment-enhanced ADA during the study period.\n Treatment-induced ADA = a patient with negative or missing baseline ADA result(s) and at least one positive post-baseline ADA result.\n Treatment-enhanced ADA = a patient with positive ADA result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\n Number of patients negative for Treatment Emergent ADA = number of post-baseline evaluable patients with negative or missing baseline ADA result(s) and all negative post-baseline results, or a patient who is treatment unaffected.\n Treatment unaffected = A post-baseline evaluable patient with a positive ADA result at baseline and (a) where all post-baseline titer results are less than 0.60 t.u. greater than the baseline titer result, OR (b) where all post-baseline results are negative or missing.\n For any positive sample with titer result less than the minimum reportable titer or any positive sample where a titer cannot be obtained, titer value is imputed as equal to the minimum reportable titer.\"\n\nresult\n\nBaseline Prevalence and Incidence of Treatment Emergent ADA\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X C: Combination <Missing> B: Placebo All Drug X \n (N=134) (N=132) (N=0) (N=134) (N=266) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nBaseline Prevalence of ADAs \n Baseline evaluable patients 134 132 0 0 266 \nPatient with a positive sample at baseline 63 (47.0%) 64 (48.5%) 0 0 127 (47.7%)\nPatient with no positive samples at baseline 71 68 0 0 139 \nIncidence of Treatment Emergent ADAs \n Post-baseline evaluable patients 134 132 0 0 266 \nPatient positive for Treatment Emergent ADA 0 0 0 0 0 \nTreatment-induced ADA 0 0 0 0 0 \nTreatment-enhanced ADA 0 0 0 0 0 \nPatient negative for Treatment Emergent ADA 0 0 0 0 0 \nTreatment unaffected 0 0 0 0 0 \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient = a patient with an ADA assay result from a baseline sample(s)\n Post-baseline evaluable patient = a patient with an ADA assay result from at least one post-baseline sample Number of patients positive for Treatment Emergent\n ADA = the number (and percentage) of post-baseline evaluable patients determined to have treatment-induced ADA or treatment-enhanced ADA during the study period.\n Treatment-induced ADA = a patient with negative or missing baseline ADA result(s) and at least one positive post-baseline ADA result.\n Treatment-enhanced ADA = a patient with positive ADA result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\n Number of patients negative for Treatment Emergent ADA = number of post-baseline evaluable patients with negative or missing baseline ADA result(s) and all negative post-baseline results, or a patient who is treatment unaffected.\n Treatment unaffected = A post-baseline evaluable patient with a positive ADA result at baseline and (a) where all post-baseline titer results are less than 0.60 t.u. greater than the baseline titer result, OR (b) where all post-baseline results are negative or missing.\n For any positive sample with titer result less than the minimum reportable titer or any positive sample where a titer cannot be obtained, titer value is imputed as equal to the minimum reportable titer.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:41:01 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tibble_3.2.1 scda_0.1.6.9017 dplyr_1.1.4 \n[4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[7] formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nDraws\nImpute\nAnalyze\nPool\nCreate Output\nReproducibility\n\n\n\nWe use a publicly available example dataset from an antidepressant clinical trial of an active drug versus placebo from the rbmi package. The relevant endpoint is the Hamilton 17-item depression rating scale (HAMD17) which was assessed at baseline and at weeks 1, 2, 4, and 6. Study drug discontinuation occurred in 24% of subjects from the active drug and 26% of subjects from placebo. All data after study drug discontinuation are missing and there is a single additional intermittent missing observation.\n\nCodelibrary(tern.rbmi)\nlibrary(dplyr)\nset.seed(123)\n\ndata <- antidepressant_data\nlevels(data$THERAPY) <- c(\"PLACEBO\", \"DRUG\") # This is important! The order defines the computation order later\n\nmissing_var <- \"CHANGE\"\nvars <- list(\n id = \"PATIENT\",\n visit = \"VISIT\",\n expand_vars = c(\"BASVAL\", \"THERAPY\"),\n group = \"THERAPY\"\n)\ncovariates <- list(\n draws = c(\"BASVAL*VISIT\", \"THERAPY*VISIT\"),\n analyse = c(\"BASVAL\")\n)\n\ndata <- data %>%\n dplyr::select(PATIENT, THERAPY, VISIT, BASVAL, THERAPY, CHANGE) %>%\n dplyr::mutate(dplyr::across(.cols = vars$id, ~ as.factor(.x))) %>%\n dplyr::arrange(dplyr::across(.cols = c(vars$id, vars$visit)))\n\n# Use expand_locf to add rows corresponding to visits with missing outcomes to the dataset\ndata_full <- do.call(\n expand_locf,\n args = list(\n data = data,\n vars = c(vars$expand_vars, vars$group),\n group = vars$id,\n order = c(vars$id, vars$visit)\n ) %>%\n append(lapply(data[c(vars$id, vars$visit)], levels))\n)\n\ndata_full <- data_full %>%\n dplyr::group_by(dplyr::across(vars$id)) %>%\n dplyr::mutate(!!vars$group := Filter(Negate(is.na), .data[[vars$group]])[1])\n\n# there are duplicates - use first value\ndata_full <- data_full %>%\n dplyr::group_by(dplyr::across(c(vars$id, vars$group, vars$visit))) %>%\n dplyr::slice(1) %>%\n dplyr::ungroup()\n# need to have a single ID column\ndata_full <- data_full %>%\n tidyr::unite(\"TMP_ID\", dplyr::all_of(vars$id), sep = \"_#_\", remove = FALSE) %>%\n dplyr::mutate(TMP_ID = as.factor(TMP_ID))\n\n\nCreating Intercurrent Event Data\nSet the imputation strategy to \"MAR\" for each patient with at least one missing observation.\n\nCodedata_ice <- data_full %>%\n dplyr::arrange(dplyr::across(.cols = c(\"TMP_ID\", vars$visit))) %>%\n dplyr::filter(is.na(.data[[missing_var]])) %>%\n dplyr::group_by(TMP_ID) %>%\n dplyr::slice(1) %>%\n dplyr::ungroup() %>%\n dplyr::select(all_of(c(\"TMP_ID\", vars$visit))) %>%\n dplyr::mutate(strategy = \"MAR\")\n\n\n\n\n\nThe rbmi::draws() function fits the imputation models and stores the corresponding parameter estimates or Bayesian posterior parameter draws. The three main inputs to the rbmi::draws() function are:\n\n\ndata - The primary longitudinal data.frame containing the outcome variable and all covariates.\n\ndata_ice - A data.frame which specifies the first visit affected by an intercurrent event (ICE) and the imputation strategy for handling missing outcome data after the ICE. At most one ICE which is to be imputed by a non-MAR strategy is allowed per subject.\n\nmethod - The statistical method used to fit the imputation models and to create imputed datasets.\n\nDefine Key Variables\nDefine the names of key variables in our dataset and the covariates included in the imputation model using rbmi::set_vars(). Note that the covariates argument can also include interaction terms.\n\nCodedebug_mode <- FALSE\n\ndraws_vars <- rbmi::set_vars(\n outcome = missing_var,\n visit = vars$visit,\n group = vars$group,\n covariates = covariates$draws\n)\ndraws_vars$subjid <- \"TMP_ID\"\n\n\nDefine which imputation method to use, then create samples for the imputation parameters by running the draws() function.\n\n\nCodedraws_method <- method_bayes()\n\ndraws_obj <- rbmi::draws(\n data = data_full,\n data_ice = data_ice,\n vars = draws_vars,\n method = draws_method\n)\n\n\nSAMPLING FOR MODEL 'MMRM' NOW (CHAIN 1).\nChain 1: \nChain 1: Gradient evaluation took 0.00037 seconds\nChain 1: 1000 transitions using 10 leapfrog steps per transition would take 3.7 seconds.\nChain 1: Adjust your expectations accordingly!\nChain 1: \nChain 1: \nChain 1: Iteration: 1 / 1200 [ 0%] (Warmup)\nChain 1: Iteration: 120 / 1200 [ 10%] (Warmup)\nChain 1: Iteration: 201 / 1200 [ 16%] (Sampling)\nChain 1: Iteration: 320 / 1200 [ 26%] (Sampling)\nChain 1: Iteration: 440 / 1200 [ 36%] (Sampling)\nChain 1: Iteration: 560 / 1200 [ 46%] (Sampling)\nChain 1: Iteration: 680 / 1200 [ 56%] (Sampling)\nChain 1: Iteration: 800 / 1200 [ 66%] (Sampling)\nChain 1: Iteration: 920 / 1200 [ 76%] (Sampling)\nChain 1: Iteration: 1040 / 1200 [ 86%] (Sampling)\nChain 1: Iteration: 1160 / 1200 [ 96%] (Sampling)\nChain 1: Iteration: 1200 / 1200 [100%] (Sampling)\nChain 1: \nChain 1: Elapsed Time: 0.555 seconds (Warm-up)\nChain 1: 1.769 seconds (Sampling)\nChain 1: 2.324 seconds (Total)\nChain 1: \n\n\n\n\n\nThe next step is to use the parameters from the imputation model to generate the imputed datasets. This is done via the rbmi::impute() function. The function only has two key inputs: the imputation model output from rbmi::draws() and the reference groups relevant to reference-based imputation methods. It’s usage is thus:\n\nCodeimpute_references <- c(\"DRUG\" = \"PLACEBO\", \"PLACEBO\" = \"PLACEBO\")\n\nimpute_obj <- rbmi::impute(\n draws_obj,\n references = impute_references\n)\n\n\n\n\nThe next step is to run the analysis model on each imputed dataset. This is done by defining an analysis function and then calling rbmi::analyse() to apply this function to each imputed dataset.\n\n\nCode# Define analysis model\nanalyse_fun <- ancova\n\nref_levels <- levels(impute_obj$data$group[[1]])\nnames(ref_levels) <- c(\"ref\", \"alt\")\n\nanalyse_obj <- rbmi::analyse(\n imputations = impute_obj,\n fun = analyse_fun,\n vars = rbmi::set_vars(\n subjid = \"TMP_ID\",\n outcome = missing_var,\n visit = vars$visit,\n group = vars$group,\n covariates = covariates$analyse\n )\n)\n\n\n\n\nThe rbmi::pool() function can be used to summarize the analysis results across multiple imputed datasets to provide an overall statistic with a standard error, confidence intervals and a p-value for the hypothesis test of the null hypothesis that the effect is equal to 0. Using the broom::tidy() function the rbmi final results are reshaped.\n\n\nCodelibrary(broom)\n\npool_obj <- rbmi::pool(\n results = analyse_obj,\n conf.level = 0.95,\n alternative = c(\"two.sided\", \"less\", \"greater\"),\n type = c(\"percentile\", \"normal\")\n)\n\ndf <- tidy(pool_obj)\ndf\n\n group est se_est lower_cl_est upper_cl_est est_contr se_contr\n1 ref -1.615820 0.4862316 -2.575771 -0.6558685 NA NA\n2 alt -1.707626 0.4749573 -2.645319 -0.7699335 -0.09180645 0.6826279\n3 ref -4.250814 0.6466452 -5.527714 -2.9739143 NA NA\n4 alt -2.804837 0.6438255 -4.076779 -1.5328939 1.44597772 0.9136660\n5 ref -6.365807 0.7214451 -7.792725 -4.9388895 NA NA\n6 alt -4.095430 0.6958248 -5.470969 -2.7198908 2.27037720 0.9961376\n7 ref -7.688935 0.7965136 -9.265897 -6.1119740 NA NA\n8 alt -4.775673 0.7516059 -6.261450 -3.2898970 2.91326216 1.0733820\n lower_cl_contr upper_cl_contr p_value relative_reduc visit conf_level\n1 NA NA NA NA 4 0.95\n2 -1.4394968 1.255884 0.893177243 0.05681725 4 0.95\n3 NA NA NA NA 5 0.95\n4 -0.3584507 3.250406 0.115488900 -0.34016488 5 0.95\n5 NA NA NA NA 6 0.95\n6 0.3014522 4.239302 0.024124977 -0.35665190 6 0.95\n7 NA NA NA NA 7 0.95\n8 0.7918874 5.034637 0.007446276 -0.37889019 7 0.95\n\n\n\n\nFinally, use functions from the rtables and tern packages to generate a nicely formatted rtable object.\n\nCoderesult <- basic_table() %>%\n split_cols_by(\"group\", ref_group = levels(df$group)[1]) %>%\n split_rows_by(\"visit\", split_label = \"Visit\", label_pos = \"topleft\") %>%\n summarize_rbmi() %>%\n build_table(df)\nresult\n\nVisit ref alt \n—————————————————————————————————————————————————————————————————————————\n4 \n Adjusted Mean (SE) -1.616 (0.486) -1.708 (0.475) \n 95% CI (-2.576, -0.656) (-2.645, -0.770)\n Difference in Adjusted Means (SE) -0.092 (0.683) \n 95% CI (-1.439, 1.256) \n Relative Reduction (%) 5.7% \n p-value (RBMI) 0.8932 \n5 \n Adjusted Mean (SE) -4.251 (0.647) -2.805 (0.644) \n 95% CI (-5.528, -2.974) (-4.077, -1.533)\n Difference in Adjusted Means (SE) 1.446 (0.914) \n 95% CI (-0.358, 3.250) \n Relative Reduction (%) -34.0% \n p-value (RBMI) 0.1155 \n6 \n Adjusted Mean (SE) -6.366 (0.721) -4.095 (0.696) \n 95% CI (-7.793, -4.939) (-5.471, -2.720)\n Difference in Adjusted Means (SE) 2.270 (0.996) \n 95% CI (0.301, 4.239) \n Relative Reduction (%) -35.7% \n p-value (RBMI) 0.0241 \n7 \n Adjusted Mean (SE) -7.689 (0.797) -4.776 (0.752) \n 95% CI (-9.266, -6.112) (-6.261, -3.290)\n Difference in Adjusted Means (SE) 2.913 (1.073) \n 95% CI (0.792, 5.035) \n Relative Reduction (%) -37.9% \n p-value (RBMI) 0.0074 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:38:56 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] broom_1.0.5 dplyr_1.1.4 tern.rbmi_0.1.2.9013 \n[4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[7] formatters_0.5.5.9018 rbmi_1.2.6 \n\nloaded via a namespace (and not attached):\n [1] gtable_0.3.4 TMB_1.9.10 xfun_0.42 ggplot2_3.5.0 \n [5] QuickJSR_1.1.3 htmlwidgets_1.6.4 inline_0.3.19 lattice_0.22-6 \n [9] vctrs_0.6.5 tools_4.3.3 Rdpack_2.6 generics_0.1.3 \n[13] stats4_4.3.3 curl_5.2.1 parallel_4.3.3 tibble_3.2.1 \n[17] mmrm_0.3.11 fansi_1.0.6 pkgconfig_2.0.3 Matrix_1.6-5 \n[21] checkmate_2.3.1 RcppParallel_5.1.7 assertthat_0.2.1 lifecycle_1.0.4 \n[25] compiler_4.3.3 stringr_1.5.1 brio_1.1.4 munsell_0.5.0 \n[29] codetools_0.2-19 htmltools_0.5.7 yaml_2.3.8 pillar_1.9.0 \n[33] tidyr_1.3.1 StanHeaders_2.32.6 nlme_3.1-164 rstan_2.32.6 \n[37] tidyselect_1.2.1 digest_0.6.35 stringi_1.8.3 purrr_1.0.2 \n[41] splines_4.3.3 fastmap_1.1.1 grid_4.3.3 colorspace_2.1-0 \n[45] cli_3.6.2 loo_2.7.0 survival_3.5-8 pkgbuild_1.4.4 \n[49] utf8_1.2.4 withr_3.0.0 scales_1.3.0 backports_1.4.1 \n[53] rmarkdown_2.26 matrixStats_1.2.0 gridExtra_2.3 evaluate_0.23 \n[57] knitr_1.45 rbibutils_2.2.16 testthat_3.2.1 V8_4.4.2 \n[61] rlang_1.1.3 Rcpp_1.0.12 glue_1.7.0 jsonlite_1.8.8 \n[65] R6_2.5.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "ADA", - "ADAT01" + "Efficacy", + "RBMIT01" ] }, { - "objectID": "tables/ADA/adat04b.html", - "href": "tables/ADA/adat04b.html", - "title": "ADAT04B", + "objectID": "tables/efficacy/onct05.html", + "href": "tables/efficacy/onct05.html", + "title": "ONCT05", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\nlibrary(tibble)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\")\n\ncombodf <- tribble(\n ~valname, ~label, ~levelcombo, ~exargs,\n \"all_X\", \"All Drug X\", c(\"A: Drug X\", \"C: Combination\"), list(),\n \"all_pt\", \"All Patients\", c(\"A: Drug X\", \"B: Placebo\", \"C: Combination\"), list()\n)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\n# Baseline Pts\nadab_b <- df_explicit_na(adab) %>%\n filter(\n ABLFL == \"Y\",\n ADABLPFL == \"Y\",\n PARAM %in% c(\n \"ADA interpreted per sample result\",\n \"NAB interpreted per sample result\"\n )\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU) %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate(\n across(\n any_of(c(\n \"ADA interpreted per sample result\",\n \"NAB interpreted per sample result\"\n )),\n as.logical\n )\n ) %>%\n mutate(\n ADABLPFL = ADABLPFL == \"Y\",\n PADABLPFL = if (exists(\"ADA interpreted per sample result\", where = .)) {\n `ADA interpreted per sample result` == \"TRUE\"\n } else {\n FALSE\n },\n PNABBLFL = if (exists(\"NAB interpreted per sample result\", where = .)) {\n `NAB interpreted per sample result` == \"TRUE\"\n } else {\n FALSE\n },\n NNABBLFL = if (exists(\"NAB interpreted per sample result\", where = .)) {\n `NAB interpreted per sample result` == \"FALSE\"\n } else {\n FALSE\n }\n ) %>%\n var_relabel(\n ADABLPFL = \"Baseline evaluable patients for ADA\",\n PADABLPFL = \"Patients with a positive ADA sample at baseline\",\n PNABBLFL = \"Patients with a positive NAb sample at baseline\",\n NNABBLFL = \"Patients with no positive NAb sample at baseline\"\n )\n\n# Post-Baseline Evaluable Pts\nadab_pb_ada <- df_explicit_na(adab) %>%\n filter(ADPBLPFL == \"Y\") %>%\n select(STUDYID, USUBJID, ARM, ACTARM, ADPBLPFL) %>%\n mutate(ADPBLPFL = ADPBLPFL == \"Y\") %>%\n distinct()\n\n# Post-Baseline ADA Positive Pts\nadab_pb_adap <- df_explicit_na(adab) %>%\n filter(\n ABLFL != \"Y\",\n PARAM == \"ADA interpreted per sample result\",\n AVALC == \"POSITIVE\"\n ) %>%\n mutate(ADAPFL = AVALC == \"POSITIVE\") %>%\n select(STUDYID, USUBJID, ARM, ACTARM, ADAPFL) %>%\n distinct()\n\n# Post-Baseline NAb Positive Pts\nadab_pb_nabp <- df_explicit_na(adab) %>%\n filter(\n ABLFL != \"Y\",\n PARAM == \"NAb interpreted per sample result\",\n AVALC == \"POSITIVE\"\n ) %>%\n mutate(NABPFL = AVALC == \"POSITIVE\") %>%\n select(STUDYID, USUBJID, ARM, ACTARM, NABPFL) %>%\n distinct()\n\n# Post-Baseline NAb Negative Pts\nadab_pb_nabn <- df_explicit_na(adab) %>%\n filter(\n ABLFL != \"Y\",\n PARAM == \"NAb interpreted per sample result\",\n AVALC == \"NEGATIVE\"\n ) %>%\n rename(NABNFL = AVALC) %>%\n select(STUDYID, USUBJID, ARM, ACTARM, NABNFL) %>%\n distinct()\n\nmergecol <- c(\"STUDYID\", \"USUBJID\", \"ARM\", \"ACTARM\")\n\nadab_pb <- left_join(adab_pb_ada, adab_pb_adap, by = mergecol) %>%\n left_join(adab_pb_nabp, by = mergecol) %>%\n mutate(\n NABNFL = ifelse(is.na(NABPFL), \"TRUE\", \"FALSE\"),\n NABNFL = NABNFL == \"TRUE\"\n ) %>%\n var_relabel(\n ADPBLPFL = \"Post-baseline evaluable patients for ADA\",\n ADAPFL = \"Patients positive for ADA\",\n NABPFL = \"Patients positive for NAb\",\n NABNFL = \"Patients negative for NAb\"\n )\n\n\n\n\n\n\nCode# Layout for Baseline Prevalence of NAbs\nlyt_bl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"ADABLPFL\", \"PADABLPFL\"),\n .stats = \"count\",\n var_labels = \"Baseline Prevalence of NAbs\",\n show_labels = \"visible\",\n table_names = \"t1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"PNABBLFL\",\n table_names = \"t2\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NNABBLFL\",\n .stats = \"count\",\n table_names = \"t3\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n )\n\n# Layout for incidence of NAbs\nlyt_pb <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"ADPBLPFL\", \"ADAPFL\"),\n .stats = \"count\",\n var_labels = \"Incidence of NAbs\",\n show_labels = \"visible\",\n table_names = \"tb1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NABPFL\",\n table_names = \"tb2\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NABNFL\",\n .stats = \"count\",\n table_names = \"tb3\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n )\n\nresult_1 <- build_table(lyt_bl, df = adab_b, alt_counts_df = adsl)\nresult_2 <- build_table(lyt_pb, df = adab_pb, alt_counts_df = adsl)\n\n# Combine tables.\nresult <- rbind(result_1, result_2)\n\n# Change the column order.\nresult <- cbind_rtables(result[, 1], result[, 3]) %>%\n cbind_rtables(result[, 4]) %>%\n cbind_rtables(result[, 2]) %>%\n cbind_rtables(result[, 5])\n\nmain_title(result) <- paste(\n \"Baseline Prevalence and Incidence of Neutralizing Antibodies (NAbs)\"\n)\nsubtitles(result) <- paste(\"Protocol:\", unique(adab$PARCAT1)[1])\n\nmain_footer(result) <- \"NAb = Neutralizing Antibodies ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient for ADA = a patient with an ADA assay result from a baseline sample(s) Baseline evaluable patient for NAb = a patient with a NAb assay result from a baseline sample(s) Post-baseline evaluable patient for ADA = a patient with an ADA assay result from at least one post-baseline sample Post-baseline evaluable patient for NAb = a patient with a NAb assay result from at least one post-baseline sample Number of patients positive for ADA = the number of post-baseline evaluable patients for ADA determined to have Treatment Emergent ADA during the study period.\nNumber of patients positive for NAb = the number (and percentage) of post-baseline evaluable patients for ADA determined to have at least one positive post-baseline NAb result during the study period. Number of patients negative for NAb = number of post-baseline evaluable patients with all negative post-baseline NAb results.\"\n\nresult\n\nBaseline Prevalence and Incidence of Neutralizing Antibodies (NAbs)\nProtocol: A: Drug X Antibody\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X C: Combination <Missing> B: Placebo All Drug X\n (N=134) (N=132) (N=0) (N=134) (N=266) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nBaseline Prevalence of NAbs \n Baseline evaluable patients for ADA 134 132 0 0 266 \n Patients with a positive ADA sample at baseline 63 64 0 0 127 \nPatients with a positive NAb sample at baseline 0 0 0 0 0 \nPatients with no positive NAb sample at baseline 0 0 0 0 0 \nIncidence of NAbs \n Post-baseline evaluable patients for ADA 134 132 0 0 266 \n Patients positive for ADA 66 59 0 0 125 \nPatients positive for NAb 0 0 0 0 0 \nPatients negative for NAb 134 132 0 0 266 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNAb = Neutralizing Antibodies ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient for ADA = a patient with an ADA assay result from a baseline sample(s) Baseline evaluable patient for NAb = a patient with a NAb assay result from a baseline sample(s) Post-baseline evaluable patient for ADA = a patient with an ADA assay result from at least one post-baseline sample Post-baseline evaluable patient for NAb = a patient with a NAb assay result from at least one post-baseline sample Number of patients positive for ADA = the number of post-baseline evaluable patients for ADA determined to have Treatment Emergent ADA during the study period.\nNumber of patients positive for NAb = the number (and percentage) of post-baseline evaluable patients for ADA determined to have at least one positive post-baseline NAb result during the study period. Number of patients negative for NAb = number of post-baseline evaluable patients with all negative post-baseline NAb results.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:40:49 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tibble_3.2.1 scda_0.1.6.9017 dplyr_1.1.4 \n[4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[7] formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Specifying Class Variables\nTable Selecting Columns and Changing the Alpha Level\nTable Setting Values Indicating Response\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadrs <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadrs <- df_explicit_na(adrs)\n\nadsl <- adsl %>%\n select(STUDYID, USUBJID, ARM, SEX, RACE, STRATA1, STRATA2)\n\nadrs <- adrs %>%\n filter(PARAMCD == \"INVET\") %>%\n select(STUDYID, USUBJID, PARAMCD, AVALC)\n\nanl <- inner_join(adsl, adrs, by = c(\"STUDYID\", \"USUBJID\"))\nanl_labels <- var_labels(anl)\n\nanl <- anl %>%\n filter(ARM %in% c(\"A: Drug X\", \"B: Placebo\")) %>%\n mutate(\n # Reorder levels of factor to make the placebo group the reference arm.\n ARM = relevel(ARM, ref = \"B: Placebo\") %>%\n droplevels()\n ) %>%\n droplevels() %>%\n mutate(rsp = AVALC %in% c(\"CR\", \"PR\"))\n\nvar_labels(anl) <- c(anl_labels, rsp = \"Is Response\")\n\n\n\n\n\n\nCodedf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"STRATA2\")\n ),\n data = anl\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Responders Response (%) n Responders Response (%) Odds Ratio 95% CI \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 84 62.7% 134 100 74.6% 1.75 (1.04, 2.95)\nSex \n F 161 82 48 58.5% 79 61 77.2% 2.40 (1.21, 4.76)\n M 107 52 36 69.2% 55 39 70.9% 1.08 (0.47, 2.48)\nStratification Factor 2 \n S1 140 67 38 56.7% 73 56 76.7% 2.51 (1.22, 5.20)\n S2 128 67 46 68.7% 61 44 72.1% 1.18 (0.55, 2.53)\n\n\n\n\nHere, the levels of subgroup variables SEX and STRATA1 are reordered. STRATA1 is reordered by frequency.\n\n\nCodeanl_reorder <- anl %>%\n mutate(\n SEX = forcats::fct_relevel(SEX, \"M\", \"F\"),\n STRATA1 = forcats::fct_infreq(STRATA1)\n )\n\ndf <- extract_rsp_subgroups(\n variables = list(rsp = \"rsp\", arm = \"ARM\", subgroups = c(\"SEX\", \"STRATA1\")),\n data = anl_reorder\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Responders Response (%) n Responders Response (%) Odds Ratio 95% CI \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 84 62.7% 134 100 74.6% 1.75 (1.04, 2.95)\nSex \n M 107 52 36 69.2% 55 39 70.9% 1.08 (0.47, 2.48)\n F 161 82 48 58.5% 79 61 77.2% 2.40 (1.21, 4.76)\nStratification Factor 1 \n C 94 45 33 73.3% 49 37 75.5% 1.12 (0.44, 2.83)\n B 92 45 26 57.8% 47 32 68.1% 1.56 (0.66, 3.66)\n A 82 44 25 56.8% 38 31 81.6% 3.37 (1.22, 9.28)\n\n\n\n\n\n\nCodedf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"STRATA2\")\n ),\n data = anl,\n conf_level = 0.9,\n method = \"chisq\"\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\", \"pval\"))\n\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Responders Response (%) n Responders Response (%) Odds Ratio 90% CI p-value (Chi-Squared Test)\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 84 62.7% 134 100 74.6% 1.75 (1.13, 2.72) 0.0351 \nSex \n F 161 82 48 58.5% 79 61 77.2% 2.40 (1.35, 4.27) 0.0113 \n M 107 52 36 69.2% 55 39 70.9% 1.08 (0.54, 2.17) 0.8497 \nStratification Factor 2 \n S1 140 67 38 56.7% 73 56 76.7% 2.51 (1.37, 4.63) 0.0119 \n S2 128 67 46 68.7% 61 44 72.1% 1.18 (0.62, 2.24) 0.6674 \n\n\n\n\nCreate a new variable new_rsp in anl data that uses new criteria for responder.\n\n\nCodeanl_new <- anl %>%\n mutate(new_rsp = AVALC == \"CR\")\n\ndf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"new_rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"STRATA2\")\n ),\n data = anl_new\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Responders Response (%) n Responders Response (%) Odds Ratio 95% CI \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 47 35.1% 134 60 44.8% 1.50 (0.92, 2.45)\nSex \n F 161 82 25 30.5% 79 39 49.4% 2.22 (1.17, 4.24)\n M 107 52 22 42.3% 55 21 38.2% 0.84 (0.39, 1.83)\nStratification Factor 2 \n S1 140 67 21 31.3% 73 31 42.5% 1.62 (0.81, 3.24)\n S2 128 67 26 38.8% 61 29 47.5% 1.43 (0.71, 2.89)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# Use table, embedded in response forest plot module.\nlibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(forcats)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADRS <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADRS <- df_explicit_na(ADRS)\n})\ndatanames <- c(\"ADSL\", \"ADRS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADRS <- data[[\"ADRS\"]]\narm_ref_comp <- list(\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n ),\n ARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_forest_rsp(\n label = \"Forest Response\",\n dataname = \"ADRS\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n \"ARMCD\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADRS, \"PARAMCD\", \"PARAM\"),\n \"BESRSPI\"\n ),\n subgroup_var = choices_selected(\n variable_choices(ADSL, names(ADSL)),\n c(\"SEX\")\n ),\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"STRATA1\", \"STRATA2\")),\n \"STRATA2\"\n ),\n plot_height = c(600L, 200L, 2000L)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:38:28 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] forcats_1.0.0 teal.modules.clinical_0.9.0.9014\n [3] teal.transform_0.5.0.9004 teal_0.15.2.9020 \n [5] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 \n [7] teal.code_0.5.0.9004 shiny_1.8.0 \n [9] scda_0.1.6.9017 dplyr_1.1.4 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[37] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[40] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[43] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[46] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[49] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[52] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[55] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[58] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[61] generics_0.1.3 chromote_0.2.0 ggplot2_3.5.0 \n[64] munsell_0.5.0 scales_1.3.0 xtable_1.8-4 \n[67] glue_1.7.0 emmeans_1.10.0 tools_4.3.3 \n[70] webshot2_0.1.1 webshot_0.5.5 mvtnorm_1.2-4 \n[73] cowplot_1.1.3 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 textshaping_0.3.7 fansi_1.0.6 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] farver_2.1.1 memoise_2.0.1 htmltools_0.5.7 \n[91] lifecycle_1.0.4 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "ADA", - "ADAT04B" + "Efficacy", + "ONCT05" ] }, { - "objectID": "tables/ECG/egt01.html", - "href": "tables/ECG/egt01.html", - "title": "EGT01", + "objectID": "tables/efficacy/coxt01.html", + "href": "tables/efficacy/coxt01.html", + "title": "COXT01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\n# Data should be filtered for the studied Parameter (`PARAM`) and the\n# Analysis Visit (`AVISIT`). According to the GDSR template, the values for\n# the `AVISIT` reported in the EGT01 standard may be:\n# 'POST-BASELINE MAXIMUM', 'POST-BASELINE MINIMUM', 'POST-BASELINE LAST'.\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadeg <- df_explicit_na(adeg)\n\nadeg_f <- adeg %>%\n filter(ANL01FL == \"Y\") %>%\n filter(PARAM %in% c(\"Heart Rate\", \"QT Duration\", \"RR Duration\"))\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nafun <- function(x, .var, .spl_context, ...) {\n n_fun <- sum(!is.na(x), na.rm = TRUE)\n if (n_fun == 0) {\n mean_sd_fun <- c(NA, NA)\n median_fun <- NA\n min_max_fun <- c(NA, NA)\n } else {\n mean_sd_fun <- c(mean(x, na.rm = TRUE), sd(x, na.rm = TRUE))\n median_fun <- median(x, na.rm = TRUE)\n min_max_fun <- c(min(x), max(x))\n }\n is_chg <- .var == \"CHG\"\n is_baseline <- .spl_context$value[which(.spl_context$split == \"AVISIT\")] == \"BASELINE\"\n if (is_baseline && is_chg) n_fun <- mean_sd_fun <- median_fun <- min_max_fun <- NULL\n\n in_rows(\n \"n\" = n_fun,\n \"Mean (SD)\" = mean_sd_fun,\n \"Median\" = median_fun,\n \"Min - Max\" = min_max_fun,\n .formats = list(\"n\" = \"xx\", \"Mean (SD)\" = \"xx.xx (xx.xx)\", \"Median\" = \"xx.xx\", \"Min - Max\" = \"xx.xx - xx.xx\"),\n .format_na_strs = list(\"n\" = \"NE\", \"Mean (SD)\" = \"NE (NE)\", \"Median\" = \"NE\", \"Min - Max\" = \"NE - NE\")\n )\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adeg_f$PARAM)) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adeg_f$AVISIT)) %>%\n split_cols_by_multivar(\n vars = c(\"AVAL\", \"CHG\"),\n varlabels = c(\"Value at Visit\", \"Change from\\nBaseline\")\n ) %>%\n analyze_colvars(afun = afun)\n\nresult <- build_table(lyt, adeg_f, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination \n Change from Change from Change from \nParameter Value at Visit Baseline Value at Visit Baseline Value at Visit Baseline \n Analysis Visit (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nHeart Rate \n BASELINE \n n 134 134 132 \n Mean (SD) 71.45 (17.93) 69.83 (20.72) 69.34 (20.95) \n Median 72.70 73.35 71.96 \n Min - Max 9.09 - 106.91 13.49 - 115.52 11.63 - 115.49 \n WEEK 1 DAY 8 \n n 134 134 134 134 132 132 \n Mean (SD) 70.19 (20.27) -1.26 (25.97) 69.43 (20.80) -0.40 (29.73) 68.65 (18.06) -0.69 (27.81) \n Median 70.70 -2.20 70.46 -0.52 68.57 -0.76 \n Min - Max 8.53 - 127.50 -50.97 - 89.16 16.85 - 129.14 -68.18 - 88.38 16.87 - 115.60 -68.25 - 67.20 \n WEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 70.32 (19.56) -1.13 (26.26) 71.11 (20.56) 1.28 (31.35) 69.19 (18.06) -0.15 (28.61) \n Median 70.88 -1.10 72.52 -0.31 69.30 -1.55 \n Min - Max 17.14 - 116.32 -85.03 - 67.52 9.22 - 120.54 -73.07 - 81.44 29.62 - 120.50 -67.75 - 66.29 \n WEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 68.25 (20.17) -3.20 (28.66) 68.95 (20.56) -0.88 (30.14) 70.88 (20.28) 1.54 (27.28) \n Median 68.79 -2.17 67.80 1.19 70.12 0.14 \n Min - Max 13.33 - 131.73 -81.20 - 72.57 23.98 - 130.41 -73.03 - 103.31 20.91 - 116.79 -64.51 - 72.52 \n WEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 70.06 (18.41) -1.38 (26.59) 71.60 (20.34) 1.77 (30.26) 71.02 (20.59) 1.68 (29.60) \n Median 69.33 -4.54 72.21 -0.88 70.52 3.81 \n Min - Max 22.30 - 116.51 -58.07 - 77.32 17.53 - 129.06 -64.32 - 85.34 10.35 - 117.30 -65.91 - 105.67 \n WEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 66.41 (19.74) -5.04 (27.11) 71.25 (18.92) 1.42 (27.08) 71.26 (18.56) 1.92 (29.59) \n Median 65.40 -6.83 70.86 0.64 73.29 1.74 \n Min - Max 23.89 - 110.38 -73.26 - 57.24 25.86 - 125.73 -71.15 - 67.37 23.89 - 117.19 -58.23 - 68.86 \nQT Duration \n BASELINE \n n 134 134 132 \n Mean (SD) 336.83 (117.96) 351.00 (98.44) 352.60 (105.11) \n Median 344.41 351.48 347.96 \n Min - Max 86.98 - 665.40 98.90 - 641.92 105.68 - 628.14 \n WEEK 1 DAY 8 \n n 134 134 134 134 132 132 \n Mean (SD) 342.57 (101.09) 5.74 (159.94) 363.95 (102.34) 12.94 (140.73) 359.42 (105.16) 6.83 (147.13) \n Median 347.26 -1.78 356.54 13.73 363.84 8.69 \n Min - Max 91.63 - 591.42 -346.44 - 452.75 114.92 - 656.45 -317.53 - 416.35 51.91 - 611.88 -473.19 - 358.00 \n WEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 353.24 (93.93) 16.41 (162.10) 345.93 (96.78) -5.08 (152.51) 335.69 (98.61) -16.91 (138.45) \n Median 351.10 16.72 346.83 -9.68 320.96 -22.27 \n Min - Max 138.01 - 587.30 -414.07 - 389.16 146.42 - 556.07 -440.28 - 364.76 104.91 - 562.34 -326.55 - 325.27 \n WEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 370.12 (101.57) 33.28 (152.78) 343.41 (102.58) -7.59 (138.80) 346.95 (94.96) -5.65 (144.65) \n Median 378.21 39.59 335.12 -15.89 352.15 9.11 \n Min - Max 118.14 - 615.18 -391.72 - 520.09 63.37 - 566.51 -311.28 - 293.76 126.09 - 580.81 -412.11 - 410.01 \n WEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 345.77 (95.97) 8.94 (145.65) 354.38 (108.29) 3.37 (142.39) 341.36 (106.75) -11.24 (145.65) \n Median 340.13 5.58 346.70 -17.13 352.30 -11.87 \n Min - Max 110.12 - 616.58 -393.34 - 456.04 80.82 - 687.69 -439.90 - 364.80 4.95 - 570.61 -480.94 - 330.67 \n WEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 358.90 (97.69) 22.07 (155.68) 338.65 (99.26) -12.36 (130.46) 349.30 (95.77) -3.30 (136.00) \n Median 351.96 5.89 344.17 0.40 350.32 12.68 \n Min - Max 88.38 - 661.12 -353.30 - 539.84 31.25 - 563.90 -338.85 - 352.75 119.02 - 581.83 -311.45 - 295.53 \nRR Duration \n BASELINE \n n 134 134 132 \n Mean (SD) 1028.42 (286.38) 1027.48 (324.00) 1074.62 (277.33) \n Median 1041.86 1047.27 1080.87 \n Min - Max 34.33 - 1783.71 5.29 - 1877.19 289.60 - 1617.06 \n WEEK 1 DAY 8 \n n 134 134 134 134 132 132 \n Mean (SD) 990.15 (318.74) -38.26 (446.40) 1061.59 (269.14) 34.10 (401.76) 1039.64 (284.39) -34.98 (406.04) \n Median 963.88 -86.50 1061.50 66.91 1014.78 -97.83 \n Min - Max 110.82 - 2014.56 -1014.82 - 1389.40 276.83 - 1711.99 -942.16 - 993.82 498.21 - 1937.47 -958.61 - 908.90 \n WEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 1013.37 (304.13) -15.05 (425.81) 1109.40 (318.23) 81.92 (453.11) 1045.21 (277.51) -29.41 (380.84) \n Median 1040.69 40.49 1117.76 69.27 1034.64 -15.33 \n Min - Max 164.19 - 1677.10 -1216.10 - 1053.15 160.73 - 2048.73 -1127.10 - 1148.61 252.84 - 1722.33 -859.27 - 871.54 \n WEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 1013.99 (304.99) -14.43 (406.53) 1118.35 (296.53) 90.86 (409.57) 1036.59 (268.52) -38.03 (421.48) \n Median 1027.23 -50.54 1134.60 52.03 1030.72 -60.72 \n Min - Max 357.04 - 1798.65 -882.94 - 1080.26 97.14 - 1825.43 -887.06 - 1166.15 446.02 - 1713.38 -984.79 - 902.37 \n WEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 1033.31 (313.92) 4.89 (483.15) 1079.76 (298.94) 52.28 (429.25) 1027.55 (295.86) -47.07 (378.23) \n Median 1050.40 5.60 1051.61 69.55 1023.36 -49.52 \n Min - Max 54.33 - 1979.43 -1345.93 - 1195.41 347.94 - 1762.04 -826.43 - 1191.83 341.62 - 2144.86 -1002.03 - 1048.66\n WEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 1072.33 (282.90) 43.92 (379.05) 1058.45 (271.01) 30.97 (436.03) 1029.04 (271.21) -45.58 (405.53) \n Median 1067.33 55.87 1068.95 33.61 1065.26 -34.40 \n Min - Max 352.97 - 2000.56 -1028.79 - 1418.57 208.83 - 1794.73 -978.97 - 1365.13 436.28 - 1794.07 -962.18 - 1329.88 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEG <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADEG <- df_explicit_na(ADEG)\n})\ndatanames <- c(\"ADSL\", \"ADEG\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADEG <- data[[\"ADEG\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"ECG Results and Change from Baseline by Visit\",\n dataname = \"ADEG\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADEG, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"AVISIT\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADEG, c(\"AVAL\", \"CHG\")),\n selected = c(\"AVAL\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADEG, \"PARAMCD\", \"PARAM\"),\n selected = \"HR\"\n ),\n parallel_vars = TRUE\n )\n ),\n filter = teal_slices(teal_slice(\"ADEG\", \"AVAL\", selected = NULL))\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADEG-filter-ADEG_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:40:22 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Cox models are the most commonly used methods to estimate the magnitude of the effect in survival analyses. It assumes proportional hazards; that is, it assumes that the ratio of the hazards of the two groups (e.g. two arms) is constant over time. This ratio is referred to as the “hazard ratio” and is one of the most commonly reported metrics to describe the effect size in survival analysis.\n\n\nData Setup\nCox Regression\nCox Regression with Interaction Term\nCox Regression Specifying Covariates\nCox Regression Setting Strata, Ties, Alpha Level\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadtte <- df_explicit_na(adtte)\n\nadsl_filtered <- adsl %>% dplyr::filter(\n RACE %in% c(\"ASIAN\", \"BLACK OR AFRICAN AMERICAN\", \"WHITE\")\n)\nadtte_filtered <- dplyr::inner_join(\n x = adsl_filtered[, c(\"STUDYID\", \"USUBJID\")],\n y = adtte,\n by = c(\"STUDYID\", \"USUBJID\")\n)\n\nanl <- adtte_filtered %>%\n filter(PARAMCD == \"OS\") %>%\n mutate(EVENT = 1 - CNSR) %>%\n filter(ARM %in% c(\"B: Placebo\", \"A: Drug X\")) %>%\n mutate(ARM = droplevels(relevel(ARM, \"B: Placebo\"))) %>%\n mutate(RACE = droplevels(RACE) %>% formatters::with_label(\"Race\"))\n\n# Add variable for column split label\nanl <- anl %>% mutate(col_label = \"Treatment Effect Adjusted for Covariate\")\n\n\n\n\nThe summarize_coxreg function fits, tidies and arranges a Cox regression model in a table layout using the rtables framework. For a Cox regression model, arguments variables, control, and at can be specified (see ?summarize_coxreg for more details and customization options). All variables specified within variables must be present in the data used when building the table.\nTo see the same model as a data.frame object, these three arguments (as well as the data) can be passed to the fit_coxreg_univar function, and the resulting list tidied using broom::tidy().\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARM\",\n covariates = c(\"AGE\", \"SEX\", \"RACE\")\n)\n\nlyt <- basic_table() %>%\n split_cols_by(\"col_label\") %>%\n summarize_coxreg(variables = variables) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\n Treatment Effect Adjusted for Covariate \nEffect/Covariate Included in the Model n Hazard Ratio 95% CI p-value \n—————————————————————————————————————————————————————————————————————————————————————————\nTreatment: \n A: Drug X vs control (B: Placebo) 247 0.97 (0.66, 1.43) 0.8934 \nCovariate: \n Age 247 0.95 (0.65, 1.40) 0.7948 \n Sex 247 0.98 (0.67, 1.43) 0.8970 \n Race 247 0.98 (0.67, 1.44) 0.9239 \n\n\n\n\nThe argument control can be used to modify standard outputs; control_coxreg() helps in adopting the right settings (see ?control_coxreg). For instance, control is used to include the interaction terms.\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARM\",\n covariates = c(\"AGE\", \"RACE\")\n)\n\nlyt <- basic_table() %>%\n split_cols_by(\"col_label\") %>%\n summarize_coxreg(\n variables = variables,\n control = control_coxreg(interaction = TRUE),\n .stats = c(\"n\", \"hr\", \"ci\", \"pval\", \"pval_inter\")\n ) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\n Treatment Effect Adjusted for Covariate \nEffect/Covariate Included in the Model n Hazard Ratio 95% CI p-value Interaction p-value\n——————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment: \n A: Drug X vs control (B: Placebo) 247 0.97 (0.66, 1.43) 0.8934 \nCovariate: \n Age 247 0.7878 \n 34 0.95 (0.65, 1.40) \n Race 247 0.6850 \n ASIAN 1.05 (0.63, 1.75) \n BLACK OR AFRICAN AMERICAN 1.08 (0.51, 2.29) \n WHITE 0.67 (0.27, 1.71) \n\n\n\n\nThe optional argument at allows the user to provide the expected level of estimation for the interaction when the predictor is a quantitative variable. For instance, it might be relevant to choose the age at which the hazard ratio should be estimated. If no input is provided to at, the median value is used in the row name (as in the previous tab).\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARM\",\n covariates = c(\"AGE\", \"SEX\")\n)\n\nlyt <- basic_table() %>%\n split_cols_by(\"col_label\") %>%\n summarize_coxreg(\n variables = variables,\n control = control_coxreg(interaction = TRUE),\n at = list(AGE = c(30, 40, 50)),\n .stats = c(\"n\", \"hr\", \"ci\", \"pval\", \"pval_inter\")\n ) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\n Treatment Effect Adjusted for Covariate \nEffect/Covariate Included in the Model n Hazard Ratio 95% CI p-value Interaction p-value\n——————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment: \n A: Drug X vs control (B: Placebo) 247 0.97 (0.66, 1.43) 0.8934 \nCovariate: \n Age 247 0.7878 \n 30 0.98 (0.63, 1.51) \n 40 0.91 (0.54, 1.51) \n 50 0.84 (0.32, 2.20) \n Sex 247 0.1455 \n F 0.77 (0.47, 1.27) \n M 1.38 (0.75, 2.52) \n\n\n\n\nAdditional controls can be customized using control_coxreg (see ?control_coxreg) such as the ties calculation method and the confidence level. Stratification variables can be added via the strata element of the variables list.\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARM\",\n covariates = c(\"AGE\", \"RACE\"),\n strata = \"SEX\"\n)\n\ncontrol <- control_coxreg(\n ties = \"breslow\",\n interaction = TRUE,\n conf_level = 0.90\n)\n\nlyt <- basic_table() %>%\n split_cols_by(\"col_label\") %>%\n summarize_coxreg(\n variables = variables,\n control = control,\n at = list(AGE = c(30, 40, 50)),\n .stats = c(\"n\", \"hr\", \"ci\", \"pval\", \"pval_inter\")\n ) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\n Treatment Effect Adjusted for Covariate \nEffect/Covariate Included in the Model n Hazard Ratio 90% CI p-value Interaction p-value\n——————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment: \n A: Drug X vs control (B: Placebo) 247 0.98 (0.71, 1.35) 0.9063 \nCovariate: \n Age 247 0.7733 \n 30 0.98 (0.68, 1.42) \n 40 0.91 (0.59, 1.39) \n 50 0.84 (0.38, 1.87) \n Race 247 0.6501 \n ASIAN 1.07 (0.64, 1.77) \n BLACK OR AFRICAN AMERICAN 1.08 (0.51, 2.29) \n WHITE 0.66 (0.26, 1.67) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADTTE <- df_explicit_na(ADTTE)\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADTTE <- data[[\"ADTTE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_coxreg(\n label = \"Cox Reg.\",\n dataname = \"ADTTE\",\n arm_var = choices_selected(c(\"ARM\", \"ACTARMCD\"), \"ARM\"),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADTTE, \"PARAMCD\", \"PARAM\"), \"OS\"\n ),\n strata_var = choices_selected(\n c(\"SEX\", \"STRATA1\", \"STRATA2\"), NULL\n ),\n cov_var = choices_selected(\n c(\"AGE\", \"SEX\", \"RACE\"), \"AGE\"\n ),\n multivariate = FALSE\n )\n )\n)\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:37:52 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 stringr_1.5.1 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 utf8_1.2.4 \n[19] promises_1.2.1 rmarkdown_2.26 ps_1.7.6 \n[22] purrr_1.0.2 xfun_0.42 shinyvalidate_0.1.3 \n[25] cachem_1.0.8 teal.reporter_0.3.1.9002 jsonlite_1.8.8 \n[28] later_1.3.2 broom_1.0.5 R6_2.5.1 \n[31] bslib_0.6.1 stringi_1.8.3 car_3.1-2 \n[34] brio_1.1.4 jquerylib_0.1.4 estimability_1.5 \n[37] Rcpp_1.0.12 knitr_1.45 zoo_1.8-12 \n[40] teal.logger_0.2.0.9001 httpuv_1.6.14 Matrix_1.6-5 \n[43] splines_4.3.3 tidyselect_1.2.1 abind_1.4-5 \n[46] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[49] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[52] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[55] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[58] shinycssloaders_1.0.0 carData_3.0-5 checkmate_2.3.1 \n[61] shinyjs_2.1.0 generics_0.1.3 chromote_0.2.0 \n[64] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[67] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[70] tools_4.3.3 webshot2_0.1.1 webshot_0.5.5 \n[73] forcats_1.0.0 mvtnorm_1.2-4 grid_4.3.3 \n[76] tidyr_1.3.1 rbibutils_2.2.16 colorspace_2.1-0 \n[79] nlme_3.1-164 cli_3.6.2 fansi_1.0.6 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] shinyWidgets_0.8.2 mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "ECG", - "EGT01" + "Efficacy", + "COXT01" ] }, { - "objectID": "tables/ECG/egt05_qtcat.html", - "href": "tables/ECG/egt05_qtcat.html", - "title": "EGT05_QTCAT", + "objectID": "tables/efficacy/ttet01.html", + "href": "tables/efficacy/ttet01.html", + "title": "TTET01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadeg <- df_explicit_na(adeg)\n\nadeg_labels <- var_labels(adeg)\nadeg_f <- adeg %>%\n filter(\n PARAMCD == \"QT\",\n ANL01FL == \"Y\"\n ) %>%\n mutate(\n AVALCAT1 = case_when(\n AVAL <= 450 ~ \"<=450 msec\",\n AVAL <= 480 ~ \">450 to <=480 msec\",\n AVAL <= 500 ~ \">480 to <= 500 msec\",\n AVAL > 500 ~ \">500 msec\",\n is.na(AVAL) ~ \"<Missing>\"\n ),\n CHGCAT1 = case_when(\n CHG <= 30 ~ \"<=30 msec\",\n CHG <= 60 ~ \">30 to <=60 msec\",\n CHG > 60 ~ \">60 msec\",\n is.na(CHG) ~ \"<Missing>\"\n )\n ) %>%\n mutate(\n AVALCAT1 = factor(\n AVALCAT1,\n levels = c(\n \"<=450 msec\",\n \">450 to <=480 msec\",\n \">480 to <= 500 msec\",\n \">500 msec\",\n \"<Missing>\"\n )\n ),\n CHGCAT1 = factor(\n CHGCAT1,\n levels = c(\n \"<=30 msec\",\n \">30 to <=60 msec\",\n \">60 msec\",\n \"<Missing>\"\n )\n )\n ) %>%\n var_relabel(\n AVALCAT1 = \"Value at Visit\",\n CHGCAT1 = \"Change from Baseline\"\n )\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_label = obj_label(adeg_f$PARAM),\n split_fun = split_fun,\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_label = obj_label(adeg_f$AVISIT),\n split_fun = split_fun,\n label_pos = \"topleft\"\n ) %>%\n analyze_vars(\n vars = c(\"AVALCAT1\", \"CHGCAT1\"),\n var_labels = c(\"Value at Visit\", \"Change from Baseline\")\n ) %>%\n append_topleft(\" Category\")\n\nresult <- build_table(lyt = lyt, df = adeg_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\nParameter \n Analysis Visit A: Drug X B: Placebo C: Combination\n Category (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————\nQT Duration \n BASELINE \n Value at Visit \n n 134 134 132 \n <=450 msec 115 (85.8%) 117 (87.3%) 104 (78.8%) \n >450 to <=480 msec 6 (4.5%) 10 (7.5%) 9 (6.8%) \n >480 to <= 500 msec 4 (3%) 3 (2.2%) 6 (4.5%) \n >500 msec 9 (6.7%) 4 (3%) 13 (9.8%) \n WEEK 1 DAY 8 \n Value at Visit \n n 134 134 132 \n <=450 msec 113 (84.3%) 106 (79.1%) 106 (80.3%) \n >450 to <=480 msec 10 (7.5%) 10 (7.5%) 11 (8.3%) \n >480 to <= 500 msec 4 (3%) 4 (3%) 3 (2.3%) \n >500 msec 7 (5.2%) 14 (10.4%) 12 (9.1%) \n Change from Baseline \n n 134 134 132 \n <=30 msec 76 (56.7%) 75 (56%) 75 (56.8%) \n >30 to <=60 msec 7 (5.2%) 13 (9.7%) 11 (8.3%) \n >60 msec 51 (38.1%) 46 (34.3%) 46 (34.8%) \n WEEK 2 DAY 15 \n Value at Visit \n n 134 134 132 \n <=450 msec 111 (82.8%) 114 (85.1%) 112 (84.8%) \n >450 to <=480 msec 10 (7.5%) 9 (6.7%) 9 (6.8%) \n >480 to <= 500 msec 7 (5.2%) 2 (1.5%) 5 (3.8%) \n >500 msec 6 (4.5%) 9 (6.7%) 6 (4.5%) \n Change from Baseline \n n 134 134 132 \n <=30 msec 71 (53%) 87 (64.9%) 89 (67.4%) \n >30 to <=60 msec 11 (8.2%) 9 (6.7%) 9 (6.8%) \n >60 msec 52 (38.8%) 38 (28.4%) 34 (25.8%) \n WEEK 3 DAY 22 \n Value at Visit \n n 134 134 132 \n <=450 msec 106 (79.1%) 112 (83.6%) 118 (89.4%) \n >450 to <=480 msec 13 (9.7%) 7 (5.2%) 3 (2.3%) \n >480 to <= 500 msec 4 (3%) 5 (3.7%) 2 (1.5%) \n >500 msec 11 (8.2%) 10 (7.5%) 9 (6.8%) \n Change from Baseline \n n 134 134 132 \n <=30 msec 63 (47%) 80 (59.7%) 81 (61.4%) \n >30 to <=60 msec 14 (10.4%) 8 (6%) 11 (8.3%) \n >60 msec 57 (42.5%) 46 (34.3%) 40 (30.3%) \n WEEK 4 DAY 29 \n Value at Visit \n n 134 134 132 \n <=450 msec 117 (87.3%) 103 (76.9%) 114 (86.4%) \n >450 to <=480 msec 7 (5.2%) 14 (10.4%) 6 (4.5%) \n >480 to <= 500 msec 4 (3%) 7 (5.2%) 3 (2.3%) \n >500 msec 6 (4.5%) 10 (7.5%) 9 (6.8%) \n Change from Baseline \n n 134 134 132 \n <=30 msec 79 (59%) 80 (59.7%) 79 (59.8%) \n >30 to <=60 msec 11 (8.2%) 7 (5.2%) 10 (7.6%) \n >60 msec 44 (32.8%) 47 (35.1%) 43 (32.6%) \n WEEK 5 DAY 36 \n Value at Visit \n n 134 134 132 \n <=450 msec 107 (79.9%) 117 (87.3%) 112 (84.8%) \n >450 to <=480 msec 16 (11.9%) 5 (3.7%) 13 (9.8%) \n >480 to <= 500 msec 5 (3.7%) 9 (6.7%) 3 (2.3%) \n >500 msec 6 (4.5%) 3 (2.2%) 4 (3%) \n Change from Baseline \n n 134 134 132 \n <=30 msec 72 (53.7%) 82 (61.2%) 73 (55.3%) \n >30 to <=60 msec 10 (7.5%) 11 (8.2%) 11 (8.3%) \n >60 msec 52 (38.8%) 41 (30.6%) 48 (36.4%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEG <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADEG <- df_explicit_na(ADEG)\n adeg_labels <- col_labels(ADEG)\n\n ADEG <- ADEG %>%\n filter(\n ANL01FL == \"Y\" # no need to filter for PARAMCD here\n ) %>%\n mutate(\n AVALCAT1 = case_when(\n AVAL <= 450 ~ \"<=450 msec\",\n AVAL <= 480 ~ \">450 to <=480 msec\",\n AVAL <= 500 ~ \">480 to <= 500 msec\",\n AVAL > 500 ~ \">500 msec\",\n is.na(AVAL) ~ \"<Missing>\"\n ),\n CHGCAT1 = case_when(\n CHG <= 30 ~ \"<=30 msec\",\n CHG <= 60 ~ \">30 to <=60 msec\",\n CHG > 60 ~ \">60 msec\",\n is.na(CHG) ~ \"<Missing>\"\n )\n ) %>%\n mutate(\n AVALCAT1 = factor(\n AVALCAT1,\n levels = c(\n \"<=450 msec\",\n \">450 to <=480 msec\",\n \">480 to <= 500 msec\",\n \">500 msec\",\n \"<Missing>\"\n )\n ),\n CHGCAT1 = factor(\n CHGCAT1,\n levels = c(\n \"<=30 msec\",\n \">30 to <=60 msec\",\n \">60 msec\",\n \"<Missing>\"\n )\n )\n )\n col_labels(ADEG) <- c(\n adeg_labels,\n \"AVALCAT1\" = \"Value at Visit\",\n \"CHGCAT1\" = \"Change from Baseline\"\n )\n})\ndatanames <- c(\"ADSL\", \"ADEG\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADEG <- data[[\"ADEG\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"ECG Actual Values and Changes from Baseline by Visit\",\n dataname = \"ADEG\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADEG, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"AVISIT\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADEG, c(\"AVALCAT1\", \"CHGCAT1\")),\n selected = c(\"AVALCAT1\", \"CHGCAT1\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADEG, \"PARAMCD\", \"PARAM\"),\n selected = \"QT\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:39:49 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Selecting Sections to Display\nTable Modifying Analysis Details like Conf. Type, Ties, Alpha Level\nTable with Stratified Analysis\nTable Modifying Time Point for the “XX Months” Analysis\nTable Requesting > 1 p-value\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n# Ensure that character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadtte <- df_explicit_na(adtte)\n\nadtte_f <- adtte %>%\n dplyr::filter(PARAMCD == \"OS\") %>%\n dplyr::mutate(\n AVAL = day2month(AVAL),\n is_event = CNSR == 0,\n is_not_event = CNSR == 1,\n EVNT1 = factor(\n case_when(\n is_event == TRUE ~ \"Patients with event (%)\",\n is_event == FALSE ~ \"Patients without event (%)\"\n ),\n levels = c(\"Patients with event (%)\", \"Patients without event (%)\")\n ),\n EVNTDESC = factor(EVNTDESC)\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n var = \"ARM\", ref_group = \"A: Drug X\"\n ) %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Patients with event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 1L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n time_point = c(6, 12),\n is_event = \"is_event\",\n method = \"both\",\n control = control_surv_timepoint()\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \n Earliest contributing event \n Death 58 58 69 \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 95% CI (9.3, NA) (9.4, NA) (7.6, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \n6 Months \n Patients remaining at risk 97 97 90 \n Event Free Rate (%) 72.39 72.39 68.18 \n 95% CI (64.82, 79.96) (64.82, 79.96) (60.24, 76.13) \n Difference in Event Free Rate 0.00 -4.21 \n 95% CI (-10.71, 10.71) (-15.18, 6.77) \n p-value (Z-test) 1.0000 0.4525 \n12 Months \n Patients remaining at risk 49 48 37 \n Event Free Rate (%) 56.72 56.72 47.73 \n 95% CI (48.33, 65.11) (48.33, 65.11) (39.21, 56.25) \n Difference in Event Free Rate 0.00 -8.99 \n 95% CI (-11.86, 11.86) (-20.95, 2.97) \n p-value (Z-test) 1.0000 0.1406 \n—————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n—————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"A: Drug X\") %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n analyze_vars(\n \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n is_event = \"is_event\",\n method = \"surv\",\n time_point = c(6, 12)\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 95% CI (9.3, NA) (9.4, NA) (7.6, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \n6 Months \n Patients remaining at risk 97 97 90 \n Event Free Rate (%) 72.39 72.39 68.18 \n 95% CI (64.82, 79.96) (64.82, 79.96) (60.24, 76.13) \n12 Months \n Patients remaining at risk 49 48 37 \n Event Free Rate (%) 56.72 56.72 47.73 \n 95% CI (48.33, 65.11) (48.33, 65.11) (39.21, 56.25) \n——————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n——————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"A: Drug X\") %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Patients with event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 1L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n control = control_surv_time(conf_level = 0.9, conf_type = \"log-log\"),\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(\n pval_method = \"log-rank\",\n conf_level = 0.95,\n ties = \"efron\"\n ),\n table_names = \"coxph_unstratified\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n is_event = \"is_event\",\n time_point = 12,\n control = control_surv_timepoint(conf_level = 0.9, conf_type = \"log-log\"),\n table_names_suffix = \"_log_log\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n show_labels = \"hidden\",\n is_event = \"is_event\",\n time_point = 12,\n method = \"surv_diff\",\n control = control_surv_timepoint(conf_level = 0.975),\n table_names_suffix = \"_975_pct\"\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \n Earliest contributing event \n Death 58 58 69 \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 90% CI (9.6, NA) (9.6, NA) (7.7, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \n12 Months \n Patients remaining at risk 49 48 37 \n Event Free Rate (%) 56.72 56.72 47.73 \n 90% CI (49.37, 63.41) (49.37, 63.41) (40.42, 54.66) \nDifference in Event Free Rate 0.00 -8.99 \n 97.5% CI (-13.57, 13.57) (-22.66, 4.69) \n p-value (Z-test) 1.0000 0.1406 \n———————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n———————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"A: Drug X\") %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Patients with event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 1L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Unstratified Analysis\",\n table_names = \"coxph_unstratified\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Stratified Analysis\",\n strata = \"SEX\",\n table_names = \"coxph_stratified\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n is_event = \"is_event\",\n method = \"both\",\n time_point = 12\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \n Earliest contributing event \n Death 58 58 69 \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 95% CI (9.3, NA) (9.4, NA) (7.6, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \nStratified Analysis \n p-value (log-rank) 0.9978 0.1733 \n Hazard Ratio 1.00 1.27 \n 95% CI (0.69, 1.44) (0.90, 1.81) \n12 Months \n Patients remaining at risk 49 48 37 \n Event Free Rate (%) 56.72 56.72 47.73 \n 95% CI (48.33, 65.11) (48.33, 65.11) (39.21, 56.25) \n Difference in Event Free Rate 0.00 -8.99 \n 95% CI (-11.86, 11.86) (-20.95, 2.97) \n p-value (Z-test) 1.0000 0.1406 \n—————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n—————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"A: Drug X\") %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Patients with event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 1L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n is_event = \"is_event\",\n time_point = 6,\n method = \"both\"\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \n Earliest contributing event \n Death 58 58 69 \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 95% CI (9.3, NA) (9.4, NA) (7.6, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \n6 Months \n Patients remaining at risk 97 97 90 \n Event Free Rate (%) 72.39 72.39 68.18 \n 95% CI (64.82, 79.96) (64.82, 79.96) (60.24, 76.13) \n Difference in Event Free Rate 0.00 -4.21 \n 95% CI (-10.71, 10.71) (-15.18, 6.77) \n p-value (Z-test) 1.0000 0.4525 \n—————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n—————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"A: Drug X\") %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Patients with event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 1L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(pval_method = \"log-rank\"),\n .stats = \"pvalue\",\n table_names = \"coxph_unstratified\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n show_labels = \"hidden\",\n control = control_coxph(pval_method = \"wald\"),\n .stats = \"pvalue\",\n .indent_mods = c(pvalue = 1L),\n table_names = \"coxph_wald_pvalue\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n show_labels = \"hidden\",\n control = control_coxph(pval_method = \"likelihood\"),\n .indent_mods = c(pvalue = 1L, hr = 2L, hr_ci = 3L),\n table_names = \"coxph_likelihood_pvalue\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n is_event = \"is_event\",\n time_point = 12,\n method = \"both\"\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \n Earliest contributing event \n Death 58 58 69 \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 95% CI (9.3, NA) (9.4, NA) (7.6, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n p-value (wald) 0.9998 0.1552 \n p-value (likelihood) 0.9998 0.1543 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \n12 Months \n Patients remaining at risk 49 48 37 \n Event Free Rate (%) 56.72 56.72 47.73 \n 95% CI (48.33, 65.11) (48.33, 65.11) (39.21, 56.25) \n Difference in Event Free Rate 0.00 -8.99 \n 95% CI (-11.86, 11.86) (-20.95, 2.97) \n p-value (Z-test) 1.0000 0.1406 \n—————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n—————————————————————————————————————————————————————————————————————————————————————\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADTTE <- df_explicit_na(ADTTE)\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADTTE <- data[[\"ADTTE\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_tte(\n label = \"Time To Event Table\",\n dataname = \"ADTTE\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADTTE, \"PARAMCD\", \"PARAM\"),\n \"OS\"\n ),\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"SEX\", \"BMRKR2\")),\n \"SEX\"\n ),\n time_points = choices_selected(c(6, 8), 6),\n event_desc_var = choices_selected(\n variable_choices(ADTTE, \"EVNTDESC\"),\n \"EVNTDESC\",\n fixed = TRUE\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:37:13 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "ECG", - "EGT05_QTCAT" + "Efficacy", + "TTET01" ] }, { - "objectID": "tables/concomitant-medications/cmt01a.html", - "href": "tables/concomitant-medications/cmt01a.html", - "title": "CMT01A", + "objectID": "tables/ADA/adat04a.html", + "href": "tables/ADA/adat04a.html", + "title": "ADAT04A", "section": "", - "text": "Data Setup\nStandard Table, Safety-Evaluable Patients\nTable Changing ATC Class Level\nTable with Classes Sorted by Frequency\nTable with Total Number of Treatments per Medication Class Suppressed\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nadcm$CMSEQ <- as.factor(adcm$CMSEQ)\n\nadsl <- df_explicit_na(adsl)\nadcm <- df_explicit_na(adcm)\n\n# Keep only safety-evaluable patients and concomitant medications\nadsl <- adsl %>%\n filter(SAFFL == \"Y\")\n\nadcm <- adcm %>%\n filter(SAFFL == \"Y\" & ATIREL == \"CONCOMITANT\") %>%\n var_relabel(CMDECOD = \"Other Treatment\")\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC2\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 2 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS2 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS2 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS2 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS2 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC1\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC1)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC1\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 1 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS1 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS1 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(path = c(\"ATC2\"), scorefun = cont_n_allcols) %>%\n sort_at_path(path = c(\"ATC2\", \"*\", \"CMDECOD\"), scorefun = score_occurrences)\n\nresult\n\nATC Level 2 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS2 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS2 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS2 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \nATCCLAS2 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC2\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 2 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS2 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS2 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS2 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS2 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\nadcm_keys <- c(\"STUDYID\", \"USUBJID\", \"ASTDTM\", \"CMSEQ\", \"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADCM <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n ADCM$CMSEQ <- as.integer(ADCM$CMSEQ)\n\n ADSL <- df_explicit_na(ADSL)\n ADCM <- df_explicit_na(ADCM)\n})\ndatanames <- c(\"ADSL\", \"ADCM\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\njoin_keys(data)[\"ADCM\", \"ADCM\"] <- adcm_keys\n\n## Reusable Configuration For Modules\nADCM <- data[[\"ADCM\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_mult_events(\n label = \"Concomitant Medications by Medication Class and Preferred Name\",\n dataname = \"ADCM\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n seq_var = choices_selected(\"CMSEQ\", selected = \"CMSEQ\", fixed = TRUE),\n hlt = choices_selected(\n choices = variable_choices(ADCM, c(\"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")),\n selected = c(\"ATC2\")\n ),\n llt = choices_selected(\n choices = variable_choices(ADCM, c(\"CMDECOD\")),\n selected = c(\"CMDECOD\")\n ),\n add_total = FALSE,\n event_type = \"treatment\"\n )\n ),\n filter = teal_slices(\n teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"),\n teal_slice(\"ADCM\", \"ATIREL\", selected = \"CONCOMITANT\")\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:39:27 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nSummary of Treatment Emergent NAbs\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\nlibrary(tibble)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\")\n\ncombodf <- tribble(\n ~valname, ~label, ~levelcombo, ~exargs,\n \"all_X\", \"All Drug X\", c(\"A: Drug X\", \"C: Combination\"), list(),\n \"all_pt\", \"All Patients\", c(\"A: Drug X\", \"B: Placebo\", \"C: Combination\"), list()\n)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\n# Baseline Pts\nadab_b <- df_explicit_na(adab) %>%\n filter(\n ABLFL == \"Y\",\n ADABLPFL == \"Y\",\n PARAM %in% c(\n \"ADA interpreted per sample result\",\n \"NAB interpreted per sample result\"\n )\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU) %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate(\n across(\n any_of(c(\n \"ADA interpreted per sample result\",\n \"NAB interpreted per sample result\"\n )),\n as.logical\n )\n ) %>%\n mutate(\n ADABLPFL = ADABLPFL == \"Y\",\n PADABLPFL = if (exists(\"ADA interpreted per sample result\", where = .)) {\n `ADA interpreted per sample result` == \"TRUE\"\n } else {\n FALSE\n },\n PNABBLFL = if (exists(\"NAB interpreted per sample result\", where = .)) {\n `NAB interpreted per sample result` == \"TRUE\"\n } else {\n FALSE\n },\n NNABBLFL = if (exists(\"NAB interpreted per sample result\", where = .)) {\n `NAB interpreted per sample result` == \"FALSE\"\n } else {\n FALSE\n }\n ) %>%\n var_relabel(\n ADABLPFL = \"Baseline evaluable patients for ADA\",\n PADABLPFL = \"Patients with a positive ADA sample at baseline\",\n PNABBLFL = \"Patients with a positive NAb sample at baseline\",\n NNABBLFL = \"Patient with no positive NAb samples at baseline\"\n )\n\n# Post Baseline Treatment Enhanced NAb positive Pts\nadab_pb <- df_explicit_na(adab) %>%\n filter(\n ABLFL != \"Y\",\n ADPBLPFL == \"Y\",\n PARAM %in% c(\n \"ADA interpreted per sample result\",\n \"Treatment Emergent - Positive, Neutralizing Antibody\",\n \"Treatment induced ADA, Neutralizing Antibody\",\n \"Treatment enhanced ADA, Neutralizing Antibody\",\n \"NAB interpreted per sample result\",\n \"Treatment unaffected, Neutralizing Antibody\"\n )\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU, -ARRLT, -NRRLT) %>%\n unique() %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate(\n across(\n any_of(c(\n \"ADA interpreted per sample result\", \"NAB interpreted per sample result\",\n \"Treatment Emergent - Positive, Neutralizing Antibody\",\n \"Treatment induced ADA, Neutralizing Antibody\",\n \"Treatment enhanced ADA, Neutralizing Antibody\",\n \"Treatment unaffected, Neutralizing Antibody\"\n )),\n as.logical\n )\n ) %>%\n mutate(\n ADPBLPFL = ADPBLPFL == \"Y\",\n ADAPFL = if (exists(\"ADA interpreted per sample result\", where = .)) {\n `ADA interpreted per sample result` == \"TRUE\"\n } else {\n FALSE\n },\n TENABPFL = if (exists(\"Treatment Emergent - Positive, Neutralizing Antibody\", where = .)) {\n `Treatment Emergent - Positive, Neutralizing Antibody` == \"TRUE\"\n } else {\n FALSE\n },\n TINPBFL = if (exists(\"Treatment induced ADA, Neutralizing Antibody\", where = .)) {\n `Treatment induced ADA, Neutralizing Antibody` == \"TRUE\"\n } else {\n FALSE\n },\n TENPBFL = if (exists(\"Treatment enhanced ADA, Neutralizing Antibody\", where = .)) {\n `Treatment enhanced ADA, Neutralizing Antibody` == \"TRUE\"\n } else {\n FALSE\n },\n NABNFL = if (exists(\"NAB interpreted per sample result\", where = .)) {\n `NAB interpreted per sample result` == \"FALSE\"\n } else {\n FALSE\n },\n TUNPBFL = if (exists(\"Treatment unaffected, Neutralizing Antibody\", where = .)) {\n `Treatment unaffected, Neutralizing Antibody` == \"TRUE\"\n } else {\n FALSE\n }\n ) %>%\n var_relabel(\n ADPBLPFL = \"Post-baseline evaluable patients for ADA\",\n ADAPFL = \"Patients positive for ADA\",\n TENABPFL = \"Patients positive for Treatment Emergent NAb\",\n TINPBFL = \"Treatment-induced NAb\",\n TENPBFL = \"Treatment-enhanced NAb\",\n NABNFL = \"Patients negative for NAb\",\n TUNPBFL = \"Treatment unaffected\"\n )\n\n\n\n\n\n\nCode# Layout for Baseline Prevalence of NAbs\nlyt_bl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"ADABLPFL\", \"PADABLPFL\"),\n table_names = \"t1\",\n .stats = \"count\",\n var_labels = \"Baseline Prevalence of NAbs\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"PNABBLFL\",\n table_names = \"t2\",\n .indent_mods = 1L\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NNABBLFL\",\n .stats = \"count\",\n table_names = \"t3\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n )\n\n# Layout for incidence of NAbs\nlyt_pb <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"ADPBLPFL\", \"ADAPFL\"),\n .stats = \"count\",\n var_labels = \"Incidence of Treatment Emergent NAbs\",\n show_labels = \"visible\",\n table_names = \"tb1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"TENABPFL\",\n table_names = \"tb2\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"TINPBFL\", \"TENPBFL\"),\n .stats = \"count\",\n table_names = \"tb3\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NABNFL\",\n table_names = \"tb4\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"TUNPBFL\",\n .stats = \"count\",\n table_names = \"tb5\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n )\n\nresult_1 <- build_table(lyt_bl, df = adab_b, alt_counts_df = adsl)\nresult_2 <- build_table(lyt_pb, df = adab_pb, alt_counts_df = adsl)\n\n# Combine tables\nresult <- rbind(result_1, result_2)\n\n# Change the column order\nresult <- cbind_rtables(result[, 1], result[, 3]) %>%\n cbind_rtables(result[, 4]) %>%\n cbind_rtables(result[, 2]) %>%\n cbind_rtables(result[, 5])\n\nmain_title(result) <- paste(\n \"Baseline Prevalence and Incidence of Treatment Emergent NAbs\"\n)\nsubtitles(result) <- paste(\"Protocol:\", unique(adab$PARCAT1)[1])\n\nmain_footer(result) <- \"NAb = Neutralizing Antibodies ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient for ADA = a patient with an ADA assay result from a baseline sample(s)\n Baseline evaluable patient for NAb = a patient with a NAb assay result from a baseline sample(s)\n Post-baseline evaluable patient for ADA = a patient with an ADA assay result from at least one post-baseline sample\n Post-baseline evaluable patient for NAb = a patient with a NAb assay result from at least one post-baseline sample\n Number of patients positive for ADA = the number of post-baseline evaluable patients for ADA determined to have Treatment Emergent ADA during the study period.\nNumber of patients positive for Treatment Emergent NAb = the number (and percentage) of post-baseline evaluable patients for ADA determined to have treatment-induced NAb or treatment-enhanced NAb during the study period.\nTreatment-induced = a patient with negative or missing baseline result(s) and at least one positive post-baseline result. Treatment-enhanced = a patient with positive result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\nNumber of patients negative for Treatment Emergent NAb = number of post-baseline evaluable patients with negative or missing baseline NAb result(s) and all negative post-baseline NAb results, or a patient who is NAb treatment unaffected.\nTreatment unaffected = A post-baseline evaluable patient with a positive result at baseline and (a) where all post-baseline titer results are less than 0.60 t.u. greater than the baseline titer result, OR (b) where all post-baseline results are negative or missing. For any positive sample with titer result less than the minimum reportable titer or any positive sample where a titer cannot be obtained, titer value is imputed as equal to the minimum reportable titer.\"\n\nresult\n\nBaseline Prevalence and Incidence of Treatment Emergent NAbs\nProtocol: A: Drug X Antibody\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X C: Combination <Missing> B: Placebo All Drug X\n (N=134) (N=132) (N=0) (N=134) (N=266) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nBaseline Prevalence of NAbs \n Baseline evaluable patients for ADA 134 132 0 0 266 \n Patients with a positive ADA sample at baseline 63 64 0 0 127 \nPatients with a positive NAb sample at baseline 0 0 0 0 0 \nPatient with no positive NAb samples at baseline 0 0 0 0 0 \nIncidence of Treatment Emergent NAbs \n Post-baseline evaluable patients for ADA 134 132 0 0 266 \n Patients positive for ADA 66 59 0 0 125 \nPatients positive for Treatment Emergent NAb 0 0 0 0 0 \nTreatment-induced NAb 0 0 0 0 0 \nTreatment-enhanced NAb 0 0 0 0 0 \nPatients negative for NAb 0 0 0 0 0 \nTreatment unaffected 0 0 0 0 0 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNAb = Neutralizing Antibodies ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient for ADA = a patient with an ADA assay result from a baseline sample(s)\n Baseline evaluable patient for NAb = a patient with a NAb assay result from a baseline sample(s)\n Post-baseline evaluable patient for ADA = a patient with an ADA assay result from at least one post-baseline sample\n Post-baseline evaluable patient for NAb = a patient with a NAb assay result from at least one post-baseline sample\n Number of patients positive for ADA = the number of post-baseline evaluable patients for ADA determined to have Treatment Emergent ADA during the study period.\nNumber of patients positive for Treatment Emergent NAb = the number (and percentage) of post-baseline evaluable patients for ADA determined to have treatment-induced NAb or treatment-enhanced NAb during the study period.\nTreatment-induced = a patient with negative or missing baseline result(s) and at least one positive post-baseline result. Treatment-enhanced = a patient with positive result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\nNumber of patients negative for Treatment Emergent NAb = number of post-baseline evaluable patients with negative or missing baseline NAb result(s) and all negative post-baseline NAb results, or a patient who is NAb treatment unaffected.\nTreatment unaffected = A post-baseline evaluable patient with a positive result at baseline and (a) where all post-baseline titer results are less than 0.60 t.u. greater than the baseline titer result, OR (b) where all post-baseline results are negative or missing. For any positive sample with titer result less than the minimum reportable titer or any positive sample where a titer cannot be obtained, titer value is imputed as equal to the minimum reportable titer.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:36:34 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tibble_3.2.1 scda_0.1.6.9017 dplyr_1.1.4 \n[4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[7] formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Concomitant Medications", - "CMT01A" + "ADA", + "ADAT04A" ] }, { - "objectID": "tables/concomitant-medications/cmt01b.html", - "href": "tables/concomitant-medications/cmt01b.html", - "title": "CMT01B", + "objectID": "tables/ADA/adat01.html", + "href": "tables/ADA/adat01.html", + "title": "ADAT01", "section": "", - "text": "Data Setup\nStandard Table with > 1 ATC Class Level\nTable Changing Class Levels\nTable with Classes Sorted by Frequency\nTable with Total Number of Treatments per Medication Class Suppressed\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nadcm$CMSEQ <- as.factor(adcm$CMSEQ)\n\nadsl <- df_explicit_na(adsl)\nadcm <- df_explicit_na(adcm)\n\n# Keep only safety-evaluable patients and concomitant medications\nadsl <- adsl %>%\n filter(SAFFL == \"Y\")\n\nadcm <- adcm %>%\n filter(SAFFL == \"Y\" & ATIREL == \"CONCOMITANT\")\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC1\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC1)\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n split_rows_by(\n \"ATC3\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC3)\n ) %>%\n split_rows_by(\n \"ATC4\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC4)\n ) %>%\n append_topleft(\" Other Treatment\") %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adcm,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC1\", \"*\", \"ATC2\", \"*\", \"ATC3\", \"*\", \"ATC4\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 1 Text \n ATC Level 2 Text \n ATC Level 3 Text \n ATC Level 4 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS1 A \n ATCCLAS2 A \n ATCCLAS3 A \n ATCCLAS4 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 A p2 \n ATCCLAS2 A p2 \n ATCCLAS3 A p2 \n ATCCLAS4 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 B \n ATCCLAS2 B \n ATCCLAS3 B \n ATCCLAS4 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS1 B p2 \n ATCCLAS2 B p2 \n ATCCLAS3 B p2 \n ATCCLAS4 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 B p3 \n ATCCLAS2 B p3 \n ATCCLAS3 B p3 \n ATCCLAS4 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 C \n ATCCLAS2 C \n ATCCLAS3 C \n ATCCLAS4 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p2 \n ATCCLAS2 C p2 \n ATCCLAS3 C p2 \n ATCCLAS4 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p3 \n ATCCLAS2 C p3 \n ATCCLAS3 C p3 \n ATCCLAS4 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC3\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC3)\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_topleft(\" Other Treatment\")\n\nresult <- build_table(\n lyt = lyt,\n df = adcm,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC3\", \"*\", \"ATC2\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 3 Text \n ATC Level 2 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS3 A \n ATCCLAS2 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS3 A p2 \n ATCCLAS2 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS3 B \n ATCCLAS2 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS3 B p2 \n ATCCLAS2 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS3 B p3 \n ATCCLAS2 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS3 C \n ATCCLAS2 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS3 C p2 \n ATCCLAS2 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS3 C p3 \n ATCCLAS2 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\n\n\nCode# In progress\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\n \"ATC1\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC1)\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n split_rows_by(\n \"ATC3\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC3)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC4\",\n child_labels = \"visible\",\n nested = TRUE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC4)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_topleft(\" Other Treatment\")\n\nresult <- build_table(\n lyt = lyt,\n df = adcm,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC1\", \"*\", \"ATC2\", \"*\", \"ATC3\", \"*\", \"ATC4\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 1 Text \n ATC Level 2 Text \n ATC Level 3 Text \n ATC Level 4 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————\nATCCLAS1 A \n ATCCLAS2 A \n ATCCLAS3 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n ATCCLAS4 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 A p2 \n ATCCLAS2 A p2 \n ATCCLAS3 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n ATCCLAS4 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 B \n ATCCLAS2 B \n ATCCLAS3 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n ATCCLAS4 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS1 B p2 \n ATCCLAS2 B p2 \n ATCCLAS3 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n ATCCLAS4 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 B p3 \n ATCCLAS2 B p3 \n ATCCLAS3 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n ATCCLAS4 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 C \n ATCCLAS2 C \n ATCCLAS3 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n ATCCLAS4 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p2 \n ATCCLAS2 C p2 \n ATCCLAS3 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n ATCCLAS4 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p3 \n ATCCLAS2 C p3 \n ATCCLAS3 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n ATCCLAS4 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\nadcm_keys <- c(\"STUDYID\", \"USUBJID\", \"ASTDTM\", \"CMSEQ\", \"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADCM <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n ADCM$CMSEQ <- as.integer(ADCM$CMSEQ)\n\n ADSL <- df_explicit_na(ADSL)\n ADCM <- df_explicit_na(ADCM)\n})\ndatanames <- c(\"ADSL\", \"ADCM\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\njoin_keys(data)[\"ADCM\", \"ADCM\"] <- adcm_keys\n\n## Reusable Configuration For Modules\nADCM <- data[[\"ADCM\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_mult_events(\n label = \"Concomitant Medications by Medication Class and Preferred Name\",\n dataname = \"ADCM\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n seq_var = choices_selected(\"CMSEQ\", selected = \"CMSEQ\", fixed = TRUE),\n hlt = choices_selected(\n choices = variable_choices(ADCM, c(\"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")),\n selected = c(\"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")\n ),\n llt = choices_selected(\n choices = variable_choices(ADCM, c(\"CMDECOD\")),\n selected = c(\"CMDECOD\")\n ),\n add_total = FALSE,\n event_type = \"treatment\"\n )\n ),\n filter = teal_slices(\n teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"),\n teal_slice(\"ADCM\", \"ATIREL\", selected = \"CONCOMITANT\")\n )\n)\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:38:54 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\nlibrary(tibble)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\")\n\ncombodf <- tribble(\n ~valname, ~label, ~levelcombo, ~exargs,\n \"all_X\", \"All Drug X\", c(\"A: Drug X\", \"C: Combination\"), list(),\n \"all_pt\", \"All Patients\", c(\"A: Drug X\", \"B: Placebo\", \"C: Combination\"), list()\n)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadab <- adab %>%\n filter(PARCAT1 == \"A: Drug X Antibody\") %>%\n select(-ARRLT, -NRRLT)\n\n# Baseline Pts\nadab_b <- df_explicit_na(adab) %>%\n filter(\n ABLFL == \"Y\",\n ADABLPFL == \"Y\",\n PARAM %in% c(\"ADA interpreted per sample result\")\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU) %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate_at(\n c(\"ADA interpreted per sample result\"),\n as.logical\n ) %>%\n mutate(\n ADABLPFL = ADABLPFL == \"Y\",\n PADABLPFL = `ADA interpreted per sample result` == \"TRUE\",\n NADABLPFL = `ADA interpreted per sample result` == \"FALSE\"\n ) %>%\n var_relabel(\n ADABLPFL = \"Baseline evaluable patients\",\n PADABLPFL = \"Patient with a positive sample at baseline\",\n NADABLPFL = \"Patient with no positive samples at baseline\"\n )\n\n# Post Baseline Treatment Enhanced NAb positive Pts\nadab_pb <- df_explicit_na(adab) %>%\n filter(\n ABLFL != \"Y\",\n ADPBLPFL == \"Y\",\n PARAM %in% c(\n \"ADA interpreted per sample result\",\n \"Treatment Emergent - Positive\",\n \"Treatment induced ADA\",\n \"Treatment enhanced ADA\",\n \"Treatment Emergent - Negative\",\n \"Treatment unaffected\"\n )\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU) %>%\n unique() %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate(\n across(\n any_of(c(\n \"ADA interpreted per sample result\", \"Treatment Emergent - Positive\",\n \"Treatment induced ADA\", \"Treatment enhanced ADA\",\n \"Treatment Emergent - Negative\", \"Treatment unaffected\"\n )),\n as.logical\n )\n ) %>%\n mutate(\n ADPBLPFL = ADPBLPFL == \"Y\",\n PTEFL = if (exists(\"Treatment Emergent - Positive\", where = .)) {\n `Treatment Emergent - Positive` == \"TRUE\"\n } else {\n FALSE\n },\n TIFL = if (exists(\"Treatment induced ADA\", where = .)) {\n `Treatment induced ADA` == \"TRUE\"\n } else {\n FALSE\n },\n TEFL = if (exists(\"Treatment enhanced ADA\", where = .)) {\n `Treatment enhanced ADA` == \"TRUE\"\n } else {\n FALSE\n },\n NTEFL = if (exists(\"Treatment Emergent - Negative\", where = .)) {\n `Treatment Emergent - Negative` == \"TRUE\"\n } else {\n FALSE\n },\n TUFL = if (exists(\"Treatment unaffected\", where = .)) {\n `Treatment unaffected` == \"TRUE\"\n } else {\n FALSE\n }\n ) %>%\n var_relabel(\n ADPBLPFL = \"Post-baseline evaluable patients\",\n PTEFL = \"Patient positive for Treatment Emergent ADA\",\n TIFL = \"Treatment-induced ADA\",\n TEFL = \"Treatment-enhanced ADA\",\n NTEFL = \"Patient negative for Treatment Emergent ADA\",\n TUFL = \"Treatment unaffected\"\n )\n\n\n\n\n\n\nCode# Layout for Baseline Prevalence of NAbs\nlyt_bl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"ADABLPFL\",\n .stats = \"count\",\n var_labels = \"Baseline Prevalence of ADAs\",\n show_labels = \"visible\",\n table_names = \"t1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"PADABLPFL\",\n table_names = \"t2\",\n .indent_mods = 1L,\n var_labels = \"a\",\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NADABLPFL\",\n .stats = \"count\",\n show_labels = \"hidden\",\n .indent_mods = 1L,\n table_names = \"t3\"\n )\n\n# Layout for incidence of NAbs\nlyt_pb <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"ADPBLPFL\",\n .stats = \"count\",\n var_labels = \"Incidence of Treatment Emergent ADAs\",\n show_labels = \"visible\",\n table_names = \"tb1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"PTEFL\",\n table_names = \"tb2\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"TIFL\", \"TEFL\"),\n .stats = \"count\",\n table_names = \"tb3\",\n .indent_mods = 2L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NTEFL\",\n table_names = \"tb4\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"TUFL\",\n .stats = \"count\",\n table_names = \"tb5\",\n .indent_mods = 2L,\n show_labels = \"hidden\"\n )\n\nresult_1 <- build_table(lyt_bl, df = adab_b, alt_counts_df = adsl)\nresult_2 <- build_table(lyt_pb, df = adab_pb, alt_counts_df = adsl)\n\n# Combine tables.\nresult_1@col_info <- result_2@col_info\nresult <- rbind(result_1, result_2)\n\n# Change the column order.\nresult <- cbind_rtables(result[, 1], result[, 3]) %>%\n cbind_rtables(result[, 4]) %>%\n cbind_rtables(result[, 2]) %>%\n cbind_rtables(result[, 5])\n\nmain_title(result) <- paste(\n \"Baseline Prevalence and Incidence of Treatment Emergent ADA\"\n)\n\nmain_footer(result) <- \"ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient = a patient with an ADA assay result from a baseline sample(s)\n Post-baseline evaluable patient = a patient with an ADA assay result from at least one post-baseline sample Number of patients positive for Treatment Emergent\n ADA = the number (and percentage) of post-baseline evaluable patients determined to have treatment-induced ADA or treatment-enhanced ADA during the study period.\n Treatment-induced ADA = a patient with negative or missing baseline ADA result(s) and at least one positive post-baseline ADA result.\n Treatment-enhanced ADA = a patient with positive ADA result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\n Number of patients negative for Treatment Emergent ADA = number of post-baseline evaluable patients with negative or missing baseline ADA result(s) and all negative post-baseline results, or a patient who is treatment unaffected.\n Treatment unaffected = A post-baseline evaluable patient with a positive ADA result at baseline and (a) where all post-baseline titer results are less than 0.60 t.u. greater than the baseline titer result, OR (b) where all post-baseline results are negative or missing.\n For any positive sample with titer result less than the minimum reportable titer or any positive sample where a titer cannot be obtained, titer value is imputed as equal to the minimum reportable titer.\"\n\nresult\n\nBaseline Prevalence and Incidence of Treatment Emergent ADA\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X C: Combination <Missing> B: Placebo All Drug X \n (N=134) (N=132) (N=0) (N=134) (N=266) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nBaseline Prevalence of ADAs \n Baseline evaluable patients 134 132 0 0 266 \nPatient with a positive sample at baseline 63 (47.0%) 64 (48.5%) 0 0 127 (47.7%)\nPatient with no positive samples at baseline 71 68 0 0 139 \nIncidence of Treatment Emergent ADAs \n Post-baseline evaluable patients 134 132 0 0 266 \nPatient positive for Treatment Emergent ADA 0 0 0 0 0 \nTreatment-induced ADA 0 0 0 0 0 \nTreatment-enhanced ADA 0 0 0 0 0 \nPatient negative for Treatment Emergent ADA 0 0 0 0 0 \nTreatment unaffected 0 0 0 0 0 \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient = a patient with an ADA assay result from a baseline sample(s)\n Post-baseline evaluable patient = a patient with an ADA assay result from at least one post-baseline sample Number of patients positive for Treatment Emergent\n ADA = the number (and percentage) of post-baseline evaluable patients determined to have treatment-induced ADA or treatment-enhanced ADA during the study period.\n Treatment-induced ADA = a patient with negative or missing baseline ADA result(s) and at least one positive post-baseline ADA result.\n Treatment-enhanced ADA = a patient with positive ADA result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\n Number of patients negative for Treatment Emergent ADA = number of post-baseline evaluable patients with negative or missing baseline ADA result(s) and all negative post-baseline results, or a patient who is treatment unaffected.\n Treatment unaffected = A post-baseline evaluable patient with a positive ADA result at baseline and (a) where all post-baseline titer results are less than 0.60 t.u. greater than the baseline titer result, OR (b) where all post-baseline results are negative or missing.\n For any positive sample with titer result less than the minimum reportable titer or any positive sample where a titer cannot be obtained, titer value is imputed as equal to the minimum reportable titer.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:36:22 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tibble_3.2.1 scda_0.1.6.9017 dplyr_1.1.4 \n[4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[7] formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Concomitant Medications", - "CMT01B" + "ADA", + "ADAT01" ] }, { - "objectID": "tables/efficacy/dort01.html", - "href": "tables/efficacy/dort01.html", - "title": "DORT01", + "objectID": "tables/ADA/adat04b.html", + "href": "tables/ADA/adat04b.html", + "title": "ADAT04B", "section": "", - "text": "Data Setup\nStandard Table\nTable Selecting Sections to Display\nTable Modifying Analysis Details like Conf. Type and Alpha Level\nTable Modifying Time Point for the “XX Months duration” Analysis\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadtte <- df_explicit_na(adtte)\n\nadtte_f <- adtte %>%\n filter(PARAMCD == \"CRSD\" & BMEASIFL == \"Y\") %>%\n dplyr::mutate(\n AVAL = day2month(AVAL),\n is_event = CNSR == 0,\n is_not_event = CNSR == 1,\n EVNT1 = factor(\n case_when(\n is_event == TRUE ~ \"Responders with subsequent event (%)\",\n is_event == FALSE ~ \"Responders without subsequent event (%)\"\n ),\n levels = c(\"Responders with subsequent event (%)\", \"Responders without subsequent event (%)\")\n ),\n EVNTDESC = factor(EVNTDESC)\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n count_values(\n vars = \"USUBJID\",\n values = unique(adtte$USUBJID),\n .labels = \"Responders\",\n .stats = \"count\"\n ) %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders with subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n show_labels = \"hidden\",\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Responders with subsequent event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 2L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders without subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Duration of response (Months)\",\n is_event = \"is_event\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months duration\",\n is_event = \"is_event\",\n time_point = 12\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table(prune_func = prune_zeros_only)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————\nResponders 68 73 62 \n Responders with subsequent event (%) 46 (67.6%) 39 (53.4%) 32 (51.6%) \n Earliest contributing event \n Death 26 24 16 \n Disease Progression 20 15 16 \n Responders without subsequent event (%) 22 (32.4%) 34 (46.6%) 30 (48.4%) \nDuration of response (Months) \n Median 5.3 6.2 5.3 \n 95% CI (4.6, 5.8) (5.4, 6.3) (4.6, 5.8) \n 25% and 75%-ile 3.8, 6.3 4.6, 6.4 4.0, 6.1 \n Range 0.5 to 6.4 0.9 to 6.5 0.6 to 6.6 \n12 Months duration \n Patients remaining at risk NA NA NA \n Event Free Rate (%) NA NA NA \n 95% CI NA NA NA \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n count_values(\n vars = \"USUBJID\",\n values = unique(adtte$USUBJID),\n .labels = \"Responders\",\n .stats = \"count\"\n ) %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders with subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n show_labels = \"hidden\",\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Responders with subsequent event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 2L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders without subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Duration of response (Months)\",\n is_event = \"is_event\",\n table_names = \"surv_time\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"cox_pair\"\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table(prune_func = prune_zeros_only)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nResponders 68 73 62 \n Responders with subsequent event (%) 46 (67.6%) 39 (53.4%) 32 (51.6%) \n Earliest contributing event \n Death 26 24 16 \n Disease Progression 20 15 16 \n Responders without subsequent event (%) 22 (32.4%) 34 (46.6%) 30 (48.4%) \nDuration of response (Months) \n Median 5.3 6.2 5.3 \n 95% CI (4.6, 5.8) (5.4, 6.3) (4.6, 5.8) \n 25% and 75%-ile 3.8, 6.3 4.6, 6.4 4.0, 6.1 \n Range 0.5 to 6.4 0.9 to 6.5 0.6 to 6.6 \nUnstratified Analysis \n p-value (log-rank) 0.0223 0.6659 \n Hazard Ratio 0.60 0.90 \n 95% CI (0.39, 0.93) (0.57, 1.44) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n count_values(\n vars = \"USUBJID\",\n values = unique(adtte$USUBJID),\n .labels = \"Responders\",\n .stats = \"count\"\n ) %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders with subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n show_labels = \"hidden\",\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Responders with subsequent event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 2L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders without subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Duration of response (Months)\",\n is_event = \"is_event\",\n control = control_surv_time(conf_level = 0.90, conf_type = \"log-log\")\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months duration\",\n is_event = \"is_event\",\n time_point = 12,\n control = control_surv_timepoint(conf_level = 0.975)\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table(prune_func = prune_zeros_only)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————\nResponders 68 73 62 \n Responders with subsequent event (%) 46 (67.6%) 39 (53.4%) 32 (51.6%) \n Earliest contributing event \n Death 26 24 16 \n Disease Progression 20 15 16 \n Responders without subsequent event (%) 22 (32.4%) 34 (46.6%) 30 (48.4%) \nDuration of response (Months) \n Median 5.3 6.2 5.3 \n 90% CI (4.6, 5.8) (5.5, 6.3) (4.6, 5.7) \n 25% and 75%-ile 3.8, 6.3 4.6, 6.4 4.0, 6.1 \n Range 0.5 to 6.4 0.9 to 6.5 0.6 to 6.6 \n12 Months duration \n Patients remaining at risk NA NA NA \n Event Free Rate (%) NA NA NA \n 97.5% CI NA NA NA \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n count_values(\n vars = \"USUBJID\",\n values = unique(adtte$USUBJID),\n .labels = \"Responders\",\n .stats = \"count\"\n ) %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders with subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n show_labels = \"hidden\",\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Responders with subsequent event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 2L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders without subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Duration of response (Months)\",\n is_event = \"is_event\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months duration\",\n is_event = \"is_event\",\n time_point = 6\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table(prune_func = prune_zeros_only)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————\nResponders 68 73 62 \n Responders with subsequent event (%) 46 (67.6%) 39 (53.4%) 32 (51.6%) \n Earliest contributing event \n Death 26 24 16 \n Disease Progression 20 15 16 \n Responders without subsequent event (%) 22 (32.4%) 34 (46.6%) 30 (48.4%) \nDuration of response (Months) \n Median 5.3 6.2 5.3 \n 95% CI (4.6, 5.8) (5.4, 6.3) (4.6, 5.8) \n 25% and 75%-ile 3.8, 6.3 4.6, 6.4 4.0, 6.1 \n Range 0.5 to 6.4 0.9 to 6.5 0.6 to 6.6 \n6 Months duration \n Patients remaining at risk 10 18 7 \n Event Free Rate (%) 33.46 50.23 30.56 \n 95% CI (20.88, 46.05) (36.54, 63.92) (13.56, 47.57)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(tern)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADTTE <- df_explicit_na(ADTTE)\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADTTE <- data[[\"ADTTE\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_tte(\n label = \"Time To Event Table\",\n dataname = \"ADTTE\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADTTE, \"PARAMCD\", \"PARAM\"),\n \"CRSD\"\n ),\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"SEX\", \"BMRKR2\")),\n \"SEX\"\n ),\n time_points = choices_selected(c(6, 8), 6),\n event_desc_var = choices_selected(\n variable_choices(ADTTE, \"EVNTDESC\"),\n \"EVNTDESC\",\n fixed = TRUE\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:38:19 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\nlibrary(tibble)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\")\n\ncombodf <- tribble(\n ~valname, ~label, ~levelcombo, ~exargs,\n \"all_X\", \"All Drug X\", c(\"A: Drug X\", \"C: Combination\"), list(),\n \"all_pt\", \"All Patients\", c(\"A: Drug X\", \"B: Placebo\", \"C: Combination\"), list()\n)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\n# Baseline Pts\nadab_b <- df_explicit_na(adab) %>%\n filter(\n ABLFL == \"Y\",\n ADABLPFL == \"Y\",\n PARAM %in% c(\n \"ADA interpreted per sample result\",\n \"NAB interpreted per sample result\"\n )\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU) %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate(\n across(\n any_of(c(\n \"ADA interpreted per sample result\",\n \"NAB interpreted per sample result\"\n )),\n as.logical\n )\n ) %>%\n mutate(\n ADABLPFL = ADABLPFL == \"Y\",\n PADABLPFL = if (exists(\"ADA interpreted per sample result\", where = .)) {\n `ADA interpreted per sample result` == \"TRUE\"\n } else {\n FALSE\n },\n PNABBLFL = if (exists(\"NAB interpreted per sample result\", where = .)) {\n `NAB interpreted per sample result` == \"TRUE\"\n } else {\n FALSE\n },\n NNABBLFL = if (exists(\"NAB interpreted per sample result\", where = .)) {\n `NAB interpreted per sample result` == \"FALSE\"\n } else {\n FALSE\n }\n ) %>%\n var_relabel(\n ADABLPFL = \"Baseline evaluable patients for ADA\",\n PADABLPFL = \"Patients with a positive ADA sample at baseline\",\n PNABBLFL = \"Patients with a positive NAb sample at baseline\",\n NNABBLFL = \"Patients with no positive NAb sample at baseline\"\n )\n\n# Post-Baseline Evaluable Pts\nadab_pb_ada <- df_explicit_na(adab) %>%\n filter(ADPBLPFL == \"Y\") %>%\n select(STUDYID, USUBJID, ARM, ACTARM, ADPBLPFL) %>%\n mutate(ADPBLPFL = ADPBLPFL == \"Y\") %>%\n distinct()\n\n# Post-Baseline ADA Positive Pts\nadab_pb_adap <- df_explicit_na(adab) %>%\n filter(\n ABLFL != \"Y\",\n PARAM == \"ADA interpreted per sample result\",\n AVALC == \"POSITIVE\"\n ) %>%\n mutate(ADAPFL = AVALC == \"POSITIVE\") %>%\n select(STUDYID, USUBJID, ARM, ACTARM, ADAPFL) %>%\n distinct()\n\n# Post-Baseline NAb Positive Pts\nadab_pb_nabp <- df_explicit_na(adab) %>%\n filter(\n ABLFL != \"Y\",\n PARAM == \"NAb interpreted per sample result\",\n AVALC == \"POSITIVE\"\n ) %>%\n mutate(NABPFL = AVALC == \"POSITIVE\") %>%\n select(STUDYID, USUBJID, ARM, ACTARM, NABPFL) %>%\n distinct()\n\n# Post-Baseline NAb Negative Pts\nadab_pb_nabn <- df_explicit_na(adab) %>%\n filter(\n ABLFL != \"Y\",\n PARAM == \"NAb interpreted per sample result\",\n AVALC == \"NEGATIVE\"\n ) %>%\n rename(NABNFL = AVALC) %>%\n select(STUDYID, USUBJID, ARM, ACTARM, NABNFL) %>%\n distinct()\n\nmergecol <- c(\"STUDYID\", \"USUBJID\", \"ARM\", \"ACTARM\")\n\nadab_pb <- left_join(adab_pb_ada, adab_pb_adap, by = mergecol) %>%\n left_join(adab_pb_nabp, by = mergecol) %>%\n mutate(\n NABNFL = ifelse(is.na(NABPFL), \"TRUE\", \"FALSE\"),\n NABNFL = NABNFL == \"TRUE\"\n ) %>%\n var_relabel(\n ADPBLPFL = \"Post-baseline evaluable patients for ADA\",\n ADAPFL = \"Patients positive for ADA\",\n NABPFL = \"Patients positive for NAb\",\n NABNFL = \"Patients negative for NAb\"\n )\n\n\n\n\n\n\nCode# Layout for Baseline Prevalence of NAbs\nlyt_bl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"ADABLPFL\", \"PADABLPFL\"),\n .stats = \"count\",\n var_labels = \"Baseline Prevalence of NAbs\",\n show_labels = \"visible\",\n table_names = \"t1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"PNABBLFL\",\n table_names = \"t2\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NNABBLFL\",\n .stats = \"count\",\n table_names = \"t3\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n )\n\n# Layout for incidence of NAbs\nlyt_pb <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"ADPBLPFL\", \"ADAPFL\"),\n .stats = \"count\",\n var_labels = \"Incidence of NAbs\",\n show_labels = \"visible\",\n table_names = \"tb1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NABPFL\",\n table_names = \"tb2\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NABNFL\",\n .stats = \"count\",\n table_names = \"tb3\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n )\n\nresult_1 <- build_table(lyt_bl, df = adab_b, alt_counts_df = adsl)\nresult_2 <- build_table(lyt_pb, df = adab_pb, alt_counts_df = adsl)\n\n# Combine tables.\nresult <- rbind(result_1, result_2)\n\n# Change the column order.\nresult <- cbind_rtables(result[, 1], result[, 3]) %>%\n cbind_rtables(result[, 4]) %>%\n cbind_rtables(result[, 2]) %>%\n cbind_rtables(result[, 5])\n\nmain_title(result) <- paste(\n \"Baseline Prevalence and Incidence of Neutralizing Antibodies (NAbs)\"\n)\nsubtitles(result) <- paste(\"Protocol:\", unique(adab$PARCAT1)[1])\n\nmain_footer(result) <- \"NAb = Neutralizing Antibodies ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient for ADA = a patient with an ADA assay result from a baseline sample(s) Baseline evaluable patient for NAb = a patient with a NAb assay result from a baseline sample(s) Post-baseline evaluable patient for ADA = a patient with an ADA assay result from at least one post-baseline sample Post-baseline evaluable patient for NAb = a patient with a NAb assay result from at least one post-baseline sample Number of patients positive for ADA = the number of post-baseline evaluable patients for ADA determined to have Treatment Emergent ADA during the study period.\nNumber of patients positive for NAb = the number (and percentage) of post-baseline evaluable patients for ADA determined to have at least one positive post-baseline NAb result during the study period. Number of patients negative for NAb = number of post-baseline evaluable patients with all negative post-baseline NAb results.\"\n\nresult\n\nBaseline Prevalence and Incidence of Neutralizing Antibodies (NAbs)\nProtocol: A: Drug X Antibody\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X C: Combination <Missing> B: Placebo All Drug X\n (N=134) (N=132) (N=0) (N=134) (N=266) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nBaseline Prevalence of NAbs \n Baseline evaluable patients for ADA 134 132 0 0 266 \n Patients with a positive ADA sample at baseline 63 64 0 0 127 \nPatients with a positive NAb sample at baseline 0 0 0 0 0 \nPatients with no positive NAb sample at baseline 0 0 0 0 0 \nIncidence of NAbs \n Post-baseline evaluable patients for ADA 134 132 0 0 266 \n Patients positive for ADA 66 59 0 0 125 \nPatients positive for NAb 0 0 0 0 0 \nPatients negative for NAb 134 132 0 0 266 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNAb = Neutralizing Antibodies ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient for ADA = a patient with an ADA assay result from a baseline sample(s) Baseline evaluable patient for NAb = a patient with a NAb assay result from a baseline sample(s) Post-baseline evaluable patient for ADA = a patient with an ADA assay result from at least one post-baseline sample Post-baseline evaluable patient for NAb = a patient with a NAb assay result from at least one post-baseline sample Number of patients positive for ADA = the number of post-baseline evaluable patients for ADA determined to have Treatment Emergent ADA during the study period.\nNumber of patients positive for NAb = the number (and percentage) of post-baseline evaluable patients for ADA determined to have at least one positive post-baseline NAb result during the study period. Number of patients negative for NAb = number of post-baseline evaluable patients with all negative post-baseline NAb results.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:36:10 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tibble_3.2.1 scda_0.1.6.9017 dplyr_1.1.4 \n[4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[7] formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Efficacy", - "DORT01" + "ADA", + "ADAT04B" ] }, { - "objectID": "tables/efficacy/rspt01.html", - "href": "tables/efficacy/rspt01.html", - "title": "RSPT01", + "objectID": "listings/lab-results/lbl02a.html", + "href": "listings/lab-results/lbl02a.html", + "title": "LBL02A", "section": "", - "text": "Data Setup\nStandard Table\nTable Selecting Sections to Display\nTable Modifying Analysis Details like Type of Confidence Interval, Alpha Level, Test Statistic\nTable with Stratified Analysis\nTable Modifying the Definition of Overall Response\nTable Defining New Sections to Display\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadrs <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadrs <- df_explicit_na(adrs)\n\nanl_adrs <- adrs %>%\n filter(PARAMCD == \"INVET\") %>%\n select(STUDYID, USUBJID, PARAMCD, AVISIT, AVALC)\nanl_adsl <- adsl %>%\n select(STUDYID, USUBJID, ARM, STRATA1)\n\n\nData pre-processing is done to label the analysis value (AVALC) so as to improve the readability of the output table. In addition, the response is binary defined (is_rsp, responder yes/no) depending on the analysis value. Finally, for comparison purposes, the reference arm is specified.\n\nCode# Pre-Processing\n\nanl <- anl_adsl %>%\n left_join(anl_adrs, by = c(\"STUDYID\", \"USUBJID\")) %>%\n mutate(rsp_lab = d_onco_rsp_label(AVALC)) %>%\n mutate(is_rsp = AVALC %in% c(\"CR\", \"PR\")) %>%\n mutate(ARM = relevel(ARM, ref = \"A: Drug X\")) %>%\n var_relabel(ARM = \"Description of Planned Arm\")\n\n\n\n\nThe tabulation layout is built in layers for the analysis of overall response and applied to the pre-processed dataset.\n\nCodelyt_01 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"is_rsp\",\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"is_rsp\",\n show_labels = \"visible\",\n var_labels = \"Unstratified Analysis\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n table_names = \"test_prop_diff\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n table_names = \"est_or\"\n ) %>%\n estimate_multinomial_response(var = \"rsp_lab\")\n\nresult <- build_table(lyt = lyt_01, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————\nResponders 100 (74.6%) 84 (62.7%) 81 (61.4%) \n95% CI (Wald, with correction) (66.9, 82.4) (54.1, 71.2) (52.7, 70.0) \nUnstratified Analysis \n Difference in Response rate (%) -11.9 -13.3 \n 95% CI (Wald, with correction) (-23.7, -0.2) (-25.1, -1.4) \n p-value (Chi-Squared Test) 0.0351 0.0204 \nOdds Ratio (95% CI) 0.57 (0.34 - 0.96) 0.54 (0.32 - 0.91)\nComplete Response (CR) 60 (44.8%) 47 (35.1%) 57 (43.2%) \n 95% CI (Wald, with correction) (35.98, 53.57) (26.62, 43.53) (34.35, 52.01) \nPartial Response (PR) 40 (29.9%) 37 (27.6%) 24 (18.2%) \n 95% CI (Wald, with correction) (21.73, 37.97) (19.67, 35.55) (11.22, 25.14) \nStable Disease (SD) 9 (6.7%) 22 (16.4%) 13 (9.8%) \n 95% CI (Wald, with correction) (2.11, 11.33) (9.77, 23.06) (4.39, 15.31) \nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 95% CI (Wald, with correction) (11.05, 24.78) (6.08, 17.80) (17.23, 32.77) \nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 95% CI (Wald, with correction) (0.00, 2.58) (3.75, 14.16) (0.15, 7.42) \n\n\n\n\nRemove (or add) rows of results by removing/adding the corresponding layers from the layout. For instance, the odds-ratio row is removed by simply removing the estimate_odds_ratio call:\n\nCodelyt_02 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"is_rsp\",\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"is_rsp\",\n show_labels = \"visible\",\n var_labels = \"Unstratified Analysis\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n table_names = \"test_prop\"\n ) %>%\n estimate_multinomial_response(var = \"rsp_lab\")\n\nresult <- build_table(lyt = lyt_02, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nResponders 100 (74.6%) 84 (62.7%) 81 (61.4%) \n95% CI (Wald, with correction) (66.9, 82.4) (54.1, 71.2) (52.7, 70.0) \nUnstratified Analysis \n Difference in Response rate (%) -11.9 -13.3 \n 95% CI (Wald, with correction) (-23.7, -0.2) (-25.1, -1.4) \n p-value (Chi-Squared Test) 0.0351 0.0204 \nComplete Response (CR) 60 (44.8%) 47 (35.1%) 57 (43.2%) \n 95% CI (Wald, with correction) (35.98, 53.57) (26.62, 43.53) (34.35, 52.01)\nPartial Response (PR) 40 (29.9%) 37 (27.6%) 24 (18.2%) \n 95% CI (Wald, with correction) (21.73, 37.97) (19.67, 35.55) (11.22, 25.14)\nStable Disease (SD) 9 (6.7%) 22 (16.4%) 13 (9.8%) \n 95% CI (Wald, with correction) (2.11, 11.33) (9.77, 23.06) (4.39, 15.31) \nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 95% CI (Wald, with correction) (11.05, 24.78) (6.08, 17.80) (17.23, 32.77)\nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 95% CI (Wald, with correction) (0.00, 2.58) (3.75, 14.16) (0.15, 7.42) \n\n\n\n\nThe confidence level is controlled by the conf_level parameter to the estimation functions. Similarly, the methods for tests and confidence interval can be modified (see ?estimate_proportion_diff).\n\nCodeconf_level <- 0.90\nlyt_03 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"is_rsp\",\n conf_level = conf_level,\n method = \"clopper-pearson\",\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"is_rsp\",\n show_labels = \"visible\",\n var_labels = \"Unstratified Analysis\",\n conf_level = conf_level,\n method = \"ha\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n method = \"fisher\",\n table_names = \"test_prop\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n conf_level = conf_level,\n table_names = \"est_or\"\n ) %>%\n estimate_multinomial_response(\n var = \"rsp_lab\",\n conf_level = conf_level,\n method = \"clopper-pearson\"\n )\n\nresult <- build_table(lyt = lyt_03, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————\nResponders 100 (74.6%) 84 (62.7%) 81 (61.4%) \n90% CI (Clopper-Pearson) (67.7, 80.7) (55.3, 69.7) (53.9, 68.5) \nUnstratified Analysis \n Difference in Response rate (%) -11.9 -13.3 \n 90% CI (Anderson-Hauck) (-21.6, -2.3) (-23.0, -3.5) \n p-value (Fisher's Exact Test) 0.0479 0.0253 \nOdds Ratio (90% CI) 0.57 (0.37 - 0.89) 0.54 (0.35 - 0.84)\nComplete Response (CR) 60 (44.8%) 47 (35.1%) 57 (43.2%) \n 90% CI (Clopper-Pearson) (37.48, 52.25) (28.22, 42.43) (35.88, 50.71) \nPartial Response (PR) 40 (29.9%) 37 (27.6%) 24 (18.2%) \n 90% CI (Clopper-Pearson) (23.36, 37.02) (21.31, 34.67) (12.87, 24.61) \nStable Disease (SD) 9 (6.7%) 22 (16.4%) 13 (9.8%) \n 90% CI (Clopper-Pearson) (3.55, 11.43) (11.38, 22.61) (5.92, 15.20) \nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 90% CI (Clopper-Pearson) (12.67, 24.25) (7.63, 17.57) (18.90, 31.97) \nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 90% CI (Clopper-Pearson) (0.04, 3.49) (5.25, 14.11) (1.50, 7.80) \n\n\n\n\nThe stratified analysis section can be added by defining the analyses needed with control_binary_comparison for the argument strat_analysis and identifying the stratification variables to use.\n\n\nCodestrata <- \"STRATA1\"\nlyt_04 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"is_rsp\",\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"is_rsp\",\n show_labels = \"visible\",\n var_labels = \"Unstratified Analysis\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n table_names = \"test_prop\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n table_names = \"est_or\"\n ) %>%\n estimate_proportion_diff(\n vars = \"is_rsp\",\n show_labels = \"visible\",\n var_labels = \"Stratified Analysis\",\n method = \"cmh\",\n variables = list(strata = strata),\n table_names = \"est_prop_diff_strat\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n method = \"cmh\",\n variables = list(strata = strata),\n table_names = \"test_prop_strat\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n variables = list(strata = strata, arm = \"ARM\"),\n table_names = \"est_or_strat\"\n ) %>%\n estimate_multinomial_response(var = \"rsp_lab\")\n\nresult <- build_table(lyt = lyt_04, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nResponders 100 (74.6%) 84 (62.7%) 81 (61.4%) \n95% CI (Wald, with correction) (66.9, 82.4) (54.1, 71.2) (52.7, 70.0) \nUnstratified Analysis \n Difference in Response rate (%) -11.9 -13.3 \n 95% CI (Wald, with correction) (-23.7, -0.2) (-25.1, -1.4) \n p-value (Chi-Squared Test) 0.0351 0.0204 \nOdds Ratio (95% CI) 0.57 (0.34 - 0.96) 0.54 (0.32 - 0.91)\nStratified Analysis \n Difference in Response rate (%) -11.9 -13.5 \n 95% CI (CMH, without correction) (-22.7, -1.0) (-24.5, -2.5) \n p-value (Cochran-Mantel-Haenszel Test) 0.0366 0.0180 \nOdds Ratio (95% CI) 0.57 (0.34 - 0.96) 0.54 (0.32 - 0.90)\nComplete Response (CR) 60 (44.8%) 47 (35.1%) 57 (43.2%) \n 95% CI (Wald, with correction) (35.98, 53.57) (26.62, 43.53) (34.35, 52.01) \nPartial Response (PR) 40 (29.9%) 37 (27.6%) 24 (18.2%) \n 95% CI (Wald, with correction) (21.73, 37.97) (19.67, 35.55) (11.22, 25.14) \nStable Disease (SD) 9 (6.7%) 22 (16.4%) 13 (9.8%) \n 95% CI (Wald, with correction) (2.11, 11.33) (9.77, 23.06) (4.39, 15.31) \nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 95% CI (Wald, with correction) (11.05, 24.78) (6.08, 17.80) (17.23, 32.77) \nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 95% CI (Wald, with correction) (0.00, 2.58) (3.75, 14.16) (0.15, 7.42) \n\n\n\n\nThe definition of responders is realized during the pre-processing step. The layout does not need to be modified and can be reused.\n\nCodeanl <- anl_adsl %>%\n left_join(anl_adrs, by = c(\"STUDYID\", \"USUBJID\")) %>%\n mutate(rsp_lab = d_onco_rsp_label(AVALC)) %>%\n mutate(is_rsp = AVALC == \"CR\") %>%\n mutate(ARM = relevel(ARM, ref = \"A: Drug X\")) %>%\n var_relabel(ARM = \"Description of Planned Arm\")\n\nresult <- build_table(lyt = lyt_01, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————\nResponders 60 (44.8%) 47 (35.1%) 57 (43.2%) \n95% CI (Wald, with correction) (36.0, 53.6) (26.6, 43.5) (34.4, 52.0) \nUnstratified Analysis \n Difference in Response rate (%) -9.7 -1.6 \n 95% CI (Wald, with correction) (-22.1, 2.7) (-14.3, 11.1) \n p-value (Chi-Squared Test) 0.1049 0.7934 \nOdds Ratio (95% CI) 0.67 (0.41 - 1.09) 0.94 (0.58 - 1.52)\nComplete Response (CR) 60 (44.8%) 47 (35.1%) 57 (43.2%) \n 95% CI (Wald, with correction) (35.98, 53.57) (26.62, 43.53) (34.35, 52.01) \nPartial Response (PR) 40 (29.9%) 37 (27.6%) 24 (18.2%) \n 95% CI (Wald, with correction) (21.73, 37.97) (19.67, 35.55) (11.22, 25.14) \nStable Disease (SD) 9 (6.7%) 22 (16.4%) 13 (9.8%) \n 95% CI (Wald, with correction) (2.11, 11.33) (9.77, 23.06) (4.39, 15.31) \nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 95% CI (Wald, with correction) (11.05, 24.78) (6.08, 17.80) (17.23, 32.77) \nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 95% CI (Wald, with correction) (0.00, 2.58) (3.75, 14.16) (0.15, 7.42) \n\n\n\n\nSimilarly to in the previous tab, redefinition or relabeling of the result is a pre-processing step and the original table layout can be reused.\n\nCodeanl <- anl_adsl %>%\n left_join(anl_adrs, by = c(\"STUDYID\", \"USUBJID\")) %>%\n mutate(rsp_lab = as.character(d_onco_rsp_label(AVALC))) %>%\n mutate(\n rsp_lab = case_when(\n rsp_lab == \"Complete Response (CR)\" ~ \"No Progression\",\n rsp_lab == \"Partial Response (PR)\" ~ \"No Progression\",\n rsp_lab == \"Stable Disease (SD)\" ~ \"No Progression\",\n TRUE ~ rsp_lab\n )\n ) %>%\n mutate(is_rsp = rsp_lab %in% \"No Progression\") %>%\n mutate(ARM = relevel(ARM, ref = \"A: Drug X\")) %>%\n var_relabel(ARM = \"Description of Planned Arm\")\n\nresult <- build_table(lyt = lyt_01, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————\nResponders 109 (81.3%) 106 (79.1%) 94 (71.2%) \n95% CI (Wald, with correction) (74.4, 88.3) (71.8, 86.4) (63.1, 79.3) \nUnstratified Analysis \n Difference in Response rate (%) -2.2 -10.1 \n 95% CI (Wald, with correction) (-12.5, 8.0) (-21.0, 0.8) \n p-value (Chi-Squared Test) 0.6455 0.0520 \nOdds Ratio (95% CI) 0.87 (0.48 - 1.59) 0.57 (0.32 - 1.01)\nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 95% CI (Wald, with correction) (11.05, 24.78) (6.08, 17.80) (17.23, 32.77) \nNo Progression 109 (81.3%) 106 (79.1%) 94 (71.2%) \n 95% CI (Wald, with correction) (74.37, 88.31) (71.85, 86.36) (63.11, 79.31) \nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 95% CI (Wald, with correction) (0.00, 2.58) (3.75, 14.16) (0.15, 7.42) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADRS <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADRS <- df_explicit_na(ADRS)\n\n ADSL <- ADSL %>%\n mutate(Dum_ARM = factor(rep(\"Single ARM\", nrow(.))))\n ADRS <- ADRS %>%\n mutate(Dum_ARM = factor(rep(\"Single ARM\", nrow(.))))\n})\ndatanames <- c(\"ADSL\", \"ADRS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADRS <- data[[\"ADRS\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_binary_outcome(\n label = \"Responders\",\n dataname = \"ADRS\",\n paramcd = choices_selected(\n choices = value_choices(ADRS, \"PARAMCD\", \"PARAM\"),\n selected = \"BESRSPI\"\n ),\n arm_var = choices_selected(\n choices = variable_choices(ADRS, c(\"ARM\", \"ARMCD\", \"ACTARMCD\", \"Dum_ARM\")),\n selected = \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n strata_var = choices_selected(\n choices = variable_choices(ADRS, c(\"SEX\", \"BMRKR2\")),\n select = NULL\n ),\n rsp_table = TRUE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:37:38 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_x <- adlb %>%\n filter(\n ANRIND %in% c(\"LOW\", \"HIGH\"),\n !ATOXGR %in% c(\"0\", \"\"),\n LBTEST != \"\"\n ) %>%\n mutate(\n LBTEST_U = paste0(LBTEST, \" (\", AVALU, \")\"),\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n ADTM = toupper(format(as.Date(ADTM), \"%d%b%Y\")),\n AVAL = format(round(AVAL, 1), nsmall = 1),\n LBNRNG = paste(format(round(ANRLO, 1), nsmall = 1), format(round(ANRHI, 1), nsmall = 1), sep = \" - \"),\n ANRIND_GR = factor(\n case_when(\n ANRIND == \"LOW\" ~ paste0(\"L\", sub(\"-\", \"\", ATOXGR)),\n ANRIND == \"HIGH\" ~ paste0(\"H\", ATOXGR)\n )\n )\n ) %>%\n select(LBTEST_U, TRT01A, CPID, ADY, ADTM, AVAL, ADY, LBNRNG, ANRIND_GR) %>%\n unique() %>%\n arrange(CPID, ADY) %>%\n group_by(LBTEST_U, CPID) %>%\n mutate(DLD = ADY - lag(ADY)) %>%\n ungroup() %>%\n mutate(DLD = ifelse(is.na(DLD), 0, DLD))\n\nout <- adlb_x %>%\n select(LBTEST_U, TRT01A, CPID, ADY, ADTM, DLD, AVAL, LBNRNG, ANRIND_GR)\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n LBTEST_U = \"Lab Test (Unit)\",\n TRT01A = \"Treatment\",\n CPID = \"Center/Patient ID\",\n ADY = \"Study\\nDay\",\n ADTM = \"Date\",\n DLD = \"Days Since\\nLast Dose of\\nStudy Drug\",\n AVAL = \"Result\",\n LBNRNG = \"Lab Normal\\nRange\",\n ANRIND_GR = \"NCI\\nCTCAE\\nGrade\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"LBTEST_U\", \"CPID\"),\n disp_cols = names(out),\n main_title = \"Listing of Laboratory Abnormalities Defined by NCI CTCAE Grade >= 1\",\n main_footer = \"NCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\"\n)\n\nhead(lsting, 20)\n\nListing of Laboratory Abnormalities Defined by NCI CTCAE Grade >= 1\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Days Since NCI \n Study Last Dose of Lab Normal CTCAE\nTreatment Lab Test (Unit) Center/Patient ID Day Date Study Drug Result Range Grade\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X Alanine Aminotransferase Measurement (U/L) BRA-1/id-105 80 27MAY2020 0 4.3 7.0 - 55.0 L4 \n 398 10APR2021 318 3.7 7.0 - 55.0 L3 \n BRA-1/id-93 207 13JAN2021 0 6.1 7.0 - 55.0 L1 \n BRA-11/id-397 326 19MAY2021 0 1.5 7.0 - 55.0 L1 \n BRA-14/id-23 594 22JUN2021 0 0.6 7.0 - 55.0 L1 \n BRA-2/id-296 281 30OCT2021 0 2.6 7.0 - 55.0 L1 \n 734 26JAN2023 453 3.9 7.0 - 55.0 L1 \n CAN-1/id-18 465 12APR2022 0 1.8 7.0 - 55.0 L2 \n CHN-1/id-133 127 13DEC2020 0 5.6 7.0 - 55.0 L2 \n 197 21FEB2021 70 1.2 7.0 - 55.0 L4 \n CHN-1/id-199 277 11OCT2020 0 5.3 7.0 - 55.0 L4 \n 672 10NOV2021 395 6.8 7.0 - 55.0 L2 \n CHN-1/id-235 348 25JUN2020 0 3.0 7.0 - 55.0 L3 \n 381 28JUL2020 33 4.7 7.0 - 55.0 L1 \n CHN-1/id-26 905 07JAN2023 0 1.1 7.0 - 55.0 L1 \n CHN-1/id-275 364 01JUN2021 0 5.1 7.0 - 55.0 L2 \n CHN-1/id-277 483 12MAY2022 0 1.1 7.0 - 55.0 L4 \n CHN-1/id-287 182 23MAY2020 0 5.9 7.0 - 55.0 L2 \n 191 01JUN2020 9 5.3 7.0 - 55.0 L3 \n 515 21APR2021 324 2.9 7.0 - 55.0 L4 \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:36:00 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "RSPT01" + "Listings", + "Lab Results", + "LBL02A" ] }, { - "objectID": "tables/efficacy/rbmit01.html", - "href": "tables/efficacy/rbmit01.html", - "title": "RBMIT01", + "objectID": "listings/lab-results/lbl02b.html", + "href": "listings/lab-results/lbl02b.html", + "title": "LBL02B", "section": "", - "text": "Data Setup\nDraws\nImpute\nAnalyze\nPool\nCreate Output\nReproducibility\n\n\n\nWe use a publicly available example dataset from an antidepressant clinical trial of an active drug versus placebo from the rbmi package. The relevant endpoint is the Hamilton 17-item depression rating scale (HAMD17) which was assessed at baseline and at weeks 1, 2, 4, and 6. Study drug discontinuation occurred in 24% of subjects from the active drug and 26% of subjects from placebo. All data after study drug discontinuation are missing and there is a single additional intermittent missing observation.\n\nCodelibrary(tern.rbmi)\nlibrary(dplyr)\nset.seed(123)\n\ndata <- antidepressant_data\nlevels(data$THERAPY) <- c(\"PLACEBO\", \"DRUG\") # This is important! The order defines the computation order later\n\nmissing_var <- \"CHANGE\"\nvars <- list(\n id = \"PATIENT\",\n visit = \"VISIT\",\n expand_vars = c(\"BASVAL\", \"THERAPY\"),\n group = \"THERAPY\"\n)\ncovariates <- list(\n draws = c(\"BASVAL*VISIT\", \"THERAPY*VISIT\"),\n analyse = c(\"BASVAL\")\n)\n\ndata <- data %>%\n dplyr::select(PATIENT, THERAPY, VISIT, BASVAL, THERAPY, CHANGE) %>%\n dplyr::mutate(dplyr::across(.cols = vars$id, ~ as.factor(.x))) %>%\n dplyr::arrange(dplyr::across(.cols = c(vars$id, vars$visit)))\n\n# Use expand_locf to add rows corresponding to visits with missing outcomes to the dataset\ndata_full <- do.call(\n expand_locf,\n args = list(\n data = data,\n vars = c(vars$expand_vars, vars$group),\n group = vars$id,\n order = c(vars$id, vars$visit)\n ) %>%\n append(lapply(data[c(vars$id, vars$visit)], levels))\n)\n\ndata_full <- data_full %>%\n dplyr::group_by(dplyr::across(vars$id)) %>%\n dplyr::mutate(!!vars$group := Filter(Negate(is.na), .data[[vars$group]])[1])\n\n# there are duplicates - use first value\ndata_full <- data_full %>%\n dplyr::group_by(dplyr::across(c(vars$id, vars$group, vars$visit))) %>%\n dplyr::slice(1) %>%\n dplyr::ungroup()\n# need to have a single ID column\ndata_full <- data_full %>%\n tidyr::unite(\"TMP_ID\", dplyr::all_of(vars$id), sep = \"_#_\", remove = FALSE) %>%\n dplyr::mutate(TMP_ID = as.factor(TMP_ID))\n\n\nCreating Intercurrent Event Data\nSet the imputation strategy to \"MAR\" for each patient with at least one missing observation.\n\nCodedata_ice <- data_full %>%\n dplyr::arrange(dplyr::across(.cols = c(\"TMP_ID\", vars$visit))) %>%\n dplyr::filter(is.na(.data[[missing_var]])) %>%\n dplyr::group_by(TMP_ID) %>%\n dplyr::slice(1) %>%\n dplyr::ungroup() %>%\n dplyr::select(all_of(c(\"TMP_ID\", vars$visit))) %>%\n dplyr::mutate(strategy = \"MAR\")\n\n\n\n\n\nThe rbmi::draws() function fits the imputation models and stores the corresponding parameter estimates or Bayesian posterior parameter draws. The three main inputs to the rbmi::draws() function are:\n\n\ndata - The primary longitudinal data.frame containing the outcome variable and all covariates.\n\ndata_ice - A data.frame which specifies the first visit affected by an intercurrent event (ICE) and the imputation strategy for handling missing outcome data after the ICE. At most one ICE which is to be imputed by a non-MAR strategy is allowed per subject.\n\nmethod - The statistical method used to fit the imputation models and to create imputed datasets.\n\nDefine Key Variables\nDefine the names of key variables in our dataset and the covariates included in the imputation model using rbmi::set_vars(). Note that the covariates argument can also include interaction terms.\n\nCodedebug_mode <- FALSE\n\ndraws_vars <- rbmi::set_vars(\n outcome = missing_var,\n visit = vars$visit,\n group = vars$group,\n covariates = covariates$draws\n)\ndraws_vars$subjid <- \"TMP_ID\"\n\n\nDefine which imputation method to use, then create samples for the imputation parameters by running the draws() function.\n\n\nCodedraws_method <- method_bayes()\n\ndraws_obj <- rbmi::draws(\n data = data_full,\n data_ice = data_ice,\n vars = draws_vars,\n method = draws_method\n)\n\n\nSAMPLING FOR MODEL 'MMRM' NOW (CHAIN 1).\nChain 1: \nChain 1: Gradient evaluation took 0.000348 seconds\nChain 1: 1000 transitions using 10 leapfrog steps per transition would take 3.48 seconds.\nChain 1: Adjust your expectations accordingly!\nChain 1: \nChain 1: \nChain 1: Iteration: 1 / 1200 [ 0%] (Warmup)\nChain 1: Iteration: 120 / 1200 [ 10%] (Warmup)\nChain 1: Iteration: 201 / 1200 [ 16%] (Sampling)\nChain 1: Iteration: 320 / 1200 [ 26%] (Sampling)\nChain 1: Iteration: 440 / 1200 [ 36%] (Sampling)\nChain 1: Iteration: 560 / 1200 [ 46%] (Sampling)\nChain 1: Iteration: 680 / 1200 [ 56%] (Sampling)\nChain 1: Iteration: 800 / 1200 [ 66%] (Sampling)\nChain 1: Iteration: 920 / 1200 [ 76%] (Sampling)\nChain 1: Iteration: 1040 / 1200 [ 86%] (Sampling)\nChain 1: Iteration: 1160 / 1200 [ 96%] (Sampling)\nChain 1: Iteration: 1200 / 1200 [100%] (Sampling)\nChain 1: \nChain 1: Elapsed Time: 0.555 seconds (Warm-up)\nChain 1: 1.764 seconds (Sampling)\nChain 1: 2.319 seconds (Total)\nChain 1: \n\n\n\n\n\nThe next step is to use the parameters from the imputation model to generate the imputed datasets. This is done via the rbmi::impute() function. The function only has two key inputs: the imputation model output from rbmi::draws() and the reference groups relevant to reference-based imputation methods. It’s usage is thus:\n\nCodeimpute_references <- c(\"DRUG\" = \"PLACEBO\", \"PLACEBO\" = \"PLACEBO\")\n\nimpute_obj <- rbmi::impute(\n draws_obj,\n references = impute_references\n)\n\n\n\n\nThe next step is to run the analysis model on each imputed dataset. This is done by defining an analysis function and then calling rbmi::analyse() to apply this function to each imputed dataset.\n\n\nCode# Define analysis model\nanalyse_fun <- ancova\n\nref_levels <- levels(impute_obj$data$group[[1]])\nnames(ref_levels) <- c(\"ref\", \"alt\")\n\nanalyse_obj <- rbmi::analyse(\n imputations = impute_obj,\n fun = analyse_fun,\n vars = rbmi::set_vars(\n subjid = \"TMP_ID\",\n outcome = missing_var,\n visit = vars$visit,\n group = vars$group,\n covariates = covariates$analyse\n )\n)\n\n\n\n\nThe rbmi::pool() function can be used to summarize the analysis results across multiple imputed datasets to provide an overall statistic with a standard error, confidence intervals and a p-value for the hypothesis test of the null hypothesis that the effect is equal to 0. Using the broom::tidy() function the rbmi final results are reshaped.\n\n\nCodelibrary(broom)\n\npool_obj <- rbmi::pool(\n results = analyse_obj,\n conf.level = 0.95,\n alternative = c(\"two.sided\", \"less\", \"greater\"),\n type = c(\"percentile\", \"normal\")\n)\n\ndf <- tidy(pool_obj)\ndf\n\n group est se_est lower_cl_est upper_cl_est est_contr se_contr\n1 ref -1.615820 0.4862316 -2.575771 -0.6558685 NA NA\n2 alt -1.707626 0.4749573 -2.645319 -0.7699335 -0.09180645 0.6826279\n3 ref -4.250814 0.6466452 -5.527714 -2.9739143 NA NA\n4 alt -2.804837 0.6438255 -4.076779 -1.5328939 1.44597772 0.9136660\n5 ref -6.365807 0.7214451 -7.792725 -4.9388895 NA NA\n6 alt -4.095430 0.6958248 -5.470969 -2.7198908 2.27037720 0.9961376\n7 ref -7.688935 0.7965136 -9.265897 -6.1119740 NA NA\n8 alt -4.775673 0.7516059 -6.261450 -3.2898970 2.91326216 1.0733820\n lower_cl_contr upper_cl_contr p_value relative_reduc visit conf_level\n1 NA NA NA NA 4 0.95\n2 -1.4394968 1.255884 0.893177243 0.05681725 4 0.95\n3 NA NA NA NA 5 0.95\n4 -0.3584507 3.250406 0.115488900 -0.34016488 5 0.95\n5 NA NA NA NA 6 0.95\n6 0.3014522 4.239302 0.024124977 -0.35665190 6 0.95\n7 NA NA NA NA 7 0.95\n8 0.7918874 5.034637 0.007446276 -0.37889019 7 0.95\n\n\n\n\nFinally, use functions from the rtables and tern packages to generate a nicely formatted rtable object.\n\nCoderesult <- basic_table() %>%\n split_cols_by(\"group\", ref_group = levels(df$group)[1]) %>%\n split_rows_by(\"visit\", split_label = \"Visit\", label_pos = \"topleft\") %>%\n summarize_rbmi() %>%\n build_table(df)\nresult\n\nVisit ref alt \n—————————————————————————————————————————————————————————————————————————\n4 \n Adjusted Mean (SE) -1.616 (0.486) -1.708 (0.475) \n 95% CI (-2.576, -0.656) (-2.645, -0.770)\n Difference in Adjusted Means (SE) -0.092 (0.683) \n 95% CI (-1.439, 1.256) \n Relative Reduction (%) 5.7% \n p-value (RBMI) 0.8932 \n5 \n Adjusted Mean (SE) -4.251 (0.647) -2.805 (0.644) \n 95% CI (-5.528, -2.974) (-4.077, -1.533)\n Difference in Adjusted Means (SE) 1.446 (0.914) \n 95% CI (-0.358, 3.250) \n Relative Reduction (%) -34.0% \n p-value (RBMI) 0.1155 \n6 \n Adjusted Mean (SE) -6.366 (0.721) -4.095 (0.696) \n 95% CI (-7.793, -4.939) (-5.471, -2.720)\n Difference in Adjusted Means (SE) 2.270 (0.996) \n 95% CI (0.301, 4.239) \n Relative Reduction (%) -35.7% \n p-value (RBMI) 0.0241 \n7 \n Adjusted Mean (SE) -7.689 (0.797) -4.776 (0.752) \n 95% CI (-9.266, -6.112) (-6.261, -3.290)\n Difference in Adjusted Means (SE) 2.913 (1.073) \n 95% CI (0.792, 5.035) \n Relative Reduction (%) -37.9% \n p-value (RBMI) 0.0074 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:37:02 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] broom_1.0.5 dplyr_1.1.4 tern.rbmi_0.1.2.9013 \n[4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[7] formatters_0.5.5.9016 rbmi_1.2.6 \n\nloaded via a namespace (and not attached):\n [1] gtable_0.3.4 TMB_1.9.10 xfun_0.42 ggplot2_3.5.0 \n [5] QuickJSR_1.1.3 htmlwidgets_1.6.4 inline_0.3.19 lattice_0.22-6 \n [9] vctrs_0.6.5 tools_4.3.3 Rdpack_2.6 generics_0.1.3 \n[13] stats4_4.3.3 curl_5.2.1 parallel_4.3.3 tibble_3.2.1 \n[17] mmrm_0.3.11 fansi_1.0.6 pkgconfig_2.0.3 Matrix_1.6-5 \n[21] checkmate_2.3.1 RcppParallel_5.1.7 assertthat_0.2.1 lifecycle_1.0.4 \n[25] compiler_4.3.3 stringr_1.5.1 brio_1.1.4 munsell_0.5.0 \n[29] codetools_0.2-19 htmltools_0.5.7 yaml_2.3.8 pillar_1.9.0 \n[33] tidyr_1.3.1 StanHeaders_2.32.6 nlme_3.1-164 rstan_2.32.6 \n[37] tidyselect_1.2.1 digest_0.6.35 stringi_1.8.3 purrr_1.0.2 \n[41] splines_4.3.3 fastmap_1.1.1 grid_4.3.3 colorspace_2.1-0 \n[45] cli_3.6.2 loo_2.7.0 survival_3.5-8 pkgbuild_1.4.4 \n[49] utf8_1.2.4 withr_3.0.0 scales_1.3.0 backports_1.4.1 \n[53] rmarkdown_2.26 matrixStats_1.2.0 gridExtra_2.3 evaluate_0.23 \n[57] knitr_1.45 rbibutils_2.2.16 testthat_3.2.1 V8_4.4.2 \n[61] rlang_1.1.3 Rcpp_1.0.12 glue_1.7.0 jsonlite_1.8.8 \n[65] R6_2.5.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_x <- adlb %>%\n filter(\n !sub(\"-\", \"\", ATOXGR) %in% c(\"\", \"0\", \"1\"),\n LBTEST != \"\",\n !is.na(ADY),\n !ANRIND %in% c(\"\", \"NORMAL\")\n ) %>%\n mutate(\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n ADTM = toupper(format(as.Date(ADTM), \"%d%b%Y\")),\n AVAL = format(round(AVAL, 1), nsmall = 1),\n LBNRNG = paste(format(round(ANRLO, 1), nsmall = 1), format(round(ANRHI, 1), nsmall = 1), sep = \" - \"),\n ANRIND_GR = factor(\n case_when(\n ANRIND == \"LOW\" ~ paste0(\"L\", sub(\"-\", \"\", ATOXGR)),\n ANRIND == \"HIGH\" ~ paste0(\"H\", ATOXGR)\n )\n )\n ) %>%\n select(LBTEST, TRT01A, CPID, ADY, ADTM, AVAL, AVALU, LBNRNG, ANRIND_GR) %>%\n unique() %>%\n arrange(CPID, ADY) %>%\n group_by(LBTEST, CPID) %>%\n mutate(DLD = ADY - lag(ADY)) %>%\n ungroup() %>%\n mutate(DLD = ifelse(is.na(DLD), 0, DLD))\n\nout <- adlb_x %>%\n select(LBTEST, TRT01A, CPID, ADY, ADTM, DLD, AVAL, AVALU, LBNRNG, ANRIND_GR)\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n LBTEST = \"Lab Test\",\n TRT01A = \"Treatment\",\n CPID = \"Center/Patient ID\",\n ADY = \"Study\\nDay\",\n ADTM = \"Date\",\n DLD = \"Days Since\\nLast Dose of\\nStudy Drug\",\n AVAL = \"Result\",\n AVALU = \"Unit\",\n LBNRNG = \"Lab Normal\\nRange\",\n ANRIND_GR = \"NCI\\nCTCAE\\nGrade\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"LBTEST\", \"CPID\"),\n disp_cols = names(out),\n main_title = \"Listing of Laboratory Abnormalities Defined by NCI CTCAE Grade >= 2\",\n main_footer = \"NCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\"\n)\n\nhead(lsting, 20)\n\nListing of Laboratory Abnormalities Defined by NCI CTCAE Grade >= 2\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Days Since NCI \n Study Last Dose of Lab Normal CTCAE\nTreatment Lab Test Center/Patient ID Day Date Study Drug Result Unit Range Grade\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X Alanine Aminotransferase Measurement BRA-1/id-105 80 27MAY2020 0 4.3 U/L 7.0 - 55.0 L4 \n 398 10APR2021 318 3.7 U/L 7.0 - 55.0 L3 \n CAN-1/id-18 465 12APR2022 0 1.8 U/L 7.0 - 55.0 L2 \n CHN-1/id-133 127 13DEC2020 0 5.6 U/L 7.0 - 55.0 L2 \n 197 21FEB2021 70 1.2 U/L 7.0 - 55.0 L4 \n CHN-1/id-199 277 11OCT2020 0 5.3 U/L 7.0 - 55.0 L4 \n 672 10NOV2021 395 6.8 U/L 7.0 - 55.0 L2 \n CHN-1/id-235 348 25JUN2020 0 3.0 U/L 7.0 - 55.0 L3 \n CHN-1/id-275 364 01JUN2021 0 5.1 U/L 7.0 - 55.0 L2 \n CHN-1/id-277 483 12MAY2022 0 1.1 U/L 7.0 - 55.0 L4 \n CHN-1/id-287 182 23MAY2020 0 5.9 U/L 7.0 - 55.0 L2 \n 191 01JUN2020 9 5.3 U/L 7.0 - 55.0 L3 \n 515 21APR2021 324 2.9 U/L 7.0 - 55.0 L4 \n CHN-1/id-315 289 05JUN2020 0 4.6 U/L 7.0 - 55.0 L4 \n 599 11APR2021 310 5.2 U/L 7.0 - 55.0 L4 \n CHN-1/id-316 971 14MAY2023 0 3.6 U/L 7.0 - 55.0 L4 \n CHN-1/id-360 689 01APR2022 0 4.7 U/L 7.0 - 55.0 L2 \n CHN-1/id-371 81 01MAY2021 0 5.9 U/L 7.0 - 55.0 L2 \n CHN-1/id-47 236 11SEP2020 0 4.4 U/L 7.0 - 55.0 L3 \n CHN-1/id-53 98 13FEB2020 0 6.4 U/L 7.0 - 55.0 L2 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:53 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "RBMIT01" + "Listings", + "Lab Results", + "LBL02B" ] }, { - "objectID": "tables/efficacy/aovt02.html", - "href": "tables/efficacy/aovt02.html", - "title": "AOVT02", + "objectID": "listings/lab-results/lbl02a_rls.html", + "href": "listings/lab-results/lbl02a_rls.html", + "title": "LBL02A_RLS", "section": "", - "text": "This example will focus on data from a single visit “WEEK 1 DAY 8” and a single endpoint “FKSI-FWB”. Only evaluable populations will be analyzed.\n\n\nData Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadqs <- df_explicit_na(adqs)\n\nadqs_single <- adqs %>%\n filter(\n AVISIT == \"WEEK 1 DAY 8\",\n PARAMCD == \"FKSI-FWB\"\n ) %>%\n mutate(CHG = ifelse(BMEASIFL == \"Y\", CHG, NA))\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\", ref_group = \"ARM A\") %>%\n append_varlabels(adqs_single, \"PARAM\") %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(arm = \"ARMCD\", covariates = NULL),\n conf_level = 0.95,\n var_labels = \"Unadjusted comparison\",\n .labels = c(lsmean = \"Mean\", lsmean_diff = \"Difference in Means\"),\n table_names = \"unadjusted\"\n ) %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(arm = \"ARMCD\", covariates = c(\"BASE\", \"STRATA1\")),\n conf_level = 0.95,\n var_labels = \"Adjusted comparison (covariates BASE and STRATA1)\",\n table_names = \"adjusted\"\n )\n\nresult <- build_table(\n lyt = lyt,\n df = adqs_single,\n alt_counts_df = adsl\n)\n\nresult\n\n ARM A ARM B ARM C \nParameter (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————\nUnadjusted comparison \n n 68 73 62 \n Mean 3.68 5.07 3.09 \n Difference in Means 1.38 -0.59 \n 95% CI (-2.76, 5.53) (-4.91, 3.73)\n p-value 0.5113 0.7873 \nAdjusted comparison (covariates BASE and STRATA1) \n n 68 73 62 \n Adjusted Mean 4.06 3.57 3.34 \n Difference in Adjusted Means -0.49 -0.72 \n 95% CI (-3.28, 2.29) (-3.57, 2.12)\n p-value 0.7277 0.6165 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADQS <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADQS <- df_explicit_na(ADQS)\n})\ndatanames <- c(\"ADSL\", \"ADQS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADQS <- data[[\"ADQS\"]]\narm_ref_comp <- list(\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n ),\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_ancova(\n label = \"ANCOVA table\",\n dataname = \"ADQS\",\n avisit = choices_selected(\n choices = value_choices(ADQS, \"AVISIT\"),\n selected = \"WEEK 1 DAY 8\"\n ),\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ACTARMCD\")),\n selected = \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n aval_var = choices_selected(\n choices = variable_choices(ADQS, c(\"CHG\", \"AVAL\")),\n selected = \"CHG\"\n ),\n cov_var = choices_selected(\n choices = variable_choices(ADQS, c(\"BASE\", \"STRATA1\", \"SEX\")),\n selected = \"STRATA1\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADQS, \"PARAMCD\", \"PARAM\"),\n selected = \"FKSI-FWB\"\n )\n )\n )\n)\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:36:36 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_x <- adlb %>%\n filter(\n LBTEST != \"\"\n ) %>%\n mutate(\n LBTEST_U = paste0(LBTEST, \" (\", AVALU, \")\"),\n CPID = paste(SITEID, SUBJID, sep = \"/\")\n ) %>%\n mutate(CRC = paste(\"40%\", \"40%\", sep = \" / \"))\n\nstd_rng <- adlb_x %>%\n group_by(LBTEST_U) %>%\n summarise(\n STD_RNG_LO = stats::quantile(AVAL, probs = c(0.1), na.rm = TRUE),\n STD_RNG_HI = stats::quantile(AVAL, probs = c(0.9), na.rm = TRUE)\n ) %>%\n ungroup()\n\nadlb_x <- adlb_x %>%\n left_join(std_rng, by = \"LBTEST_U\") %>%\n mutate(\n AVAL = format(round(AVAL, 1), nsmall = 1),\n PCHG = format(round(PCHG, 1), nsmall = 1),\n LBNRNG = paste(ANRLO, ANRHI, sep = \" - \"),\n STD_RNG_LO = format(round(STD_RNG_LO, 1), nsmall = 1),\n STD_RNG_HI = format(round(STD_RNG_HI, 1), nsmall = 1)\n ) %>%\n mutate(\n STD_RNG = paste(STD_RNG_LO, STD_RNG_HI, sep = \" - \"),\n ANRIND = factor(case_when(\n ANRIND == \"LOW\" & AVAL > STD_RNG_LO ~ \"L\",\n ANRIND == \"HIGH\" & AVAL < STD_RNG_HI ~ \"H\",\n ANRIND == \"LOW\" & AVAL <= STD_RNG_LO ~ \"LL\",\n ANRIND == \"HIGH\" & AVAL >= STD_RNG_HI ~ \"HH\",\n TRUE ~ \"\"\n ))\n ) %>%\n select(LBTEST_U, TRT01A, CPID, ADY, AVAL, PCHG, STD_RNG, LBNRNG, CRC, ANRIND) %>%\n unique() %>%\n arrange(CPID, ADY) %>%\n group_by(LBTEST_U, CPID) %>%\n mutate(DLD = ADY - lag(ADY)) %>%\n ungroup() %>%\n mutate(DLD = ifelse(is.na(DLD), 0, DLD))\n\nout <- adlb_x %>%\n select(LBTEST_U, TRT01A, CPID, ADY, DLD, AVAL, PCHG, STD_RNG, LBNRNG, CRC, ANRIND)\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n LBTEST_U = \"Lab Test (Unit)\",\n TRT01A = \"Treatment\",\n CPID = \"Center/Patient ID\",\n ADY = \"Study\\nDay\",\n DLD = \"Days Since\\nLast Dose of\\nStudy Drug\",\n AVAL = \"Result\",\n PCHG = \"% Change\\nfrom\\nBaseline\",\n STD_RNG = \"Standard\\nReference\\nRange\",\n LBNRNG = \"Marked\\nReference\\nRange\",\n CRC = \"Clinically\\nRelevant\\nChange\\nDec./Inc.\",\n ANRIND = \"Abnormality\\nFlag\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"LBTEST_U\", \"CPID\"),\n disp_cols = names(out),\n main_title = \"Listing of Laboratory Abnormalities Defined by Roche Safety Lab Standardization\",\n main_footer = \"Standard reference range, marked reference range and clinically relevant change from baseline are from the Roche Safety Lab Standardization guideline. Abnormalities are flagged as high (H) or low (L) if outside the standard reference range; high high (HH) or low low (LL) if outside the marked reference range with a clinically relevant change from baseline.\" \n)\n\nhead(lsting, 20)\n\nListing of Laboratory Abnormalities Defined by Roche Safety Lab Standardization\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Clinically \n Days Since % Change Standard Marked Relevant \n Study Last Dose of from Reference Reference Change Abnormality\nTreatment Lab Test (Unit) Center/Patient ID Day Study Drug Result Baseline Range Range Dec./Inc. Flag \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X Alanine Aminotransferase Measurement (U/L) BRA-1/id-105 80 0 4.3 NA 5.5 - 31.1 7 - 55 40% / 40% LL \n 149 69 24.7 0.0 5.5 - 31.1 7 - 55 40% / 40% \n 314 165 24.9 0.7 5.5 - 31.1 7 - 55 40% / 40% \n 398 84 3.7 -85.2 5.5 - 31.1 7 - 55 40% / 40% LL \n 470 72 18.5 -24.9 5.5 - 31.1 7 - 55 40% / 40% \n 528 58 7.7 -68.7 5.5 - 31.1 7 - 55 40% / 40% \n 535 7 23.5 -4.8 5.5 - 31.1 7 - 55 40% / 40% \n BRA-1/id-134 225 0 7.4 NA 5.5 - 31.1 7 - 55 40% / 40% \n 227 2 16.4 0.0 5.5 - 31.1 7 - 55 40% / 40% \n 255 28 11.2 -32.0 5.5 - 31.1 7 - 55 40% / 40% \n 269 14 15.9 -3.2 5.5 - 31.1 7 - 55 40% / 40% \n 357 88 24.4 48.3 5.5 - 31.1 7 - 55 40% / 40% \n 436 79 16.0 -2.4 5.5 - 31.1 7 - 55 40% / 40% \n 440 4 17.2 4.8 5.5 - 31.1 7 - 55 40% / 40% \n BRA-1/id-42 176 0 16.6 NA 5.5 - 31.1 7 - 55 40% / 40% \n 477 301 16.5 0.0 5.5 - 31.1 7 - 55 40% / 40% \n 534 57 18.7 13.4 5.5 - 31.1 7 - 55 40% / 40% \n 550 16 11.4 -30.6 5.5 - 31.1 7 - 55 40% / 40% \n 569 19 21.7 31.3 5.5 - 31.1 7 - 55 40% / 40% \n 608 39 24.6 49.2 5.5 - 31.1 7 - 55 40% / 40% \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nStandard reference range, marked reference range and clinically relevant change from baseline are from the Roche Safety Lab Standardization guideline. Abnormalities are flagged as high (H) or low (L) if outside the standard reference range; high high (HH) or low low (LL) if outside the marked reference range with a clinically relevant change from baseline.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:45 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "AOVT02" + "Listings", + "Lab Results", + "LBL02A_RLS" ] }, { - "objectID": "tables/efficacy/coxt02.html", - "href": "tables/efficacy/coxt02.html", - "title": "COXT02", + "objectID": "listings/concomitant-medications/cml02b_gl.html", + "href": "listings/concomitant-medications/cml02b_gl.html", + "title": "CML02B_GL", "section": "", - "text": "Analysis based on multivariable Cox models is usually not performed for the Clinical Study Report (CSR) or regulatory documents, serving exploratory purposes only (e.g. for publication). In practice, the model usually includes only the main effects (without interaction terms). It produces the estimates for each of the covariates included in the model. The analysis follows the same principles (i.e. stratified vs. unstratified analysis and tie handling) as the general Cox model analysis also used in COXT01. Since there is usually no pre-specified hypothesis testing for such analysis, the p-values must be interpreted with caution.\n\n\nData Setup\nMultivariable Cox Regression\nMultivariable Cox Regression with Interaction Term\nMultivariable Cox Regression Specifying Covariates\nMultivariable Cox Regression Specifying Covariates from ADSUB\nMultivariable Cox Regression Setting Strata, Ties, Alpha Level, Statistics\nMultivariable Cox Regression with Selection Process for Covariates\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\nlibrary(broom)\n\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadtte <- df_explicit_na(adtte)\n\nanl <- adtte %>%\n filter(\n PARAMCD == \"OS\",\n SEX %in% c(\"F\", \"M\"),\n RACE %in% c(\"ASIAN\", \"BLACK OR AFRICAN AMERICAN\", \"WHITE\")\n ) %>%\n mutate(\n ARM = droplevels(relevel(ARM, \"B: Placebo\")),\n SEX = droplevels(SEX),\n RACE = droplevels(RACE)\n ) %>%\n mutate(EVENT = 1 - CNSR) %>%\n var_relabel(\n ARM = \"Planned Arm\",\n SEX = \"Sex\",\n RACE = \"Race\",\n AGE = \"Age\"\n )\n\n\n\n\nThe summarize_coxreg function fits, tidies and arranges a Cox regression model in a table layout using the rtables framework. For a multivariable Cox regression model, argument multivar must be set to TRUE. Arguments variables and control can be specified to set up the model (see ?summarize_coxreg for more details and customization options). All variables specified within variables must be present in the data used when building the table.\nTo see the same model as a data.frame object, these two arguments (as well as the data) can be passed to the fit_coxreg_multivar function, and the resulting list tidied using broom::tidy().\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARM\",\n covariates = c(\"SEX\", \"AGE\")\n)\n\nlyt <- basic_table() %>%\n summarize_coxreg(variables = variables, multivar = TRUE) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\nEffect/Covariate Included in the Model Hazard Ratio 95% CI p-value\n——————————————————————————————————————————————————————————————————————————————\nTreatment: \n Planned Arm (reference = B: Placebo) 0.2643 \n A: Drug X 0.96 (0.66, 1.42) 0.8536 \n C: Combination 1.27 (0.88, 1.83) 0.2010 \nCovariate: \n Sex (reference = F) \n M 1.09 (0.80, 1.48) 0.5987 \n Age \n All 0.99 (0.97, 1.01) 0.5104 \n\n\n\n\nThe estimation of interaction terms is not supported.\nInteraction terms are not included in the GDSR. For this reason and because we must take precautions when fitting such models, this functionality has not been translated in fit_coxreg_multivar. Please remove interaction terms or, if required by the study, refer to the survival::coxph function. Aside from this, using tern the developer must add the necessary variables to the analysis dataset during pre-processing based on ADVS or ADSUB. An example can be found in DMT01.\n\n\nThis option is not supported.\nSee the Multivariable Cox Regression with Interaction Term tab for more details.\n\n\nThis option is not supported.\nSee the Multivariable Cox Regression with Interaction Term tab for more details.\n\n\nAdditional controls can be customized using control_coxreg (see ?control_coxreg) such as the ties calculation method and the confidence level. Stratification variables can be added via the strata element of the variables list.\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARMCD\",\n covariates = c(\"SEX\", \"AGE\"),\n strata = \"RACE\"\n)\n\ncontrol <- control_coxreg(\n conf_level = 0.9,\n ties = \"efron\"\n)\n\nlyt <- basic_table() %>%\n summarize_coxreg(\n variables = variables,\n control = control,\n multivar = TRUE,\n .stats = c(\"hr\", \"ci\")\n ) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\nEffect/Covariate Included in the Model Hazard Ratio 90% CI \n————————————————————————————————————————————————————————————————————\nTreatment: \n Planned Arm Code (reference = ARM A) \n ARM B 1.03 (0.74, 1.42)\n ARM C 1.30 (0.96, 1.77)\nCovariate: \n Sex (reference = F) \n M 1.08 (0.83, 1.40)\n Age \n All 0.99 (0.98, 1.01)\n\n\n\n\nSee the Multivariable Cox Regression with Interaction Term tab.\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADTTE <- data[[\"ADTTE\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_coxreg(\n label = \"Cox Reg.\",\n dataname = \"ADTTE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\", \"ACTARMCD\"), \"ARM\"),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADTTE, \"PARAMCD\", \"PARAM\"), \"OS\"\n ),\n strata_var = choices_selected(\n c(\"SEX\", \"STRATA1\", \"STRATA2\"), NULL\n ),\n cov_var = choices_selected(\n c(\"AGE\", \"SEX\", \"RACE\"), c(\"AGE\", \"SEX\")\n ),\n multivariate = TRUE\n )\n )\n)\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:36:01 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 broom_1.0.5 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 stringr_1.5.1 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 utf8_1.2.4 \n[19] promises_1.2.1 rmarkdown_2.26 ps_1.7.6 \n[22] purrr_1.0.2 xfun_0.42 shinyvalidate_0.1.3 \n[25] cachem_1.0.8 teal.reporter_0.3.1.9002 jsonlite_1.8.8 \n[28] later_1.3.2 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 car_3.1-2 brio_1.1.4 \n[34] jquerylib_0.1.4 estimability_1.5 Rcpp_1.0.12 \n[37] knitr_1.45 zoo_1.8-12 teal.logger_0.2.0.9001 \n[40] httpuv_1.6.14 Matrix_1.6-5 splines_4.3.3 \n[43] tidyselect_1.2.1 abind_1.4-5 yaml_2.3.8 \n[46] codetools_0.2-19 websocket_1.4.1 processx_3.8.4 \n[49] teal.widgets_0.4.2.9009 lattice_0.22-6 tibble_3.2.1 \n[52] withr_3.0.0 coda_0.19-4.1 evaluate_0.23 \n[55] survival_3.5-8 pillar_1.9.0 shinycssloaders_1.0.0 \n[58] carData_3.0-5 checkmate_2.3.1 shinyjs_2.1.0 \n[61] generics_0.1.3 chromote_0.2.0 ggplot2_3.5.0 \n[64] munsell_0.5.0 scales_1.3.0 xtable_1.8-4 \n[67] glue_1.7.0 emmeans_1.10.0 tools_4.3.3 \n[70] webshot2_0.1.1 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 geepack_1.3.10 \n[82] gtable_0.3.4 sass_0.4.9 digest_0.6.35 \n[85] TH.data_1.1-2 htmlwidgets_1.6.4 memoise_2.0.1 \n[88] htmltools_0.5.7 lifecycle_1.0.4 shinyWidgets_0.8.2 \n[91] mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nout <- adcm %>%\n select(ATC1, ATC2, ATC3, ATC4, CMDECOD, CMTRT) %>%\n unique()\n\nvar_labels(out) <- c(\n ATC1 = \"ATC Class Level 1\",\n ATC2 = \"ATC Class Level 2\",\n ATC3 = \"ATC Class Level 3\",\n ATC4 = \"ATC Class Level 4\",\n CMDECOD = \"WHODrug Preferred Name\",\n CMTRT = \"Investigator-Specified\\nTreatment Term\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\"),\n disp_cols = names(out),\n main_title = \"Listing of Concomitant Medication Class, Preferred Name, and Investigator-Specified Terms\"\n)\n\nhead(lsting, 20)\n\nListing of Concomitant Medication Class, Preferred Name, and Investigator-Specified Terms\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Investigator-Specified\nATC Class Level 1 ATC Class Level 2 ATC Class Level 3 ATC Class Level 4 WHODrug Preferred Name Treatment Term \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n ATCCLAS1 A ATCCLAS2 A ATCCLAS3 A ATCCLAS4 A medname A_2/3 A_2/3 \n medname A_3/3 A_3/3 \n medname A_1/3 A_1/3 \n ATCCLAS1 A p2 ATCCLAS2 A p2 ATCCLAS3 A p2 ATCCLAS4 A p2 medname A_3/3 A_3/3 \n ATCCLAS1 B ATCCLAS2 B ATCCLAS3 B ATCCLAS4 B medname B_1/4 B_1/4 \n medname B_4/4 B_4/4 \n medname B_2/4 B_2/4 \n medname B_3/4 B_3/4 \n ATCCLAS1 B p2 ATCCLAS2 B p2 ATCCLAS3 B p2 ATCCLAS4 B p2 medname B_1/4 B_1/4 \n medname B_2/4 B_2/4 \n ATCCLAS1 B p3 ATCCLAS2 B p3 ATCCLAS3 B p3 ATCCLAS4 B p3 medname B_1/4 B_1/4 \n medname B_2/4 B_2/4 \n ATCCLAS1 C ATCCLAS2 C ATCCLAS3 C ATCCLAS4 C medname C_1/2 C_1/2 \n medname C_2/2 C_2/2 \n ATCCLAS1 C p2 ATCCLAS2 C p2 ATCCLAS3 C p2 ATCCLAS4 C p2 medname C_1/2 C_1/2 \n medname C_2/2 C_2/2 \n ATCCLAS1 C p3 ATCCLAS2 C p3 ATCCLAS3 C p3 ATCCLAS4 C p3 medname C_2/2 C_2/2 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:37 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "COXT02" + "Listings", + "Concomitant Medications", + "CML02B_GL" ] }, { - "objectID": "tables/efficacy/aovt03.html", - "href": "tables/efficacy/aovt03.html", - "title": "AOVT03", + "objectID": "listings/concomitant-medications/cml01.html", + "href": "listings/concomitant-medications/cml01.html", + "title": "CML01", "section": "", - "text": "This example will focus on data from multiple visits and take the interaction between visits and arms into consideration.\n\n\nData Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\nadqs_in <- adqs %>%\n filter(AVISIT %in% c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\", \"WEEK 5 DAY 36\")) %>%\n droplevels() %>%\n filter(PARAM %in% c(\"BFI All Questions\", \"Fatigue Interference\")) %>%\n mutate(CHG = ifelse(BMEASIFL == \"Y\", CHG, NA)) # only analyze evaluable population\n\n\n\n\n\nCoderesult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\", ref_group = \"ARM A\") %>%\n split_rows_by(\"PARAM\", split_fun = drop_split_levels) %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(arm = \"ARMCD\", covariates = c(\"BASE\", \"AVISIT\", \"AVISIT*ARMCD\")),\n conf_level = 0.95,\n var_labels = \"WEEK 1 DAY 8\",\n table_names = \"WEEK 1 DAY 8\",\n interaction_y = \"WEEK 1 DAY 8\",\n interaction_item = \"AVISIT\"\n ) %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(arm = \"ARMCD\", covariates = c(\"BASE\", \"AVISIT\", \"AVISIT*ARMCD\")),\n conf_level = 0.95,\n var_labels = \"WEEK 2 DAY 15\",\n table_names = \"WEEK 2 DAY 15\",\n interaction_y = \"WEEK 2 DAY 15\",\n interaction_item = \"AVISIT\"\n ) %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(arm = \"ARMCD\", covariates = c(\"BASE\", \"AVISIT\", \"AVISIT*ARMCD\")),\n conf_level = 0.95,\n var_labels = \"WEEK 5 DAY 36\",\n table_names = \"WEEK 5 DAY 36\",\n interaction_y = \"WEEK 5 DAY 36\",\n interaction_item = \"AVISIT\"\n ) %>%\n build_table(adqs_in, alt_counts_df = adsl)\n\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————\nBFI All Questions \n WEEK 1 DAY 8 \n n 68 73 62 \n Adjusted Mean 4.34 5.96 3.90 \n Difference in Adjusted Means 1.62 -0.44 \n 95% CI (-1.75, 4.98) (-3.94, 3.06)\n p-value 0.3460 0.8059 \n WEEK 2 DAY 15 \n n 68 73 62 \n Adjusted Mean 12.99 11.23 9.86 \n Difference in Adjusted Means -1.76 -3.13 \n 95% CI (-5.12, 1.60) (-6.64, 0.37)\n p-value 0.3048 0.0795 \n WEEK 5 DAY 36 \n n 68 73 62 \n Adjusted Mean 23.88 23.08 28.21 \n Difference in Adjusted Means -0.81 4.33 \n 95% CI (-4.17, 2.56) (0.83, 7.83) \n p-value 0.6383 0.0155 \nFatigue Interference \n WEEK 1 DAY 8 \n n 68 73 62 \n Adjusted Mean 5.97 5.19 5.21 \n Difference in Adjusted Means -0.78 -0.76 \n 95% CI (-4.17, 2.61) (-4.30, 2.78)\n p-value 0.6522 0.6729 \n WEEK 2 DAY 15 \n n 68 73 62 \n Adjusted Mean 11.39 9.42 9.55 \n Difference in Adjusted Means -1.96 -1.84 \n 95% CI (-5.35, 1.43) (-5.37, 1.70)\n p-value 0.2560 0.3084 \n WEEK 5 DAY 36 \n n 68 73 62 \n Adjusted Mean 22.79 25.37 23.43 \n Difference in Adjusted Means 2.58 0.64 \n 95% CI (-0.81, 5.97) (-2.89, 4.18)\n p-value 0.1353 0.7212 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:35:40 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9016 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] sandwich_3.1-0 utf8_1.2.4 generics_0.1.3 tidyr_1.3.1 \n [5] stringi_1.8.3 lattice_0.22-6 digest_0.6.35 evaluate_0.23 \n [9] grid_4.3.3 estimability_1.5 mvtnorm_1.2-4 fastmap_1.1.1 \n[13] jsonlite_1.8.8 Matrix_1.6-5 backports_1.4.1 brio_1.1.4 \n[17] survival_3.5-8 multcomp_1.4-25 purrr_1.0.2 fansi_1.0.6 \n[21] scales_1.3.0 TH.data_1.1-2 codetools_0.2-19 Rdpack_2.6 \n[25] cli_3.6.2 rlang_1.1.3 rbibutils_2.2.16 munsell_0.5.0 \n[29] splines_4.3.3 yaml_2.3.8 tools_4.3.3 checkmate_2.3.1 \n[33] coda_0.19-4.1 colorspace_2.1-0 ggplot2_3.5.0 broom_1.0.5 \n[37] vctrs_0.6.5 R6_2.5.1 zoo_1.8-12 lifecycle_1.0.4 \n[41] emmeans_1.10.0 htmlwidgets_1.6.4 MASS_7.3-60.0.1 pkgconfig_2.0.3 \n[45] pillar_1.9.0 gtable_0.3.4 glue_1.7.0 xfun_0.42 \n[49] tibble_3.2.1 tidyselect_1.2.1 knitr_1.45 xtable_1.8-4 \n[53] htmltools_0.5.7 rmarkdown_2.26 testthat_3.2.1 compiler_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nout <- adcm %>%\n filter(!is.na(CMDECOD)) %>%\n mutate(\n ID = paste(SITEID, SUBJID, sep = \"/\"),\n AGSXRC = paste(AGE, SEX, RACE, sep = \"/\"),\n TRTSD = toupper(format(as.Date(TRTSDTM), \"%d%b%Y\")),\n CMASTD = toupper(format(as.Date(ASTDTM), \"%d%b%Y\")),\n CMSTRFL = ifelse(ASTDY < 0, \"Yes\", \"No\"),\n CMENRFL = ifelse(CMENRTPT == \"ONGOING\", \"Yes\", \"No\")\n ) %>%\n select(\n ID, AGSXRC, TRT01A, CMDECOD, TRTSD, CMASTD, ASTDY, ADURN,\n CMSTRFL, CMENRFL, CMDOSE, CMDOSU, CMDOSFRQ, CMROUTE\n )\n\nvar_labels(out) <- c(\n ID = \"Center/Patient ID\",\n AGSXRC = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n CMDECOD = \"Medication Name\",\n TRTSD = \"Date of First\\nStudy Drug\\nAdministration\",\n CMASTD = \"Medication\\nStart Date\",\n ASTDY = \"Study Day\",\n ADURN = \"Duration\\n(days)\",\n CMSTRFL = \"Previous?\",\n CMENRFL = \"Ongoing\\nat Final\\nContact?\",\n CMDOSE = \"Dose\",\n CMDOSU = \"Dose Unit\",\n CMDOSFRQ = \"Frequency\",\n CMROUTE = \"Route\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"ID\", \"AGSXRC\", \"CMDECOD\"),\n disp_cols = names(out),\n main_title = \"Listing of Previous and Concomitant Medications\"\n)\n\nhead(lsting, 20)\n\nListing of Previous and Concomitant Medications\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of First Ongoing \n Study Drug Medication Duration at Final \nTreatment Center/Patient ID Age/Sex/Race Medication Name Administration Start Date Study Day (days) Previous? Contact? Dose Dose Unit Frequency Route \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE medname A_2/3 04NOV2020 21SEP2021 321 -148 No No 30 mg/breath Q4H INTRAMUSCULAR\n 04NOV2020 02DEC2021 393 -42 No No 41 umol/L TWICE UNKNOWN \n medname B_1/4 04NOV2020 15APR2021 162 -172 No No 25 ug/kg/day Q4H INTRAVENOUS \n 04NOV2020 15APR2021 162 -172 No No 25 ug/kg/day Q4H INTRAVENOUS \n 04NOV2020 15APR2021 162 -172 No No 25 ug/kg/day Q4H INTRAVENOUS \n medname C_1/2 04NOV2020 19MAY2021 196 -165 No No 22 ug/mL TID INHALED \n 04NOV2020 19MAY2021 196 -165 No No 22 ug/mL TID INHALED \n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN medname A_2/3 01JAN2020 09JUN2020 160 -258 No Yes 48 DROP QD INTRAVENOUS \n 01JAN2020 04APR2021 459 -194 No Yes 57 ug/kg/day Q4W NASAL \n 01JAN2020 15APR2021 470 -130 No Yes 83 ug/kg/day Q4H UNKNOWN \n 01JAN2020 20APR2021 475 -112 No Yes 17 ug/kg/day Q4H SUBCUTANEOUS \n medname A_3/3 01JAN2020 03OCT2021 641 -14 No Yes 68 % 4 TIMES PER MONTH UNKNOWN \n 01JAN2020 03OCT2021 641 -14 No Yes 68 % 4 TIMES PER MONTH UNKNOWN \n medname B_1/4 01JAN2020 19OCT2020 292 -49 No Yes 5 ug/mL TWICE UNKNOWN \n 01JAN2020 19OCT2020 292 -49 No Yes 5 ug/mL TWICE UNKNOWN \n 01JAN2020 19OCT2020 292 -49 No Yes 5 ug/mL TWICE UNKNOWN \n medname B_2/4 01JAN2020 11MAY2021 496 -161 No Yes 83 ug/mL TWICE RECTAL \n 01JAN2020 11MAY2021 496 -161 No Yes 83 ug/mL TWICE RECTAL \n 01JAN2020 11MAY2021 496 -161 No Yes 83 ug/mL TWICE RECTAL \n medname B_3/4 01JAN2020 09FEB2020 39 -505 No Yes 85 ug QD SUBCUTANEOUS \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:30 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "AOVT03" + "Listings", + "Concomitant Medications", + "CML01" ] }, { - "objectID": "tables/efficacy/onct05.html", - "href": "tables/efficacy/onct05.html", - "title": "ONCT05", + "objectID": "listings/pharmacokinetic/pkpl02.html", + "href": "listings/pharmacokinetic/pkpl02.html", + "title": "PKPL02", "section": "", - "text": "Data Setup\nStandard Table\nTable Specifying Class Variables\nTable Selecting Columns and Changing the Alpha Level\nTable Setting Values Indicating Response\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadrs <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadrs <- df_explicit_na(adrs)\n\nadsl <- adsl %>%\n select(STUDYID, USUBJID, ARM, SEX, RACE, STRATA1, STRATA2)\n\nadrs <- adrs %>%\n filter(PARAMCD == \"INVET\") %>%\n select(STUDYID, USUBJID, PARAMCD, AVALC)\n\nanl <- inner_join(adsl, adrs, by = c(\"STUDYID\", \"USUBJID\"))\nanl_labels <- var_labels(anl)\n\nanl <- anl %>%\n filter(ARM %in% c(\"A: Drug X\", \"B: Placebo\")) %>%\n mutate(\n # Reorder levels of factor to make the placebo group the reference arm.\n ARM = relevel(ARM, ref = \"B: Placebo\") %>%\n droplevels()\n ) %>%\n droplevels() %>%\n mutate(rsp = AVALC %in% c(\"CR\", \"PR\"))\n\nvar_labels(anl) <- c(anl_labels, rsp = \"Is Response\")\n\n\n\n\n\n\nCodedf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"STRATA2\")\n ),\n data = anl\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Responders Response (%) n Responders Response (%) Odds Ratio 95% CI \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 84 62.7% 134 100 74.6% 1.75 (1.04, 2.95)\nSex \n F 161 82 48 58.5% 79 61 77.2% 2.40 (1.21, 4.76)\n M 107 52 36 69.2% 55 39 70.9% 1.08 (0.47, 2.48)\nStratification Factor 2 \n S1 140 67 38 56.7% 73 56 76.7% 2.51 (1.22, 5.20)\n S2 128 67 46 68.7% 61 44 72.1% 1.18 (0.55, 2.53)\n\n\n\n\nHere, the levels of subgroup variables SEX and STRATA1 are reordered. STRATA1 is reordered by frequency.\n\n\nCodeanl_reorder <- anl %>%\n mutate(\n SEX = forcats::fct_relevel(SEX, \"M\", \"F\"),\n STRATA1 = forcats::fct_infreq(STRATA1)\n )\n\ndf <- extract_rsp_subgroups(\n variables = list(rsp = \"rsp\", arm = \"ARM\", subgroups = c(\"SEX\", \"STRATA1\")),\n data = anl_reorder\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Responders Response (%) n Responders Response (%) Odds Ratio 95% CI \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 84 62.7% 134 100 74.6% 1.75 (1.04, 2.95)\nSex \n M 107 52 36 69.2% 55 39 70.9% 1.08 (0.47, 2.48)\n F 161 82 48 58.5% 79 61 77.2% 2.40 (1.21, 4.76)\nStratification Factor 1 \n C 94 45 33 73.3% 49 37 75.5% 1.12 (0.44, 2.83)\n B 92 45 26 57.8% 47 32 68.1% 1.56 (0.66, 3.66)\n A 82 44 25 56.8% 38 31 81.6% 3.37 (1.22, 9.28)\n\n\n\n\n\n\nCodedf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"STRATA2\")\n ),\n data = anl,\n conf_level = 0.9,\n method = \"chisq\"\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\", \"pval\"))\n\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Responders Response (%) n Responders Response (%) Odds Ratio 90% CI p-value (Chi-Squared Test)\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 84 62.7% 134 100 74.6% 1.75 (1.13, 2.72) 0.0351 \nSex \n F 161 82 48 58.5% 79 61 77.2% 2.40 (1.35, 4.27) 0.0113 \n M 107 52 36 69.2% 55 39 70.9% 1.08 (0.54, 2.17) 0.8497 \nStratification Factor 2 \n S1 140 67 38 56.7% 73 56 76.7% 2.51 (1.37, 4.63) 0.0119 \n S2 128 67 46 68.7% 61 44 72.1% 1.18 (0.62, 2.24) 0.6674 \n\n\n\n\nCreate a new variable new_rsp in anl data that uses new criteria for responder.\n\n\nCodeanl_new <- anl %>%\n mutate(new_rsp = AVALC == \"CR\")\n\ndf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"new_rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"STRATA2\")\n ),\n data = anl_new\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nresult\n\n B: Placebo A: Drug X \nBaseline Risk Factors Total n n Responders Response (%) n Responders Response (%) Odds Ratio 95% CI \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAll Patients 268 134 47 35.1% 134 60 44.8% 1.50 (0.92, 2.45)\nSex \n F 161 82 25 30.5% 79 39 49.4% 2.22 (1.17, 4.24)\n M 107 52 22 42.3% 55 21 38.2% 0.84 (0.39, 1.83)\nStratification Factor 2 \n S1 140 67 21 31.3% 73 31 42.5% 1.62 (0.81, 3.24)\n S2 128 67 26 38.8% 61 29 47.5% 1.43 (0.71, 2.89)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# Use table, embedded in response forest plot module.\nlibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(forcats)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADRS <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADRS <- df_explicit_na(ADRS)\n})\ndatanames <- c(\"ADSL\", \"ADRS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADRS <- data[[\"ADRS\"]]\narm_ref_comp <- list(\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n ),\n ARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_forest_rsp(\n label = \"Forest Response\",\n dataname = \"ADRS\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n \"ARMCD\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADRS, \"PARAMCD\", \"PARAM\"),\n \"BESRSPI\"\n ),\n subgroup_var = choices_selected(\n variable_choices(ADSL, names(ADSL)),\n c(\"SEX\")\n ),\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"STRATA1\", \"STRATA2\")),\n \"STRATA2\"\n ),\n plot_height = c(600L, 200L, 2000L)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:35:07 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] forcats_1.0.0 teal.modules.clinical_0.9.0.9014\n [3] teal.transform_0.5.0.9004 teal_0.15.2.9019 \n [5] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 \n [7] teal.code_0.5.0.9004 shiny_1.8.0 \n [9] scda_0.1.6.9017 dplyr_1.1.4 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[37] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[40] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[43] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[46] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[49] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[52] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[55] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[58] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[61] generics_0.1.3 chromote_0.2.0 ggplot2_3.5.0 \n[64] munsell_0.5.0 scales_1.3.0 xtable_1.8-4 \n[67] glue_1.7.0 emmeans_1.10.0 tools_4.3.3 \n[70] webshot2_0.1.1 webshot_0.5.5 mvtnorm_1.2-4 \n[73] cowplot_1.1.3 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 textshaping_0.3.7 fansi_1.0.6 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] farver_2.1.1 memoise_2.0.1 htmltools_0.5.7 \n[91] lifecycle_1.0.4 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(rlistings)\nlibrary(scda)\n\ndrug_a <- \"Plasma Drug X\"\nspec <- \"Urine\"\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp_x <- adpp %>% filter(\n PPCAT == drug_a,\n PPSPEC == spec\n)\n\nout <- adpp_x %>%\n mutate(PARAM = paste0(PARAM, \" (\", AVALU, \")\")) %>%\n select(TRT01A, USUBJID, AVISIT, PARAM, AVAL) %>%\n unique() %>%\n tidyr::pivot_wider(\n id_cols = c(TRT01A, USUBJID, AVISIT),\n names_from = PARAM,\n values_from = AVAL\n )\n\nvar_labels(out) <- names(out)\nout <- out %>% var_relabel(\n TRT01A = \"Treatment Group\",\n USUBJID = \"Subject ID\",\n AVISIT = \"Visit\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"USUBJID\", \"AVISIT\"),\n disp_cols = names(out),\n main_title = paste(\"Listing of\", drug_a, spec, \"PK Parameters, PK Population\\nProtocol: xxnnnnn\"),\n subtitles = paste(\"Analyte:\", drug_a)\n)\n\nhead(lsting, 20)\n\nListing of Plasma Drug X Urine PK Parameters, PK Population\nProtocol: xxnnnnn\nAnalyte: Plasma Drug X\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Group Subject ID Visit Renal CL (L/hr) Renal CL Norm by Dose (L/hr/mg) Amt Rec from T1 to T2 (mg) Pct Rec from T1 to T2 (%)\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X AB12345-BRA-1-id-105 SCREENING 0.0538423152160391 0.00441769893771616 2.15210785813109 17.8220657702531 \n CYCLE 1 DAY 1 0.0480828455497337 0.00418360874479016 1.77968465488986 13.4821873677008 \n CYCLE 1 DAY 2 0.0524191320174391 0.00574562025709617 1.7751362634173 11.7748899262287 \n AB12345-BRA-1-id-134 SCREENING 0.054828756388858 0.00489378524965625 1.69069405572207 14.6782255303037 \n CYCLE 1 DAY 1 0.0463628883891636 0.00281388401660215 1.03364773182262 15.2049132671477 \n CYCLE 1 DAY 2 0.0542853013687975 0.00480239019141706 2.07978470495693 16.6499332185177 \n AB12345-BRA-1-id-42 SCREENING 0.0479776607513692 0.00620670551445586 1.49259200502984 12.4632371401908 \n CYCLE 1 DAY 1 0.060136833920038 0.00423749524975822 2.002399829348 16.1228873656652 \n CYCLE 1 DAY 2 0.0222050225259149 0.0041513339034891 1.65173021070619 10.129985981426 \n AB12345-BRA-1-id-93 SCREENING 0.0429283028076499 0.00450841008626937 0.882348047230192 19.8088728992851 \n CYCLE 1 DAY 1 0.0343747382858835 0.00495342578722049 1.73500915591676 14.8733500411057 \n CYCLE 1 DAY 2 0.0474831008867497 0.00415970555107753 1.30298887256052 14.9616973312841 \n AB12345-BRA-11-id-217 SCREENING 0.0524432563610182 0.00439177770746837 1.16344390767412 16.584779611686 \n CYCLE 1 DAY 1 0.0411628011374518 0.00567801310981526 1.11763922430636 19.3000982041101 \n CYCLE 1 DAY 2 0.0672581292323284 0.00400060865194939 1.45655867480937 10.1596117673893 \n AB12345-BRA-11-id-345 SCREENING 0.044070189259969 0.00561835429596993 1.43739076299198 15.4875095868721 \n CYCLE 1 DAY 1 0.0362275034574886 0.0038765297501434 0.96604915921 17.1567306808389 \n CYCLE 1 DAY 2 0.0416331541840018 0.00462187415243145 1.27070193721417 19.2547757988484 \n AB12345-BRA-11-id-397 SCREENING 0.0379747899730378 0.0047876948377162 1.67729762147252 11.6015615292251 \n CYCLE 1 DAY 1 0.0430467407701829 0.00463308440642305 1.1695965192594 12.5511219923965 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:22 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 rlistings_0.2.7.9012 tibble_3.2.1 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "ONCT05" + "Listings", + "Pharmacokinetic", + "PKPL02" ] }, { - "objectID": "tables/efficacy/lgrt02.html", - "href": "tables/efficacy/lgrt02.html", - "title": "LGRT02", + "objectID": "listings/pharmacokinetic/pkpl04.html", + "href": "listings/pharmacokinetic/pkpl04.html", + "title": "PKPL04", "section": "", - "text": "Data Setup\nMulti-Variable Logistic Regression\nMulti-Variable Logistic Regression with Interaction Term\nMulti-Variable Logistic Regression Specifying Covariates\nMulti-Variable Logistic Regression Setting an Event, Alpha Level, and Level for Interaction\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadrs <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadrs <- df_explicit_na(adrs)\n\nadsl <- adsl %>%\n dplyr::filter(SEX %in% c(\"F\", \"M\"))\n\nadrs <- adrs %>%\n dplyr::filter(PARAMCD == \"BESRSPI\") %>%\n dplyr::mutate(\n Response = case_when(AVALC %in% c(\"PR\", \"CR\") ~ 1, TRUE ~ 0),\n SEX = factor(SEX, c(\"M\", \"F\")),\n RACE = factor(\n RACE,\n levels = c(\n \"AMERICAN INDIAN OR ALASKA NATIVE\", \"ASIAN\", \"BLACK OR AFRICAN AMERICAN\",\n \"WHITE\", \"MULTIPLE\", \"NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER\"\n )\n )\n ) %>%\n var_relabel(Response = \"Response\", SEX = \"Sex\", RACE = \"Race\")\n\n\n\n\n\nCodemodel <- fit_logistic(\n adrs,\n variables = list(response = \"Response\", arm = \"ARMCD\", covariates = c(\"SEX\", \"AGE\"))\n)\nconf_level <- 0.95\ndf <- broom::tidy(model, conf_level = conf_level)\n\n# empty string flag\ndf <- df_explicit_na(df, na_level = \"_NA_\")\n\nresult <- basic_table() %>%\n summarize_logistic(\n conf_level = conf_level,\n drop_and_remove_str = \"_NA_\"\n ) %>%\n append_topleft(\"Logistic regression\") %>%\n build_table(df = df)\nresult\n\nLogistic regression Degrees of Freedom Parameter Estimate Standard Error Odds Ratio Wald 95% CI p-value\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nPlanned Arm Code 2 0.0408 \n Reference ARM A, n = 134 \n ARM B, n = 134 1 -2.094 1.080 0.12 (0.01, 1.02) 0.0524 \n ARM C, n = 132 1 -0.074 1.423 0.93 (0.06, 15.09) 0.9584 \nSex \n Reference M, n = 169 \n F, n = 231 1 0.331 0.695 1.39 (0.36, 5.44) 0.6339 \nAge \n Age 1 0.070 0.054 1.07 (0.97, 1.19) 0.1945 \n\n\n\n\n\nCodemodel <- fit_logistic(\n adrs,\n variables = list(\n response = \"Response\",\n arm = \"ARMCD\",\n covariates = c(\"SEX\", \"AGE\"),\n interaction = \"SEX\"\n )\n)\nconf_level <- 0.95\ndf <- broom::tidy(model, conf_level = conf_level)\n\n# empty string flag\ndf <- df_explicit_na(df, na_level = \"_NA_\")\n\nresult <- basic_table() %>%\n summarize_logistic(\n conf_level = conf_level,\n drop_and_remove_str = \"_NA_\"\n ) %>%\n append_topleft(\"Logistic regression with interaction\") %>%\n build_table(df = df)\nresult\n\nLogistic regression with interaction Degrees of Freedom Parameter Estimate Standard Error Odds Ratio Wald 95% CI p-value\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAge \n Age 1 0.067 0.054 1.07 (0.96, 1.19) 0.2084 \nPlanned Arm Code 2 0.4882 \n Reference ARM A, n = 134 \n ARM B, n = 134 1 -17.850 2362.767 0.9940 \n Sex \n F 0.23 (0.02, 2.11) \n M 0.00 (0.00, >999.99) \n ARM C, n = 132 1 -16.442 2362.767 0.9944 \n Sex \n F >999.99 (0.00, >999.99) \n M 0.00 (0.00, >999.99) \nSex \n Reference M, n = 169 \n F, n = 231 1 -16.044 2362.767 0.9946 \n Planned Arm Code \n ARM A 0.00 (0.00, >999.99) \n ARM B 1.39 (0.29, 6.59) \n ARM C >999.99 (0.00, >999.99) \nInteraction of Planned Arm Code * Sex 2 0.9999 \n Reference ARM A or M, n = 248 \n ARM B * F, n = 82 1 16.373 2362.767 0.9945 \n ARM C * F, n = 70 1 32.492 3156.732 0.9918 \n\n\n\n\n\nCodemodel <- fit_logistic(\n adrs,\n variables = list(\n response = \"Response\",\n arm = \"ARMCD\",\n covariates = c(\"SEX\", \"AGE\", \"RACE\")\n )\n)\nconf_level <- 0.95\ndf <- broom::tidy(model, conf_level = conf_level)\n\n# empty string flag\ndf <- df_explicit_na(df, na_level = \"_NA_\")\n\nresult <- basic_table() %>%\n summarize_logistic(\n conf_level = conf_level,\n drop_and_remove_str = \"_NA_\"\n ) %>%\n append_topleft(\"y ~ ARM + SEX + AGE + RACE\") %>%\n build_table(df = df)\nresult\n\ny ~ ARM + SEX + AGE + RACE Degrees of Freedom Parameter Estimate Standard Error Odds Ratio Wald 95% CI p-value\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nPlanned Arm Code 2 0.0346 \n Reference ARM A, n = 134 \n ARM B, n = 134 1 -2.162 1.084 0.12 (0.01, 0.96) 0.0461 \n ARM C, n = 132 1 -0.090 1.426 0.91 (0.06, 14.97) 0.9499 \nSex \n Reference M, n = 169 \n F, n = 231 1 0.364 0.701 1.44 (0.36, 5.69) 0.6032 \nAge \n Age 1 0.071 0.053 1.07 (0.97, 1.19) 0.1866 \nRace 5 0.9685 \n Reference AMERICAN INDIAN OR ALASKA NATIVE, n = 25 \n ASIAN, n = 208 1 -16.246 2017.122 0.00 (0.00, >999.99) 0.9936 \n BLACK OR AFRICAN AMERICAN, n = 91 1 -15.205 2017.122 0.00 (0.00, >999.99) 0.9940 \n WHITE, n = 74 1 -15.955 2017.122 0.00 (0.00, >999.99) 0.9937 \n MULTIPLE, n = 1 1 -0.363 10941.553 0.70 (0.00, >999.99) 1.0000 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER, n = 1 1 1.036 10941.553 2.82 (0.00, >999.99) 0.9999 \n\n\n\n\n\nCodemodel <- fit_logistic(\n adrs,\n variables = list(\n response = \"Response\",\n arm = \"ARMCD\",\n covariates = c(\"SEX\", \"AGE\"),\n interaction = \"AGE\"\n ),\n response_definition = \"1 - response\"\n)\nconf_level <- 0.9\ndf <- broom::tidy(model, conf_level = conf_level, at = c(30, 50))\n\n# empty string flag\ndf <- df_explicit_na(df, na_level = \"_NA_\")\n\nresult <- basic_table() %>%\n summarize_logistic(\n conf_level = conf_level,\n drop_and_remove_str = \"_NA_\"\n ) %>%\n append_topleft(\"Estimations at age 30 and 50\") %>%\n build_table(df = df)\nresult\n\nEstimations at age 30 and 50 Degrees of Freedom Parameter Estimate Standard Error Odds Ratio Wald 90% CI p-value\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nSex \n Reference M, n = 169 \n F, n = 231 1 -0.381 0.710 0.68 (0.21, 2.20) 0.5915 \nPlanned Arm Code 2 0.2768 \n Reference ARM A, n = 134 \n ARM B, n = 134 1 -20.020 13.714 0.1443 \n Age \n 30 234.91 (0.30, >999.99) \n 50 >999.99 (0.04, >999.99) \n ARM C, n = 132 1 -15.622 14.810 0.2915 \n Age \n 30 31.95 (0.03, >999.99) \n 50 >999.99 (<0.01, >999.99) \nAge \n Age 1 -0.877 0.581 0.1309 \n Planned Arm Code \n ARM A 0.42 (0.16, 1.08) \n ARM B 0.97 (0.89, 1.06) \n ARM C 0.79 (0.55, 1.11) \nInteraction of Planned Arm Code * Age 2 0.2213 \n Reference ARM A, n = 134 \n ARM B, n = 134 1 0.849 0.583 0.1449 \n ARM C, n = 132 1 0.636 0.618 0.3034 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADRS <- synthetic_cdisc_dataset(\"latest\", \"adrs\") %>%\n filter(PARAMCD %in% c(\"BESRSPI\", \"INVET\"))\n})\ndatanames <- c(\"ADSL\", \"ADRS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADRS <- data[[\"ADRS\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_logistic(\n label = \"Logistic Regression\",\n dataname = \"ADRS\",\n arm_var = choices_selected(\n choices = variable_choices(ADRS, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n choices = value_choices(ADRS, \"PARAMCD\", \"PARAM\"),\n selected = \"BESRSPI\"\n ),\n cov_var = choices_selected(\n choices = c(\"SEX\", \"AGE\", \"BMRKR1\", \"BMRKR2\"),\n selected = \"SEX\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:34:28 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] processx_3.8.4 survival_3.5-8 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 abind_1.4-5 \n[25] multcomp_1.4-25 withr_3.0.0 purrr_1.0.2 \n[28] shinyWidgets_0.8.2 geepack_1.3.10 grid_4.3.3 \n[31] fansi_1.0.6 teal.logger_0.2.0.9001 xtable_1.8-4 \n[34] colorspace_2.1-0 ggplot2_3.5.0 emmeans_1.10.0 \n[37] scales_1.3.0 MASS_7.3-60.0.1 cli_3.6.2 \n[40] mvtnorm_1.2-4 rmarkdown_2.26 generics_0.1.3 \n[43] cachem_1.0.8 chromote_0.2.0 splines_4.3.3 \n[46] formatR_1.14 vctrs_0.6.5 webshot_0.5.5 \n[49] Matrix_1.6-5 sandwich_3.1-0 jsonlite_1.8.8 \n[52] carData_3.0-5 callr_3.7.5 car_3.1-2 \n[55] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[58] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[61] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[64] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[67] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[70] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[73] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[76] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[79] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[82] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[85] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[88] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[91] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing - CYCLE 1 DAY 1\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(rlistings)\nlibrary(scda)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\nvisit <- \"CYCLE 1 DAY 1\"\ndrug_a <- \"Plasma Drug X\" # numerator drug\ndrug_b <- \"Plasma Drug Y\" # denominator drug\n\nadpp_x <- adpp %>%\n filter(\n AVISIT == visit,\n PPCAT %in% c(drug_a, drug_b),\n PARAMCD %in% c(\"CMAX\", \"AUCIFO\")\n ) %>%\n mutate(\n PARAM_U = paste0(PARAM, \" (\", AVALU, \")\")\n )\n\nadpp_ratio <- adpp_x %>%\n tidyr::pivot_wider(\n id_cols = c(USUBJID, PARAM_U),\n names_from = PPCAT,\n values_from = AVAL\n )\n\nadpp_ratio[, paste0(drug_a, \"/\", drug_b)] <- as.numeric(unlist(adpp_ratio[, drug_a] / adpp_ratio[, drug_b]))\n\nout <- adpp_ratio %>%\n tidyr::pivot_wider(\n id_cols = USUBJID,\n names_from = PARAM_U,\n names_glue = \"{PARAM_U}\\n{.value}\",\n values_from = c(all_of(drug_a), all_of(drug_b), paste0(drug_a, \"/\", drug_b))\n ) %>%\n select(names(.)[c(1:2, 4, 6, 3, 5, 7)])\n\nvar_labels(out) <- names(out)\nout <- out %>% var_relabel(USUBJID = \"Subject ID\")\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = \"USUBJID\",\n disp_cols = names(out),\n main_title = paste0(\n \"Listing of Individual \", drug_a, \" \", paste(unique(adpp_x$PARAM), collapse = \" and \"), \" Ratios following \",\n unique(adpp_x$REGIMEN), \" \", paste(drug_a, drug_b, sep = \" or \"), \", PK Population\\nProtocol: xxnnnnn\",\n \"\\nVisit: \", unique(adpp_x$AVISIT)\n ),\n subtitles = paste0(\"\\nAnalytes: \", paste(drug_a, drug_b, sep = \" and \"))\n)\n\nhead(lsting, 20)\n\nListing of Individual Plasma Drug X AUC Infinity Obs and Max Conc Ratios following BID Plasma Drug X or Plasma Drug Y, PK Population\nProtocol: xxnnnnn\nVisit: CYCLE 1 DAY 1\n\nAnalytes: Plasma Drug X and Plasma Drug Y\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n AUC Infinity Obs (day*ug/mL) AUC Infinity Obs (day*ug/mL) AUC Infinity Obs (day*ug/mL) Max Conc (ug/mL) Max Conc (ug/mL) Max Conc (ug/mL) \n Subject ID Plasma Drug X Plasma Drug Y Plasma Drug X/Plasma Drug Y Plasma Drug X Plasma Drug Y Plasma Drug X/Plasma Drug Y\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAB12345-BRA-1-id-105 246.349321001289 NA NA 31.2264481880236 NA NA \nAB12345-BRA-1-id-134 248.519038520728 NA NA 21.7795763901966 NA NA \nAB12345-BRA-1-id-141 204.038850147211 191.797779791421 1.06382279486812 29.5409649407056 38.8911230490524 0.759581174949522 \nAB12345-BRA-1-id-265 196.360864588266 218.652833415662 0.898048570973609 35.6328283094637 34.2215467219396 1.04123956170044 \n AB12345-BRA-1-id-42 210.528307366678 NA NA 26.7845825535397 NA NA \n AB12345-BRA-1-id-93 160.406798051843 NA NA 17.5296885232566 NA NA \nAB12345-BRA-11-id-171 217.543269983548 180.798322952882 1.20323721166508 30.3782220474834 31.615072576154 0.960877820992148 \nAB12345-BRA-11-id-217 272.094354596647 NA NA 34.2812274648873 NA NA \nAB12345-BRA-11-id-237 148.094218281784 193.694022424355 0.764578154907287 32.9103242471385 38.7385450224575 0.849549827647366 \nAB12345-BRA-11-id-321 206.178847103577 216.464946980475 0.95248145244585 33.0064256549217 28.4783979285037 1.1589986816599 \nAB12345-BRA-11-id-345 228.51025073098 NA NA 39.7523164840323 NA NA \nAB12345-BRA-11-id-397 201.536920713046 NA NA 36.5841424116449 NA NA \nAB12345-BRA-11-id-50 189.012389008811 NA NA 21.1977400008473 NA NA \n AB12345-BRA-11-id-9 235.477941027941 207.851453783084 1.13291457308587 27.1559637630099 28.2923295654501 0.959834844995305 \nAB12345-BRA-13-id-177 185.956676853099 NA NA 31.0405525087113 NA NA \nAB12345-BRA-14-id-120 209.878908685802 301.584778421544 0.695920098435608 31.8076450080362 22.9229189133965 1.38759139393227 \nAB12345-BRA-14-id-23 270.799396057463 NA NA 29.2804222629517 NA NA \nAB12345-BRA-15-id-36 183.877364155027 NA NA 37.9405096212457 NA NA \nAB12345-BRA-2-id-296 216.092875093089 NA NA 27.3509307000219 NA NA \nAB12345-BRA-4-id-368 203.23438144437 149.30280248041 1.36122281744199 38.3952821076341 30.8121148640987 1.24610992387189 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:15 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 rlistings_0.2.7.9012 tibble_3.2.1 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "LGRT02" + "Listings", + "Pharmacokinetic", + "PKPL04" ] }, { - "objectID": "tables/disclosures/eudrat02.html", - "href": "tables/disclosures/eudrat02.html", - "title": "EUDRAT02", + "objectID": "listings/pharmacokinetic/pkcl02.html", + "href": "listings/pharmacokinetic/pkcl02.html", + "title": "PKCL02", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\nFor illustrative purposes, the adae data is filtered by arm A: Drug X here.\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadae <- df_explicit_na(adae)\n\nadae_serious <- adae %>% filter(AESER == \"Y\", SAFFL == \"Y\")\nadae_serious_arm <- adae_serious %>% filter(ARM == \"A: Drug X\")\n\nfilters_list <- list(\n related = with_label(c(AEREL = \"Y\"), \"Events (Related)\"),\n fatal = with_label(c(AESDTH = \"Y\"), \"Events (Fatal)\"),\n fatal_related = with_label(c(AEREL = \"Y\", AESDTH = \"Y\"), \"Events (Fatal & Related)\")\n)\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n summarize_patients_events_in_cols(\n filters_list = filters_list,\n empty_stats = c(\"all\", \"related\", \"fatal\", \"fatal_related\"),\n custom_label = \"Total number of patients with at least one serious adverse event\"\n ) %>%\n split_rows_by(\"AEBODSYS\",\n nested = FALSE,\n split_fun = split_fun,\n indent_mod = -1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae_serious_arm$AEBODSYS)\n ) %>%\n split_rows_by(\"AEDECOD\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae_serious_arm$AEDECOD)\n ) %>%\n summarize_patients_events_in_cols(\n filters_list = filters_list,\n col_split = FALSE\n )\n\nresult <- build_table(lyt, adae_serious_arm)\nresult\n\nBody System or Organ Class \n Dictionary-Derived Term Patients (All) Events (All) Events (Related) Events (Fatal) Events (Fatal & Related)\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one serious adverse event 104 \ncl A.1 \n dcd A.1.1.1.2 48 68 0 0 0 \ncl B.1 \n dcd B.1.1.1.1 47 56 56 56 56 \ncl B.2 \n dcd B.2.2.3.1 48 64 0 0 0 \ncl D.1 \n dcd D.1.1.1.1 50 61 61 61 61 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:33:55 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(rlistings)\nlibrary(scda)\n\ndrug_a <- \"Drug X\"\nspec <- \"URINE\"\n\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\")\nadpc_x <- adpc %>%\n mutate(REGIMEN = ifelse(\"REGIMEN\" %in% names(adpc), REGIMEN, \"BID\")) %>%\n filter(\n grepl(drug_a, PARAM),\n ASMED == spec\n )\n\nout <- adpc_x %>%\n tidyr::pivot_longer(\n cols = c(AVAL, PCVOL),\n names_to = \"URCD\",\n values_to = \"VALUE\"\n ) %>%\n mutate(\n URCD = case_when(\n URCD == \"AVAL\" ~ \"UR_Conc\",\n URCD == \"PCVOL\" ~ \"Vurine\",\n TRUE ~ URCD\n ),\n UNIT = case_when(\n URCD == \"UR_Conc\" ~ as.character(AVALU),\n URCD == \"Vurine\" ~ as.character(PCVOLU),\n TRUE ~ \"NA\"\n )\n ) %>%\n mutate(\n PARAM_INT = paste0(\n URCD, \" (\", UNIT, \") -\\nUrine Collection\\nInterval\",\n ifelse(PCTPT == \"Predose\", \"\", \" (hours)\"), \":\\n\",\n gsub(\"[PTH]\", \"\", PCTPT)\n )\n ) %>%\n select(TRT01A, USUBJID, VISIT, PARAM_INT, VALUE) %>%\n unique() %>%\n tidyr::pivot_wider(\n id_cols = c(TRT01A, USUBJID, VISIT),\n names_from = PARAM_INT,\n values_from = VALUE\n )\n\nvar_labels(out) <- names(out)\nout <- out %>% var_relabel(\n TRT01A = \"Treatment Group\",\n USUBJID = \"Subject ID\",\n VISIT = \"Visit\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"USUBJID\", \"VISIT\"),\n disp_cols = names(out),\n main_title = paste0(\n \"Listing of \", drug_a, \" Urine Concentration and Volumes following \", unique(adpc_x$REGIMEN)[1],\n \" of \", drug_a, \", PK Population\\nProtocol: xxnnnnn\"\n ),\n subtitles = paste(\"Analyte:\", drug_a)\n)\n\nhead(lsting, 20)\n\nListing of Drug X Urine Concentration and Volumes following BID of Drug X, PK Population\nProtocol: xxnnnnn\nAnalyte: Drug X\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n UR_Conc (ug/mL) - Vurine (mL) - UR_Conc (ug/mL) - Vurine (mL) - UR_Conc (ug/mL) - Vurine (mL) - UR_Conc (ug/mL) - Vurine (mL) - UR_Conc (ug/mL) - Vurine (mL) - \n Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection Urine Collection \n Interval: Interval: Interval (hours): Interval (hours): Interval (hours): Interval (hours): Interval (hours): Interval (hours): Interval (hours): Interval (hours):\nTreatment Group Subject ID Visit redose redose 0 - 4 0 - 4 4 - 8 4 - 8 8 - 12 8 - 12 0 - 24 0 - 24 \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X AB12345-BRA-1-id-105 Day 1 0 713.94 5.461 96.92 0.562 235.38 0.049 384.98 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 735.22 \n AB12345-BRA-1-id-134 Day 1 0 1068.83 4.064 145.1 0.178 352.39 0.006 576.35 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 1080.14 \n AB12345-BRA-1-id-42 Day 1 0 817.09 4.277 110.93 0.305 269.39 0.018 440.6 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 737.25 \n AB12345-BRA-1-id-93 Day 1 0 864.61 4.324 117.38 0.278 285.06 0.015 466.23 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 757.23 \n AB12345-BRA-11-id-217 Day 1 0 724.93 6.225 98.41 0.672 239.01 0.059 390.91 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 1185.46 \n AB12345-BRA-11-id-345 Day 1 0 840.09 6.511 114.05 0.588 276.98 0.04 453.01 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 883.89 \n AB12345-BRA-11-id-397 Day 1 0 974.41 5.478 132.28 0.354 321.26 0.017 525.44 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 918.67 \n AB12345-BRA-11-id-50 Day 1 0 922.97 4.122 125.3 0.228 304.3 0.01 497.7 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 808.08 \n AB12345-BRA-13-id-177 Day 1 0 694.09 4.267 94.23 0.421 228.84 0.038 374.28 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 908.45 \n AB12345-BRA-14-id-23 Day 1 0 722.84 4.254 98.13 0.386 238.32 0.032 389.78 NA NA \n Day 2 NA NA NA NA NA NA NA NA 0 862.1 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:07 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 rlistings_0.2.7.9012 tibble_3.2.1 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Disclosures", - "EUDRAT02" + "Listings", + "Pharmacokinetic", + "PKCL02" ] }, { - "objectID": "tables/disclosures/eudrat01.html", - "href": "tables/disclosures/eudrat01.html", - "title": "EUDRAT01", + "objectID": "listings/disposition/dsl02.html", + "href": "listings/disposition/dsl02.html", + "title": "DSL02", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\nDefine a trimming function get_adae_trimmed to filter for AEs of greater than 5% incidence rate.\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nadae_nonser <- adae %>% filter(AESER != \"Y\", SAFFL == \"Y\")\n\nget_adae_trimmed <- function(adsl, adae, cutoff_rate) {\n n_per_arm <- adsl %>%\n dplyr::count(ARM)\n\n anl_terms <- adae %>%\n dplyr::group_by(ARM, AEBODSYS, AEDECOD) %>%\n dplyr::count(\n unique_terms = n_distinct(USUBJID)\n ) %>%\n dplyr::select(-n) %>%\n dplyr::ungroup()\n\n anl_terms <- dplyr::left_join(\n anl_terms,\n n_per_arm,\n by = \"ARM\"\n ) %>%\n dplyr::mutate(\n ae_rate = unique_terms / n\n ) %>%\n dplyr::filter(ae_rate >= cutoff_rate) %>%\n dplyr::select(AEDECOD) %>%\n unique()\n\n anl <- dplyr::left_join(\n anl_terms,\n adae,\n by = \"AEDECOD\"\n )\n anl\n}\n\nadae_trim <- get_adae_trimmed(adsl, adae_nonser, cutoff_rate = 0.05)\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n split_cols_by(\"ARM\") %>%\n summarize_patients_events_in_cols(\n custom_label = \"Total number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5% and number of events\" \n ) %>%\n split_rows_by(\"AEBODSYS\",\n nested = FALSE,\n split_fun = split_fun,\n indent_mod = -1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae_trim$AEBODSYS)\n ) %>%\n split_rows_by(\"AEDECOD\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adae_trim$AEDECOD)) %>%\n summarize_patients_events_in_cols(\n col_split = FALSE\n )\n\nresult <- build_table(lyt, adae_trim)\nresult\n\nBody System or Organ Class A: Drug X B: Placebo C: Combination \n Dictionary-Derived Term Patients (All) Events (All) Patients (All) Events (All) Patients (All) Events (All)\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5% and number of events 106 360 112 367 112 421 \ncl A.1 \n dcd A.1.1.1.1 50 64 45 62 63 88 \ncl B.2 \n dcd B.2.1.2.1 49 65 44 62 52 66 \ncl C.1 \n dcd C.1.1.1.3 43 55 46 63 43 64 \ncl C.2 \n dcd C.2.1.2.1 35 48 48 53 55 65 \ncl D.1 \n dcd D.1.1.4.2 48 66 42 55 50 64 \ncl D.2 \n dcd D.2.1.5.3 47 62 58 72 57 74 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:33:42 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 withr_3.0.0 \n[33] Rdpack_2.6 digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 \n[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\nout <- adsl %>%\n filter(AEWITHFL == \"Y\") %>%\n mutate(\n ID = paste(SITEID, SUBJID, sep = \"/\"),\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n DISCONT = ifelse(!is.na(DCSREAS) & EOSSTT != \"COMPLETED\", \"Yes\", \"No\"),\n SSADTM = as.POSIXct(\n strftime(TRTSDTM, format = \"%Y-%m-%d %H:%M:%S\"),\n format = \"%Y-%m-%d\",\n tz = \"UTC\"\n ),\n SSAEDY = as.numeric(ceiling(difftime(EOSDT, SSADTM, units = \"days\"))),\n RANDEDY = as.numeric(ceiling(difftime(EOSDT, RANDDT, units = \"days\"))),\n ) %>%\n filter(DISCONT == \"Yes\") %>%\n select(ID, ASR, TRT01A, SSADTM, EOSDY, SSAEDY, RANDEDY, DCSREAS)\n\nvar_labels(out) <- c(\n ID = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n SSADTM = \"Date of First\\nStudy Drug\\nAdministration\",\n EOSDY = \"Day of Last\\nStudy Drug\\nAdministration\",\n SSAEDY = \"Day of Study\\nDiscontinuation\\nRelative to First\\nStudy Drug\\nAdministration\",\n RANDEDY = \"Day of Study\\nDiscontinuation\\nRelative to\\nRandomization\",\n DCSREAS = \"Reason for\\nDiscontinuation\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = \"TRT01A\",\n disp_cols = names(out),\n main_title = \"Listing of Patients Who Discontinued Early from Study\"\n)\n\nhead(lsting, 20)\n\nListing of Patients Who Discontinued Early from Study\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Day of Study \n Discontinuation Day of Study \n Date of First Day of Last Relative to First Discontinuation \n Study Drug Study Drug Study Drug Relative to Reason for \n Treatment Center/Patient ID Age/Sex/Race Administration Administration Administration Randomization Discontinuation \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X CHN-1/id-62 36/F/WHITE 2020-11-22 455 454 455 DEATH \n B: Placebo CHN-9/id-11 28/F/NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 2021-01-27 388 387 388 DEATH \nC: Combination USA-11/id-136 38/F/ASIAN 2019-10-02 865 864 868 DEATH \n USA-11/id-100 40/F/ASIAN 2020-03-10 705 705 707 LACK OF EFFICACY\n CHN-11/id-91 44/M/BLACK OR AFRICAN AMERICAN 2020-05-29 625 625 626 DEATH \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:00 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Disclosures", - "EUDRAT01" + "Listings", + "Disposition", + "DSL02" ] }, { - "objectID": "tables/demography/dmt01.html", - "href": "tables/demography/dmt01.html", - "title": "DMT01", + "objectID": "listings/adverse-events/ael02_ed.html", + "href": "listings/adverse-events/ael02_ed.html", + "title": "AEL02_ED", "section": "", - "text": "Data Setup\nTable with an Additional Study-Specific Continuous Variable\nTable with an Additional Study-Specific Categorical Variable\nTable with Subgrouping for Some Analyses\nTable with Additional Vital Signs Baseline Values\nTable with Additional Values from ADSUB\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(tidyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadvs <- synthetic_cdisc_dataset(\"latest\", \"advs\")\nadsub <- synthetic_cdisc_dataset(\"latest\", \"adsub\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadvs <- df_explicit_na(advs)\nadsub <- df_explicit_na(adsub)\n\n# Change description in variable SEX.\nadsl <- adsl %>%\n mutate(\n SEX = factor(case_when(\n SEX == \"M\" ~ \"Male\",\n SEX == \"F\" ~ \"Female\",\n SEX == \"U\" ~ \"Unknown\",\n SEX == \"UNDIFFERENTIATED\" ~ \"Undifferentiated\"\n )),\n AGEGR1 = factor(\n case_when(\n between(AGE, 18, 40) ~ \"18-40\",\n between(AGE, 41, 64) ~ \"41-64\",\n AGE > 64 ~ \">=65\"\n ),\n levels = c(\"18-40\", \"41-64\", \">=65\")\n ),\n BMRKR1_CAT = factor(\n case_when(\n BMRKR1 < 3.5 ~ \"LOW\",\n BMRKR1 >= 3.5 & BMRKR1 < 10 ~ \"MEDIUM\",\n BMRKR1 >= 10 ~ \"HIGH\"\n ),\n levels = c(\"LOW\", \"MEDIUM\", \"HIGH\")\n )\n ) %>%\n var_relabel(\n BMRKR1_CAT = \"Biomarker 1 Categories\"\n )\n# The developer needs to do pre-processing to add necessary variables based on ADVS to analysis dataset.\n# Obtain SBP, DBP and weight.\nget_param_advs <- function(pname, plabel) {\n ds <- advs %>%\n filter(PARAM == plabel & AVISIT == \"BASELINE\") %>%\n select(USUBJID, AVAL)\n\n colnames(ds) <- c(\"USUBJID\", pname)\n\n ds\n}\n# The developer needs to do pre-processing to add necessary variables based on ADSUB to analysis dataset.\n# Obtain baseline BMI (BBMISI).\nget_param_adsub <- function(pname, plabel) {\n ds <- adsub %>%\n filter(PARAM == plabel) %>%\n select(USUBJID, AVAL)\n\n colnames(ds) <- c(\"USUBJID\", pname)\n\n ds\n}\nadsl <- adsl %>%\n left_join(get_param_advs(\"SBP\", \"Systolic Blood Pressure\"), by = \"USUBJID\") %>%\n left_join(get_param_advs(\"DBP\", \"Diastolic Blood Pressure\"), by = \"USUBJID\") %>%\n left_join(get_param_advs(\"WGT\", \"Weight\"), by = \"USUBJID\") %>%\n left_join(get_param_adsub(\"BBMISI\", \"Baseline BMI\"), by = \"USUBJID\")\n\n\n\n\n\nCodevars <- c(\"AGE\", \"AGEGR1\", \"SEX\", \"ETHNIC\", \"RACE\", \"BMRKR1\")\nvar_labels <- c(\n \"Age (yr)\",\n \"Age Group\",\n \"Sex\",\n \"Ethnicity\",\n \"Race\",\n \"Continous Level Biomarker 1\"\n)\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n add_overall_col(\"All Patients\") %>%\n analyze_vars(\n vars = vars,\n var_labels = var_labels\n ) %>%\n build_table(adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————————————————\nAge (yr) \n n 134 134 132 400 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) 34.9 (7.4) \n Median 33.0 35.0 35.0 34.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 20.0 - 69.0 \nAge Group \n n 134 134 132 400 \n 18-40 113 (84.3%) 103 (76.9%) 106 (80.3%) 322 (80.5%) \n 41-64 21 (15.7%) 31 (23.1%) 25 (18.9%) 77 (19.2%) \n >=65 0 0 1 (0.8%) 1 (0.2%) \nSex \n n 134 134 132 400 \n Female 79 (59%) 82 (61.2%) 70 (53%) 231 (57.8%) \n Male 55 (41%) 52 (38.8%) 62 (47%) 169 (42.2%) \nEthnicity \n n 134 134 132 400 \n HISPANIC OR LATINO 15 (11.2%) 18 (13.4%) 15 (11.4%) 48 (12%) \n NOT HISPANIC OR LATINO 104 (77.6%) 103 (76.9%) 101 (76.5%) 308 (77%) \n NOT REPORTED 6 (4.5%) 10 (7.5%) 11 (8.3%) 27 (6.8%) \n UNKNOWN 9 (6.7%) 3 (2.2%) 5 (3.8%) 17 (4.2%) \nRace \n n 134 134 132 400 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) 208 (52%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) 91 (22.8%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) 74 (18.5%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) 25 (6.2%) \n MULTIPLE 0 1 (0.7%) 0 1 (0.2%) \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 1 (0.2%) \n OTHER 0 0 0 0 \n UNKNOWN 0 0 0 0 \nContinous Level Biomarker 1 \n n 134 134 132 400 \n Mean (SD) 6.0 (3.6) 5.7 (3.3) 5.6 (3.5) 5.8 (3.4) \n Median 5.4 4.8 4.6 4.8 \n Min - Max 0.4 - 17.7 0.6 - 14.2 0.2 - 21.4 0.2 - 21.4 \n\n\n\n\n\nCodevars <- c(\"AGE\", \"AGEGR1\", \"SEX\", \"ETHNIC\", \"RACE\", \"BMRKR1_CAT\")\nvar_labels <- c(\n \"Age (yr)\",\n \"Age Group\",\n \"Sex\",\n \"Ethnicity\",\n \"Race\",\n \"Biomarker 1 Categories\"\n)\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_vars(\n vars = vars,\n var_labels = var_labels\n ) %>%\n build_table(adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————\nAge (yr) \n n 134 134 132 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) \n Median 33.0 35.0 35.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 \nAge Group \n n 134 134 132 \n 18-40 113 (84.3%) 103 (76.9%) 106 (80.3%) \n 41-64 21 (15.7%) 31 (23.1%) 25 (18.9%) \n >=65 0 0 1 (0.8%) \nSex \n n 134 134 132 \n Female 79 (59%) 82 (61.2%) 70 (53%) \n Male 55 (41%) 52 (38.8%) 62 (47%) \nEthnicity \n n 134 134 132 \n HISPANIC OR LATINO 15 (11.2%) 18 (13.4%) 15 (11.4%) \n NOT HISPANIC OR LATINO 104 (77.6%) 103 (76.9%) 101 (76.5%) \n NOT REPORTED 6 (4.5%) 10 (7.5%) 11 (8.3%) \n UNKNOWN 9 (6.7%) 3 (2.2%) 5 (3.8%) \nRace \n n 134 134 132 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) \n MULTIPLE 0 1 (0.7%) 0 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 \n OTHER 0 0 0 \n UNKNOWN 0 0 0 \nBiomarker 1 Categories \n n 134 134 132 \n LOW 33 (24.6%) 41 (30.6%) 38 (28.8%) \n MEDIUM 84 (62.7%) 76 (56.7%) 80 (60.6%) \n HIGH 17 (12.7%) 17 (12.7%) 14 (10.6%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_vars(\n vars = c(\"AGE\", \"SEX\", \"RACE\"),\n var_labels = c(\"Age\", \"Sex\", \"Race\")\n ) %>%\n split_rows_by(\"STRATA1\",\n split_fun = split_fun\n ) %>%\n analyze_vars(\"BMRKR1\") %>%\n build_table(adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————\nAge \n n 134 134 132 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) \n Median 33.0 35.0 35.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 \nSex \n n 134 134 132 \n Female 79 (59%) 82 (61.2%) 70 (53%) \n Male 55 (41%) 52 (38.8%) 62 (47%) \nRace \n n 134 134 132 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) \n MULTIPLE 0 1 (0.7%) 0 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 \n OTHER 0 0 0 \n UNKNOWN 0 0 0 \nA \n n 38 44 40 \n Mean (SD) 5.8 (3.8) 5.4 (3.2) 5.1 (3.2) \n Median 5.1 4.5 3.8 \n Min - Max 0.4 - 17.7 1.4 - 14.2 1.5 - 14.0 \nB \n n 47 45 43 \n Mean (SD) 6.1 (3.6) 5.8 (3.6) 5.7 (3.4) \n Median 5.2 4.8 5.1 \n Min - Max 1.6 - 17.2 0.6 - 13.3 0.2 - 16.5 \nC \n n 49 45 49 \n Mean (SD) 6.0 (3.4) 5.9 (3.2) 6.0 (3.8) \n Median 5.8 5.6 4.5 \n Min - Max 0.5 - 15.1 1.5 - 13.9 1.2 - 21.4 \n\n\n\n\n\nCoderesult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_vars(\n vars = c(\"AGE\", \"SEX\", \"RACE\", \"DBP\", \"SBP\"),\n var_labels = c(\n \"Age (yr)\",\n \"Sex\",\n \"Race\",\n \"Diastolic Blood Pressure\",\n \"Systolic Blood Pressure\"\n )\n ) %>%\n build_table(adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————\nAge (yr) \n n 134 134 132 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) \n Median 33.0 35.0 35.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 \nSex \n n 134 134 132 \n Female 79 (59%) 82 (61.2%) 70 (53%) \n Male 55 (41%) 52 (38.8%) 62 (47%) \nRace \n n 134 134 132 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) \n MULTIPLE 0 1 (0.7%) 0 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 \n OTHER 0 0 0 \n UNKNOWN 0 0 0 \nDiastolic Blood Pressure \n n 134 134 132 \n Mean (SD) 96.5 (19.9) 101.1 (19.9) 102.8 (19.5) \n Median 96.0 100.4 102.0 \n Min - Max 44.3 - 136.6 29.2 - 143.8 49.4 - 153.5 \nSystolic Blood Pressure \n n 134 134 132 \n Mean (SD) 151.7 (31.5) 149.5 (26.5) 144.7 (30.1) \n Median 150.1 153.0 146.5 \n Min - Max 69.1 - 231.2 87.2 - 220.9 71.8 - 220.2 \n\n\n\n\n\nCoderesult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_vars(\n vars = c(\"AGE\", \"SEX\", \"RACE\", \"BBMISI\"),\n var_labels = c(\n \"Age (yr)\",\n \"Sex\",\n \"Race\",\n \"Baseline BMI\"\n )\n ) %>%\n build_table(adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————\nAge (yr) \n n 134 134 132 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) \n Median 33.0 35.0 35.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 \nSex \n n 134 134 132 \n Female 79 (59%) 82 (61.2%) 70 (53%) \n Male 55 (41%) 52 (38.8%) 62 (47%) \nRace \n n 134 134 132 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) \n MULTIPLE 0 1 (0.7%) 0 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 \n OTHER 0 0 0 \n UNKNOWN 0 0 0 \nBaseline BMI \n n 134 134 132 \n Mean (SD) 30.0 (18.3) 32.4 (23.2) 30.1 (18.4) \n Median 27.1 31.1 30.0 \n Min - Max -6.9 - 75.9 -26.6 - 117.9 -44.2 - 87.5 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n # Include `EOSDY` and `DCSREAS` variables below because they contain missing data.\n stopifnot(\n any(is.na(ADSL$EOSDY)),\n any(is.na(ADSL$DCSREAS))\n )\n})\ndatanames <- \"ADSL\"\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary(\n label = \"Demographic Table\",\n dataname = \"ADSL\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n summarize_vars = choices_selected(\n c(\"SEX\", \"RACE\", \"BMRKR2\", \"EOSDY\", \"DCSREAS\"),\n c(\"SEX\", \"RACE\")\n ),\n useNA = \"ifany\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:33:29 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tidyr_1.3.1 \n [9] dplyr_1.1.4 scda_0.1.6.9017 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 glue_1.7.0 ps_1.7.6 \n[58] codetools_0.2-19 stringi_1.8.3 gtable_0.3.4 \n[61] later_1.3.2 shinycssloaders_1.0.0 munsell_0.5.0 \n[64] tibble_3.2.1 logger_0.3.0 pillar_1.9.0 \n[67] htmltools_0.5.7 brio_1.1.4 R6_2.5.1 \n[70] Rdpack_2.6 evaluate_0.23 lattice_0.22-6 \n[73] rbibutils_2.2.16 backports_1.4.1 memoise_2.0.1 \n[76] broom_1.0.5 teal.reporter_0.3.1.9002 bslib_0.6.1 \n[79] httpuv_1.6.14 Rcpp_1.0.12 shinyvalidate_0.1.3 \n[82] coda_0.19-4.1 nlme_3.1-164 checkmate_2.3.1 \n[85] xfun_0.42 zoo_1.8-12 forcats_1.0.0 \n[88] pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\nlibrary(lubridate)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nadae_anl <- adae %>%\n filter(SAFFL == \"Y\") %>%\n mutate(\n DHM = as.period(LDOSEDTM %--% ASTDTM),\n TMOM = minute(DHM) + ifelse(second(DHM) >= 30, 1, 0),\n TMOH = hour(DHM) + ifelse(TMOM == 60, 1, 0),\n TMOD = day(DHM) + ifelse(TMOH == 24, 1, 0)\n ) %>%\n mutate(\n TMOM = TMOM %% 60,\n TMOH = TMOH %% 24\n )\n\nout <- adae_anl %>%\n mutate(\n ADURN = AENDY - ASTDY + 1,\n cent_subj = paste(SITEID, SUBJID, sep = \"/\"),\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n AESER_F = if_else(AESER == \"Y\", \"Yes\", \"No\", \"\"),\n AEREL_F = if_else(AEREL == \"Y\", \"Yes\", \"No\", \"\"),\n AECONTRT_F = if_else(AECONTRT == \"Y\", \"Yes\", \"No\", \"\"),\n AEOUT_F = case_when(\n AEOUT == \"FATAL\" ~ 1,\n AEOUT == \"NOT RECOVERED/NOT RESOLVED\" ~ 2,\n AEOUT == \"RECOVERED/RESOLVED\" ~ 3,\n AEOUT == \"RECOVERED/RESOLVED WITH SEQUELAE\" ~ 4,\n AEOUT == \"RECOVERING/RESOLVING\" ~ 5,\n AEOUT == \"UNKNOWN\" ~ 6\n ),\n AEACN_F = case_when(\n AEACN == \"DOSE INCREASED\" ~ 1,\n AEACN == \"DOSE NOT CHANGED\" ~ 2,\n AEACN == \"DOSE REDUCED\" | AEACN == \"DOSE RATE REDUCED\" ~ 3,\n AEACN == \"DRUG INTERRUPTED\" ~ 4,\n AEACN == \"DRUG WITHDRAWN\" ~ 5,\n AEACN == \"NOT APPLICABLE\" | AEACN == \"NOT EVALUABLE\" ~ 6,\n AEACN == \"UNKNOWN\" ~ 7\n )\n ) %>%\n select(\n cent_subj, ASR, TRT01A, AEDECOD, ASTDY, TMOD, TMOH, TMOM,\n ADURN, AESER_F, AESEV, AEREL_F, AEOUT_F, AECONTRT_F, AEACN_F\n )\n\nout <- out %>% var_relabel(\n cent_subj = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n AEDECOD = \"Adverse\\nEvent MedDRA\\nPreferred Term\",\n ASTDY = \"Study\\nDay of\\nOnset\",\n TMOD = \"Time from\\nLast Dose\\nto Onset\\ndays\",\n TMOH = \"Time from\\nLast Dose\\nto Onset\\nhrs\",\n TMOM = \"Time from\\nLast Dose\\nto Onset\\nmins\",\n ADURN = \"AE\\nDuration\\nin Days\",\n AESER_F = \"Serious\",\n AESEV = \"Most\\nExtreme\\nIntensity\",\n AEREL_F = \"Caused by\\nStudy\\nDrug\",\n AEOUT_F = \"Outcome\\n(1)\",\n AECONTRT_F = \"Treatment\\nfor AE\",\n AEACN_F = \"Action\\nTaken\\n(2)\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"cent_subj\", \"ASR\"),\n disp_cols = names(out),\n main_title = \"Listing of Adverse Events (for early development studies)\",\n main_footer = \"\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\"\n)\n\nhead(lsting, 20)\n\nListing of Adverse Events (for early development studies)\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Time from Time from Time from \n Adverse Study Last Dose Last Dose Last Dose AE Most Caused by Action\n Event MedDRA Day of to Onset to Onset to Onset Duration Extreme Study Outcome Treatment Taken \nTreatment Center/Patient ID Age/Sex/Race Preferred Term Onset days hrs mins in Days Serious Intensity Drug (1) for AE (2) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE dcd B.2.1.2.1 162 7 19 4 173 No MODERATE No 5 Yes 2 \n dcd D.1.1.4.2 196 1 20 48 166 No MODERATE No 5 No 2 \n dcd A.1.1.1.2 321 28 12 54 149 Yes MODERATE No 5 Yes 2 \n dcd A.1.1.1.2 393 12 19 17 43 Yes MODERATE No 5 No 5 \n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN dcd C.2.1.2.1 39 30 9 4 506 No MODERATE Yes 2 No 6 \n dcd D.1.1.1.1 64 26 17 10 630 Yes SEVERE Yes 1 No 6 \n dcd C.2.1.2.1 95 4 12 58 306 No MODERATE Yes 5 No 2 \n dcd A.1.1.1.2 160 24 5 57 259 Yes MODERATE No 2 Yes 2 \n dcd B.2.2.3.1 292 9 23 4 50 Yes MILD No 3 No 2 \n dcd A.1.1.1.2 459 9 5 4 195 Yes MODERATE No 5 Yes 2 \n dcd B.1.1.1.1 470 6 5 0 131 Yes SEVERE Yes 1 No 6 \n dcd A.1.1.1.2 475 20 16 16 113 Yes MODERATE No 4 Yes 2 \n dcd C.1.1.1.3 496 5 5 28 162 No SEVERE Yes 5 Yes 2 \n dcd B.1.1.1.1 641 8 17 4 15 Yes SEVERE Yes 1 Yes 6 \n BRA-1/id-93 34/F/ASIAN dcd D.1.1.4.2 44 18 15 39 47 No MODERATE No 5 Yes 2 \n dcd D.2.1.5.3 79 2 3 58 300 No MILD Yes 5 No 3 \n dcd A.1.1.1.1 136 22 1 19 78 No MILD No 3 Yes 2 \n dcd D.2.1.5.3 260 12 12 26 305 No MILD Yes 5 No 2 \n dcd C.1.1.1.3 281 4 14 52 106 No SEVERE Yes 5 Yes 2 \n dcd D.1.1.1.1 316 6 12 43 250 Yes SEVERE Yes 1 No 6 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:34:53 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] lubridate_1.9.3 rlistings_0.2.7.9012 tibble_3.2.1 \n[4] formatters_0.5.5.9018 scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 timechange_0.3.0 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 \n[29] utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 \n[33] withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Demography", - "DMT01" + "Listings", + "Adverse Events", + "AEL02_ED" ] }, { - "objectID": "tables/pharmacokinetic/pkpt07.html", - "href": "tables/pharmacokinetic/pkpt07.html", - "title": "PKPT07", + "objectID": "listings/adverse-events/ael01_nollt.html", + "href": "listings/adverse-events/ael01_nollt.html", + "title": "AEL01_NOLLT", "section": "", - "text": "Data Setup\nStandard Table – Urine\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\nlibrary(stringr)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>%\n filter(AVISIT == \"CYCLE 1 DAY 1\", str_detect(tolower(PARAM), regex(\"norm by dose\", ignore_case = TRUE)))\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_rows_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ARMCD\"),\n label_pos = \"topleft\",\n split_label = \"Treatment Arm\"\n ) %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\",\n child_labels = \"hidden\"\n ) %>%\n analyze_vars_in_cols(\n vars = \"AVAL\",\n .stats = c(\n \"n\", \"mean\", \"sd\", \"cv\",\n \"geom_mean\", \"geom_cv\", \"median\",\n \"min\", \"max\"\n ),\n .labels = c(\n n = \"n\",\n mean = \"Mean\",\n sd = \"SD\",\n cv = \"CV (%)\",\n geom_mean = \"Geometric Mean\",\n geom_cv = \"CV % Geometric Mean\",\n median = \"Median\",\n min = \"Minimum\",\n max = \"Maximum\"\n ),\n .formats = c(\n n = \"xx.\",\n mean = format_sigfig(3),\n sd = format_sigfig(3),\n cv = \"xx.x\",\n median = format_sigfig(3),\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n min = format_sigfig(3),\n max = format_sigfig(3)\n )\n )\n\n\nPlasma Drug X\n\n\nCodeadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\"Summary of\", unique(adpp0$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A \n RENALCLD (L/hr/mg) 134 0.00487 0.000965 19.8 0.00477 21.2 0.00497 0.00238 0.00726\nARM C \n RENALCLD (L/hr/mg) 132 0.00511 0.000934 18.3 0.00502 19.7 0.00515 0.00236 0.00741\n\n\nPlasma Drug Y\n\n\nCodeadpp1 <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp1)\nmain_title(result) <- paste(\"Summary of\", unique(adpp1$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp1$PPCAT), \"\\nVisit:\", unique(adpp1$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y \nVisit: CYCLE 1 DAY 1\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM C \n RENALCLD (L/hr/mg) 132 0.00509 0.00103 20.3 0.00499 21.4 0.00502 0.00236 0.00794\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:33:09 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] stringr_1.5.1 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9016 dplyr_1.1.4 \n[7] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nout <- adae %>%\n select(AESOC, AEDECOD, AETERM) %>%\n unique()\n\nvar_labels(out) <- c(\n AESOC = \"MedDRA System Organ Class\",\n AEDECOD = \"MedDRA Preferred Term\",\n AETERM = \"Investigator-Specified\\nAdverse Event Term\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"AESOC\", \"AEDECOD\"),\n disp_cols = names(out),\n main_title = \"Listing of Preferred Terms and Investigator-Specified Adverse Event Terms\"\n)\n\nhead(lsting, 20)\n\nListing of Preferred Terms and Investigator-Specified Adverse Event Terms\n\n——————————————————————————————————————————————————————————————————————————\n Investigator-Specified\nMedDRA System Organ Class MedDRA Preferred Term Adverse Event Term \n——————————————————————————————————————————————————————————————————————————\n cl A dcd A.1.1.1.1 trm A.1.1.1.1 \n dcd A.1.1.1.2 trm A.1.1.1.2 \n cl B dcd B.1.1.1.1 trm B.1.1.1.1 \n dcd B.2.1.2.1 trm B.2.1.2.1 \n dcd B.2.2.3.1 trm B.2.2.3.1 \n cl C dcd C.1.1.1.3 trm C.1.1.1.3 \n dcd C.2.1.2.1 trm C.2.1.2.1 \n cl D dcd D.1.1.1.1 trm D.1.1.1.1 \n dcd D.1.1.4.2 trm D.1.1.4.2 \n dcd D.2.1.5.3 trm D.2.1.5.3 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:34:45 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Pharmacokinetic", - "PKPT07" + "Listings", + "Adverse Events", + "AEL01_NOLLT" ] }, { - "objectID": "tables/pharmacokinetic/pkpt11.html", - "href": "tables/pharmacokinetic/pkpt11.html", - "title": "PKPT11", - "section": "", - "text": "Data Setup\nStandard Table – Plasma\nteal App\nReproducibility\n\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\n# Comparator Dose - A: Drug X\narm_var <- \"TRT01A\"\ncomp_dose <- \"A: Drug X\"\nother_doses <- as.character(unique(adpp[[arm_var]])[unique(adpp[[arm_var]]) != comp_dose])\n\nadpp <- adpp %>%\n filter(AVISIT == \"CYCLE 1 DAY 1\") %>%\n mutate(\n COMP = paste0(TRT01A, \"/\", comp_dose),\n COMP_AVAL = ifelse(TRT01A == comp_dose, paste0(AVAL, comp_dose), AVAL)\n )\n\nfor (dose in other_doses) {\n temp_df <- adpp[adpp[[arm_var]] == comp_dose, ]\n temp_df$COMP <- paste0(dose, \"/\", comp_dose)\n adpp <- rbind(adpp, temp_df)\n}\n\n# Plasma Drug X\nadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n var_relabel(COMP = \"Comparison\")\n\n# statistics function\ns_gmr <- function(df,\n compare_dose = comp_dose, # comparator, defaults to comp_dose defined above (string)\n denom = TRUE, # whether to use comparator as denominator, defaults to TRUE (logical)\n arm_var = arm_var) { # arm variable, defaults to arm_var defined above (string)\n which_num <- !grepl(compare_dose, df[[arm_var]])\n\n x_num <- as.numeric(df[which_num, ][[\"AVAL\"]])\n x_num <- x_num[!is.na(x_num)]\n x_num_no_negative_vals <- x_num\n x_num_no_negative_vals[x_num_no_negative_vals <= 0] <- NA\n\n x_denom <- as.numeric(gsub(compare_dose, \"\", df[!which_num, ][[\"AVAL\"]]))\n x_denom <- x_denom[!is.na(x_denom)]\n x_denom_no_negative_vals <- x_denom\n x_denom_no_negative_vals[x_denom_no_negative_vals <= 0] <- NA\n\n x_num_log <- log(x_num_no_negative_vals)\n x_denom_log <- log(x_denom_no_negative_vals)\n\n if (denom) {\n geom_mean_ratio <- exp(mean(x_num_log, na.rm = FALSE)) / exp(mean(x_denom_log, na.rm = FALSE))\n geom_mean_ci <- t.test(x_num_log, x_denom_log, conf.level = 0.90)$conf.int\n } else {\n geom_mean_ratio <- exp(mean(x_denom_log, na.rm = FALSE)) / exp(mean(x_num_log, na.rm = FALSE))\n geom_mean_ci <- t.test(x_denom_log, x_num_log, conf.level = 0.90)$conf.int\n }\n\n list(\n n = nrow(df),\n geom_mean_ratio = geom_mean_ratio,\n gmr_ci_lwr = exp(geom_mean_ci[1]),\n gmr_ci_upr = exp(geom_mean_ci[2])\n )\n}\n\nafun_pk_gmr <- function(\n .formats = list(\n n = \"xx.\",\n geom_mean_ratio = format_sigfig(3),\n gmr_ci_lwr = format_sigfig(3),\n gmr_ci_upr = format_sigfig(3)\n ),\n compare_dose = comp_dose,\n denom = TRUE) {\n checkmate::assert_list(.formats)\n checkmate::assert_subset(names(.formats), c(\"n\", \"geom_mean_ratio\", \"gmr_ci_lwr\", \"gmr_ci_upr\"))\n\n afun_lst <- Map(\n function(stat, fmt, compare_dose, denom, arm_var) {\n function(df, .spl_context) {\n x_stat <- s_gmr(df, compare_dose = compare_dose, denom = denom, arm_var = arm_var)[[stat]]\n rcell(x_stat, format = fmt, label = tail(.spl_context$value, 1))\n }\n },\n stat = names(.formats),\n fmt = .formats,\n compare_dose = compare_dose,\n denom = denom,\n arm_var = arm_var\n )\n\n afun_lst\n}\n\n\n\n\n\nCode# create layout\nlyt <- basic_table() %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_fun = keep_split_levels(c(\"AUCinf obs (day*ug/mL)\", \"Cmax (ug/mL)\")),\n split_label = \"PK Parameter\"\n ) %>%\n split_rows_by(\n var = \"COMP\",\n split_fun = remove_split_levels(paste0(comp_dose, \"/\", comp_dose)),\n indent_mod = 11L,\n child_labels = \"hidden\"\n ) %>%\n split_cols_by_multivar(\n vars = rep(\"AVAL\", 4),\n varlabels = c(\n \"n\",\n \"Geometric Mean Ratio\",\n \"90% CI Lower Bound\",\n \"90% CI Upper Bound\"\n )\n ) %>%\n analyze_colvars(\n afun = afun_pk_gmr(),\n extra_args = list(\n compare_dose = comp_dose,\n denom = TRUE,\n arm_var = arm_var\n )\n ) %>%\n append_varlabels(adpp0, \"COMP\", 12L)\n\nresult <- build_table(lyt, df = adpp0)\n\nmain_title(result) <- paste0(\n \"Estimated Ratios of Geometric Means and 90% Confidence Intervals for AUC and CMAX Following \",\n unique(adpp0$REGIMEN), \"\\nof \", comp_dose, \" in Comparison with \",\n paste(other_doses, collapse = \" & \"), \", PK Population\"\n)\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT))\n\nresult\n\nEstimated Ratios of Geometric Means and 90% Confidence Intervals for AUC and CMAX Following BID\nof A: Drug X in Comparison with C: Combination, PK Population\nAnalyte: Plasma Drug X\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nPK Parameter \n Comparison n Geometric Mean Ratio 90% CI Lower Bound 90% CI Upper Bound\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAUCinf obs (day*ug/mL) \n C: Combination/A: Drug X 266 0.962 0.925 1.00 \nCmax (ug/mL) \n C: Combination/A: Drug X 266 0.997 0.958 1.04 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:32:57 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "objectID": "listings/adverse-events/ael04.html", + "href": "listings/adverse-events/ael04.html", + "title": "AEL04", + "section": "", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\nout <- adsl %>%\n filter(!is.na(DTHADY)) %>%\n mutate(\n ID = paste(SITEID, SUBJID, sep = \"/\"),\n AGSXRC = paste(AGE, SEX, RACE, sep = \"/\"),\n TRTSD = toupper(format(as.Date(TRTSDTM), \"%d%b%Y\"))\n ) %>%\n arrange(SUBJID) %>%\n select(ID, AGSXRC, TRT01A, TRTSD, EOSDY, DTHADY, DTHCAUS, ADTHAUT)\n\nvar_labels(out) <- c(\n ID = \"Center/Patient ID\",\n AGSXRC = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n TRTSD = \"Date of First\\nStudy Drug\\nAdministration\",\n EOSDY = \"Day of Last\\nStudy Drug\\nAdministration\",\n DTHADY = \"Day of\\nDeath\",\n DTHCAUS = \"Cause of Death\",\n ADTHAUT = \"Autopsy\\nPerformed?\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"ID\"),\n disp_cols = names(out),\n main_title = \"Listing of Patient Deaths\"\n)\n\nhead(lsting, 20)\n\nListing of Patient Deaths\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of First Day of Last \n Study Drug Study Drug Day of Autopsy \nTreatment Center/Patient ID Age/Sex/Race Administration Administration Death Cause of Death Performed?\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE 04NOV2020 473 496 ADVERSE EVENT Yes \n BRA-1/id-93 34/F/ASIAN 20JUN2020 610 657 ADVERSE EVENT Yes \n BRA-11/id-217 43/M/ASIAN 28SEP2019 871 893 ADVERSE EVENT Yes \n BRA-15/id-36 38/F/ASIAN 08JAN2020 767 812 DISEASE PROGRESSION Yes \n CAN-11/id-139 31/M/ASIAN 15SEP2020 519 563 ADVERSE EVENT Yes \n CHN-1/id-123 27/F/ASIAN 28JAN2020 750 750 DISEASE PROGRESSION Yes \n CHN-1/id-199 27/M/BLACK OR AFRICAN AMERICAN 08JAN2020 773 779 DISEASE PROGRESSION Yes \n CHN-1/id-235 39/M/ASIAN 13JUL2019 950 968 ADVERSE EVENT Yes \n CHN-1/id-62 36/F/WHITE 22NOV2020 455 497 ADVERSE EVENT Yes \n CHN-12/id-258 45/M/WHITE 01MAR2020 721 756 SUICIDE No \n CHN-15/id-14 38/F/BLACK OR AFRICAN AMERICAN 29SEP2019 871 919 DISEASE PROGRESSION Yes \n CHN-17/id-182 37/M/BLACK OR AFRICAN AMERICAN 18SEP2019 879 902 LOST TO FOLLOW UP NA \n CHN-17/id-92 29/M/ASIAN 01MAR2020 720 721 LOST TO FOLLOW UP NA \n CHN-2/id-22 29/M/ASIAN 15JAN2021 393 409 MISSING NA \n CHN-2/id-223 29/F/ASIAN 18NOV2020 453 468 DISEASE PROGRESSION Yes \n CHN-2/id-272 41/F/ASIAN 11JAN2020 768 773 DISEASE PROGRESSION Yes \n CHN-2/id-274 40/F/ASIAN 14OCT2019 860 890 SUICIDE No \n CHN-3/id-128 32/M/ASIAN 24FEB2019 1084 1105 ADVERSE EVENT Yes \n CHN-5/id-108 28/F/BLACK OR AFRICAN AMERICAN 11SEP2019 886 935 MISSING NA \n CHN-6/id-30 29/M/ASIAN 24AUG2020 539 578 Post-study reporting of death No \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:34:38 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Pharmacokinetic", - "PKPT11" + "Listings", + "Adverse Events", + "AEL04" ] }, { - "objectID": "tables/pharmacokinetic/pkct01.html", - "href": "tables/pharmacokinetic/pkct01.html", - "title": "PKCT01", + "objectID": "listings/development-safety-update-report/dsur4.html", + "href": "listings/development-safety-update-report/dsur4.html", + "title": "DSUR4", "section": "", - "text": "Data Setup\nStandard Table (Stats in Columns)\nTable Implementing 1/3 Imputation Rule\nTable Implementing 1/2 Imputation Rule\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>%\n filter(ACTARM == \"A: Drug X\")\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\") %>%\n filter(ACTARM == \"A: Drug X\", PARAM == \"Plasma Drug X\")\n\n# Setting up the data\nadpc_1 <- adpc %>%\n mutate(\n NFRLT = as.factor(NFRLT),\n AVALCAT1 = as.factor(AVALCAT1),\n NOMTPT = as.factor(paste(NFRLT, \"/\", PCTPT))\n ) %>%\n select(NOMTPT, ACTARM, VISIT, AVAL, PARAM, AVALCAT1)\n\nadpc_1$NOMTPT <- factor(\n adpc_1$NOMTPT,\n levels = levels(adpc_1$NOMTPT)[order(as.numeric(gsub(\".*?([0-9\\\\.]+).*\", \"\\\\1\", levels(adpc_1$NOMTPT))))]\n)\n\n# Row structure\nlyt_rows <- basic_table() %>%\n split_rows_by(\n var = \"ACTARM\",\n split_fun = drop_split_levels,\n split_label = \"Treatment Group\",\n label_pos = \"topleft\"\n ) %>%\n add_rowcounts(alt_counts = TRUE) %>%\n split_rows_by(\n var = \"VISIT\",\n split_fun = drop_split_levels,\n split_label = \"Visit\",\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n var = \"NOMTPT\",\n split_fun = drop_split_levels,\n split_label = \"Nominal Time (hr) / Timepoint\",\n label_pos = \"topleft\",\n child_labels = \"hidden\"\n )\n\n\n\n\n\nCodelyt <- lyt_rows %>%\n analyze_vars_in_cols(\n vars = c(\"AVAL\", \"AVALCAT1\", rep(\"AVAL\", 8)),\n .stats = c(\"n\", \"n_blq\", \"mean\", \"sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"min\", \"max\"),\n .formats = c(\n n = \"xx.\", n_blq = \"xx.\", mean = format_sigfig(3), sd = format_sigfig(3), cv = \"xx.x\", median = format_sigfig(3),\n geom_mean = format_sigfig(3), geom_cv = \"xx.x\", min = format_sigfig(3), max = format_sigfig(3)\n ),\n .labels = c(\n n = \"n\", n_blq = \"Number\\nof\\nLTRs/BLQs\", mean = \"Mean\", sd = \"SD\", cv = \"CV (%) Mean\",\n geom_mean = \"Geometric Mean\", geom_cv = \"CV % Geometric Mean\", median = \"Median\", min = \"Minimum\", max = \"Maximum\"\n ),\n na_str = \"NE\",\n .aligns = \"decimal\"\n )\n\nresult <- build_table(lyt, df = adpc_1, alt_counts_df = adsl) %>% prune_table()\n\n# Decorating\nmain_title(result) <- \"Summary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\"\nsubtitles(result) <- c(\n \"Protocol: xxxxx\",\n paste(\"Analyte: \", unique(adpc_1$PARAM)),\n paste(\"Treatment:\", unique(adpc_1$ACTARM))\n)\nmain_footer(result) <- \"NE: Not Estimable\"\n\nresult\n\nSummary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\nProtocol: xxxxx\nAnalyte: Plasma Drug X\nTreatment: A: Drug X\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Group Number \n Visit of \n Nominal Time (hr) / Timepoint n LTRs/BLQs Mean SD CV (%) Mean Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X (N=134) \n Day 1 \n 0 / Predose 134 134 0 0 NE NE NE 0 0 0 \n 0.5 / 0.5H 134 0 12.6 1.51 12.0 12.5 12.2 12.6 9.72 15.6 \n 1 / 1H 134 0 16.2 1.63 10.0 16.1 10.1 16.2 12.6 19.9 \n 1.5 / 1.5H 134 0 15.6 1.46 9.3 15.6 9.3 15.5 12.3 19.0 \n 2 / 2H 134 0 13.4 1.35 10.1 13.4 10.0 13.3 10.8 16.5 \n 3 / 3H 134 0 8.47 1.25 14.7 8.38 15.0 8.40 5.88 10.9 \n 4 / 4H 134 0 4.79 1.02 21.2 4.69 22.0 4.79 2.70 7.09 \n 8 / 8H 134 0 0.348 0.180 51.7 0.303 58.4 0.318 0.0760 0.866 \n 12 / 12H 134 0 0.0224 0.0189 84.6 0.0156 111.6 0.0170 0.00200 0.0830\n Day 2 \n 24 / 24H 134 134 0 0 NE NE NE 0 0 0 \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNE: Not Estimable\n\n\n\n\n\nCodelyt <- lyt_rows %>%\n analyze_vars_in_cols(\n vars = c(\"AVAL\", \"AVALCAT1\", rep(\"AVAL\", 8)),\n .stats = c(\"n\", \"n_blq\", \"mean\", \"sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"min\", \"max\"),\n .formats = c(\n n = \"xx.\", n_blq = \"xx.\", mean = format_sigfig(3), sd = format_sigfig(3), cv = \"xx.x\", median = format_sigfig(3),\n geom_mean = format_sigfig(3), geom_cv = \"xx.x\", min = format_sigfig(3), max = format_sigfig(3)\n ),\n .labels = c(\n n = \"n\", n_blq = \"Number\\nof\\nLTRs/BLQs\", mean = \"Mean\", sd = \"SD\", cv = \"CV (%) Mean\",\n geom_mean = \"Geometric Mean\", geom_cv = \"CV % Geometric Mean\", median = \"Median\", min = \"Minimum\", max = \"Maximum\"\n ),\n imp_rule = \"1/3\",\n .aligns = \"decimal\"\n )\n\nresult <- build_table(lyt, df = adpc_1, alt_counts_df = adsl) %>% prune_table()\n\n# Decorating\nmain_title(result) <- \"Summary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\"\nsubtitles(result) <- c(\n \"Protocol: xxxxx\",\n paste(\"Analyte: \", unique(adpc_1$PARAM)),\n paste(\"Treatment:\", unique(adpc_1$ACTARM))\n)\nmain_footer(result) <- c(\"NE: Not Estimable\", \"ND: Not Derived\")\n\nresult\n\nSummary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\nProtocol: xxxxx\nAnalyte: Plasma Drug X\nTreatment: A: Drug X\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Group Number \n Visit of \n Nominal Time (hr) / Timepoint n LTRs/BLQs Mean SD CV (%) Mean Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X (N=134) \n Day 1 \n 0 / Predose 134 134 ND ND ND NE ND 0 ND 0 \n 0.5 / 0.5H 134 0 12.6 1.51 12.0 12.5 12.2 12.6 9.72 15.6 \n 1 / 1H 134 0 16.2 1.63 10.0 16.1 10.1 16.2 12.6 19.9 \n 1.5 / 1.5H 134 0 15.6 1.46 9.3 15.6 9.3 15.5 12.3 19.0 \n 2 / 2H 134 0 13.4 1.35 10.1 13.4 10.0 13.3 10.8 16.5 \n 3 / 3H 134 0 8.47 1.25 14.7 8.38 15.0 8.40 5.88 10.9 \n 4 / 4H 134 0 4.79 1.02 21.2 4.69 22.0 4.79 2.70 7.09 \n 8 / 8H 134 0 0.348 0.180 51.7 0.303 58.4 0.318 0.0760 0.866 \n 12 / 12H 134 0 0.0224 0.0189 84.6 0.0156 111.6 0.0170 0.00200 0.0830\n Day 2 \n 24 / 24H 134 134 ND ND ND NE ND 0 ND 0 \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNE: Not Estimable\nND: Not Derived\n\n\n\n\n\nCodelyt <- lyt_rows %>%\n analyze_vars_in_cols(\n vars = c(\"AVAL\", \"AVALCAT1\", rep(\"AVAL\", 8)),\n .stats = c(\"n\", \"n_blq\", \"mean\", \"sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"min\", \"max\"),\n .formats = c(\n n = \"xx.\", n_blq = \"xx.\", mean = format_sigfig(3), sd = format_sigfig(3), cv = \"xx.x\", median = format_sigfig(3),\n geom_mean = format_sigfig(3), geom_cv = \"xx.x\", min = format_sigfig(3), max = format_sigfig(3)\n ),\n .labels = c(\n n = \"n\", n_blq = \"Number\\nof\\nLTRs/BLQs\", mean = \"Mean\", sd = \"SD\", cv = \"CV (%) Mean\",\n geom_mean = \"Geometric Mean\", geom_cv = \"CV % Geometric Mean\", median = \"Median\", min = \"Minimum\", max = \"Maximum\"\n ),\n imp_rule = \"1/2\",\n .aligns = \"decimal\"\n )\n\nresult <- build_table(lyt, df = adpc_1, alt_counts_df = adsl) %>% prune_table()\n\n# Decorate table\nmain_title(result) <- \"Summary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\"\nsubtitles(result) <- c(\n \"Protocol: xxxxx\",\n paste(\"Analyte: \", unique(adpc_1$PARAM)),\n paste(\"Treatment:\", unique(adpc_1$ACTARM))\n)\nmain_footer(result) <- \"ND: Not Derived\"\n\nresult\n\nSummary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\nProtocol: xxxxx\nAnalyte: Plasma Drug X\nTreatment: A: Drug X\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Group Number \n Visit of \n Nominal Time (hr) / Timepoint n LTRs/BLQs Mean SD CV (%) Mean Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X (N=134) \n Day 1 \n 0 / Predose 134 134 ND ND ND ND ND ND ND 0 \n 0.5 / 0.5H 134 0 12.6 1.51 12.0 12.5 12.2 12.6 9.72 15.6 \n 1 / 1H 134 0 16.2 1.63 10.0 16.1 10.1 16.2 12.6 19.9 \n 1.5 / 1.5H 134 0 15.6 1.46 9.3 15.6 9.3 15.5 12.3 19.0 \n 2 / 2H 134 0 13.4 1.35 10.1 13.4 10.0 13.3 10.8 16.5 \n 3 / 3H 134 0 8.47 1.25 14.7 8.38 15.0 8.40 5.88 10.9 \n 4 / 4H 134 0 4.79 1.02 21.2 4.69 22.0 4.79 2.70 7.09 \n 8 / 8H 134 0 0.348 0.180 51.7 0.303 58.4 0.318 0.0760 0.866 \n 12 / 12H 134 0 0.0224 0.0189 84.6 0.0156 111.6 0.0170 0.00200 0.0830\n Day 2 \n 24 / 24H 134 134 ND ND ND ND ND ND ND 0 \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nND: Not Derived\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:32:46 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\nout <- adsl %>%\n filter(DTHFL == \"Y\") %>%\n mutate(ID = paste(SITEID, SUBJID, sep = \"/\")) %>%\n select(ARM, ID, DTHCAUS)\ndeath_num <- length(unique(out$ID))\nvar_labels(out) <- c(\n ARM = \"Treatment Group\",\n ID = \"Center/Patient ID\",\n DTHCAUS = \"Cause of Death\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"ARM\"),\n disp_cols = names(out),\n main_title = \"Listing of Patients Who Died During Reporting Period\",\n subtitles = paste(\"Number of patient deaths during reporting period =\", death_num)\n)\n\nhead(lsting, 20)\n\nListing of Patients Who Died During Reporting Period\nNumber of patient deaths during reporting period = 70\n\n———————————————————————————————————————————————————————————————————\nTreatment Group Center/Patient ID Cause of Death \n———————————————————————————————————————————————————————————————————\n A: Drug X CHN-3/id-128 ADVERSE EVENT \n RUS-1/id-52 DISEASE PROGRESSION \n CHN-1/id-235 ADVERSE EVENT \n CHN-5/id-108 MISSING \n CHN-17/id-182 LOST TO FOLLOW UP \n BRA-11/id-217 ADVERSE EVENT \n CHN-15/id-14 DISEASE PROGRESSION \n CHN-2/id-274 SUICIDE \n USA-11/id-339 UNKNOWN \n BRA-15/id-36 DISEASE PROGRESSION \n CHN-1/id-199 DISEASE PROGRESSION \n CHN-2/id-272 DISEASE PROGRESSION \n CHN-1/id-123 DISEASE PROGRESSION \n CHN-12/id-258 SUICIDE \n CHN-17/id-92 LOST TO FOLLOW UP \n NGA-1/id-46 DISEASE PROGRESSION \n BRA-1/id-93 ADVERSE EVENT \n CHN-6/id-30 Post-study reporting of death\n CAN-11/id-139 ADVERSE EVENT \n GBR-1/id-319 ADVERSE EVENT \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:34:31 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Pharmacokinetic", - "PKCT01" + "Listings", + "Development Safety Update Report", + "DSUR4" ] }, { - "objectID": "tables/pharmacokinetic/pkpt04.html", - "href": "tables/pharmacokinetic/pkpt04.html", - "title": "PKPT04", + "objectID": "listings/ADA/adal02.html", + "href": "listings/ADA/adal02.html", + "title": "ADAL02", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>% filter(PPSPEC == \"Urine\", AVISIT == \"CYCLE 1 DAY 1\")\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_cols_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ARMCD\"),\n split_label = \"Treatment Arm\"\n ) %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\"\n ) %>%\n tern::analyze_vars(\n vars = \"AVAL\",\n .stats = c(\"n\", \"mean_sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"range\"),\n .formats = c(\n n = \"xx.\",\n mean_sd = format_sigfig(3, \"xx (xx)\"),\n cv = \"xx.x\",\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n median = format_sigfig(3),\n range = format_sigfig(3, \"xx - xx\")\n )\n )\n\n\nPlasma Drug X\n\n\nCodeadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\"Summary of\", unique(adpp0$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n———————————————————————————————————————————————————————————————\nPK Parameter ARM A ARM C \n———————————————————————————————————————————————————————————————\nAe (mg) \n n 268 264 \n Mean (SD) 1.55 (0.338) 1.54 (0.298) \n CV (%) 21.8 19.4 \n Geometric Mean 1.51 1.51 \n CV % Geometric Mean 23.0 20.3 \n Median 1.55 1.55 \n Min - Max 0.702 - 2.46 0.850 - 2.21 \nFe (%) \n n 268 264 \n Mean (SD) 15.7 (3.35) 16.1 (3.10) \n CV (%) 21.3 19.3 \n Geometric Mean 15.3 15.8 \n CV % Geometric Mean 22.2 20.2 \n Median 15.8 16.0 \n Min - Max 8.15 - 24.5 8.50 - 24.4 \nCLR (L/hr) \n n 134 132 \n Mean (SD) 0.0492 (0.00961) 0.0502 (0.0105) \n CV (%) 19.5 20.9 \n Geometric Mean 0.0482 0.0491 \n CV % Geometric Mean 21.0 21.9 \n Median 0.0491 0.0498 \n Min - Max 0.0249 - 0.0751 0.0251 - 0.0856 \nRENALCLD (L/hr/mg) \n n 134 132 \n Mean (SD) 0.00487 (0.000965) 0.00511 (0.000934)\n CV (%) 19.8 18.3 \n Geometric Mean 0.00477 0.00502 \n CV % Geometric Mean 21.2 19.7 \n Median 0.00497 0.00515 \n Min - Max 0.00238 - 0.00726 0.00236 - 0.00741 \n\n\nPlasma Drug Y\n\n\nCodeadpp1 <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp1)\nmain_title(result) <- paste(\"Summary of\", unique(adpp1$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp1$PPCAT), \"\\nVisit:\", unique(adpp1$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y \nVisit: CYCLE 1 DAY 1\n\n—————————————————————————————————————————\nPK Parameter ARM C \n—————————————————————————————————————————\nAe (mg) \n n 264 \n Mean (SD) 1.60 (0.315) \n CV (%) 19.7 \n Geometric Mean 1.56 \n CV % Geometric Mean 21.4 \n Median 1.60 \n Min - Max 0.857 - 2.26 \nFe (%) \n n 264 \n Mean (SD) 15.8 (3.08) \n CV (%) 19.4 \n Geometric Mean 15.5 \n CV % Geometric Mean 20.2 \n Median 15.7 \n Min - Max 8.31 - 23.8 \nCLR (L/hr) \n n 132 \n Mean (SD) 0.0497 (0.0101) \n CV (%) 20.3 \n Geometric Mean 0.0486 \n CV % Geometric Mean 22.0 \n Median 0.0491 \n Min - Max 0.0184 - 0.0776 \nRENALCLD (L/hr/mg) \n n 132 \n Mean (SD) 0.00509 (0.00103)\n CV (%) 20.3 \n Geometric Mean 0.00499 \n CV % Geometric Mean 21.4 \n Median 0.00502 \n Min - Max 0.00236 - 0.00794\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:32:25 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(rlistings)\nlibrary(scda)\n\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\") %>%\n filter(NFRLT %% 1 == 0 & NFRLT > 0)\n\ntrt <- \"A: Drug X\"\ndrug_a <- \"A: Drug X Antibody\"\ndrugcd <- unique(adab$PARAMCD[adab$PARAM == \"Antibody titer units\"])[1]\nmin_titer <- 1.10\n\nadab_x <- adab %>%\n filter(\n ARM == trt,\n PARCAT1 == drug_a,\n ADPBLPFL == \"Y\"\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU, -ARRLT, -NRRLT) %>%\n unique() %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n filter(if_any(matches(\"Treatment Emergent - Positive\"), ~ .x == 1)) %>%\n # filter(`Treatment Emergent - Positive` == 1) %>%\n mutate(\n VISN = factor(paste0(\n VISIT, \"\\n(Day \",\n ifelse(\n NFRLT %% 1 == 0,\n NFRLT,\n as.character(format(round(NFRLT, 2), nsmall = 2))\n ),\n \")\"\n )),\n PTES = ifelse(\n ifelse(\"Treatment induced ADA\" %in% names(.), `Treatment induced ADA` == 1, FALSE),\n ifelse(\n \"Transient ADA\" %in% names(.) & `Transient ADA` == 1,\n \"Induced (Transient)\",\n \"Induced (Persistent)\"\n ),\n \"Enhanced\"\n )\n ) %>%\n mutate(\n AVAL = paste0(\n ifelse(\n ifelse(\"ADA interpreted per sample result\" %in% names(.), `ADA interpreted per sample result` == 0, FALSE),\n \"NEGATIVE\",\n ifelse(\n ifelse(\"Antibody titer units\" %in% names(.), !is.na(`Antibody titer units`), FALSE),\n ifelse(\n `Antibody titer units` < min_titer,\n paste0(\"<\", format(min_titer, nsmall = 2)),\n as.character(format(round(`Antibody titer units`, 2), nsmall = 2))\n ),\n \"---\"\n )\n ),\n ifelse(\n ifelse(\"NAB interpreted per sample result\" %in% names(.), `NAB interpreted per sample result` == 1, FALSE),\n \"*\",\n \"\"\n )\n )\n )\n\nout <- adab_x %>%\n select(USUBJID, VISN, AVAL, PTES) %>%\n tidyr::pivot_wider(\n names_from = VISN,\n values_from = AVAL\n ) %>%\n select(USUBJID, unique(adab_x$VISN[order(adab_x$NFRLT)]), PTES)\n\nvar_labels(out) <- names(out)\n\nout <- out %>%\n var_relabel(\n USUBJID = \"Subject ID\",\n PTES = \"Patient Treatment\\nEmergent ADA Status\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = \"USUBJID\",\n disp_cols = names(out),\n main_title = paste0(\n \"Listing of Anti-\", drugcd, \" Antibody Data for Treatment Emergent ADA Positive Patients, PK Population\",\n \"\\nProtocol: \", unique(adab$PARCAT1)[1]\n ),\n subtitles = paste(\"\\nTreatment Group:\", trt),\n \n main_footer = \"Minimum reportable titer = 1.10 (example only)\n--- = No sample evaluated\nADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies)\nNumber of patients positive for Treatment Emergent ADA = the number of post-baseline evaluable patients determined to have treatment-induced ADA or treatment-enhanced ADA during the study period.\nTreatment-induced ADA = a patient with negative or missing baseline ADA result(s) and at least one positive post-baseline ADA result.\nTreatment-enhanced ADA = a patient with positive ADA result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\nTransient ADA = ADA positive result detected (a) at only one post-baseline sampling timepoint (excluding last timepoint) OR (b) at 2 or more timepoints during treatment where the first and last ADA positive samples are separated by a period of < 16 weeks, irrespective of any negative samples in between.\nPersistent ADA = ADA positive result detected (a) at the last post-baseline sampling timepoint, OR (b) at 2 or more time points during treatment where the first and last ADA positive samples are separated by a period ≥ 16 weeks, irrespective of any negative samples in between.\nAsterisk denotes sample that tested positive for Neutralizing Antibodies.\"\n \n)\n\nhead(lsting, 20)\n\nListing of Anti-R1800000 Antibody Data for Treatment Emergent ADA Positive Patients, PK Population\nProtocol: A: Drug X Antibody\n\nTreatment Group: A: Drug X\n\n—————————————————————————————————————————————————————\n Day 2 Patient Treatment \n Subject ID (Day 1) Emergent ADA Status\n—————————————————————————————————————————————————————\nAB12345-BRA-1-id-105 --- Enhanced \nAB12345-BRA-1-id-134 --- Enhanced \n AB12345-BRA-1-id-42 --- Enhanced \n AB12345-BRA-1-id-93 --- Enhanced \nAB12345-BRA-11-id-217 --- Enhanced \nAB12345-BRA-11-id-345 --- Enhanced \nAB12345-BRA-11-id-397 --- Enhanced \nAB12345-BRA-11-id-50 --- Enhanced \nAB12345-BRA-13-id-177 --- Enhanced \nAB12345-BRA-14-id-23 --- Enhanced \nAB12345-BRA-15-id-36 --- Enhanced \nAB12345-BRA-2-id-296 --- Enhanced \nAB12345-BRA-6-id-369 --- Enhanced \n AB12345-CAN-1-id-18 --- Enhanced \nAB12345-CAN-11-id-139 --- Enhanced \nAB12345-CAN-14-id-104 --- Enhanced \nAB12345-CHN-1-id-119 --- Enhanced \nAB12345-CHN-1-id-123 --- Enhanced \nAB12345-CHN-1-id-133 --- Enhanced \nAB12345-CHN-1-id-199 --- Enhanced \n—————————————————————————————————————————————————————\n\nMinimum reportable titer = 1.10 (example only)\n--- = No sample evaluated\nADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies)\nNumber of patients positive for Treatment Emergent ADA = the number of post-baseline evaluable patients determined to have treatment-induced ADA or treatment-enhanced ADA during the study period.\nTreatment-induced ADA = a patient with negative or missing baseline ADA result(s) and at least one positive post-baseline ADA result.\nTreatment-enhanced ADA = a patient with positive ADA result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\nTransient ADA = ADA positive result detected (a) at only one post-baseline sampling timepoint (excluding last timepoint) OR (b) at 2 or more timepoints during treatment where the first and last ADA positive samples are separated by a period of < 16 weeks, irrespective of any negative samples in between.\nPersistent ADA = ADA positive result detected (a) at the last post-baseline sampling timepoint, OR (b) at 2 or more time points during treatment where the first and last ADA positive samples are separated by a period ≥ 16 weeks, irrespective of any negative samples in between.\nAsterisk denotes sample that tested positive for Neutralizing Antibodies.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:34:22 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 rlistings_0.2.7.9012 tibble_3.2.1 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Pharmacokinetic", - "PKPT04" + "Listings", + "ADA", + "ADAL02" ] }, { - "objectID": "CODE_OF_CONDUCT.html#our-pledge", - "href": "CODE_OF_CONDUCT.html#our-pledge", - "title": "", - "section": "Our Pledge", - "text": "Our Pledge\nWe 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.\nWe pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community." - }, - { - "objectID": "CODE_OF_CONDUCT.html#our-standards", - "href": "CODE_OF_CONDUCT.html#our-standards", - "title": "", - "section": "Our Standards", - "text": "Our Standards\nExamples of behavior that contributes to a positive environment for our community include:\n\nDemonstrating empathy and kindness toward other people\nBeing respectful of differing opinions, viewpoints, and experiences\nGiving and gracefully accepting constructive feedback\nAccepting responsibility and apologizing to those affected by our mistakes, and learning from the experience\nFocusing on what is best not just for us as individuals, but for the overall community\n\nExamples of unacceptable behavior include:\n\nThe use of sexualized language or imagery, and sexual attention or advances of any kind\nTrolling, insulting or derogatory comments, and personal or political attacks\nPublic or private harassment\nPublishing others’ private information, such as a physical or email address, without their explicit permission\nOther conduct which could reasonably be considered inappropriate in a professional setting" - }, - { - "objectID": "CODE_OF_CONDUCT.html#enforcement-responsibilities", - "href": "CODE_OF_CONDUCT.html#enforcement-responsibilities", - "title": "", - "section": "Enforcement Responsibilities", - "text": "Enforcement Responsibilities\nCommunity 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.\nCommunity 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." - }, - { - "objectID": "CODE_OF_CONDUCT.html#scope", - "href": "CODE_OF_CONDUCT.html#scope", - "title": "", - "section": "Scope", - "text": "Scope\nThis 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." - }, - { - "objectID": "CODE_OF_CONDUCT.html#enforcement", - "href": "CODE_OF_CONDUCT.html#enforcement", - "title": "", - "section": "Enforcement", - "text": "Enforcement\nInstances 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.\nAll community leaders are obligated to respect the privacy and security of the reporter of any incident." - }, - { - "objectID": "CODE_OF_CONDUCT.html#enforcement-guidelines", - "href": "CODE_OF_CONDUCT.html#enforcement-guidelines", - "title": "", - "section": "Enforcement Guidelines", - "text": "Enforcement Guidelines\nCommunity leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:\n\n1. Correction\nCommunity Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.\nConsequence: 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.\n\n\n2. Warning\nCommunity Impact: A violation through a single incident or series of actions.\nConsequence: 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.\n\n\n3. Temporary Ban\nCommunity Impact: A serious violation of community standards, including sustained inappropriate behavior.\nConsequence: 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.\n\n\n4. Permanent Ban\nCommunity 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.\nConsequence: A permanent ban from any sort of public interaction within the community." - }, - { - "objectID": "CODE_OF_CONDUCT.html#attribution", - "href": "CODE_OF_CONDUCT.html#attribution", + "objectID": "test-utils/save_results.html", + "href": "test-utils/save_results.html", "title": "", - "section": "Attribution", - "text": "Attribution\nThis 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.\nCommunity Impact Guidelines were inspired by Mozilla’s code of conduct enforcement ladder.\nFor 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." + "section": "", + "text": "Codeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}" }, { - "objectID": "tlg-index.html", - "href": "tlg-index.html", - "title": "Index", + "objectID": "index.html", + "href": "index.html", + "title": "TLG Catalog ", "section": "", - "text": "Tables\n\nADA\n        ADAT01 – Baseline Prevalence and Incidence of Treatment Emergent ADA\n        ADAT02 – Summary of Patients with Treatment-Induced ADA\n        ADAT03 – Summary of Serum Concentrations at Timepoints Where ADA Samples Were Collected and Analyzed\n        ADAT04A – Baseline Prevalence and Incidence of Treatment Emergent NAbs\n        ADAT04B – Baseline Prevalence and Incidence of NAbs\n\n\nAdverse Events\n        AET01 – Safety Summary\n        AET01_AESI – Safety Summary (Adverse Events of Special Interest)\n        AET02 – Adverse Events\n        AET02_SMQ – Adverse Events by Standardized MedDRA Query\n        AET03 – Adverse Events by Greatest Intensity\n        AET04 – Adverse Events by Highest NCI CTCAE Grade\n        AET04_PI – Adverse Events Reported in \\(\\geq\\) 10% of Patients by Highest NCI CTCAE Grade\n        AET05 – Adverse Event Rate Adjusted for Patient-Years at Risk – First Occurrence\n        AET05_ALL – Adverse Event Rate Adjusted for Patient-Years at Risk – All Occurrences\n        AET06 – Adverse Events by Baseline Characteristic\n        AET06_SMQ – Adverse Events by Baseline Characteristic, by SMQ and Preferred Term\n        AET07 – Adverse Events Resulting in Death\n        AET09 – Adverse Events Related to Study Drug\n        AET09_SMQ – Adverse Events Related to Study Drug by Standardized MedDRA Query\n        AET10 – Most Common (\\(\\geq\\) 5%) Adverse Events\n\n\nConcomitant Medications\n        CMT01 – Concomitant Medications (GNEDrug Legacy Coding)\n        CMT01A – Concomitant Medications by Medication Class and Preferred Name\n        CMT01B – Concomitant Medications by Medication Class and Preferred Name\n        CMT02_PT – Concomitant Medications by Preferred Name (WHODrug Coding)\n\n\nDeaths\n        DTHT01 – Deaths\n\n\nDemography\n        DMT01 – Demographics and Baseline Characteristics\n\n\nDisclosures\n        DISCLOSUREST01 – Disclosures Outputs\n        EUDRAT01 – Non-Serious Adverse Events Reported in \\(\\geq\\) 5% of Patients in Any Treatment Group – Patients and Events\n        EUDRAT02 – Serious Adverse Events, Fatal Serious Adverse Events, and Serious Adverse Events Related to Study Medication\n\n\nDisposition\n        DST01 – Patient Disposition\n        PDT01 – Major Protocol Deviations\n        PDT02 – Major Protocol Deviations Related to Epidemic/Pandemic\n\n\nECG\n        EGT01 – ECG Results and Change from Baseline by Visit\n        EGT02 – ECG Abnormalities (EGT02_1 & EGT02_2)\n        EGT03 – Shift Table of ECG Interval Data – Baseline Versus Minimum/Maximum Post-Baseline\n        EGT04 – Shift Table of Qualitative ECG Assessments\n        EGT05_QTCAT – ECG Actual Values and Changes from Baseline by Visit\n\n\nEfficacy\n        AOVT01 – ANCOVA for Multiple End Points\n        AOVT02 – ANCOVA with Single End Point and Customized Table\n        AOVT03 – ANCOVA with Consideration of Interaction\n        CFBT01 – Efficacy Data and Change from Baseline by Visit\n        CMHT01 – Cochran-Mantel-Haenszel (CMH) Summary\n        COXT01 – Cox Regression\n        COXT02 – Multivariable Cox Regression\n        DORT01 – Duration of Response\n        LGRT02 – Multi-Variable Logistic Regression\n        MMRMT01 – Tables for Mixed-Effect Model Repeated Measures Analysis\n        ONCT05 – Objective Response Rate by Subgroup\n        RATET01 – Event Rate Summary for Recurrent Events\n        RBMIT01 – Tables for RBMI\n        RSPT01 – Best Overall Response\n        TTET01 – Time-To-Event Summary\n\n\nExposure\n        EXT01 – Study Drug Exposure Table\n\n\nLab Results\n        LBT01 – Laboratory Test Results and Change from Baseline by Visit\n        LBT02 – Laboratory Test Results by Visit\n        LBT03 – Laboratory Test Results Change from Baseline by Visit\n        LBT04 – Laboratory Abnormalities Not Present at Baseline\n        LBT05 – Laboratory Abnormalities with Single and Replicated Marked\n        LBT06 – Laboratory Abnormalities by Visit and Baseline Status\n        LBT07 – Laboratory Test Results with Highest NCI CTCAE Grade Post-Baseline\n        LBT08 – Laboratory Test Results with Highest NCI CTCAE Grade at Any Time\n        LBT09 – Liver Laboratory Tests – Patients with Elevated Post-Baseline AST or ALT Levels\n        LBT10 – Liver Laboratory Tests – Patients with Elevated Post-Baseline AST or ALT Levels at Two Consecutive Visits (with Respect to ULN)\n        LBT10_BL – Liver Laboratory Tests – Patients with Elevated Post-Baseline AST or ALT Levels at Two Consecutive Visits (with Respect to Baseline)\n        LBT11 – Time to First Increase in Liver Laboratory Test Result Meeting Hy’s Law Laboratory Critieria (with Respect to ULN)\n        LBT11_BL – Time to First Increase in Liver Laboratory Test Result Meeting Hy’s Law Laboratory Critieria (with Respect to Baseline)\n        LBT12 – Liver Laboratory Tests by Time on Treatment – Patients with Elevated Post-Baseline AST or ALT Levels (with Respect to ULN)\n        LBT12_BL – Liver Laboratory Tests by Time on Treatment – Patients with Elevated Post-Baseline AST or ALT Levels (with Respect to Baseline)\n        LBT13 – NCI CTCAE Grade Laboratory Abnormalities by Visit and Baseline Grade\n        LBT14 – Laboratory Test Results Shift Table – Highest NCI CTCAE Grade Post-Baseline by Baseline NCI CTCAE Grade\n        LBT15 – Laboratory Test Shifts to NCI CTCAE Grade 3-4 Post-Baseline\n\n\nMedical History\n        MHT01 – Medical History\n\n\nPharmacokinetic\n        PKCT01 – Summary Concentration Table\n        PKPT02 – Pharmacokinetic Parameter Summary – Plasma/Serum/Blood PK Parameters (Stats in Rows)\n        PKPT03 – Pharmacokinetic Parameter Summary of Plasma by Treatment (Stats in Columns)\n        PKPT04 – Pharmacokinetic Parameter Summary – Urine PK Parameters (Stats in Rows)\n        PKPT05 – Summary of Urinary PK Parameters by Treatment Arm (Stats in Columns)\n        PKPT06 – Pharmacokinetic Parameter Summary – Dose-Normalized PK Parameters (Stats in Rows)\n        PKPT07 – Table of Mean Dose-Normalized Selected Pharmacokinetic Parameters (Stats in Columns)\n        PKPT08 – Pharmacokinetic Parameter Summary of Cumulative Amount of Drug Eliminated and Cumulative Percentage of Drug Recovered (Stats in Columns)\n        PKPT11 – Pharmacokinetic Parameter Estimated Ratios of Geometric Means and 90% Confidence Intervals for AUC and CMAX\n\n\nRisk Management Plan\n        RMPT01 – Duration of Exposure for Risk Management Plan\n        RMPT03 – Extent of Exposure by Age Group and Gender for Risk Management Plan\n        RMPT04 – Extent of Exposure by Ethnic Origin for Risk Management Plan\n        RMPT05 – Extent of Exposure by Race for Risk Management Plan\n        RMPT06 – Seriousness, Outcomes, Severity, Frequency with 95% CI for Risk Management Plan\n\n\nSafety\n        ENTXX – Enrollment Variants\n\n\nVital Signs\n        VST01 – Vital Sign Results and Change from Baseline by Visit\n        VST02 – Vital Sign Abnormalities\n\n\n\n\nListings\n\nADA\n        ADAL02 – Listing of Anti-Drug Antibody Data for Treatment Emergent ADA Positive Patients\n\n\nAdverse Events\n        AEL01 – Listing of Preferred Terms, Lowest Level Terms, and Investigator-Specified Adverse Event Terms\n        AEL01_NOLLT – Listing of Preferred Terms and Investigator-Specified Adverse Event Terms\n        AEL02 – Listing of Adverse Events\n        AEL02_ED – Listing of Adverse Events (for Early Development Studies)\n        AEL03 – Listing of Serious Adverse Events\n        AEL04 – Listing of Patient Deaths\n\n\nConcomitant Medications\n        CML01 – Listing of Previous and Concomitant Medications\n        CML02A_GL – Listing of Concomitant Medication Class Level 2, Preferred Name, and Investigator-Specified Terms\n        CML02B_GL – Listing of Concomitant Medication Class, Preferred Name, and Investigator-Specified Terms\n\n\nDisposition\n        DSL01 – Listing of Patients with Study Drug Withdrawn Due to Adverse Events\n        DSL02 – Listing of Patients Who Discontinued Early from Study\n\n\nDevelopment Safety Update Report\n        DSUR4 – Listing of Patients Who Died During Reporting Period\n\n\nECG\n        EGL01 – Listing of ECG Data: Safety-Evaluable Patients\n\n\nExposure\n        EXL01 – Listing of Exposure to Study Drug\n\n\nLab Results\n        LBL01 – Listing of Laboratory Test Results\n        LBL01_RLS – Listing of Laboratory Test Results Using Roche Safety Lab Standardization\n        LBL02A – Listing of Laboratory Abnormalities (constant units)\n        LBL02A_RLS – Listing of Laboratory Abnormalities Defined by Roche Safety Lab Standardization\n        LBL02B – Listing of Laboratory Abnormalities (variable units)\n\n\nMedical History\n        MHL01 – Listing of Medical History and Concurrent Diseases\n\n\nPharmacokinetic\n        PKCL01 – Listing of Drug A Concentration by Treatment Group, Patient and Nominal Time\n        PKCL02 – Listing of Drug A Urine Concentration and Volumes\n        PKPL01 – Listing of Drug A Plasma PK Parameters\n        PKPL02 – Listing of Drug A Urine PK Parameters\n        PKPL04 – Listing of Individual Drug A AUCIFO and CMAX Ratios Following Drug A or Drug B\n\n\nVital Signs\n        VSL01 – Listing of Vital Signs: Safety-Evaluable Patients\n\n\n\n\nGraphs\n\nEfficacy\n        FSTG01 – Subgroup Analysis of Best Overall Response\n        FSTG02 – Subgroup Analysis of Survival Duration\n        KMG01 – Kaplan-Meier Plot\n        MMRMG01 – Plots for Mixed-Effect Model Repeated Measures Analysis\n        MMRMG02 – Forest Plot for Mixed-Effect Model Repeated Measures\n\n\nPharmacokinetic\n        PKCG01 – Plot of PK Concentration Over Time by Subject\n        PKCG02 – Plot of PK Concentration Over Time by Cohort/Treatment Group/Dose\n        PKCG03 – Plot of Mean PK Concentration Over Time by Cohort\n        PKPG01 – Plot of Mean Cumulative Percentage (%) of Recovered Drug in Urine\n        PKPG02 – Pharmacokinetic Parameter Summary of Serum PK Parameters by Treatment\n        PKPG03 – Box Plot of Pharmacokinetic Parameters by Visit – Plasma\n        PKPG04 – Box Plot of Pharmacokinetic Parameters by Visit – Plasma\n        PKPG06 – Boxplot of Metabolite to Parent Ratios by Treatment\n\n\nOther\n        BRG01 – Bar Chart\n        BWG01 – Box Plot\n        CIG01 – Confidence Interval Plot\n        IPPG01 – Individual Patient Plot Over Time\n        LTG01 – Lattice Plot of Laboratory Tests by Treatment Group Over Time\n        MNG01 – Mean Plot", + "text": "The TLG catalog is a catalog of Tables, Listings, and Graphs for clinical trials generated using NEST packages.\nThis repository provides a comprehensive collection of clinical trials outputs generated using the R language. The target audience is the clinical trials community, including statisticians, data scientists, and other professionals interested in applying R to clinical trials data.\n\n\nEach TLG is represented on a separate article page, typically including the following sections:\n\nSetup and pre-processing of synthetic data.\nSteps to produce the TLG.\nThe output TLG generated by the given code (including any available variants).\nAn interactive application that can alternatively be used to produce and interact with the TLG.\nReproducibility information.\n\nSee the full list of available TLGs on the Index page.\n\n\n\n\nThe full source code of each article can be viewed by clicking on the “Source Code” button at the top of the page and copied using the “Copy to Clipboard” button.\n\n\n\nIndividual code chunks from within the article can also be viewed and copied.\n\n\n\nThe Reproducibility tab contains session information and allows one to install the packages required to properly run the code.\n\n\n\n\n\n\n\n\nThis catalog as well as code examples are licensed under the Apache License, Version 2.0 - see the LICENSE file for details.\n\n\n\nWe welcome contributions big and small to the TLG catalog. Please refer to the Contributing guide for more information on how you can contribute. Use the giscus panels at the bottom of each page to share your feedback & ideas, ask questions, and report issues.\n\n\n\nThis website is built using Quarto and hosted on GitHub Pages. This website is rebuilt and republished daily as well as every time a change is pushed to the repository as part of the CI/CD process.\nThe catalog is rendered using “Stable” and “Development” profiles. The main difference between these two profiles is the package versions used to generate the outputs. The “Stable” profile uses the most recently released versions of all packages, whereas the “Development” profile uses the latest development versions of all NEST packages. This means that the same R code (e.g. foo::bar()) would be run using both the latest released and development package versions (e.g. foo@v1.2.3 on the “Stable” profile and foo@v1.2.3.9123 on the “Development” profile). If your article is affected by API changes between released and development versions, please consider conditional content (checking QUARTO_PROFILE environment variable) and/or if statements on respective package versions to enable the article to work in both profiles.\nAs a part of the CI/CD process, each article’s code is checked for quality, coherence, and readability using tools such as lintr, styler, and spelling. Additionally, regression testing is performed using testthat snapshot testing (see the package component of the repository for more details).\nIf you are adding a new table, listing, or graph in the form a new .qmd file, then you will also need to update the index in the tlg-index.qmd file with the new file name. To do so, run the R code in the generate-index.R file after creating your template.", "crumbs": [ - "Index" + "Introduction" ] }, { - "objectID": "tables/pharmacokinetic/pkpt05.html", - "href": "tables/pharmacokinetic/pkpt05.html", - "title": "PKPT05", + "objectID": "index.html#usage", + "href": "index.html#usage", + "title": "TLG Catalog ", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>% filter(PPSPEC == \"Urine\", AVISIT == \"CYCLE 1 DAY 1\")\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_rows_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ARMCD\"),\n label_pos = \"topleft\",\n split_label = \"Treatment Arm\"\n ) %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\",\n child_labels = \"hidden\"\n ) %>%\n analyze_vars_in_cols(\n vars = \"AVAL\",\n .stats = c(\n \"n\", \"mean\", \"sd\", \"cv\",\n \"geom_mean\", \"geom_cv\", \"median\",\n \"min\", \"max\"\n ),\n .labels = c(\n n = \"n\",\n mean = \"Mean\",\n sd = \"SD\",\n cv = \"CV (%)\",\n geom_mean = \"Geometric Mean\",\n geom_cv = \"CV % Geometric Mean\",\n median = \"Median\",\n min = \"Minimum\",\n max = \"Maximum\"\n ),\n .formats = c(\n n = \"xx.\",\n mean = format_sigfig(3),\n sd = format_sigfig(3),\n cv = \"xx.x\",\n median = format_sigfig(3),\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n min = format_sigfig(3),\n max = format_sigfig(3)\n )\n )\n\n\nPlasma Drug X\n\n\nCodeadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\"Summary of\", unique(adpp0$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A \n Ae (mg) 268 1.55 0.338 21.8 1.51 23.0 1.55 0.702 2.46 \n Fe (%) 268 15.7 3.35 21.3 15.3 22.2 15.8 8.15 24.5 \n CLR (L/hr) 134 0.0492 0.00961 19.5 0.0482 21.0 0.0491 0.0249 0.0751 \n RENALCLD (L/hr/mg) 134 0.00487 0.000965 19.8 0.00477 21.2 0.00497 0.00238 0.00726\nARM C \n Ae (mg) 264 1.54 0.298 19.4 1.51 20.3 1.55 0.850 2.21 \n Fe (%) 264 16.1 3.10 19.3 15.8 20.2 16.0 8.50 24.4 \n CLR (L/hr) 132 0.0502 0.0105 20.9 0.0491 21.9 0.0498 0.0251 0.0856 \n RENALCLD (L/hr/mg) 132 0.00511 0.000934 18.3 0.00502 19.7 0.00515 0.00236 0.00741\n\n\nPlasma Drug Y\n\n\nCodeadpp1 <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp1)\nmain_title(result) <- paste(\"Summary of\", unique(adpp1$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp1$PPCAT), \"\\nVisit:\", unique(adpp1$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y \nVisit: CYCLE 1 DAY 1\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM C \n Ae (mg) 264 1.60 0.315 19.7 1.56 21.4 1.60 0.857 2.26 \n Fe (%) 264 15.8 3.08 19.4 15.5 20.2 15.7 8.31 23.8 \n CLR (L/hr) 132 0.0497 0.0101 20.3 0.0486 22.0 0.0491 0.0184 0.0776 \n RENALCLD (L/hr/mg) 132 0.00509 0.00103 20.3 0.00499 21.4 0.00502 0.00236 0.00794\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:32:19 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Each TLG is represented on a separate article page, typically including the following sections:\n\nSetup and pre-processing of synthetic data.\nSteps to produce the TLG.\nThe output TLG generated by the given code (including any available variants).\nAn interactive application that can alternatively be used to produce and interact with the TLG.\nReproducibility information.\n\nSee the full list of available TLGs on the Index page.\n\n\n\n\nThe full source code of each article can be viewed by clicking on the “Source Code” button at the top of the page and copied using the “Copy to Clipboard” button.\n\n\n\nIndividual code chunks from within the article can also be viewed and copied.\n\n\n\nThe Reproducibility tab contains session information and allows one to install the packages required to properly run the code.", "crumbs": [ - "Tables", - "Pharmacokinetic", - "PKPT05" + "Introduction" ] }, { - "objectID": "tables/pharmacokinetic/pkpt03.html", - "href": "tables/pharmacokinetic/pkpt03.html", - "title": "PKPT03", + "objectID": "index.html#license", + "href": "index.html#license", + "title": "TLG Catalog ", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\n# Preprocess analysis data ----\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>%\n filter(PPSPEC == \"Plasma\") %>%\n filter(AVISIT %in% c(\"CYCLE 1 DAY 1\", \"CYCLE 1 DAY 2\")) %>%\n h_pkparam_sort() %>%\n mutate(PARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PARAM = reorder(PARAM, TLG_ORDER))\n\n# Preprocess subject-level data ----\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# Workaround needed to include (N=xx) population counts\n# Repeat ADSL by the number of levels in AVISIT\n# Include AVISIT and dummy PARAM as it's needed for trim_levels_in_group\nadsl_tmp <- adsl %>%\n select(STUDYID, USUBJID, ARMCD) %>%\n unique() %>%\n mutate(PARAM = factor(NA_character_, levels = levels(adpp$PARAM)))\n\n# Data for Plasma Drug X example ----\nadpp_x <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n # Please do not replicate mutate statement below!\n # It is used to make the random data in this example more realistic\n # as not all parameters are always available across all visits.\n mutate(\n AVAL = if_else(\n ARMCD == \"ARM A\" & AVISIT == \"CYCLE 1 DAY 1\" & PARAM == \"Cmax (ug/mL)\",\n NA_real_, AVAL\n )\n )\n\nadpp_x_tmp <- adpp_x %>%\n select(STUDYID, USUBJID, ARMCD, AVISIT) %>%\n unique()\n\nadsl_x_splitvars <- adsl_tmp %>%\n left_join(adpp_x_tmp, by = c(\"STUDYID\", \"USUBJID\", \"ARMCD\")) %>%\n filter(!is.na(AVISIT))\n\n# Data for Plasma Drug Y example ----\nadpp_y <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\")\n\nadpp_y_tmp <- adpp_y %>%\n select(STUDYID, USUBJID, ARMCD, AVISIT) %>%\n unique()\n\nadsl_y_splitvars <- adsl_tmp %>%\n left_join(adpp_y_tmp, by = c(\"STUDYID\", \"USUBJID\", \"ARMCD\")) %>%\n filter(!is.na(AVISIT))\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_rows_by(\n var = \"AVISIT\",\n split_fun = drop_split_levels,\n split_label = \"Visit\",\n page_by = TRUE\n ) %>%\n split_rows_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"PARAM\"),\n label_pos = \"topleft\",\n split_label = \"Treatment Arm\"\n ) %>%\n add_rowcounts(alt_counts = TRUE) %>%\n split_rows_by(\n var = \"PARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\",\n child_labels = \"hidden\"\n ) %>%\n analyze_vars_in_cols(\n vars = \"AVAL\",\n .stats = c(\n \"n\", \"mean\", \"sd\", \"cv\",\n \"geom_mean\", \"geom_cv\", \"median\",\n \"min\", \"max\"\n ),\n .labels = c(\n n = \"n\",\n mean = \"Mean\",\n sd = \"SD\",\n cv = \"CV (%)\",\n geom_mean = \"Geometric Mean\",\n geom_cv = \"CV % Geometric Mean\",\n median = \"Median\",\n min = \"Minimum\",\n max = \"Maximum\"\n ),\n .formats = c(\n n = \"xx.\",\n mean = format_sigfig(3),\n sd = format_sigfig(3),\n cv = \"xx.x\",\n median = format_sigfig(3),\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n min = format_sigfig(3),\n max = format_sigfig(3)\n ),\n na_str = \"NE\"\n )\n\n\nPlasma Drug X\n\nCoderesult <- build_table(lyt, df = adpp_x, alt_counts_df = adsl_x_splitvars)\nmain_title(result) <- paste(\"Summary of\", unique(adpp_x$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp_x$PPCAT))\nresult <- paginate_table(result, landscape = TRUE)\nresult\n\n$`CYCLE 1 DAY 1`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X\nVisit: CYCLE 1 DAY 1\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n Cmax (ug/mL) 0 NE NE NE NE NE NE NE NE \n AUCinf obs (day*ug/mL) 134 203 37.7 18.6 199 18.7 197 125 311 \n CL obs (ml/day/kg) 134 5.04 1.04 20.6 4.93 22.4 5.08 2.25 7.39 \nARM C (N=132) \n Cmax (ug/mL) 132 30.0 5.46 18.2 29.5 18.9 29.8 15.9 47.6 \n AUCinf obs (day*ug/mL) 132 195 37.8 19.4 192 20.1 196 103 315 \n CL obs (ml/day/kg) 132 5.01 0.985 19.7 4.91 21.1 4.97 2.10 7.49 \n\n$`CYCLE 1 DAY 2`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X\nVisit: CYCLE 1 DAY 2\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n Cmax (ug/mL) 134 29.4 6.22 21.2 28.6 24.4 29.8 10.1 43.5 \n AUCinf obs (day*ug/mL) 134 202 41.2 20.4 197 21.4 200 105 294 \n CL obs (ml/day/kg) 134 5.04 1.04 20.7 4.92 22.6 5.01 2.39 7.18 \nARM C (N=132) \n Cmax (ug/mL) 132 30.4 6.03 19.9 29.7 21.7 30.5 12.4 45.5 \n AUCinf obs (day*ug/mL) 132 191 43.0 22.5 186 24.7 189 74.8 296 \n CL obs (ml/day/kg) 132 5.07 1.07 21.1 4.96 22.4 5.01 2.48 7.50 \n\n\nPlasma Drug X: Remove Rows with 0s\n\nCoderesult <- build_table(lyt, df = adpp_x, alt_counts_df = adsl_x_splitvars) %>%\n prune_table()\n\nmain_title(result) <- paste(\"Summary of\", unique(adpp_x$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp_x$PPCAT))\nresult <- paginate_table(result, landscape = TRUE)\nresult\n\n$`CYCLE 1 DAY 1`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X\nVisit: CYCLE 1 DAY 1\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n AUCinf obs (day*ug/mL) 134 203 37.7 18.6 199 18.7 197 125 311 \n CL obs (ml/day/kg) 134 5.04 1.04 20.6 4.93 22.4 5.08 2.25 7.39 \nARM C (N=132) \n Cmax (ug/mL) 132 30.0 5.46 18.2 29.5 18.9 29.8 15.9 47.6 \n AUCinf obs (day*ug/mL) 132 195 37.8 19.4 192 20.1 196 103 315 \n CL obs (ml/day/kg) 132 5.01 0.985 19.7 4.91 21.1 4.97 2.10 7.49 \n\n$`CYCLE 1 DAY 2`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X\nVisit: CYCLE 1 DAY 2\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n Cmax (ug/mL) 134 29.4 6.22 21.2 28.6 24.4 29.8 10.1 43.5 \n AUCinf obs (day*ug/mL) 134 202 41.2 20.4 197 21.4 200 105 294 \n CL obs (ml/day/kg) 134 5.04 1.04 20.7 4.92 22.6 5.01 2.39 7.18 \nARM C (N=132) \n Cmax (ug/mL) 132 30.4 6.03 19.9 29.7 21.7 30.5 12.4 45.5 \n AUCinf obs (day*ug/mL) 132 191 43.0 22.5 186 24.7 189 74.8 296 \n CL obs (ml/day/kg) 132 5.07 1.07 21.1 4.96 22.4 5.01 2.48 7.50 \n\n\nPlasma Drug Y\n\nCoderesult <- build_table(lyt, df = adpp_y, alt_counts_df = adsl_y_splitvars)\nmain_title(result) <- paste(\"Summary of\", unique(adpp_y$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp_y$PPCAT))\nresult <- paginate_table(result, landscape = TRUE)\nresult\n\n$`CYCLE 1 DAY 1`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y\nVisit: CYCLE 1 DAY 1\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM C (N=132) \n Cmax (ug/mL) 132 29.9 5.55 18.6 29.4 20.1 29.7 14.1 43.4 \n AUCinf obs (day*ug/mL) 132 199 37.9 19.1 195 18.9 195 126 318 \n CL obs (ml/day/kg) 132 4.96 0.895 18.1 4.87 18.7 4.94 2.99 7.21 \n\n$`CYCLE 1 DAY 2`\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y\nVisit: CYCLE 1 DAY 2\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM C (N=132) \n Cmax (ug/mL) 132 30.7 6.12 19.9 30.1 21.9 31.4 12.9 48.3 \n AUCinf obs (day*ug/mL) 132 199 40.0 20.1 194 22.2 197 79.2 295 \n CL obs (ml/day/kg) 132 4.99 0.984 19.7 4.89 20.9 4.96 2.58 8.39 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:32:38 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "This catalog as well as code examples are licensed under the Apache License, Version 2.0 - see the LICENSE file for details.", "crumbs": [ - "Tables", - "Pharmacokinetic", - "PKPT03" + "Introduction" ] }, { - "objectID": "tables/pharmacokinetic/pkpt08.html", - "href": "tables/pharmacokinetic/pkpt08.html", - "title": "PKPT08", + "objectID": "index.html#contributing", + "href": "index.html#contributing", + "title": "TLG Catalog ", "section": "", - "text": "Data Setup\nStandard Table – Plasma\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(tern)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\nadpp <- adpp %>%\n filter(PPSTINT != \"NA\" & PPENINT != \"NA\") %>%\n mutate(PPINT = factor(paste0(gsub(\"[PH]\", \"\", PPSTINT), \"-\", gsub(\"[PH]\", \"\", PPENINT))))\n\n\n\n\n\n\nCode# create layout\nlyt <- basic_table() %>%\n add_overall_col(\"Accumulation Interval (hours)\") %>%\n split_cols_by(var = \"PPINT\") %>%\n split_cols_by(var = \"PKPARAM\") %>%\n split_rows_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ACTARM\"),\n label_pos = \"topleft\",\n split_label = \"Treatment Arm\"\n ) %>%\n analyze_vars(\n vars = \"AVAL\",\n .stats = c(\n \"n\", \"mean\", \"sd\", \"cv\",\n \"median\", \"min\", \"max\"\n ),\n .labels = c(\n n = \"n\",\n mean = \"Mean\",\n sd = \"SD\",\n cv = \"CV (%)\",\n median = \"Median\",\n min = \"Minimum\",\n max = \"Maximum\"\n ),\n .formats = c(\n n = \"xx.\",\n mean = format_sigfig(3),\n sd = format_sigfig(3),\n cv = \"xx.x\",\n median = format_sigfig(3),\n min = format_sigfig(3),\n max = format_sigfig(3)\n )\n )\n\nadpp0 <- adpp %>%\n filter(\n AVISIT == \"CYCLE 1 DAY 1\",\n PPCAT == \"Plasma Drug X\"\n ) %>%\n h_pkparam_sort() %>%\n mutate(\n PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))\n )\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\n \"Summary of Cumulative Amount and Percentage of\", unique(adpp0$PPSPEC), \"Recovered from\\n\",\n unique(adpp0$PPCAT), \"following\", unique(adpp0$REGIMEN), \"Administration for\",\n unique(adpp0$PPINT)[length(unique(adpp0$PPINT))], \"hours, PK Population\"\n)\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\n\ncat(rtables::toString(result, indent_size = 10))\n\nSummary of Cumulative Amount and Percentage of Urine Recovered from\n Plasma Drug X following BID Administration for 0-24 hours, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n——————————————————————————————————————————————————————————\n Accumulation Interval (hours) \n 0-12 0-24 \nTreatment Arm Ae (mg) Fe (%) Ae (mg) Fe (%)\n——————————————————————————————————————————————————————————\nARM A \n n 134 134 134 134 \n Mean 1.55 15.7 1.55 15.7 \n SD 0.339 3.35 0.339 3.35 \n CV (%) 21.9 21.4 21.9 21.4 \n Median 1.55 15.8 1.55 15.8 \n Minimum 0.702 8.15 0.702 8.15 \n Maximum 2.46 24.5 2.46 24.5 \nARM C \n n 132 132 132 132 \n Mean 1.54 16.1 1.54 16.1 \n SD 0.298 3.11 0.298 3.11 \n CV (%) 19.4 19.3 19.4 19.3 \n Median 1.55 16.0 1.55 16.0 \n Minimum 0.850 8.50 0.850 8.50 \n Maximum 2.21 24.4 2.21 24.4 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:32:52 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "We welcome contributions big and small to the TLG catalog. Please refer to the Contributing guide for more information on how you can contribute. Use the giscus panels at the bottom of each page to share your feedback & ideas, ask questions, and report issues.", "crumbs": [ - "Tables", - "Pharmacokinetic", - "PKPT08" + "Introduction" ] }, { - "objectID": "tables/pharmacokinetic/pkpt02.html", - "href": "tables/pharmacokinetic/pkpt02.html", - "title": "PKPT02", + "objectID": "index.html#development", + "href": "index.html#development", + "title": "TLG Catalog ", "section": "", - "text": "Data Setup\nStandard Table – Plasma\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>% filter(PPSPEC == \"Plasma\", AVISIT == \"CYCLE 1 DAY 1\")\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_cols_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ARMCD\"),\n split_label = \"Treatment Arm\"\n ) %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\"\n ) %>%\n tern::analyze_vars(\n vars = \"AVAL\",\n .stats = c(\"n\", \"mean_sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"range\"),\n .formats = c(\n n = \"xx.\",\n mean_sd = format_sigfig(3, \"xx (xx)\"),\n cv = \"xx.x\",\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n median = format_sigfig(3),\n range = format_sigfig(3, \"xx - xx\")\n )\n )\n\n\nPlasma Drug X\n\n\nCodeadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\"Summary of\", unique(adpp0$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\nresult\n\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n———————————————————————————————————————————————————\nPK Parameter ARM A ARM C \n———————————————————————————————————————————————————\nCmax (ug/mL) \n n 134 132 \n Mean (SD) 30.2 (6.24) 30.0 (5.46) \n CV (%) 20.6 18.2 \n Geometric Mean 29.6 29.5 \n CV % Geometric Mean 21.0 18.9 \n Median 29.9 29.8 \n Min - Max 17.5 - 48.7 15.9 - 47.6 \nAUCinf obs (day*ug/mL) \n n 134 132 \n Mean (SD) 203 (37.7) 195 (37.8) \n CV (%) 18.6 19.4 \n Geometric Mean 199 192 \n CV % Geometric Mean 18.7 20.1 \n Median 197 196 \n Min - Max 125 - 311 103 - 315 \nCL obs (ml/day/kg) \n n 134 132 \n Mean (SD) 5.04 (1.04) 5.01 (0.985)\n CV (%) 20.6 19.7 \n Geometric Mean 4.93 4.91 \n CV % Geometric Mean 22.4 21.1 \n Median 5.08 4.97 \n Min - Max 2.25 - 7.39 2.10 - 7.49 \n\n\nPlasma Drug Y\n\n\nCodeadpp1 <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp1)\nmain_title(result) <- paste(\"Summary of\", unique(adpp1$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp1$PPCAT), \"\\nVisit:\", unique(adpp1$AVISIT))\nresult\n\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y \nVisit: CYCLE 1 DAY 1\n\n—————————————————————————————————————\nPK Parameter ARM C \n—————————————————————————————————————\nCmax (ug/mL) \n n 132 \n Mean (SD) 29.9 (5.55) \n CV (%) 18.6 \n Geometric Mean 29.4 \n CV % Geometric Mean 20.1 \n Median 29.7 \n Min - Max 14.1 - 43.4 \nAUCinf obs (day*ug/mL) \n n 132 \n Mean (SD) 199 (37.9) \n CV (%) 19.1 \n Geometric Mean 195 \n CV % Geometric Mean 18.9 \n Median 195 \n Min - Max 126 - 318 \nCL obs (ml/day/kg) \n n 132 \n Mean (SD) 4.96 (0.895)\n CV (%) 18.1 \n Geometric Mean 4.87 \n CV % Geometric Mean 18.7 \n Median 4.94 \n Min - Max 2.99 - 7.21 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:33:03 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "This website is built using Quarto and hosted on GitHub Pages. This website is rebuilt and republished daily as well as every time a change is pushed to the repository as part of the CI/CD process.\nThe catalog is rendered using “Stable” and “Development” profiles. The main difference between these two profiles is the package versions used to generate the outputs. The “Stable” profile uses the most recently released versions of all packages, whereas the “Development” profile uses the latest development versions of all NEST packages. This means that the same R code (e.g. foo::bar()) would be run using both the latest released and development package versions (e.g. foo@v1.2.3 on the “Stable” profile and foo@v1.2.3.9123 on the “Development” profile). If your article is affected by API changes between released and development versions, please consider conditional content (checking QUARTO_PROFILE environment variable) and/or if statements on respective package versions to enable the article to work in both profiles.\nAs a part of the CI/CD process, each article’s code is checked for quality, coherence, and readability using tools such as lintr, styler, and spelling. Additionally, regression testing is performed using testthat snapshot testing (see the package component of the repository for more details).\nIf you are adding a new table, listing, or graph in the form a new .qmd file, then you will also need to update the index in the tlg-index.qmd file with the new file name. To do so, run the R code in the generate-index.R file after creating your template.", "crumbs": [ - "Tables", - "Pharmacokinetic", - "PKPT02" + "Introduction" ] }, { - "objectID": "tables/pharmacokinetic/pkpt06.html", - "href": "tables/pharmacokinetic/pkpt06.html", - "title": "PKPT06", + "objectID": "listings/efficacy/oncl01.html", + "href": "listings/efficacy/oncl01.html", + "title": "ONCL01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\nlibrary(stringr)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>%\n filter(AVISIT == \"CYCLE 1 DAY 1\", str_detect(tolower(PARAM), regex(\"norm by dose\", ignore_case = TRUE)))\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_cols_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ARMCD\"),\n split_label = \"Treatment Arm\"\n ) %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\"\n ) %>%\n tern::analyze_vars(\n vars = \"AVAL\",\n .stats = c(\"n\", \"mean_sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"range\"),\n .formats = c(\n n = \"xx.\",\n mean_sd = format_sigfig(3, \"xx (xx)\"),\n cv = \"xx.x\",\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n median = format_sigfig(3),\n range = format_sigfig(3, \"xx - xx\")\n )\n )\n\n\nPlasma Drug X\n\n\nCodeadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\"Summary of Dose-Normalized PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\nresult\n\nSummary of Dose-Normalized PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n———————————————————————————————————————————————————————————————\nPK Parameter ARM A ARM C \n———————————————————————————————————————————————————————————————\nRENALCLD (L/hr/mg) \n n 134 132 \n Mean (SD) 0.00487 (0.000965) 0.00511 (0.000934)\n CV (%) 19.8 18.3 \n Geometric Mean 0.00477 0.00502 \n CV % Geometric Mean 21.2 19.7 \n Median 0.00497 0.00515 \n Min - Max 0.00238 - 0.00726 0.00236 - 0.00741 \n\n\nPlasma Drug Y\n\n\nCodeadpp1 <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp1)\nmain_title(result) <- paste(\"Summary of Dose-Normalized PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp1$PPCAT), \"\\nVisit:\", unique(adpp1$AVISIT))\nresult\n\nSummary of Dose-Normalized PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y \nVisit: CYCLE 1 DAY 1\n\n—————————————————————————————————————————\nPK Parameter ARM C \n—————————————————————————————————————————\nRENALCLD (L/hr/mg) \n n 132 \n Mean (SD) 0.00509 (0.00103)\n CV (%) 20.3 \n Geometric Mean 0.00499 \n CV % Geometric Mean 21.4 \n Median 0.00502 \n Min - Max 0.00236 - 0.00794\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:33:14 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] stringr_1.5.1 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9016 dplyr_1.1.4 \n[7] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadrs <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\nout_ex <- adex %>%\n filter(PARAMCD == \"TNDOSE\") %>%\n mutate(ID = paste(SITEID, SUBJID, sep = \"/\")) %>%\n select(ID, AVAL)\n\nout_rs <- adrs %>%\n filter(PARAM %in% c(\"Investigator End Of Induction Response\", \"Best Confirmed Overall Response by Investigator\")) %>%\n mutate(ID = paste(SITEID, SUBJID, sep = \"/\")) %>%\n select(ID, AVALC, PARAM) %>%\n tidyr::pivot_wider(\n id_cols = ID,\n names_from = PARAM,\n values_from = AVALC\n ) %>%\n right_join(out_ex, ., by = \"ID\", multiple = \"all\")\n\nadtte_flt <- adtte %>%\n filter(PARAMCD %in% c(\"OS\", \"PFS\", \"CRSD\")) %>%\n mutate(\n PARAM = paste(PARAM, paste0(\"(\", AVALU, \")\"), sep = \" \"), ID = paste(SITEID, SUBJID, sep = \"/\"),\n trigeventpfs = ifelse(CNSR == 0, EVNTDESC, NA)\n )\n\n# Select triggering event variable\nout_trg <- adtte_flt %>%\n select(ID, trigeventpfs)\n\nout_tte <- adtte_flt %>%\n select(ID, TRT01A, PARAM, AVAL, trigeventpfs) %>%\n tidyr::pivot_wider(\n id_cols = c(ID, TRT01A),\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate_at(\n c(\"Overall Survival (DAYS)\", \"Progression Free Survival (DAYS)\", \"Duration of Confirmed Response (DAYS)\"),\n function(x) format(round(x, 1), nsmall = 1)\n ) %>%\n select(\n ID,\n TRT01A,\n `Overall Survival (DAYS)`,\n `Progression Free Survival (DAYS)`,\n `Duration of Confirmed Response (DAYS)`\n ) %>%\n right_join(out_trg, ., by = \"ID\", multiple = \"all\")\n\nout <- out_tte %>%\n right_join(out_rs, ., by = \"ID\", multiple = \"all\") %>%\n select(\n \"ID\", \"TRT01A\", \"AVAL\", \"Best Confirmed Overall Response by Investigator\",\n \"Investigator End Of Induction Response\", \"Overall Survival (DAYS)\", \"Progression Free Survival (DAYS)\",\n \"trigeventpfs\", \"Duration of Confirmed Response (DAYS)\"\n )\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n ID = \"Center/Patient ID\",\n TRT01A = \"Treatment\",\n AVAL = \"Number of Doses\\nReceived\",\n `Best Confirmed Overall Response by Investigator` = \"Best Confirmed\\nOverall Response\\nby Investigator\",\n `Investigator End Of Induction Response` = \"Investigator\\nEnd Of Induction\\nResponse\",\n trigeventpfs = \"Triggering Event\\n for PFS\",\n `Overall Survival (DAYS)` = \"Overall Survival\\n(days)\",\n `Progression Free Survival (DAYS)` = \"PFS\\n(days)\",\n `Duration of Confirmed Response (DAYS)` = \"Duration of\\nConfirmed Response\\n(days)\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"ID\"),\n disp_cols = names(out),\n main_title = \"Listing of Individual Efficacy Data\",\n main_footer = \"PFS = Progression Free Survival\"\n)\n\nhead(lsting, 20)\n\nListing of Individual Efficacy Data\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Best Confirmed Investigator Duration of \n Number of Doses Overall Response End Of Induction Overall Survival PFS Triggering Event Confirmed Response\nTreatment Center/Patient ID Received by Investigator Response (days) (days) for PFS (days) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-105 7 CR CR 402.6 235.7 Disease Progression 119.6 \n 7 CR CR 402.6 235.7 NA 119.6 \n 7 CR CR 402.6 235.7 NA 119.6 \n BRA-1/id-134 7 CR CR 90.1 90.1 Death 90.1 \n 7 CR CR 90.1 90.1 Death 90.1 \n 7 CR CR 90.1 90.1 Death 90.1 \n BRA-1/id-42 7 PR PR 407.0 204.6 Disease Progression 193.9 \n 7 PR PR 407.0 204.6 NA 193.9 \n 7 PR PR 407.0 204.6 NA 193.9 \n BRA-1/id-93 7 CR PD 316.0 255.7 NA 140.3 \n 7 CR PD 316.0 255.7 NA 140.3 \n 7 CR PD 316.0 255.7 NA 140.3 \n BRA-11/id-217 7 CR CR 293.0 293.0 Disease Progression 153.2 \n 7 CR CR 293.0 293.0 Death 153.2 \n 7 CR CR 293.0 293.0 Death 153.2 \n BRA-11/id-345 7 CR CR 305.5 272.6 NA 150.6 \n 7 CR CR 305.5 272.6 NA 150.6 \n 7 CR CR 305.5 272.6 NA 150.6 \n BRA-11/id-397 7 PR PR 138.7 138.7 Death 138.7 \n 7 PR PR 138.7 138.7 Death 138.7 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nPFS = Progression Free Survival\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:34:27 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4\n[25] testthat_3.2.1 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Pharmacokinetic", - "PKPT06" + "Listings", + "Efficacy", + "ONCL01" ] }, { - "objectID": "tables/deaths/dtht01.html", - "href": "tables/deaths/dtht01.html", - "title": "DTHT01", + "objectID": "listings/medical-history/mhl01.html", + "href": "listings/medical-history/mhl01.html", + "title": "MHL01", "section": "", - "text": "Data Setup\nStandard Table\nTable Selecting Sections to Display\nTable for Studies Collecting Death Information from Public Records\nTable Adding Details for “All other causes” Category for Studies Collecting Death Information from Public Records\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl) %>% filter(SAFFL == \"Y\")\n\n# Reorder the levels in \"DTHCAT\" to put Other category at the end.\nadsl$DTHCAT <- factor(adsl$DTHCAT, levels = c(\"ADVERSE EVENT\", \"PROGRESSIVE DISEASE\", \"OTHER\", \"<Missing>\"))\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", split_fun = add_overall_level(\"All Patients\", first = FALSE)) %>%\n count_values(\n \"DTHFL\",\n values = \"Y\",\n .labels = c(count_fraction = \"Total number of deaths\"),\n .formats = c(count_fraction = \"xx (xx.x%)\")\n ) %>%\n analyze_vars(vars = c(\"DTHCAT\"), var_labels = c(\"Primary Cause of Death\"))\n\nresult <- build_table(lyt, df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————\nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \nPrimary Cause of Death \n n 25 23 22 70 \n ADVERSE EVENT 9 (36%) 7 (30.4%) 10 (45.5%) 26 (37.1%) \n PROGRESSIVE DISEASE 8 (32%) 6 (26.1%) 6 (27.3%) 20 (28.6%) \n OTHER 8 (32%) 10 (43.5%) 6 (27.3%) 24 (34.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", split_fun = add_overall_level(\"All Patients\", first = FALSE)) %>%\n count_values(\n \"DTHFL\",\n values = \"Y\",\n .labels = c(count_fraction = \"Total number of deaths\"),\n .formats = c(count_fraction = \"xx (xx.x%)\")\n ) %>%\n analyze_vars(vars = c(\"DTHCAT\"), var_labels = c(\"Primary Cause of Death\")) %>%\n split_rows_by(\"DTHCAT\", split_fun = keep_split_levels(\"OTHER\"), child_labels = \"hidden\") %>%\n analyze_vars(\n \"DTHCAUS\",\n .stats = \"count_fraction\",\n .indent_mods = c(\"count_fraction\" = 2L),\n show_labels = \"hidden\"\n ) %>%\n analyze_vars(\n vars = \"LDDTHGR1\",\n nested = FALSE,\n var_labels = \"Days from last drug administration\",\n show_labels = \"visible\"\n ) %>%\n split_rows_by(\n \"LDDTHGR1\",\n split_fun = remove_split_levels(\"<Missing>\"),\n split_label = \"Primary cause by days from last study drug administration\",\n label_pos = \"visible\"\n ) %>%\n analyze_vars(\"DTHCAT\")\n\nresult <- build_table(lyt, df = adsl) %>% prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \nPrimary Cause of Death \n n 25 23 22 70 \n ADVERSE EVENT 9 (36%) 7 (30.4%) 10 (45.5%) 26 (37.1%) \n PROGRESSIVE DISEASE 8 (32%) 6 (26.1%) 6 (27.3%) 20 (28.6%) \n OTHER 8 (32%) 10 (43.5%) 6 (27.3%) 24 (34.3%) \n LOST TO FOLLOW UP 2 (25%) 2 (20%) 2 (33.3%) 6 (25%) \n MISSING 2 (25%) 3 (30%) 2 (33.3%) 7 (29.2%) \n Post-study reporting of death 1 (12.5%) 2 (20%) 1 (16.7%) 4 (16.7%) \n SUICIDE 2 (25%) 2 (20%) 1 (16.7%) 5 (20.8%) \n UNKNOWN 1 (12.5%) 1 (10%) 0 2 (8.3%) \nDays from last drug administration \n n 25 23 22 70 \n <=30 14 (56%) 11 (47.8%) 14 (63.6%) 39 (55.7%) \n >30 11 (44%) 12 (52.2%) 8 (36.4%) 31 (44.3%) \nPrimary cause by days from last study drug administration \n <=30 \n n 14 11 14 39 \n ADVERSE EVENT 4 (28.6%) 2 (18.2%) 6 (42.9%) 12 (30.8%) \n PROGRESSIVE DISEASE 6 (42.9%) 3 (27.3%) 4 (28.6%) 13 (33.3%) \n OTHER 4 (28.6%) 6 (54.5%) 4 (28.6%) 14 (35.9%) \n >30 \n n 11 12 8 31 \n ADVERSE EVENT 5 (45.5%) 5 (41.7%) 4 (50%) 14 (45.2%) \n PROGRESSIVE DISEASE 2 (18.2%) 3 (25%) 2 (25%) 7 (22.6%) \n OTHER 4 (36.4%) 4 (33.3%) 2 (25%) 10 (32.3%) \n\n\n\n\n\nCodedthcaus_levels <- levels(adsl[adsl$DTHCAT == \"OTHER\", ]$DTHCAUS)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", split_fun = add_overall_level(\"All Patients\", first = FALSE)) %>%\n count_values(\n \"DTHFL\",\n values = \"Y\",\n .labels = c(count_fraction = \"Total number of deaths\"),\n .formats = c(count_fraction = \"xx (xx.x%)\")\n ) %>%\n analyze_vars(\n vars = c(\"DTHCAT\"),\n var_labels = c(\"Primary Cause of Death\"),\n table_names = \"primary_cause\"\n ) %>%\n split_rows_by(\n \"DTHCAT\",\n split_fun = keep_split_levels(\"OTHER\"),\n child_labels = \"hidden\"\n ) %>%\n count_values(\n \"DTHCAUS\",\n values = dthcaus_levels[5],\n .labels = c(count_fraction = \"Post-study reportings of death\"),\n .formats = c(count_fraction = \"xx (xx.x%)\"),\n .indent_mods = c(count_fraction = 2L),\n table_names = \"post_study_deaths\"\n ) %>%\n count_values(\n \"DTHCAUS\",\n values = dthcaus_levels[-5],\n .labels = c(count_fraction = \"All other causes\"),\n .formats = c(count_fraction = \"xx (xx.x%)\"),\n .indent_mods = c(count_fraction = 2L),\n table_names = \"all_other_causes\"\n )\n\nresult <- build_table(lyt, df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \nPrimary Cause of Death \n n 25 23 22 70 \n ADVERSE EVENT 9 (36%) 7 (30.4%) 10 (45.5%) 26 (37.1%) \n PROGRESSIVE DISEASE 8 (32%) 6 (26.1%) 6 (27.3%) 20 (28.6%) \n OTHER 8 (32%) 10 (43.5%) 6 (27.3%) 24 (34.3%) \n Post-study reportings of death 1 (12.5%) 2 (20.0%) 1 (16.7%) 4 (16.7%) \n All other causes 7 (87.5%) 8 (80.0%) 5 (83.3%) 20 (83.3%) \n\n\n\n\n\nCodedthcaus_levels <- levels(adsl[adsl$DTHCAT == \"OTHER\", ]$DTHCAUS)\n\n# create a helper variable DTHCAUS_other\nadsl <- adsl %>%\n mutate(\n DTHCAUS_other = factor(ifelse(\n DTHCAT == \"OTHER\" & DTHCAUS != \"Post-study reporting of death\", as.character(DTHCAUS), NA\n ), levels = c(\"LOST TO FOLLOW UP\", \"SUICIDE\", \"UNKNOWN\", \"MISSING\")) %>% explicit_na()\n )\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", split_fun = add_overall_level(\"All Patients\", first = FALSE)) %>%\n count_values(\n \"DTHFL\",\n values = \"Y\",\n .labels = c(count_fraction = \"Total number of deaths\"),\n .formats = c(count_fraction = \"xx (xx.x%)\")\n ) %>%\n analyze_vars(\n vars = c(\"DTHCAT\"),\n var_labels = c(\"Primary Cause of Death\"),\n table_names = \"primary_cause\"\n ) %>%\n split_rows_by(\"DTHCAT\", split_fun = keep_split_levels(\"OTHER\"), child_labels = \"hidden\") %>%\n count_values(\n \"DTHCAUS\",\n values = dthcaus_levels[5],\n .labels = c(count_fraction = \"Post-study reportings of death\"),\n .formats = c(count_fraction = \"xx (xx.x%)\"),\n .indent_mods = c(count_fraction = 2L),\n table_names = \"post_study_deaths\"\n ) %>%\n count_values(\n \"DTHCAUS\",\n values = dthcaus_levels[-5],\n .labels = c(count_fraction = \"All other causes\"),\n .formats = c(count_fraction = \"xx (xx.x%)\"),\n .indent_mods = c(count_fraction = 2L),\n table_names = \"all_other_causes\"\n ) %>%\n analyze_vars(\n \"DTHCAUS_other\",\n .stats = \"count_fraction\",\n .indent_mods = c(\"count_fraction\" = 3L),\n show_labels = \"hidden\"\n )\n\nresult <- build_table(lyt, df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \nPrimary Cause of Death \n n 25 23 22 70 \n ADVERSE EVENT 9 (36%) 7 (30.4%) 10 (45.5%) 26 (37.1%) \n PROGRESSIVE DISEASE 8 (32%) 6 (26.1%) 6 (27.3%) 20 (28.6%) \n OTHER 8 (32%) 10 (43.5%) 6 (27.3%) 24 (34.3%) \n Post-study reportings of death 1 (12.5%) 2 (20.0%) 1 (16.7%) 4 (16.7%) \n All other causes 7 (87.5%) 8 (80.0%) 5 (83.3%) 20 (83.3%) \n LOST TO FOLLOW UP 2 (28.6%) 2 (25%) 2 (40%) 6 (30%) \n SUICIDE 2 (28.6%) 2 (25%) 1 (20%) 5 (25%) \n UNKNOWN 1 (14.3%) 1 (12.5%) 0 2 (10%) \n MISSING 2 (28.6%) 3 (37.5%) 2 (40%) 7 (35%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:33:37 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadmh <- synthetic_cdisc_dataset(\"latest\", \"admh\")\n\nout <- admh %>%\n mutate(\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n ID = paste(SITEID, SUBJID, sep = \"/\"),\n TRTSDTM = toupper(format(as.Date(TRTSDTM), \"%d%b%Y\")),\n ASTDTM = toupper(format(as.Date(ASTDTM), \"%d%b%Y\")),\n AENDTM = toupper(format(as.Date(AENDTM), \"%d%b%Y\"))\n ) %>%\n select(ID, ASR, TRT01A, MHBODSYS, MHDECOD, TRTSDTM, ASTDTM, ASTDY, AENDTM, AENDY, ATIREL)\n\nvar_labels(out) <- c(\n ID = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n MHBODSYS = \"SOC\",\n MHDECOD = \"Disease Term\",\n TRTSDTM = \"Date of First\\nStudy Drug\\nAdministration\",\n ASTDTM = \"Start Date\\nof Disease\",\n ASTDY = \"Start Day\\nof Disease\",\n AENDTM = \"End Date\\nof Disease\",\n AENDY = \"End Day\\nof Disease\",\n ATIREL = \"Time Relation\\nof Disease\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"ID\", \"ASR\", \"MHBODSYS\", \"MHDECOD\"),\n disp_cols = names(out),\n main_title = \"Listing of Medical History and Concurrent Diseases\"\n)\n\nhead(lsting, 20)\n\nListing of Medical History and Concurrent Diseases\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of First \n Study Drug Start Date Start Day End Date End Day Time Relation \nTreatment Center/Patient ID Age/Sex/Race SOC Disease Term Administration of Disease of Disease of Disease of Disease of Disease \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE cl A trm A_2/2 04NOV2020 21SEP2021 321 16FEB2022 469 PRIOR_CONCOMITANT\n 04NOV2020 02DEC2021 393 13JAN2022 435 PRIOR_CONCOMITANT\n cl B trm B_2/3 04NOV2020 15APR2021 162 04OCT2021 334 PRIOR_CONCOMITANT\n cl D trm D_2/3 04NOV2020 19MAY2021 196 31OCT2021 361 PRIOR_CONCOMITANT\n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN cl A trm A_2/2 01JAN2020 09JUN2020 160 22FEB2021 418 PRIOR_CONCOMITANT\n 01JAN2020 04APR2021 459 15OCT2021 653 PRIOR_CONCOMITANT\n 01JAN2020 20APR2021 475 10AUG2021 587 PRIOR_CONCOMITANT\n cl B trm B_1/3 01JAN2020 15APR2021 470 23AUG2021 600 PRIOR_CONCOMITANT\n 01JAN2020 03OCT2021 641 17OCT2021 655 PRIOR_CONCOMITANT\n trm B_3/3 01JAN2020 19OCT2020 292 07DEC2020 341 PRIOR_CONCOMITANT\n cl C trm C_1/2 01JAN2020 11MAY2021 496 19OCT2021 657 PRIOR_CONCOMITANT\n trm C_2/2 01JAN2020 09FEB2020 39 28JUN2021 544 PRIOR_CONCOMITANT\n 01JAN2020 05APR2020 95 04FEB2021 400 PRIOR_CONCOMITANT\n cl D trm D_1/3 01JAN2020 05MAR2020 64 24NOV2021 693 PRIOR_CONCOMITANT\n BRA-1/id-93 34/F/ASIAN cl A trm A_1/2 20JUN2020 03NOV2020 136 19JAN2021 213 PRIOR_CONCOMITANT\n cl B trm B_1/3 20JUN2020 25NOV2021 523 18DEC2021 546 PRIOR_CONCOMITANT\n trm B_3/3 20JUN2020 06FEB2022 596 15FEB2022 605 PRIOR_CONCOMITANT\n cl C trm C_1/2 20JUN2020 28MAR2021 281 11JUL2021 386 PRIOR_CONCOMITANT\n cl D trm D_1/3 20JUN2020 02MAY2021 316 06JAN2022 565 PRIOR_CONCOMITANT\n trm D_2/3 20JUN2020 03AUG2020 44 18SEP2020 90 PRIOR_CONCOMITANT\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:34:34 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Deaths", - "DTHT01" + "Listings", + "Medical History", + "MHL01" ] }, { - "objectID": "tables/disclosures/disclosurest01.html", - "href": "tables/disclosures/disclosurest01.html", - "title": "DISCLOSUREST01", + "objectID": "listings/adverse-events/ael03.html", + "href": "listings/adverse-events/ael03.html", + "title": "AEL03", "section": "", - "text": "Patient Disposition Table (CTgov & EudraCT)\nDemographic Table (CTgov & EudraCT)\nEnrollment by Country Table (EudraCT only)\nNon-Serious Adverse Events Reported in \\(\\geq\\) 5% of Patients in Any Treatment Group (CTgov & EudraCT)\nSerious Adverse Events, Fatal SAEs and SAEs Related to Study Medication, by Treatment Group (CTgov & EudraCT)\nDeath Table (EudraCT only)\nReproducibility\n\n\n\nData Setup\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\nset.seed(1, kind = \"Mersenne-Twister\")\n\n# Add additional disposition variables to adsl.\nadsl0 <- adsl %>%\n mutate(\n STSTFL = case_when(\n is.na(RANDDT) ~ \"N\",\n TRUE ~ \"Y\"\n ) %>% as.factor(),\n COMPSTUD = sample(\n c(\"Y\", \"N\"),\n size = nrow(adsl),\n replace = TRUE\n ) %>% as.factor(),\n STUDONS = sample(\n c(\"Alive: On Treatment\", \"Alive: In Follow-up\", NA),\n size = nrow(adsl),\n replace = TRUE\n ) %>% as.factor(),\n STDDRS = sample(\n c(\n \"Death\", \"Lost To Follow-Up\",\n \"Protocol Violation\", \"Withdrawal By Subject\",\n \"Other\"\n ),\n size = nrow(adsl),\n replace = TRUE\n ) %>% as.factor(),\n GOTTRT = ifelse(!is.na(ACTARMCD), \"Y\", \"N\") %>%\n as.factor(),\n DISTRTFL = sample(\n c(\"Y\", \"N\"),\n size = nrow(adsl),\n replace = TRUE\n ) %>% as.factor(),\n TRTDRS = sample(\n c(\n \"ADVERSE EVENT\", \"PROGRESSIVE DISEASE\",\n \"PHYSICIAN DECISION\", \"LACK OF EFFICACY\",\n \"OTHER\"\n ),\n size = nrow(adsl),\n replace = TRUE\n ) %>% as.factor(),\n STUDONS = case_when(COMPSTUD == \"N\" ~ STUDONS),\n STDDRS = case_when(COMPSTUD == \"N\" & is.na(STUDONS) ~ STDDRS),\n DISSTDFL = case_when(!is.na(STDDRS) ~ \"Y\"),\n DISTRTFL = case_when(GOTTRT == \"Y\" ~ DISTRTFL),\n TRTDRS = case_when(DISTRTFL == \"Y\" ~ TRTDRS),\n DRSCAT = case_when(\n TRTDRS %in% c(\"ADVERSE EVENT\", \"PHYSICIAN DECISION\") ~ \"Safety\",\n !is.na(TRTDRS) ~ \"Other\"\n )\n ) %>%\n var_relabel(\n STSTFL = \"Started Study\",\n COMPSTUD = \"Complete Study\",\n STUDONS = \"On-study Status\",\n DISSTDFL = \"Discontinued Study\",\n STDDRS = \"Reason for Study Discontinuation\",\n GOTTRT = \"Received Treatment\",\n DISTRTFL = \"Discontinued Treatment\",\n TRTDRS = \"Reason for Treatment Discontinuation\",\n DRSCAT = \"Subcategory for Treatment Discontinuation\"\n )\n\n\nPatient Disposition Table\n\nCode# Define the split function\nsplit_fun <- keep_split_levels(\"Y\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_values(\"STSTFL\",\n values = \"Y\",\n .labels = c(count_fraction = \"Started Study\")\n ) %>%\n count_values(\"COMPSTUD\",\n values = \"Y\",\n .labels = c(count_fraction = \"Completed Study\")\n ) %>%\n split_rows_by(\n \"DISSTDFL\",\n split_fun = split_fun\n ) %>%\n summarize_row_groups(label_fstr = \"Discontinued Study\") %>%\n analyze_vars(\n \"STDDRS\",\n .stats = \"count_fraction\"\n ) %>%\n append_topleft(\"Status\")\n\nresult <- build_table(lyt = lyt, df = adsl0)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients \nStatus (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————\nStarted Study 134 (100.00%) 134 (100.00%) 132 (100.00%) 400 (100.00%)\nCompleted Study 65 (48.51%) 67 (50.00%) 69 (52.27%) 201 (50.25%) \nDiscontinued Study 15 (11.2%) 28 (20.9%) 24 (18.2%) 67 (16.8%) \n Death 6 (40%) 5 (17.9%) 4 (16.7%) 15 (22.4%) \n Lost To Follow-Up 1 (6.7%) 3 (10.7%) 8 (33.3%) 12 (17.9%) \n Other 2 (13.3%) 6 (21.4%) 5 (20.8%) 13 (19.4%) \n Protocol Violation 4 (26.7%) 4 (14.3%) 4 (16.7%) 12 (17.9%) \n Withdrawal By Subject 2 (13.3%) 10 (35.7%) 3 (12.5%) 15 (22.4%) \n\n\n\n\n\nData Setup\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\n# Change description in variable SEX.\nadsl <- adsl %>%\n mutate(\n SEX = factor(case_when(\n SEX == \"M\" ~ \"Male\",\n SEX == \"F\" ~ \"Female\",\n SEX == \"U\" ~ \"Unknown\",\n SEX == \"UNDIFFERENTIATED\" ~ \"Undifferentiated\"\n )),\n AGEGRP = factor(\n case_when(\n between(AGE, 18, 40) ~ \"18-40\",\n between(AGE, 41, 64) ~ \"41-64\",\n AGE > 64 ~ \">=65\"\n ),\n levels = c(\"18-40\", \"41-64\", \">=65\")\n )\n )\n\n\nDemographic Table\n\nCodevars <- c(\"AGE\", \"AGEGRP\", \"SEX\", \"RACE\", \"ETHNIC\")\nvar_labels <- c(\"Age (yr)\", \"Age group\", \"Sex\", \"Race\", \"Ethnicity\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n add_overall_col(\"All Patients\") %>%\n analyze_vars(\n vars = vars,\n var_labels = var_labels\n )\n\nresult <- build_table(lyt = lyt, df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————————————————\nAge (yr) \n n 134 134 132 400 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) 34.9 (7.4) \n Median 33.0 35.0 35.0 34.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 20.0 - 69.0 \nAge group \n n 134 134 132 400 \n 18-40 113 (84.3%) 103 (76.9%) 106 (80.3%) 322 (80.5%) \n 41-64 21 (15.7%) 31 (23.1%) 25 (18.9%) 77 (19.2%) \n >=65 0 0 1 (0.8%) 1 (0.2%) \nSex \n n 134 134 132 400 \n Female 79 (59%) 82 (61.2%) 70 (53%) 231 (57.8%) \n Male 55 (41%) 52 (38.8%) 62 (47%) 169 (42.2%) \nRace \n n 134 134 132 400 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) 208 (52%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) 91 (22.8%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) 74 (18.5%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) 25 (6.2%) \n MULTIPLE 0 1 (0.7%) 0 1 (0.2%) \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 1 (0.2%) \n OTHER 0 0 0 0 \n UNKNOWN 0 0 0 0 \nEthnicity \n n 134 134 132 400 \n HISPANIC OR LATINO 15 (11.2%) 18 (13.4%) 15 (11.4%) 48 (12%) \n NOT HISPANIC OR LATINO 104 (77.6%) 103 (76.9%) 101 (76.5%) 308 (77%) \n NOT REPORTED 6 (4.5%) 10 (7.5%) 11 (8.3%) 27 (6.8%) \n UNKNOWN 9 (6.7%) 3 (2.2%) 5 (3.8%) 17 (4.2%) \n\n\n\n\n\nData Setup\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadsl_labels <- var_labels(adsl)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\nadsl <- adsl %>%\n mutate(COUNTRY = droplevels(COUNTRY)) %>%\n arrange(REGION1, COUNTRY)\n\nvar_labels(adsl) <- c(adsl_labels)\n\n\nEnrollment by Country Table\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n analyze_vars(\"COUNTRY\") %>%\n append_varlabels(adsl, \"COUNTRY\")\n\nresult <- build_table(lyt, adsl)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\nCountry (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————\nn 134 134 132 400 \nCHN 74 (55.2%) 81 (60.4%) 64 (48.5%) 219 (54.8%) \nUSA 10 (7.5%) 13 (9.7%) 17 (12.9%) 40 (10%) \nBRA 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \nPAK 12 (9%) 9 (6.7%) 10 (7.6%) 31 (7.8%) \nNGA 8 (6%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \nRUS 5 (3.7%) 8 (6%) 6 (4.5%) 19 (4.8%) \nJPN 5 (3.7%) 4 (3%) 9 (6.8%) 18 (4.5%) \nGBR 4 (3%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \nCAN 3 (2.2%) 2 (1.5%) 3 (2.3%) 8 (2%) \n\n\n\n\n\nData Setup\nTrimming function get_adae_trimmed is defined to filter AEs with greater than 5% incidence rate.\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nadae_nonser <- adae %>% filter(AESER != \"Y\", SAFFL == \"Y\")\n\nget_adae_trimmed <- function(adsl, adae, cutoff_rate) {\n n_per_arm <- adsl %>%\n dplyr::count(ARM)\n\n anl_terms <- adae %>%\n dplyr::group_by(ARM, AEBODSYS, AEDECOD) %>%\n dplyr::count(\n unique_terms = n_distinct(USUBJID)\n ) %>%\n dplyr::select(-n) %>%\n dplyr::ungroup()\n\n anl_terms <- dplyr::left_join(\n anl_terms,\n n_per_arm,\n by = \"ARM\"\n ) %>%\n dplyr::mutate(\n ae_rate = unique_terms / n\n ) %>%\n dplyr::filter(ae_rate >= cutoff_rate) %>%\n dplyr::select(AEDECOD) %>%\n unique()\n\n anl <- dplyr::left_join(\n anl_terms,\n adae,\n by = \"AEDECOD\"\n )\n anl\n}\n\nadae_trim <- get_adae_trimmed(adsl, adae_nonser, cutoff_rate = 0.05)\n\n\nNon-Serious Adverse Events Report in \\(\\geq\\) 5% of Patients in Any Treatment Group\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n split_cols_by(\"ARM\") %>%\n summarize_patients_events_in_cols(\n custom_label = \"Total number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5%\" \n ) %>%\n split_rows_by(\"AEBODSYS\",\n nested = FALSE,\n split_fun = split_fun,\n indent_mod = -1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae_trim$AEBODSYS)\n ) %>%\n split_rows_by(\"AEDECOD\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adae_trim$AEDECOD)) %>%\n summarize_patients_events_in_cols(\n col_split = FALSE\n )\n\nresult <- build_table(lyt, adae_trim)\nresult\n\nBody System or Organ Class A: Drug X B: Placebo C: Combination \n Dictionary-Derived Term Patients (All) Events (All) Patients (All) Events (All) Patients (All) Events (All)\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5% 106 360 112 367 112 421 \ncl A.1 \n dcd A.1.1.1.1 50 64 45 62 63 88 \ncl B.2 \n dcd B.2.1.2.1 49 65 44 62 52 66 \ncl C.1 \n dcd C.1.1.1.3 43 55 46 63 43 64 \ncl C.2 \n dcd C.2.1.2.1 35 48 48 53 55 65 \ncl D.1 \n dcd D.1.1.4.2 48 66 42 55 50 64 \ncl D.2 \n dcd D.2.1.5.3 47 62 58 72 57 74 \n\n\n\n\n\nFor illustrative purposes, the adae data is filtered by arm “A: Drug X” here.\nData Setup\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadae <- df_explicit_na(adae)\n\nadae_serious <- adae %>% filter(AESER == \"Y\", SAFFL == \"Y\")\nadae_serious_arm <- adae_serious %>% filter(ARM == \"A: Drug X\")\n\nfilters_list <- list(\n related = with_label(c(AEREL = \"Y\"), \"Events (Related)\"),\n fatal = with_label(c(AESDTH = \"Y\"), \"Events (Fatal)\"),\n fatal_related = with_label(c(AEREL = \"Y\", AESDTH = \"Y\"), \"Events (Fatal & Related)\")\n)\n\n\nSerious Adverse Events, Fatal SAEs and SAEs Related to Study Medication, by Treatment Group\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n summarize_patients_events_in_cols(\n filters_list = filters_list,\n empty_stats = c(\"all\", \"related\", \"fatal\", \"fatal_related\"),\n custom_label = \"Total number of patients with at least one serious adverse event\"\n ) %>%\n split_rows_by(\"AEBODSYS\",\n nested = FALSE,\n split_fun = split_fun,\n indent_mod = -1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae_trim$AEBODSYS)\n ) %>%\n split_rows_by(\"AEDECOD\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae_serious_arm$AEDECOD)\n ) %>%\n summarize_patients_events_in_cols(\n filters_list = filters_list,\n col_split = FALSE\n )\n\nresult <- build_table(lyt, adae_serious_arm)\nresult\n\nBody System or Organ Class \n Dictionary-Derived Term Patients (All) Events (All) Events (Related) Events (Fatal) Events (Fatal & Related)\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one serious adverse event 104 \ncl A.1 \n dcd A.1.1.1.2 48 68 0 0 0 \ncl B.1 \n dcd B.1.1.1.1 47 56 56 56 56 \ncl B.2 \n dcd B.2.2.3.1 48 64 0 0 0 \ncl D.1 \n dcd D.1.1.1.1 50 61 61 61 61 \n\n\n\n\n\nData Setup\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n\nDeath Table\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(\"All Patients\") %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"AESDTH\" = \"Y\"),\n .labels = c(count_fraction = \"Total Number of Deaths\"),\n .formats = c(count_fraction = \"xx (xx.xx%)\")\n )\nresult <- build_table(lyt, adae, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n——————————————————————————————————————————————————————————————————————————————————\nTotal Number of Deaths 76 (62.30%) 70 (56.91%) 75 (62.50%) 221 (60.55%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:33:50 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 withr_3.0.0 \n[33] Rdpack_2.6 digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 \n[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nout <- adae %>%\n filter(AESER == \"Y\") %>%\n mutate(\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n Date_First = toupper(format(as.Date(TRTSDTM), \"%d%b%Y\")),\n Duration = AENDY - ASTDY + 1,\n Related = ifelse(AEREL == \"Y\", \"Yes\", ifelse(AEREL == \"N\", \"No\", \"\")),\n Outcome = case_when(\n AEOUT == \"FATAL\" ~ 1,\n AEOUT == \"NOT RECOVERED/NOT RESOLVED\" ~ 2,\n AEOUT == \"RECOVERED/RESOLVED\" ~ 3,\n AEOUT == \"RECOVERED/RESOLVED WITH SEQUELAE\" ~ 4,\n AEOUT == \"RECOVERING/RESOLVING\" ~ 5,\n AEOUT == \"UNKNOWN\" ~ 6\n ),\n Treated = ifelse(AECONTRT == \"Y\", \"Yes\", ifelse(AECONTRT == \"N\", \"No\", \"\")),\n Action = case_when(\n AEACN == \"DOSE INCREASED\" ~ 1,\n AEACN == \"DOSE NOT CHANGED\" ~ 2,\n AEACN == \"DOSE REDUCED\" | AEACN == \"DOSE RATE REDUCED\" ~ 3,\n AEACN == \"DRUG INTERRUPTED\" ~ 4,\n AEACN == \"DRUG WITHDRAWN\" ~ 5,\n AEACN == \"NOT APPLICABLE\" | AEACN == \"NOT EVALUABLE\" ~ 6,\n AEACN == \"UNKNOWN\" ~ 7\n ),\n SERREAS = case_when(\n AESDTH == \"Y\" ~ \"1\",\n AESLIFE == \"Y\" ~ \"2\",\n AESHOSP == \"Y\" ~ \"3\",\n AESDISAB == \"Y\" ~ \"4\",\n AESCONG == \"Y\" ~ \"5\",\n AESMIE == \"Y\" ~ \"6\",\n TRUE ~ \" \"\n )\n ) %>%\n select(CPID, ASR, TRT01A, AEDECOD, Date_First, ASTDY, Duration, AESEV, Related, Outcome, Treated, Action, SERREAS)\n\nvar_labels(out) <- c(\n CPID = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n AEDECOD = \"Adverse\\nEvent MedDRA\\nPreferred Term\",\n Date_First = \"Date of\\nFirst Study\\nDrug\\nAdministration\",\n ASTDY = \"Study\\nDay of\\nOnset\",\n Duration = \"AE\\nDuration\\nin Days\",\n AESEV = \"Most\\nExtreme\\nIntensity\",\n Related = \"Caused by\\nStudy\\nDrug\",\n Outcome = \"Outcome\\n(1)\",\n Treated = \"Treatment\\nfor AE\",\n Action = \"Action\\nTaken\\n(2)\",\n SERREAS = \"Reason\\nClassified\\nas Serious\\n(3)\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CPID\", \"ASR\"),\n disp_cols = names(out),\n main_title = \"Listing of Serious Adverse Events\",\n main_footer = \"\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n(3) Reason classified as serious: 1 = resulted in death; 2 = life threatening;\n 3 = required prolonged in patient hospitalization; 4 = disabling;\n 5 = a congenital anomaly/birth defect in offspring of study subject;\n 6 = does not meet any of the above serious criteria, but may jeopardize the subject,\n and may require medical or surgical intervention to prevent one of the outcomes listed above.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\"\n)\n\nhead(lsting, 20)\n\nListing of Serious Adverse Events\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of Reason \n Adverse First Study Study AE Most Caused by Action Classified\n Event MedDRA Drug Day of Duration Extreme Study Outcome Treatment Taken as Serious\nTreatment Center/Patient ID Age/Sex/Race Preferred Term Administration Onset in Days Intensity Drug (1) for AE (2) (3) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE dcd A.1.1.1.2 04NOV2020 321 149 MODERATE No 5 Yes 2 4 \n dcd A.1.1.1.2 04NOV2020 393 43 MODERATE No 5 No 5 5 \n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN dcd D.1.1.1.1 01JAN2020 64 630 SEVERE Yes 1 No 6 1 \n dcd A.1.1.1.2 01JAN2020 160 259 MODERATE No 2 Yes 2 4 \n dcd B.2.2.3.1 01JAN2020 292 50 MILD No 3 No 2 4 \n dcd A.1.1.1.2 01JAN2020 459 195 MODERATE No 5 Yes 2 5 \n dcd B.1.1.1.1 01JAN2020 470 131 SEVERE Yes 1 No 6 1 \n dcd A.1.1.1.2 01JAN2020 475 113 MODERATE No 4 Yes 2 4 \n dcd B.1.1.1.1 01JAN2020 641 15 SEVERE Yes 1 Yes 6 1 \n BRA-1/id-93 34/F/ASIAN dcd D.1.1.1.1 20JUN2020 316 250 SEVERE Yes 1 No 6 1 \n dcd B.1.1.1.1 20JUN2020 523 24 SEVERE Yes 1 No 6 1 \n dcd B.2.2.3.1 20JUN2020 596 10 MILD No 3 Yes 2 4 \n BRA-11/id-345 37/F/WHITE dcd B.1.1.1.1 18AUG2020 1009 35 SEVERE Yes 1 No 6 1 \n BRA-11/id-397 38/M/ASIAN dcd D.1.1.1.1 27JUN2020 516 441 SEVERE Yes 1 No 6 1 \n dcd B.1.1.1.1 27JUN2020 1011 30 SEVERE Yes 1 Yes 6 1 \n BRA-11/id-50 26/M/BLACK OR AFRICAN AMERICAN dcd A.1.1.1.2 28APR2019 1007 68 MODERATE No 3 Yes 2 5 \n BRA-13/id-177 24/M/WHITE dcd B.1.1.1.1 30AUG2020 249 470 SEVERE Yes 1 No 6 1 \n dcd B.1.1.1.1 30AUG2020 1012 33 SEVERE Yes 1 No 6 1 \n BRA-15/id-36 38/F/ASIAN dcd B.1.1.1.1 08JAN2020 372 154 SEVERE Yes 1 Yes 6 1 \n dcd A.1.1.1.2 08JAN2020 573 134 MODERATE No 3 Yes 2 3 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n(3) Reason classified as serious: 1 = resulted in death; 2 = life threatening;\n 3 = required prolonged in patient hospitalization; 4 = disabling;\n 5 = a congenital anomaly/birth defect in offspring of study subject;\n 6 = does not meet any of the above serious criteria, but may jeopardize the subject,\n and may require medical or surgical intervention to prevent one of the outcomes listed above.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:34:41 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Disclosures", - "DISCLOSUREST01" + "Listings", + "Adverse Events", + "AEL03" ] }, { - "objectID": "tables/exposure/ext01.html", - "href": "tables/exposure/ext01.html", - "title": "EXT01", + "objectID": "listings/adverse-events/ael02.html", + "href": "listings/adverse-events/ael02.html", + "title": "AEL02", "section": "", - "text": "Data Setup\nStandard Table\nTable with Optional Analyses\nTable with User-Specified Categories for Missed Doses\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\nlibrary(tidyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadex <- df_explicit_na(adex)\n\nadex <- adex %>%\n filter(PARCAT1 == \"OVERALL\") %>%\n select(STUDYID, USUBJID, ACTARM, PARAMCD, PARAM, AVAL, PARCAT2) %>%\n mutate(\n PARAMCD = as.character(PARAMCD),\n AVALC = \"\"\n ) %>%\n droplevels()\n\n# Add new param tdurd for treatment duration.\nset.seed(99)\ntdurd_adsl <- adsl %>%\n select(STUDYID, USUBJID, ACTARM) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(1:150, size = nrow(adsl), replace = TRUE),\n AVALC = case_when(\n 0 <= AVAL & AVAL <= 30 ~ \"0 - 30\",\n 31 <= AVAL & AVAL <= 60 ~ \"31 - 60\",\n 61 <= AVAL & AVAL <= 90 ~ \"61 - 90\",\n TRUE ~ \">= 91\"\n )\n )\ntdurd <- adex %>%\n filter(PARAMCD == \"TNDOSE\") %>%\n select(STUDYID, USUBJID, PARCAT2) %>%\n left_join(tdurd_adsl, by = c(\"STUDYID\", \"USUBJID\"))\n\n# Add new param tndosmis for missed doses.\ntndosmis_adsl <- adsl %>%\n select(STUDYID, USUBJID, ACTARM) %>%\n mutate(\n PARAMCD = \"TNDOSMIS\",\n PARAM = \"Total number of missed doses during study\",\n AVAL = sample(0:20, size = nrow(adsl), replace = TRUE),\n AVALC = \"\"\n )\ntndosmis <- adex %>%\n filter(PARAMCD == \"TNDOSE\") %>%\n select(STUDYID, USUBJID, PARCAT2) %>%\n left_join(tndosmis_adsl, by = c(\"STUDYID\", \"USUBJID\"))\n\nadex <- dplyr::bind_rows(adex, tdurd, tndosmis) %>%\n mutate(PARAM = factor(\n PARAM,\n levels = c(\n \"Overall duration (days)\", \"Total dose administered\", \"Total number of doses administered\",\n \"Total number of missed doses during study\"\n )\n ))\n\n\n\n\n\nCode# When summary table contains only categorical or only numeric parameters\n\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARCAT2\", split_label = \"\\nParameter Category (Drug A/Drug B)\", label_pos = \"topleft\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun) %>%\n analyze_vars(vars = \"AVAL\")\n\nresult <- build_table(lyt = lyt, df = adex, alt_counts_df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination \nParameter Category (Drug A/Drug B) (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nDrug A \n Overall duration (days) \n n 75 67 75 \n Mean (SD) 74.3 (41.6) 79.0 (43.1) 74.2 (39.5) \n Median 77.0 80.0 78.0 \n Min - Max 5.0 - 149.0 2.0 - 150.0 1.0 - 147.0 \n Total dose administered \n n 75 67 75 \n Mean (SD) 6675.2 (1110.9) 6505.1 (1249.3) 6982.4 (1272.5)\n Median 6720.0 6480.0 7200.0 \n Min - Max 4800.0 - 9360.0 4080.0 - 9360.0 4320.0 - 9360.0\n Total number of doses administered \n n 75 67 75 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \n Total number of missed doses during study \n n 75 67 75 \n Mean (SD) 10.5 (5.9) 10.0 (6.1) 9.5 (5.5) \n Median 10.0 11.0 9.0 \n Min - Max 0.0 - 20.0 0.0 - 19.0 0.0 - 20.0 \nDrug B \n Overall duration (days) \n n 59 67 57 \n Mean (SD) 77.5 (40.5) 76.3 (41.0) 69.5 (46.2) \n Median 79.0 76.0 65.0 \n Min - Max 2.0 - 149.0 5.0 - 148.0 1.0 - 149.0 \n Total dose administered \n n 59 67 57 \n Mean (SD) 6630.5 (1334.0) 6297.3 (1291.1) 6505.3 (1080.7)\n Median 6720.0 6240.0 6480.0 \n Min - Max 4320.0 - 8880.0 4080.0 - 9120.0 4320.0 - 8640.0\n Total number of doses administered \n n 59 67 57 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \n Total number of missed doses during study \n n 59 67 57 \n Mean (SD) 9.1 (6.5) 10.0 (6.3) 10.7 (5.8) \n Median 9.0 10.0 11.0 \n Min - Max 0.0 - 20.0 0.0 - 20.0 1.0 - 20.0 \n\n\n\n\n\nCode# When summary table contains both categorical and numeric parameters,\n# developer needs to do pre-processing to transform dataset to wide format.\nadex_avalc_wide <- adex %>%\n filter(PARAMCD == \"TDURD\") %>%\n select(STUDYID, USUBJID, PARAMCD, AVALC, PARCAT2) %>%\n tidyr::pivot_wider(\n id_cols = c(STUDYID, USUBJID, PARCAT2),\n names_from = PARAMCD,\n values_from = AVALC\n ) %>%\n mutate(\n TDURDC = factor(TDURD, levels = c(\"0 - 30\", \"31 - 60\", \"61 - 90\", \">= 91\"))\n ) %>%\n select(-TDURD)\n\nanl <- adex %>%\n select(STUDYID, USUBJID, ACTARM, PARAMCD, AVAL, PARCAT2) %>%\n tidyr::pivot_wider(\n id_cols = c(STUDYID, USUBJID, ACTARM, PARCAT2),\n names_from = PARAMCD,\n values_from = AVAL\n ) %>%\n left_join(adex_avalc_wide, by = c(\"STUDYID\", \"USUBJID\", \"PARCAT2\")) %>%\n var_relabel(\n TDOSE = \"Total dose administered\",\n TNDOSE = \"Total number of doses administered\",\n TDURD = \"Overall duration (days)\",\n TNDOSMIS = \"Total number of missed doses during study\",\n TDURDC = \"Overall duration (days)\"\n )\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARCAT2\", split_label = \"\\nParameter Category (Drug A/Drug B)\", label_pos = \"topleft\") %>%\n analyze_vars(\n vars = c(\"TDURD\", \"TDURDC\", \"TDOSE\", \"TNDOSE\"),\n var_labels = var_labels(anl)[c(\"TDURD\", \"TDURDC\", \"TDOSE\", \"TNDOSE\")]\n )\n\nresult <- build_table(lyt = lyt, df = anl, alt_counts_df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination \nParameter Category (Drug A/Drug B) (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————\nDrug A \n Overall duration (days) \n n 75 67 75 \n Mean (SD) 74.3 (41.6) 79.0 (43.1) 74.2 (39.5) \n Median 77.0 80.0 78.0 \n Min - Max 5.0 - 149.0 2.0 - 150.0 1.0 - 147.0 \n Overall duration (days) \n n 75 67 75 \n 0 - 30 12 (16%) 12 (17.9%) 15 (20%) \n 31 - 60 18 (24%) 12 (17.9%) 14 (18.7%) \n 61 - 90 19 (25.3%) 15 (22.4%) 18 (24%) \n >= 91 26 (34.7%) 28 (41.8%) 28 (37.3%) \n Total dose administered \n n 75 67 75 \n Mean (SD) 6675.2 (1110.9) 6505.1 (1249.3) 6982.4 (1272.5)\n Median 6720.0 6480.0 7200.0 \n Min - Max 4800.0 - 9360.0 4080.0 - 9360.0 4320.0 - 9360.0\n Total number of doses administered \n n 75 67 75 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \nDrug B \n Overall duration (days) \n n 59 67 57 \n Mean (SD) 77.5 (40.5) 76.3 (41.0) 69.5 (46.2) \n Median 79.0 76.0 65.0 \n Min - Max 2.0 - 149.0 5.0 - 148.0 1.0 - 149.0 \n Overall duration (days) \n n 59 67 57 \n 0 - 30 8 (13.6%) 10 (14.9%) 16 (28.1%) \n 31 - 60 14 (23.7%) 16 (23.9%) 12 (21.1%) \n 61 - 90 15 (25.4%) 17 (25.4%) 11 (19.3%) \n >= 91 22 (37.3%) 24 (35.8%) 18 (31.6%) \n Total dose administered \n n 59 67 57 \n Mean (SD) 6630.5 (1334.0) 6297.3 (1291.1) 6505.3 (1080.7)\n Median 6720.0 6240.0 6480.0 \n Min - Max 4320.0 - 8880.0 4080.0 - 9120.0 4320.0 - 8640.0\n Total number of doses administered \n n 59 67 57 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \n\n\n\n\n\nCode# When summary table contains both categorical and numeric parameters,\n# developer needs to do pre-processing to transform dataset to wide format.\nadex_avalc_wide <- adex %>%\n filter(PARAMCD == \"TDURD\") %>%\n select(STUDYID, USUBJID, PARAMCD, AVALC, PARCAT2) %>%\n tidyr::pivot_wider(\n id_cols = c(STUDYID, USUBJID, PARCAT2),\n names_from = PARAMCD,\n values_from = AVALC\n ) %>%\n mutate(\n TDURDC = factor(TDURD, levels = c(\"0 - 30\", \"31 - 60\", \"61 - 90\", \">= 91\"))\n ) %>%\n select(-TDURD)\n\nanl <- adex %>%\n select(STUDYID, USUBJID, ACTARM, PARAMCD, AVAL, PARCAT2) %>%\n tidyr::pivot_wider(\n id_cols = c(STUDYID, USUBJID, ACTARM, PARCAT2),\n names_from = PARAMCD,\n values_from = AVAL\n ) %>%\n left_join(adex_avalc_wide, by = c(\"STUDYID\", \"USUBJID\", \"PARCAT2\")) %>%\n var_relabel(\n TDOSE = \"Total dose administered\",\n TNDOSE = \"Total number of doses administered\",\n TDURD = \"Overall duration (days)\",\n TNDOSMIS = \"Total number of missed doses during study\",\n TDURDC = \"Overall duration (days)\"\n )\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARCAT2\", split_label = \"\\nParameter Category (Drug A/Drug B)\", label_pos = \"topleft\") %>%\n analyze_vars(\n vars = c(\"TDURD\", \"TDURDC\", \"TDOSE\", \"TNDOSE\"),\n var_labels = var_labels(anl)[c(\"TDURD\", \"TDURDC\", \"TDOSE\", \"TNDOSE\")]\n ) %>%\n count_missed_doses(\n \"TNDOSMIS\",\n thresholds = c(1, 5, 10, 15),\n var_labels = \"Missed Doses\"\n )\n\nresult <- build_table(lyt = lyt, df = anl, alt_counts_df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination \nParameter Category (Drug A/Drug B) (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————\nDrug A \n Overall duration (days) \n n 75 67 75 \n Mean (SD) 74.3 (41.6) 79.0 (43.1) 74.2 (39.5) \n Median 77.0 80.0 78.0 \n Min - Max 5.0 - 149.0 2.0 - 150.0 1.0 - 147.0 \n Overall duration (days) \n n 75 67 75 \n 0 - 30 12 (16%) 12 (17.9%) 15 (20%) \n 31 - 60 18 (24%) 12 (17.9%) 14 (18.7%) \n 61 - 90 19 (25.3%) 15 (22.4%) 18 (24%) \n >= 91 26 (34.7%) 28 (41.8%) 28 (37.3%) \n Total dose administered \n n 75 67 75 \n Mean (SD) 6675.2 (1110.9) 6505.1 (1249.3) 6982.4 (1272.5)\n Median 6720.0 6480.0 7200.0 \n Min - Max 4800.0 - 9360.0 4080.0 - 9360.0 4320.0 - 9360.0\n Total number of doses administered \n n 75 67 75 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \n Missed Doses \n n 75 67 75 \n At least 1 missed dose 74 (55.2%) 63 (47%) 73 (55.3%) \n At least 5 missed doses 59 (44%) 49 (36.6%) 59 (44.7%) \n At least 10 missed doses 41 (30.6%) 38 (28.4%) 37 (28%) \n At least 15 missed doses 26 (19.4%) 21 (15.7%) 16 (12.1%) \nDrug B \n Overall duration (days) \n n 59 67 57 \n Mean (SD) 77.5 (40.5) 76.3 (41.0) 69.5 (46.2) \n Median 79.0 76.0 65.0 \n Min - Max 2.0 - 149.0 5.0 - 148.0 1.0 - 149.0 \n Overall duration (days) \n n 59 67 57 \n 0 - 30 8 (13.6%) 10 (14.9%) 16 (28.1%) \n 31 - 60 14 (23.7%) 16 (23.9%) 12 (21.1%) \n 61 - 90 15 (25.4%) 17 (25.4%) 11 (19.3%) \n >= 91 22 (37.3%) 24 (35.8%) 18 (31.6%) \n Total dose administered \n n 59 67 57 \n Mean (SD) 6630.5 (1334.0) 6297.3 (1291.1) 6505.3 (1080.7)\n Median 6720.0 6240.0 6480.0 \n Min - Max 4320.0 - 8880.0 4080.0 - 9120.0 4320.0 - 8640.0\n Total number of doses administered \n n 59 67 57 \n Mean (SD) 7.0 (0.0) 7.0 (0.0) 7.0 (0.0) \n Median 7.0 7.0 7.0 \n Min - Max 7.0 - 7.0 7.0 - 7.0 7.0 - 7.0 \n Missed Doses \n n 59 67 57 \n At least 1 missed dose 56 (41.8%) 63 (47%) 57 (43.2%) \n At least 5 missed doses 41 (30.6%) 50 (37.3%) 47 (35.6%) \n At least 10 missed doses 27 (20.1%) 36 (26.9%) 31 (23.5%) \n At least 15 missed doses 17 (12.7%) 18 (13.4%) 20 (15.2%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEX <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n adex_labels <- unname(col_labels(ADEX))\n ADEX <- ADEX %>%\n filter(PARCAT1 == \"OVERALL\") %>%\n mutate(\n AVALCAT1 = case_when(\n PARAMCD == \"TDOSE\" & AVAL < 5000 ~ \"LOW\",\n PARAMCD == \"TDOSE\" & AVAL >= 5000 ~ \"HIGH\",\n PARAMCD == \"TNDOSE\" & AVAL < 10 ~ \"< 10\",\n PARAMCD == \"TNDOSE\" & AVAL >= 10 ~ \">= 10\"\n )\n )\n col_labels(ADEX) <- c(adex_labels, \"\")\n})\ndatanames <- c(\"ADSL\", \"ADEX\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADEX <- data[[\"ADEX\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Exposure Table\",\n dataname = \"ADEX\",\n arm_var = choices_selected(\n choices = variable_choices(ADEX, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADEX, c(\"PARCAT2\", \"PARAM\")),\n selected = c(\"PARCAT2\", \"PARAM\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADEX, c(\"AVAL\", \"AVALCAT1\")),\n selected = c(\"AVAL\", \"AVALCAT1\")\n ),\n paramcd = choices_selected(\n choices = value_choices(ADEX, \"PARAMCD\", \"PARAM\"),\n selected = c(\"TDOSE\", \"TNDOSE\")\n ),\n denominator = choices_selected(\n choices = c(\"n\", \"N\", \"omit\"),\n selected = \"N\"\n )\n )\n ), # Set initial filter state as single study drug to produce smaller table\n filter = teal_slices(\n teal_slice(\"ADEX\", \"PARCAT2\", selected = \"Drug A\"),\n teal_slice(\"ADEX\", \"AVAL\", selected = NULL)\n )\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADEX-filter-ADEX_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:34:11 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tidyr_1.3.1 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 rbibutils_2.2.16 \n[76] colorspace_2.1-0 nlme_3.1-164 cli_3.6.2 \n[79] fansi_1.0.6 viridisLite_0.4.2 geepack_1.3.10 \n[82] gtable_0.3.4 sass_0.4.9 digest_0.6.35 \n[85] TH.data_1.1-2 htmlwidgets_1.6.4 memoise_2.0.1 \n[88] htmltools_0.5.7 lifecycle_1.0.4 httr_1.4.7 \n[91] shinyWidgets_0.8.2 mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nout <- adae %>%\n mutate(\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n Date_First = toupper(format(as.Date(TRTSDTM), \"%d%b%Y\")),\n Duration = AENDY - ASTDY + 1,\n Serious = ifelse(AESER == \"Y\", \"Yes\", ifelse(AESER == \"N\", \"No\", \"\")),\n Related = ifelse(AEREL == \"Y\", \"Yes\", ifelse(AEREL == \"N\", \"No\", \"\")),\n Outcome = case_when(\n AEOUT == \"FATAL\" ~ 1,\n AEOUT == \"NOT RECOVERED/NOT RESOLVED\" ~ 2,\n AEOUT == \"RECOVERED/RESOLVED\" ~ 3,\n AEOUT == \"RECOVERED/RESOLVED WITH SEQUELAE\" ~ 4,\n AEOUT == \"RECOVERING/RESOLVING\" ~ 5,\n AEOUT == \"UNKNOWN\" ~ 6\n ),\n Treated = ifelse(AECONTRT == \"Y\", \"Yes\", ifelse(AECONTRT == \"N\", \"No\", \"\")),\n Action = case_when(\n AEACN == \"DOSE INCREASED\" ~ 1,\n AEACN == \"DOSE NOT CHANGED\" ~ 2,\n AEACN == \"DOSE REDUCED\" | AEACN == \"DOSE RATE REDUCED\" ~ 3,\n AEACN == \"DRUG INTERRUPTED\" ~ 4,\n AEACN == \"DRUG WITHDRAWN\" ~ 5,\n AEACN == \"NOT APPLICABLE\" | AEACN == \"NOT EVALUABLE\" ~ 6,\n AEACN == \"UNKNOWN\" ~ 7\n )\n ) %>%\n select(CPID, ASR, TRT01A, AEDECOD, Date_First, ASTDY, Duration, Serious, AESEV, Related, Outcome, Treated, Action)\n\nvar_labels(out) <- c(\n CPID = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n AEDECOD = \"Adverse\\nEvent MedDRA\\nPreferred Term\",\n Date_First = \"Date of\\nFirst Study\\nDrug\\nAdministration\",\n ASTDY = \"Study\\nDay of\\nOnset\",\n Duration = \"AE\\nDuration\\nin Days\",\n Serious = \"Serious\",\n AESEV = \"Most\\nExtreme\\nIntensity\",\n Related = \"Caused by\\nStudy\\nDrug\",\n Outcome = \"Outcome\\n(1)\",\n Treated = \"Treatment\\nfor AE\",\n Action = \"Action\\nTaken\\n(2)\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CPID\", \"ASR\"),\n disp_cols = names(out),\n main_title = \"Listing of Adverse Events\",\n main_footer = \"\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\"\n)\n\nhead(lsting, 20)\n\nListing of Adverse Events\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of \n Adverse First Study Study AE Most Caused by Action\n Event MedDRA Drug Day of Duration Extreme Study Outcome Treatment Taken \nTreatment Center/Patient ID Age/Sex/Race Preferred Term Administration Onset in Days Serious Intensity Drug (1) for AE (2) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE dcd B.2.1.2.1 04NOV2020 162 173 No MODERATE No 5 Yes 2 \n dcd D.1.1.4.2 04NOV2020 196 166 No MODERATE No 5 No 2 \n dcd A.1.1.1.2 04NOV2020 321 149 Yes MODERATE No 5 Yes 2 \n dcd A.1.1.1.2 04NOV2020 393 43 Yes MODERATE No 5 No 5 \n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN dcd C.2.1.2.1 01JAN2020 39 506 No MODERATE Yes 2 No 6 \n dcd D.1.1.1.1 01JAN2020 64 630 Yes SEVERE Yes 1 No 6 \n dcd C.2.1.2.1 01JAN2020 95 306 No MODERATE Yes 5 No 2 \n dcd A.1.1.1.2 01JAN2020 160 259 Yes MODERATE No 2 Yes 2 \n dcd B.2.2.3.1 01JAN2020 292 50 Yes MILD No 3 No 2 \n dcd A.1.1.1.2 01JAN2020 459 195 Yes MODERATE No 5 Yes 2 \n dcd B.1.1.1.1 01JAN2020 470 131 Yes SEVERE Yes 1 No 6 \n dcd A.1.1.1.2 01JAN2020 475 113 Yes MODERATE No 4 Yes 2 \n dcd C.1.1.1.3 01JAN2020 496 162 No SEVERE Yes 5 Yes 2 \n dcd B.1.1.1.1 01JAN2020 641 15 Yes SEVERE Yes 1 Yes 6 \n BRA-1/id-93 34/F/ASIAN dcd D.1.1.4.2 20JUN2020 44 47 No MODERATE No 5 Yes 2 \n dcd D.2.1.5.3 20JUN2020 79 300 No MILD Yes 5 No 3 \n dcd A.1.1.1.1 20JUN2020 136 78 No MILD No 3 Yes 2 \n dcd D.2.1.5.3 20JUN2020 260 305 No MILD Yes 5 No 2 \n dcd C.1.1.1.3 20JUN2020 281 106 No SEVERE Yes 5 Yes 2 \n dcd D.1.1.1.1 20JUN2020 316 250 Yes SEVERE Yes 1 No 6 \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:34:49 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Exposure", - "EXT01" + "Listings", + "Adverse Events", + "AEL02" ] }, { - "objectID": "tables/efficacy/cmht01.html", - "href": "tables/efficacy/cmht01.html", - "title": "CMHT01", + "objectID": "listings/adverse-events/ael01.html", + "href": "listings/adverse-events/ael01.html", + "title": "AEL01", "section": "", - "text": "Data Setup\nTable of Single Parameter\nTable of Multiple Parameters\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadqs <- df_explicit_na(adqs)\n\n\n\n\n\n\nCodeanl_01 <- adqs %>%\n filter(PARAMCD == \"FKSI-FWB\" & AVISIT == \"WEEK 1 DAY 8\") %>%\n mutate(is_rsp = PCHG > 15) %>%\n mutate(ARM = relevel(ARM, ref = \"A: Drug X\")) %>%\n var_relabel(ARM = \"Description of Planned Arm\") %>%\n mutate(strata = interaction(STRATA1, STRATA2, drop = TRUE))\n\nlyt_01 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(vars = \"is_rsp\", table_names = \"est_prop\") %>%\n estimate_proportion_diff(\n var_labels = \"Unstratified Analysis\",\n vars = \"is_rsp\",\n show_labels = \"visible\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(vars = \"is_rsp\", table_names = \"test_prop\") %>%\n estimate_odds_ratio(vars = \"is_rsp\", table_names = \"est_or\") %>%\n estimate_proportion_diff(\n var_labels = \"Stratified Analysis\",\n vars = \"is_rsp\",\n show_labels = \"visible\",\n method = \"cmh\",\n variables = list(strata = \"strata\"),\n table_names = \"est_prop_diff_strat\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n method = \"cmh\",\n variables = list(strata = \"strata\"),\n table_names = \"test_prop_strat\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n variables = list(strata = \"strata\", arm = \"ARM\"),\n table_names = \"est_or_strat\"\n )\n\nresult <- build_table(\n lyt = lyt_01,\n df = anl_01,\n alt_counts_df = adsl\n)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nResponders 49 (36.6%) 51 (38.1%) 47 (35.6%) \n95% CI (Wald, with correction) (28.0, 45.1) (29.5, 46.7) (27.1, 44.2) \nUnstratified Analysis \n Difference in Response rate (%) 1.5 -1.0 \n 95% CI (Wald, with correction) (-10.8, 13.8) (-13.3, 11.3) \n p-value (Chi-Squared Test) 0.8006 0.8704 \nOdds Ratio (95% CI) 1.07 (0.65 - 1.75) 0.96 (0.58 - 1.58)\nStratified Analysis \n Difference in Response rate (%) 2.8 -1.5 \n 95% CI (CMH, without correction) (-8.2, 13.8) (-13.0, 9.9) \n p-value (Cochran-Mantel-Haenszel Test) 0.6397 0.7952 \nOdds Ratio (95% CI) 1.12 (0.68 - 1.83) 0.99 (0.60 - 1.64)\n\n\n\n\n\n\nCodeanl_02 <- adqs %>%\n filter(AVISIT == \"WEEK 1 DAY 8\") %>%\n mutate(is_rsp = PCHG > 15) %>%\n mutate(PARAM = droplevels(PARAM)) %>%\n mutate(ARM = relevel(ARM, ref = \"A: Drug X\")) %>%\n var_relabel(ARM = \"Description of Planned Arm\") %>%\n mutate(strata = interaction(STRATA1, STRATA2, drop = TRUE))\n\nvar_labels(anl_02)[\"PARAM\"] <- \"Parameter\"\n\nsplit_fun <- drop_split_levels\n\nlyt_02 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n split_rows_by(\n var = \"PARAM\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(anl_02$PARAM)\n ) %>%\n estimate_proportion(vars = \"is_rsp\", table_names = \"est_prop\") %>%\n estimate_proportion_diff(\n var_labels = \"Unstratified Analysis\",\n vars = \"is_rsp\",\n show_labels = \"visible\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(vars = \"is_rsp\", table_names = \"test_prop\") %>%\n estimate_odds_ratio(vars = \"is_rsp\", table_names = \"est_or\") %>%\n estimate_proportion_diff(\n var_labels = \"Stratified Analysis\",\n vars = \"is_rsp\",\n show_labels = \"visible\",\n method = \"cmh\",\n variables = list(strata = \"strata\"),\n table_names = \"est_prop_diff_strat\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n method = \"cmh\",\n variables = list(strata = \"strata\"),\n table_names = \"test_prop_strat\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n variables = list(strata = \"strata\", arm = \"ARM\"),\n table_names = \"est_or_strat\"\n )\n\nresult <- build_table(\n lyt = lyt_02,\n df = anl_02,\n alt_counts_df = adsl\n)\nresult\n\n A: Drug X B: Placebo C: Combination \nParameter (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nBFI All Questions \n Responders 57 (42.5%) 65 (48.5%) 50 (37.9%) \n 95% CI (Wald, with correction) (33.8, 51.3) (39.7, 57.3) (29.2, 46.5) \n Unstratified Analysis \n Difference in Response rate (%) 6.0 -4.7 \n 95% CI (Wald, with correction) (-6.7, 18.6) (-17.2, 7.9) \n p-value (Chi-Squared Test) 0.3264 0.4385 \n Odds Ratio (95% CI) 1.27 (0.79 - 2.06) 0.82 (0.50 - 1.35)\n Stratified Analysis \n Difference in Response rate (%) 6.7 -5.1 \n 95% CI (CMH, without correction) (-5.0, 18.4) (-16.8, 6.6) \n p-value (Cochran-Mantel-Haenszel Test) 0.2781 0.4056 \n Odds Ratio (95% CI) 1.30 (0.80 - 2.11) 0.80 (0.49 - 1.32)\nFatigue Interference \n Responders 66 (49.3%) 50 (37.3%) 48 (36.4%) \n 95% CI (Wald, with correction) (40.4, 58.1) (28.8, 45.9) (27.8, 44.9) \n Unstratified Analysis \n Difference in Response rate (%) -11.9 -12.9 \n 95% CI (Wald, with correction) (-24.5, 0.6) (-25.4, -0.3) \n p-value (Chi-Squared Test) 0.0485 0.0337 \n Odds Ratio (95% CI) 0.61 (0.38 - 1.00) 0.59 (0.36 - 0.96)\n Stratified Analysis \n Difference in Response rate (%) -12.0 -13.3 \n 95% CI (CMH, without correction) (-23.7, -0.2) (-24.9, -1.6) \n p-value (Cochran-Mantel-Haenszel Test) 0.0518 0.0303 \n Odds Ratio (95% CI) 0.61 (0.37 - 0.99) 0.58 (0.36 - 0.96)\nFKSI-19 All Questions \n Responders 60 (44.8%) 57 (42.5%) 68 (51.5%) \n 95% CI (Wald, with correction) (36.0, 53.6) (33.8, 51.3) (42.6, 60.4) \n Unstratified Analysis \n Difference in Response rate (%) -2.2 6.7 \n 95% CI (Wald, with correction) (-14.9, 10.4) (-6.0, 19.5) \n p-value (Chi-Squared Test) 0.7118 0.2714 \n Odds Ratio (95% CI) 0.91 (0.56 - 1.48) 1.31 (0.81 - 2.12)\n Stratified Analysis \n Difference in Response rate (%) -2.8 5.6 \n 95% CI (CMH, without correction) (-14.3, 8.8) (-6.2, 17.4) \n p-value (Cochran-Mantel-Haenszel Test) 0.6442 0.3683 \n Odds Ratio (95% CI) 0.90 (0.56 - 1.47) 1.26 (0.77 - 2.04)\nFunction/Well-Being (GF1,GF3,GF7) \n Responders 49 (36.6%) 51 (38.1%) 47 (35.6%) \n 95% CI (Wald, with correction) (28.0, 45.1) (29.5, 46.7) (27.1, 44.2) \n Unstratified Analysis \n Difference in Response rate (%) 1.5 -1.0 \n 95% CI (Wald, with correction) (-10.8, 13.8) (-13.3, 11.3) \n p-value (Chi-Squared Test) 0.8006 0.8704 \n Odds Ratio (95% CI) 1.07 (0.65 - 1.75) 0.96 (0.58 - 1.58)\n Stratified Analysis \n Difference in Response rate (%) 2.8 -1.5 \n 95% CI (CMH, without correction) (-8.2, 13.8) (-13.0, 9.9) \n p-value (Cochran-Mantel-Haenszel Test) 0.6397 0.7952 \n Odds Ratio (95% CI) 1.12 (0.68 - 1.83) 0.99 (0.60 - 1.64)\nTreatment Side Effects (GP2,C5,GP5) \n Responders 62 (46.3%) 49 (36.6%) 51 (38.6%) \n 95% CI (Wald, with correction) (37.5, 55.1) (28.0, 45.1) (30.0, 47.3) \n Unstratified Analysis \n Difference in Response rate (%) -9.7 -7.6 \n 95% CI (Wald, with correction) (-22.2, 2.8) (-20.2, 5.0) \n p-value (Chi-Squared Test) 0.1069 0.2080 \n Odds Ratio (95% CI) 0.67 (0.41 - 1.09) 0.73 (0.45 - 1.19)\n Stratified Analysis \n Difference in Response rate (%) -9.6 -7.1 \n 95% CI (CMH, without correction) (-21.0, 1.8) (-18.8, 4.6) \n p-value (Cochran-Mantel-Haenszel Test) 0.1168 0.2426 \n Odds Ratio (95% CI) 0.67 (0.41 - 1.10) 0.73 (0.45 - 1.19)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADRS <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n})\ndatanames <- c(\"ADSL\", \"ADRS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADRS <- data[[\"ADRS\"]]\narm_ref_comp <- list(\n ARMCD = list(ref = \"ARM B\", comp = c(\"ARM A\", \"ARM C\")),\n ARM = list(ref = \"B: Placebo\", comp = c(\"A: Drug X\", \"C: Combination\"))\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_binary_outcome(\n label = \"Responders\",\n dataname = \"ADRS\",\n paramcd = choices_selected(\n choices = value_choices(ADRS, \"PARAMCD\", \"PARAM\"),\n selected = \"BESRSPI\"\n ),\n arm_var = choices_selected(\n choices = variable_choices(ADRS, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n selected = \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n strata_var = choices_selected(\n choices = variable_choices(ADRS, c(\"SEX\", \"BMRKR2\")),\n select = NULL\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:34:50 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nout <- adae %>%\n select(AESOC, AEDECOD, AELLT, AETERM) %>%\n unique()\n\nvar_labels(out) <- c(\n AESOC = \"MedDRA System Organ Class\",\n AEDECOD = \"MedDRA Preferred Term\",\n AELLT = \"MedDRA Lowest Level Term\",\n AETERM = \"Investigator-Specified\\nAdverse Event Term\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"AESOC\", \"AEDECOD\", \"AELLT\"),\n disp_cols = names(out),\n main_title = \"Listing of Preferred Terms, Lowest Level Terms, and Investigator-Specified Adverse Event Terms\"\n)\n\nhead(lsting, 20)\n\nListing of Preferred Terms, Lowest Level Terms, and Investigator-Specified Adverse Event Terms\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————\n Investigator-Specified\nMedDRA System Organ Class MedDRA Preferred Term MedDRA Lowest Level Term Adverse Event Term \n—————————————————————————————————————————————————————————————————————————————————————————————————————\n cl A dcd A.1.1.1.1 llt A.1.1.1.1 trm A.1.1.1.1 \n dcd A.1.1.1.2 llt A.1.1.1.2 trm A.1.1.1.2 \n cl B dcd B.1.1.1.1 llt B.1.1.1.1 trm B.1.1.1.1 \n dcd B.2.1.2.1 llt B.2.1.2.1 trm B.2.1.2.1 \n dcd B.2.2.3.1 llt B.2.2.3.1 trm B.2.2.3.1 \n cl C dcd C.1.1.1.3 llt C.1.1.1.3 trm C.1.1.1.3 \n dcd C.2.1.2.1 llt C.2.1.2.1 trm C.2.1.2.1 \n cl D dcd D.1.1.1.1 llt D.1.1.1.1 trm D.1.1.1.1 \n dcd D.1.1.4.2 llt D.1.1.4.2 trm D.1.1.4.2 \n dcd D.2.1.5.3 llt D.2.1.5.3 trm D.2.1.5.3 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:34:56 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "CMHT01" + "Listings", + "Adverse Events", + "AEL01" ] }, { - "objectID": "tables/efficacy/mmrmt01.html", - "href": "tables/efficacy/mmrmt01.html", - "title": "MMRMT01", + "objectID": "listings/disposition/dsl01.html", + "href": "listings/disposition/dsl01.html", + "title": "DSL01", "section": "", - "text": "Data Setup\nLeast Squares Means\nFixed Effects\nCovariance Matrix\nModel Diagnostics\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern.mmrm)\nlibrary(scda)\nlibrary(broom)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadqs <- df_explicit_na(adqs)\n\nadqs_f <- adqs %>%\n dplyr::filter(PARAMCD == \"FKSI-FWB\" & !AVISIT %in% c(\"BASELINE\", \"SCREENING\")) %>%\n droplevels() %>%\n dplyr::mutate(ARMCD = factor(ARMCD, levels = c(\"ARM B\", \"ARM A\", \"ARM C\"))) %>%\n dplyr::mutate(\n AVISITN = rank(AVISITN) %>%\n as.factor() %>%\n as.numeric() %>%\n as.factor()\n )\nadsl_sub <- adqs_f %>%\n dplyr::filter(!is.na(CHG)) %>%\n distinct(USUBJID) %>%\n left_join(adsl, by = \"USUBJID\")\nvar_labels(adqs_f) <- var_labels(adqs)\n\n\n\n\nConsidering the treatment variable in the model\n\nCodemmrm_results <- fit_mmrm(\n vars = list(\n response = \"CHG\",\n covariates = c(\"BASE\", \"STRATA1\", \"BMRKR2\"),\n id = \"USUBJID\",\n arm = \"ARMCD\",\n visit = \"AVISIT\"\n ),\n data = adqs_f,\n weights_emmeans = \"equal\"\n)\n\ndf <- tidy(mmrm_results)\nattr(df$AVISIT, \"label\") <- \"Visit\"\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\", ref_group = mmrm_results$ref_level) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(df$AVISIT)) %>%\n summarize_lsmeans(show_relative = \"increase\") %>%\n append_topleft(\" Statistics\") %>%\n build_table(df, alt_counts_df = adsl_sub)\n\nresult\n\nVisit ARM B ARM A ARM C \n Statistics (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————\nWEEK 1 DAY 8 \n n 134 134 132 \n Adjusted Mean (SE) 3.488 (0.687) 4.246 (0.687) 3.163 (0.692) \n 95% CI (2.136, 4.839) (2.895, 5.598) (1.803, 4.523) \n Difference in Adjusted Means (SE) 0.759 (0.973) -0.325 (0.976) \n 95% CI (-1.155, 2.672) (-2.243, 1.593) \n Relative Increase (%) 21.8% -9.3% \n p-value (MMRM) 0.4362 0.7393 \nWEEK 2 DAY 15 \n n 134 134 132 \n Adjusted Mean (SE) 9.135 (0.768) 9.018 (0.767) 8.509 (0.773) \n 95% CI (7.626, 10.644) (7.510, 10.527) (6.991, 10.028) \n Difference in Adjusted Means (SE) -0.117 (1.087) -0.626 (1.090) \n 95% CI (-2.253, 2.020) (-2.768, 1.517) \n Relative Increase (%) -1.3% -6.8% \n p-value (MMRM) 0.9147 0.5662 \nWEEK 3 DAY 22 \n n 134 134 132 \n Adjusted Mean (SE) 13.547 (0.871) 16.014 (0.871) 15.789 (0.877) \n 95% CI (11.835, 15.259) (14.303, 17.726) (14.066, 17.513)\n Difference in Adjusted Means (SE) 2.467 (1.232) 2.242 (1.236) \n 95% CI (0.044, 4.890) (-0.187, 4.672) \n Relative Increase (%) 18.2% 16.6% \n p-value (MMRM) 0.0460 0.0704 \nWEEK 4 DAY 29 \n n 134 134 132 \n Adjusted Mean (SE) 18.102 (0.995) 19.479 (0.995) 19.511 (1.002) \n 95% CI (16.146, 20.059) (17.523, 21.435) (17.541, 21.481)\n Difference in Adjusted Means (SE) 1.377 (1.408) 1.409 (1.413) \n 95% CI (-1.392, 4.145) (-1.368, 4.186) \n Relative Increase (%) 7.6% 7.8% \n p-value (MMRM) 0.3288 0.3192 \nWEEK 5 DAY 36 \n n 134 134 132 \n Adjusted Mean (SE) 23.503 (1.058) 24.931 (1.058) 23.704 (1.065) \n 95% CI (21.423, 25.583) (22.851, 27.011) (21.610, 25.798)\n Difference in Adjusted Means (SE) 1.428 (1.497) 0.201 (1.502) \n 95% CI (-1.515, 4.371) (-2.752, 3.153) \n Relative Increase (%) 6.1% 0.9% \n p-value (MMRM) 0.3408 0.8937 \n\n\nNot considering the treatment variable in the model\n\nCodemmrm_results_no_arm <- fit_mmrm(\n vars = list(\n response = \"CHG\",\n covariates = c(\"BMRKR2\", \"STRATA1\"),\n id = \"USUBJID\",\n visit = \"AVISIT\"\n ),\n data = adqs_f,\n weights_emmeans = \"equal\",\n parallel = TRUE\n)\n\ndf_no_arm <- tidy(mmrm_results_no_arm)\nattr(df_no_arm$AVISIT, \"label\") <- \"Visit\"\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n add_overall_col(\"All Patients\") %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(df_no_arm$AVISIT)) %>%\n summarize_lsmeans(arms = FALSE) %>%\n append_topleft(\" Statistics\") %>%\n build_table(df_no_arm, alt_counts_df = adsl_sub)\n\nresult\n\nVisit All Patients \n Statistics (N=400) \n———————————————————————————————————————\nWEEK 1 DAY 8 \n n 400 \n Adjusted Mean (SE) 3.615 (0.620) \n 95% CI (2.396, 4.834) \nWEEK 2 DAY 15 \n n 400 \n Adjusted Mean (SE) 8.870 (0.602) \n 95% CI (7.687, 10.053) \nWEEK 3 DAY 22 \n n 400 \n Adjusted Mean (SE) 15.094 (0.683) \n 95% CI (13.751, 16.437)\nWEEK 4 DAY 29 \n n 400 \n Adjusted Mean (SE) 19.009 (0.717) \n 95% CI (17.599, 20.418)\nWEEK 5 DAY 36 \n n 400 \n Adjusted Mean (SE) 24.028 (0.747) \n 95% CI (22.560, 25.496)\n\n\nAdding baseline rows\nIt may be of interest to summarize some different statistics at the baseline visit or summarize a different variable in the data set not used in the MMRM. For example, the model may use the variable CHG but the baseline visit row may summarize the AVAL variable, thus we would need to create two tables and then combine them to accomplish this.\n\nCode# First have the least-square means table.\na <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\", ref_group = mmrm_results$ref_level) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(df$AVISIT)) %>%\n summarize_lsmeans(show_relative = \"increase\") %>%\n append_topleft(\" Statistics\") %>%\n build_table(df, alt_counts_df = adsl_sub)\n\n# Second prepare the baseline values summary table.\nbaseline_dat <- adqs %>%\n filter(AVISIT == \"BASELINE\") %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n droplevels()\n\nb <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\") %>%\n split_rows_by(\"AVISIT\") %>%\n analyze_vars(\"AVAL\") %>%\n append_topleft(\" Statistics\") %>%\n build_table(baseline_dat, alt_counts_df = adsl_sub)\n\n# Now we can combine them as follows.\ncol_info(b) <- EmptyColInfo\nrbind(b, a)\n\nVisit ARM B ARM A ARM C \n Statistics (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————\nBASELINE \n n 134 134 132 \n Mean (SD) 49.9 (7.4) 49.7 (8.3) 50.3 (9.1) \n Median 48.7 49.3 49.7 \n Min - Max 33.7 - 65.9 25.8 - 71.5 26.0 - 70.0 \nWEEK 1 DAY 8 \n n 134 134 132 \n Adjusted Mean (SE) 3.488 (0.687) 4.246 (0.687) 3.163 (0.692) \n 95% CI (2.136, 4.839) (2.895, 5.598) (1.803, 4.523) \n Difference in Adjusted Means (SE) 0.759 (0.973) -0.325 (0.976) \n 95% CI (-1.155, 2.672) (-2.243, 1.593) \n Relative Increase (%) 21.8% -9.3% \n p-value (MMRM) 0.4362 0.7393 \nWEEK 2 DAY 15 \n n 134 134 132 \n Adjusted Mean (SE) 9.135 (0.768) 9.018 (0.767) 8.509 (0.773) \n 95% CI (7.626, 10.644) (7.510, 10.527) (6.991, 10.028) \n Difference in Adjusted Means (SE) -0.117 (1.087) -0.626 (1.090) \n 95% CI (-2.253, 2.020) (-2.768, 1.517) \n Relative Increase (%) -1.3% -6.8% \n p-value (MMRM) 0.9147 0.5662 \nWEEK 3 DAY 22 \n n 134 134 132 \n Adjusted Mean (SE) 13.547 (0.871) 16.014 (0.871) 15.789 (0.877) \n 95% CI (11.835, 15.259) (14.303, 17.726) (14.066, 17.513)\n Difference in Adjusted Means (SE) 2.467 (1.232) 2.242 (1.236) \n 95% CI (0.044, 4.890) (-0.187, 4.672) \n Relative Increase (%) 18.2% 16.6% \n p-value (MMRM) 0.0460 0.0704 \nWEEK 4 DAY 29 \n n 134 134 132 \n Adjusted Mean (SE) 18.102 (0.995) 19.479 (0.995) 19.511 (1.002) \n 95% CI (16.146, 20.059) (17.523, 21.435) (17.541, 21.481)\n Difference in Adjusted Means (SE) 1.377 (1.408) 1.409 (1.413) \n 95% CI (-1.392, 4.145) (-1.368, 4.186) \n Relative Increase (%) 7.6% 7.8% \n p-value (MMRM) 0.3288 0.3192 \nWEEK 5 DAY 36 \n n 134 134 132 \n Adjusted Mean (SE) 23.503 (1.058) 24.931 (1.058) 23.704 (1.065) \n 95% CI (21.423, 25.583) (22.851, 27.011) (21.610, 25.798)\n Difference in Adjusted Means (SE) 1.428 (1.497) 0.201 (1.502) \n 95% CI (-1.515, 4.371) (-2.752, 3.153) \n Relative Increase (%) 6.1% 0.9% \n p-value (MMRM) 0.3408 0.8937 \n\n\nConsidering visit averages\nIt may also be of interest to summarize several different statistics for an averaged combination of various visits in the MMRM. For example, you may want to see the statistics for the average of the first 2 visits, or the average statistics of all visits combined. This can be accomplished by specifying the averages_emmeans argument when fitting the MMRM model.\n\nCodemmrm_results_avg_visits <- fit_mmrm(\n vars = list(\n response = \"CHG\",\n covariates = c(\"BASE\", \"STRATA1\", \"BMRKR2\"),\n id = \"USUBJID\",\n arm = \"ARMCD\",\n visit = \"AVISIT\"\n ),\n data = adqs_f,\n weights_emmeans = \"equal\",\n averages_emmeans = list(\n \"WEEKS 1-2\" = c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\"),\n \"WEEKS 3-5\" = c(\"WEEK 3 DAY 22\", \"WEEK 4 DAY 29\", \"WEEK 5 DAY 36\"),\n \"ALL VISITS\" = c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\", \"WEEK 3 DAY 22\", \"WEEK 4 DAY 29\", \"WEEK 5 DAY 36\")\n )\n)\n\ndf_avgs <- tidy(mmrm_results_avg_visits)\nattr(df_avgs$AVISIT, \"label\") <- \"Visit\"\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\", ref_group = mmrm_results_avg_visits$ref_level) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(df_avgs$AVISIT)) %>%\n summarize_lsmeans(show_relative = \"increase\") %>%\n append_topleft(\" Statistics\") %>%\n build_table(df_avgs, alt_counts_df = adsl_sub)\n\nresult\n\nVisit ARM B ARM A ARM C \n Statistics (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————\nWEEK 1 DAY 8 \n n 134 134 132 \n Adjusted Mean (SE) 3.488 (0.687) 4.246 (0.687) 3.163 (0.692) \n 95% CI (2.136, 4.839) (2.895, 5.598) (1.803, 4.523) \n Difference in Adjusted Means (SE) 0.759 (0.973) -0.325 (0.976) \n 95% CI (-1.155, 2.672) (-2.243, 1.593) \n Relative Increase (%) 21.8% -9.3% \n p-value (MMRM) 0.4362 0.7393 \nWEEK 2 DAY 15 \n n 134 134 132 \n Adjusted Mean (SE) 9.135 (0.768) 9.018 (0.767) 8.509 (0.773) \n 95% CI (7.626, 10.644) (7.510, 10.527) (6.991, 10.028) \n Difference in Adjusted Means (SE) -0.117 (1.087) -0.626 (1.090) \n 95% CI (-2.253, 2.020) (-2.768, 1.517) \n Relative Increase (%) -1.3% -6.8% \n p-value (MMRM) 0.9147 0.5662 \nWEEK 3 DAY 22 \n n 134 134 132 \n Adjusted Mean (SE) 13.547 (0.871) 16.014 (0.871) 15.789 (0.877) \n 95% CI (11.835, 15.259) (14.303, 17.726) (14.066, 17.513)\n Difference in Adjusted Means (SE) 2.467 (1.232) 2.242 (1.236) \n 95% CI (0.044, 4.890) (-0.187, 4.672) \n Relative Increase (%) 18.2% 16.6% \n p-value (MMRM) 0.0460 0.0704 \nWEEK 4 DAY 29 \n n 134 134 132 \n Adjusted Mean (SE) 18.102 (0.995) 19.479 (0.995) 19.511 (1.002) \n 95% CI (16.146, 20.059) (17.523, 21.435) (17.541, 21.481)\n Difference in Adjusted Means (SE) 1.377 (1.408) 1.409 (1.413) \n 95% CI (-1.392, 4.145) (-1.368, 4.186) \n Relative Increase (%) 7.6% 7.8% \n p-value (MMRM) 0.3288 0.3192 \nWEEK 5 DAY 36 \n n 134 134 132 \n Adjusted Mean (SE) 23.503 (1.058) 24.931 (1.058) 23.704 (1.065) \n 95% CI (21.423, 25.583) (22.851, 27.011) (21.610, 25.798)\n Difference in Adjusted Means (SE) 1.428 (1.497) 0.201 (1.502) \n 95% CI (-1.515, 4.371) (-2.752, 3.153) \n Relative Increase (%) 6.1% 0.9% \n p-value (MMRM) 0.3408 0.8937 \nWEEKS 1-2 \n n 134 134 132 \n Adjusted Mean (SE) 6.311 (0.514) 6.632 (0.514) 5.836 (0.516) \n 95% CI (5.301, 7.322) (5.623, 7.642) (4.821, 6.852) \n Difference in Adjusted Means (SE) 0.321 (0.728) -0.475 (0.729) \n 95% CI (-1.111, 1.753) (-1.909, 0.959) \n Relative Increase (%) 5.1% -7.5% \n p-value (MMRM) 0.6596 0.5151 \nWEEKS 3-5 \n n 134 134 132 \n Adjusted Mean (SE) 18.384 (0.560) 20.141 (0.560) 19.668 (0.563) \n 95% CI (17.284, 19.485) (19.041, 21.241) (18.562, 20.775)\n Difference in Adjusted Means (SE) 1.757 (0.793) 1.284 (0.794) \n 95% CI (0.198, 3.316) (-0.278, 2.846) \n Relative Increase (%) 9.6% 7.0% \n p-value (MMRM) 0.0273 0.1068 \nALL VISITS \n n 134 134 132 \n Adjusted Mean (SE) 13.555 (0.388) 14.738 (0.388) 14.135 (0.389) \n 95% CI (12.792, 14.318) (13.976, 15.500) (13.370, 14.900)\n Difference in Adjusted Means (SE) 1.183 (0.551) 0.580 (0.551) \n 95% CI (0.100, 2.266) (-0.502, 1.663) \n Relative Increase (%) 8.7% 4.3% \n p-value (MMRM) 0.0324 0.2924 \n\n\n\n\n\nConsidering the treatment variable in the model\n\n\nCodeas.rtable(mmrm_results, type = \"fixed\")\n\n Estimate Std. Error t value df Pr(>|t|)\n——————————————————————————————————————————————————————————————————————————————————\n(Intercept) 55.7483 1.5244 36.5713 510 <0.0001 \nBASE -1.0196 0.0246 -41.4362 392 <0.0001 \nSTRATA1B -0.0369 0.5345 -0.0691 392 0.9450 \nSTRATA1C 0.0205 0.5238 0.0392 392 0.9688 \nBMRKR2MEDIUM -0.3840 0.5198 -0.7386 392 0.4606 \nBMRKR2HIGH -1.0056 0.5259 -1.9123 392 0.0566 \nARMCDARM A 0.7587 0.9733 0.7795 396 0.4362 \nARMCDARM C -0.3248 0.9756 -0.3329 394 0.7393 \nAVISITWEEK 2 DAY 15 5.6472 1.0331 5.4665 397 <0.0001 \nAVISITWEEK 3 DAY 22 10.0591 1.0897 9.2311 397 <0.0001 \nAVISITWEEK 4 DAY 29 14.6145 1.2176 12.0027 397 <0.0001 \nAVISITWEEK 5 DAY 36 20.0154 1.2584 15.9057 397 <0.0001 \nARMCDARM A:AVISITWEEK 2 DAY 15 -0.8752 1.4610 -0.5990 397 0.5495 \nARMCDARM C:AVISITWEEK 2 DAY 15 -0.3007 1.4665 -0.2050 397 0.8376 \nARMCDARM A:AVISITWEEK 3 DAY 22 1.7085 1.5411 1.1087 397 0.2682 \nARMCDARM C:AVISITWEEK 3 DAY 22 2.5673 1.5469 1.6597 397 0.0978 \nARMCDARM A:AVISITWEEK 4 DAY 29 0.6181 1.7220 0.3589 397 0.7198 \nARMCDARM C:AVISITWEEK 4 DAY 29 1.7337 1.7285 1.0030 397 0.3165 \nARMCDARM A:AVISITWEEK 5 DAY 36 0.6690 1.7796 0.3759 397 0.7072 \nARMCDARM C:AVISITWEEK 5 DAY 36 0.5257 1.7863 0.2943 397 0.7687 \n\n\nNot considering the treatment variable in the model\n\n\nCodeas.rtable(mmrm_results_no_arm, type = \"fixed\")\n\n Estimate Std. Error t value df Pr(>|t|)\n——————————————————————————————————————————————————————————————————————\n(Intercept) 1.5624 1.1751 1.3296 466 0.1843 \nBMRKR2MEDIUM 1.0924 1.1878 0.9196 395 0.3583 \nBMRKR2HIGH 1.4619 1.1971 1.2212 395 0.2227 \nSTRATA1B 2.6321 1.2180 2.1610 395 0.0313 \nSTRATA1C 0.9717 1.2008 0.8092 395 0.4189 \nAVISITWEEK 2 DAY 15 5.2548 0.5967 8.8061 399 <0.0001 \nAVISITWEEK 3 DAY 22 11.4787 0.6314 18.1802 399 <0.0001 \nAVISITWEEK 4 DAY 29 15.3937 0.7039 21.8696 399 <0.0001 \nAVISITWEEK 5 DAY 36 20.4130 0.7266 28.0921 399 <0.0001 \n\n\n\n\n\n\n\nCodeas.rtable(mmrm_results, type = \"cov\")\n\n WEEK 1 DAY 8 WEEK 2 DAY 15 WEEK 3 DAY 22 WEEK 4 DAY 29 WEEK 5 DAY 36\n————————————————————————————————————————————————————————————————————————————————————————————\nWEEK 1 DAY 8 63.0140 -0.6664 2.5965 -1.6231 0.2589 \nWEEK 2 DAY 15 -0.6664 78.6592 1.7004 -11.8677 -0.4261 \nWEEK 3 DAY 22 2.5965 1.7004 101.2949 -5.8424 7.1145 \nWEEK 4 DAY 29 -1.6231 -11.8677 -5.8424 132.4034 -5.3739 \nWEEK 5 DAY 36 0.2589 -0.4261 7.1145 -5.3739 149.6937 \n\n\n\n\nModel diagnostics are currently available to evaluate choice of covariates for the fixed and random effects. Statistics to evaluate choice of covariance structure are being investigated and will be included in a future release.\n\nCodeas.rtable(mmrm_results, type = \"diagnostic\")\n\n Diagnostic statistic value\n———————————————————————————————————————————\nREML criterion 14835.9968 \nAIC 14865.9968 \nAICc 14866.2412 \nBIC 14925.8688 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADQS <- synthetic_cdisc_dataset(\"latest\", \"adqs\") %>%\n filter(ABLFL != \"Y\" & ABLFL2 != \"Y\") %>%\n filter(AVISIT %in% c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\", \"WEEK 3 DAY 22\")) %>%\n mutate(\n AVISIT = as.factor(AVISIT),\n AVISITN = rank(AVISITN) %>%\n as.factor() %>%\n as.numeric() %>%\n as.factor() # making consecutive numeric factor\n )\n})\ndatanames <- c(\"ADSL\", \"ADQS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADQS <- data[[\"ADQS\"]]\narm_ref_comp <- list(\n ARMCD = list(\n ref = \"ARM A\",\n comp = c(\"ARM B\", \"ARM C\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_a_mmrm(\n label = \"MMRM\",\n dataname = \"ADQS\",\n aval_var = choices_selected(c(\"AVAL\", \"CHG\"), \"CHG\"),\n id_var = choices_selected(c(\"USUBJID\", \"SUBJID\"), \"USUBJID\"),\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARMCD\"),\n visit_var = choices_selected(c(\"AVISIT\", \"AVISITN\"), \"AVISIT\"),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n choices = value_choices(ADQS, \"PARAMCD\", \"PARAM\"),\n selected = \"FKSI-FWB\"\n ),\n cov_var = choices_selected(c(\"BASE\", \"AGE\", \"SEX\", \"BASE:AVISIT\"), NULL),\n conf_level = choices_selected(c(0.95, 0.9, 0.8), 0.95)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:35:30 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 broom_1.0.5 \n [9] scda_0.1.6.9017 tern.mmrm_0.3.0.9005 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9016 \n[15] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 mmrm_0.3.11 formatR_1.14 \n [4] tern.gee_0.1.3.9004 logger_0.3.0 testthat_3.2.1 \n [7] sandwich_3.1-0 rlang_1.1.3 multcomp_1.4-25 \n[10] compiler_4.3.3 callr_3.7.5 vctrs_0.6.5 \n[13] stringr_1.5.1 pkgconfig_2.0.3 fastmap_1.1.1 \n[16] backports_1.4.1 ellipsis_0.3.2 fontawesome_0.5.2 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 purrr_1.0.2 xfun_0.42 \n[25] shinyvalidate_0.1.3 cachem_1.0.8 teal.reporter_0.3.1.9002\n[28] jsonlite_1.8.8 later_1.3.2 parallel_4.3.3 \n[31] R6_2.5.1 bslib_0.6.1 stringi_1.8.3 \n[34] parallelly_1.37.1 brio_1.1.4 jquerylib_0.1.4 \n[37] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[40] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[43] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[46] yaml_2.3.8 TMB_1.9.10 codetools_0.2-19 \n[49] websocket_1.4.1 processx_3.8.4 teal.widgets_0.4.2.9009 \n[52] lattice_0.22-6 tibble_3.2.1 withr_3.0.0 \n[55] coda_0.19-4.1 evaluate_0.23 survival_3.5-8 \n[58] shinycssloaders_1.0.0 pillar_1.9.0 checkmate_2.3.1 \n[61] shinyjs_2.1.0 generics_0.1.3 chromote_0.2.0 \n[64] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[67] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[70] tools_4.3.3 webshot2_0.1.1 webshot_0.5.5 \n[73] forcats_1.0.0 mvtnorm_1.2-4 cowplot_1.1.3 \n[76] grid_4.3.3 tidyr_1.3.1 rbibutils_2.2.16 \n[79] colorspace_2.1-0 nlme_3.1-164 cli_3.6.2 \n[82] fansi_1.0.6 geepack_1.3.10 gtable_0.3.4 \n[85] sass_0.4.9 digest_0.6.35 TH.data_1.1-2 \n[88] htmlwidgets_1.6.4 memoise_2.0.1 htmltools_0.5.7 \n[91] lifecycle_1.0.4 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\nout <- adsl %>%\n filter(AEWITHFL == \"Y\") %>%\n mutate(\n ID = paste(SITEID, SUBJID, sep = \"/\"),\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n SSADM = toupper(format(as.Date(TRTSDTM), format = \"%d%b%Y\")),\n STDWD = as.numeric(ceiling(difftime(TRTEDTM, TRTSDTM, units = \"days\"))),\n DISCONT = ifelse(!is.na(DCSREAS) & toupper(EOSSTT) == \"DISCONTINUED\", \"Yes\", \"No\")\n ) %>%\n select(ID, ASR, TRT01A, SSADM, STDWD, DISCONT)\n\nvar_labels(out) <- c(\n ID = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n SSADM = \"Date of First\\nStudy Drug\\nAdministration\",\n STDWD = \"Study Day\\nof Withdrawal\",\n DISCONT = \"Discontinued\\nEarly from Study?\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = \"TRT01A\",\n disp_cols = names(out),\n main_title = \"Listing of Patients with Study Drug Withdrawn Due to Adverse Events\"\n)\n\nhead(lsting, 20)\n\nListing of Patients with Study Drug Withdrawn Due to Adverse Events\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of First \n Study Drug Study Day Discontinued \n Treatment Center/Patient ID Age/Sex/Race Administration of Withdrawal Early from Study?\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X RUS-18/id-359 47/F/BLACK OR AFRICAN AMERICAN 08JUN2019 1096 No \n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN 01JAN2020 NA No \n CHN-11/id-256 23/M/ASIAN 17MAR2020 1096 No \n CHN-1/id-26 29/M/WHITE 16JUL2020 1096 No \n CHN-1/id-62 36/F/WHITE 22NOV2020 455 Yes \n B: Placebo CHN-7/id-28 40/M/AMERICAN INDIAN OR ALASKA NATIVE 11MAR2019 1096 No \n CHN-13/id-102 37/M/ASIAN 23MAR2019 1096 No \n CHN-3/id-333 30/F/BLACK OR AFRICAN AMERICAN 13JAN2020 NA No \n USA-12/id-226 30/M/WHITE 29JAN2020 NA No \n CHN-9/id-147 26/F/ASIAN 06FEB2020 NA No \n USA-11/id-157 50/M/WHITE 14JUN2020 1096 No \n CHN-9/id-11 28/F/NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 27JAN2021 388 Yes \nC: Combination CHN-15/id-262 35/M/BLACK OR AFRICAN AMERICAN 26FEB2019 1096 No \n NGA-11/id-173 24/F/BLACK OR AFRICAN AMERICAN 10MAR2019 1096 No \n CHN-11/id-263 34/F/ASIAN 03APR2019 1096 No \n PAK-2/id-191 38/F/AMERICAN INDIAN OR ALASKA NATIVE 07APR2019 1096 No \n USA-11/id-136 38/F/ASIAN 02OCT2019 865 Yes \n CHN-17/id-31 35/F/ASIAN 17NOV2019 NA No \n BRA-11/id-237 64/F/ASIAN 10MAR2020 1096 No \n USA-11/id-100 40/F/ASIAN 10MAR2020 705 Yes \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:03 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "MMRMT01" + "Listings", + "Disposition", + "DSL01" ] }, { - "objectID": "tables/efficacy/ratet01.html", - "href": "tables/efficacy/ratet01.html", - "title": "RATET01", + "objectID": "listings/pharmacokinetic/pkpl01.html", + "href": "listings/pharmacokinetic/pkpl01.html", + "title": "PKPL01", "section": "", - "text": "This example will focus on data from a single visit “WEEK 1 DAY 8” and a single endpoint “FKSI-FWB”. Only evaluable populations will be analyzed.\n\n\nData Setup\nCustomized Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nanl <- synthetic_cdisc_dataset(\"latest\", \"adtte\") %>%\n filter(PARAMCD == \"TNE\")\n\n# Ensure number of exacerbation is a factor and NAs are explicit missing levels.\nanl$AVAL_f <- as.factor(anl$AVAL)\nanl <- df_explicit_na(anl)\n\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"B: Placebo\", split_fun = ref_group_position(\"first\")) %>%\n analyze_vars(\n \"AVAL_f\",\n var_labels = \"Number of exacerbations per patient\",\n .stats = c(\"count_fraction\"),\n .formats = c(\"count_fraction\" = \"xx (xx.xx%)\"),\n .labels = c(\"Number of exacerbations per patient\")\n ) %>%\n summarize_glm_count(\n vars = \"AVAL\",\n variables = list(arm = \"ARM\", offset = \"lgTMATRSK\", covariates = NULL),\n conf_level = 0.95,\n distribution = \"poisson\",\n rate_mean_method = \"emmeans\",\n var_labels = \"Unadjusted exacerbation rate (per year)\",\n table_names = \"unadj\",\n .stats = c(\"rate\"),\n .labels = c(rate = \"Rate\")\n ) %>%\n summarize_glm_count(\n vars = \"AVAL\",\n variables = list(arm = \"ARM\", offset = \"lgTMATRSK\", covariates = c(\"REGION1\")),\n conf_level = 0.95,\n distribution = \"quasipoisson\",\n rate_mean_method = \"ppmeans\",\n var_labels = \"Adjusted (QP) exacerbation rate (per year)\",\n table_names = \"adj-qp\",\n .stats = c(\"rate\", \"rate_ci\", \"rate_ratio\", \"rate_ratio_ci\", \"pval\"),\n .labels = c(\n rate = \"Rate\", rate_ci = \"Rate CI\", rate_ratio = \"Rate Ratio\",\n rate_ratio_ci = \"Rate Ratio CI\", pval = \"p value\"\n )\n ) %>%\n summarize_glm_count(\n vars = \"AVAL\",\n variables = list(arm = \"ARM\", offset = \"lgTMATRSK\", covariates = c(\"REGION1\")),\n conf_level = 0.95,\n distribution = \"negbin\",\n rate_mean_method = \"emmeans\",\n var_labels = \"Adjusted (NB) exacerbation rate (per year)\",\n table_names = \"adj-nb\",\n .stats = c(\"rate\", \"rate_ci\", \"rate_ratio\", \"rate_ratio_ci\", \"pval\"),\n .labels = c(\n rate = \"Rate\", rate_ci = \"Rate CI\", rate_ratio = \"Rate Ratio\",\n rate_ratio_ci = \"Rate Ratio CI\", pval = \"p value\"\n )\n )\nresult <- build_table(\n lyt = lyt,\n df = anl\n)\nresult\n\n B: Placebo A: Drug X C: Combination \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nNumber of exacerbations per patient \n 0 10 (7.46%) 6 (4.48%) 11 (8.33%) \n 1 25 (18.66%) 21 (15.67%) 14 (10.61%) \n 2 38 (28.36%) 41 (30.60%) 33 (25.00%) \n 3 22 (16.42%) 26 (19.40%) 21 (15.91%) \n 4 13 (9.70%) 18 (13.43%) 30 (22.73%) \n 5 11 (8.21%) 10 (7.46%) 12 (9.09%) \n 6 10 (7.46%) 7 (5.22%) 7 (5.30%) \n 7 3 (2.24%) 4 (2.99%) 3 (2.27%) \n 8 1 (0.75%) 1 (0.75%) 1 (0.76%) \n 9 1 (0.75%) 0 (0.00%) 0 (0.00%) \nUnadjusted exacerbation rate (per year) \n Rate 7.2364 8.2148 9.8131 \nAdjusted (QP) exacerbation rate (per year) \n Rate 2.4550 2.8514 3.4304 \n Rate CI (1.6194, 3.7219) (1.8974, 4.2850) (2.2946, 5.1284)\n Rate Ratio 1.1615 1.3973 \n Rate Ratio CI (0.6462, 2.0877) (0.7789, 2.5067)\n p value 0.6169 0.2619 \nAdjusted (NB) exacerbation rate (per year) \n Rate 2.7374 2.8150 2.9789 \n Rate CI (2.3932, 3.1311) (2.4681, 3.2106) (2.6152, 3.3932)\n Rate Ratio 1.0283 1.0882 \n Rate Ratio CI (0.8856, 1.1941) (0.9381, 1.2624)\n p value 0.7140 0.2643 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In Progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:35:47 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9016 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] sandwich_3.1-0 utf8_1.2.4 generics_0.1.3 tidyr_1.3.1 \n [5] stringi_1.8.3 lattice_0.22-6 digest_0.6.35 evaluate_0.23 \n [9] grid_4.3.3 estimability_1.5 mvtnorm_1.2-4 fastmap_1.1.1 \n[13] jsonlite_1.8.8 Matrix_1.6-5 backports_1.4.1 brio_1.1.4 \n[17] survival_3.5-8 multcomp_1.4-25 purrr_1.0.2 fansi_1.0.6 \n[21] scales_1.3.0 TH.data_1.1-2 codetools_0.2-19 Rdpack_2.6 \n[25] cli_3.6.2 rlang_1.1.3 rbibutils_2.2.16 munsell_0.5.0 \n[29] splines_4.3.3 yaml_2.3.8 tools_4.3.3 checkmate_2.3.1 \n[33] coda_0.19-4.1 colorspace_2.1-0 ggplot2_3.5.0 forcats_1.0.0 \n[37] broom_1.0.5 vctrs_0.6.5 R6_2.5.1 zoo_1.8-12 \n[41] lifecycle_1.0.4 emmeans_1.10.0 htmlwidgets_1.6.4 MASS_7.3-60.0.1 \n[45] pkgconfig_2.0.3 pillar_1.9.0 gtable_0.3.4 glue_1.7.0 \n[49] xfun_0.42 tibble_3.2.1 tidyselect_1.2.1 knitr_1.45 \n[53] xtable_1.8-4 htmltools_0.5.7 rmarkdown_2.26 testthat_3.2.1 \n[57] compiler_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(rlistings)\nlibrary(scda)\n\ndrug_a <- \"Plasma Drug X\"\nspec <- \"Plasma\"\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp_x <- adpp %>% filter(\n PPCAT == drug_a,\n PPSPEC == spec\n)\n\nout <- adpp_x %>%\n mutate(PARAM = paste0(PARAM, \" (\", AVALU, \")\")) %>%\n select(TRT01A, USUBJID, AVISIT, PARAM, AVAL) %>%\n tidyr::pivot_wider(\n id_cols = c(TRT01A, USUBJID, AVISIT),\n names_from = PARAM,\n values_from = AVAL\n )\n\nvar_labels(out) <- names(out)\nout <- out %>% var_relabel(\n TRT01A = \"Treatment Group\",\n USUBJID = \"Subject ID\",\n AVISIT = \"Visit\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"USUBJID\", \"AVISIT\"),\n disp_cols = names(out),\n main_title = paste(\"Listing of\", drug_a, spec, \"PK Parameters, PK Population\\nProtocol: xxnnnnn\"),\n subtitles = paste(\"Analyte:\", drug_a)\n)\n\nhead(lsting, 20)\n\nListing of Plasma Drug X Plasma PK Parameters, PK Population\nProtocol: xxnnnnn\nAnalyte: Plasma Drug X\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Group Subject ID Visit AUC Infinity Obs (day*ug/mL) Max Conc (ug/mL) Total CL Obs (ml/day/kg)\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X AB12345-BRA-1-id-105 SCREENING 145.191684898102 35.5067335878638 5.1567601025515 \n CYCLE 1 DAY 1 246.349321001289 31.2264481880236 4.41386730113941 \n CYCLE 1 DAY 2 225.443483077171 43.4987268488453 4.81490455551286 \n AB12345-BRA-1-id-134 SCREENING 157.461703380688 32.1171292884992 6.0374125711965 \n CYCLE 1 DAY 1 248.519038520728 21.7795763901966 4.561839813278 \n CYCLE 1 DAY 2 230.794839837734 21.0627132276049 6.95200595313275 \n AB12345-BRA-1-id-42 SCREENING 194.224015921831 20.4565798423567 6.33709739029277 \n CYCLE 1 DAY 1 210.528307366678 26.7845825535397 3.50776680376268 \n CYCLE 1 DAY 2 167.592869235882 34.8276545020143 4.11969088323673 \n AB12345-BRA-1-id-93 SCREENING 186.75868084484 27.3983170052516 3.40495133575408 \n CYCLE 1 DAY 1 160.406798051843 17.5296885232566 3.8508725098954 \n CYCLE 1 DAY 2 252.04512291352 32.4903879259459 6.21586252565961 \n AB12345-BRA-11-id-217 SCREENING 215.367414313054 20.8879942219526 6.55883385955605 \n CYCLE 1 DAY 1 272.094354596647 34.2812274648873 5.04441608634882 \n CYCLE 1 DAY 2 174.183265394136 23.04243406023 4.07416508597243 \n AB12345-BRA-11-id-345 SCREENING 235.746948097021 26.5740342881269 5.52059967823211 \n CYCLE 1 DAY 1 228.51025073098 39.7523164840323 6.32996327499752 \n CYCLE 1 DAY 2 120.712762389698 24.37143486359 5.02620823564574 \n AB12345-BRA-11-id-397 SCREENING 165.925716319045 21.8770819414152 6.3713157196375 \n CYCLE 1 DAY 1 201.536920713046 36.5841424116449 4.32440907316618 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:11 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 rlistings_0.2.7.9012 tibble_3.2.1 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "RATET01" + "Listings", + "Pharmacokinetic", + "PKPL01" ] }, { - "objectID": "tables/efficacy/aovt01.html", - "href": "tables/efficacy/aovt01.html", - "title": "AOVT01", + "objectID": "listings/pharmacokinetic/pkcl01.html", + "href": "listings/pharmacokinetic/pkcl01.html", + "title": "PKCL01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadqs <- df_explicit_na(adqs)\n\nadqs_multi <- filter(adqs, AVISIT == \"WEEK 1 DAY 8\")\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nl <- basic_table() %>%\n split_cols_by(\"ARMCD\", ref_group = \"ARM A\") %>%\n split_rows_by(\"PARAMCD\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adqs_multi$PARAMCD)\n ) %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(\n arm = \"ARMCD\",\n covariates = c(\"BASE\", \"STRATA1\")\n ),\n conf_level = 0.95,\n var_labels = \"Adjusted mean\"\n )\n\nresult <- build_table(\n lyt = l,\n df = adqs_multi,\n alt_counts_df = adsl\n)\n\nresult\n\nParameter Code ARM A ARM B ARM C \n————————————————————————————————————————————————————————————————————————\nBFIALL \n Adjusted mean \n n 134 134 132 \n Adjusted Mean 4.47 6.33 4.02 \n Difference in Adjusted Means 1.85 -0.46 \n 95% CI (-0.14, 3.85) (-2.45, 1.54)\n p-value 0.0679 0.6539 \nFATIGI \n Adjusted mean \n n 134 134 132 \n Adjusted Mean 5.42 4.83 4.56 \n Difference in Adjusted Means -0.59 -0.86 \n 95% CI (-2.58, 1.41) (-2.87, 1.15)\n p-value 0.5644 0.4026 \nFKSI-FWB \n Adjusted mean \n n 134 134 132 \n Adjusted Mean 4.29 3.51 3.06 \n Difference in Adjusted Means -0.79 -1.24 \n 95% CI (-2.71, 1.14) (-3.17, 0.69)\n p-value 0.4221 0.2088 \nFKSI-TSE \n Adjusted mean \n n 134 134 132 \n Adjusted Mean 4.70 3.84 4.45 \n Difference in Adjusted Means -0.86 -0.25 \n 95% CI (-2.80, 1.09) (-2.20, 1.70)\n p-value 0.3858 0.8007 \nFKSIALL \n Adjusted mean \n n 134 134 132 \n Adjusted Mean 5.03 5.82 6.44 \n Difference in Adjusted Means 0.79 1.42 \n 95% CI (-1.17, 2.76) (-0.56, 3.39)\n p-value 0.4288 0.1591 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADQS <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADQS <- df_explicit_na(ADQS)\n})\ndatanames <- c(\"ADSL\", \"ADQS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADQS <- data[[\"ADQS\"]]\narm_ref_comp <- list(\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n ),\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_ancova(\n label = \"ANCOVA table\",\n dataname = \"ADQS\",\n avisit = choices_selected(\n choices = value_choices(ADQS, \"AVISIT\"),\n selected = \"WEEK 1 DAY 8\"\n ),\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ACTARMCD\")),\n selected = \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n aval_var = choices_selected(\n choices = variable_choices(ADQS, c(\"CHG\", \"AVAL\")),\n selected = \"CHG\"\n ),\n cov_var = choices_selected(\n choices = variable_choices(ADQS, c(\"BASE\", \"STRATA1\", \"SEX\")),\n selected = \"STRATA1\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADQS, \"PARAMCD\", \"PARAM\"),\n selected = c(\"FKSI-FWB\", \"BFIALL\")\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:36:20 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(rlistings)\nlibrary(scda)\nlibrary(dplyr)\n\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\")\n\nanalyte <- \"Plasma Drug X\"\n\nout <- adpc %>%\n filter(PARAM == analyte) %>%\n select(ARM, USUBJID, VISIT, NFRLT, AFRLT, AVAL)\n\nvar_labels(out) <- c(\n ARM = \"Treatment Group\",\n USUBJID = \"Subject ID\",\n VISIT = \"Visit\",\n NFRLT = paste0(\"Nominal Sampling\\nTime (\", adpc$RELTMU[1], \")\"),\n AFRLT = paste0(\"Actual Time\\nFrom First\\nDose (\", adpc$RELTMU[1], \")\"),\n AVAL = paste0(\"Concentration\\n(\", adpc$AVALU[1], \")\")\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"ARM\", \"USUBJID\", \"VISIT\"),\n disp_cols = names(out),\n main_title = paste(\n \"Listing of\",\n analyte,\n \"Concentration by Treatment Group, Subject and Nominal Time, PK Population\\nProtocol: xxnnnnn\"\n ),\n subtitles = paste(\"Analyte:\", analyte)\n)\n\nhead(lsting, 20)\n\nListing of Plasma Drug X Concentration by Treatment Group, Subject and Nominal Time, PK Population\nProtocol: xxnnnnn\nAnalyte: Plasma Drug X\n\n———————————————————————————————————————————————————————————————————————————————————————————————\n Actual Time \n Nominal Sampling From First Concentration\nTreatment Group Subject ID Visit Time (hr) Dose (hr) (ug/mL) \n———————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X AB12345-BRA-1-id-105 Day 1 0 0 0 \n 0.5 0.5 10.404 \n 1 1 13.987 \n 1.5 1.5 14.142 \n 2 2 12.744 \n 3 3 8.803 \n 4 4 5.461 \n 8 8 0.562 \n 12 12 0.049 \n Day 2 24 24 0 \n AB12345-BRA-1-id-134 Day 1 0 0 0 \n 0.5 0.5 14.405 \n 1 1 17.863 \n 1.5 1.5 16.613 \n 2 2 13.735 \n 3 3 7.923 \n 4 4 4.064 \n 8 8 0.178 \n 12 12 0.006 \n Day 2 24 24 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:18 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 scda_0.1.6.9017 rlistings_0.2.7.9012 \n[4] tibble_3.2.1 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "AOVT01" + "Listings", + "Pharmacokinetic", + "PKCL01" ] }, { - "objectID": "tables/efficacy/cfbt01.html", - "href": "tables/efficacy/cfbt01.html", - "title": "CFBT01", + "objectID": "listings/ECG/egl01.html", + "href": "listings/ECG/egl01.html", + "title": "EGL01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadqs <- df_explicit_na(adqs)\n\n# This example focuses on \"BFI All Questions\" starting from baseline.\nadqs <- adqs %>%\n dplyr::filter(\n PARAM == \"BFI All Questions\",\n AVISIT != \"SCREENING\"\n )\n\n# Define the split function for AVISIT\nsplit_fun <- drop_split_levels\n\n\n\n\n\nCodeafun <- function(x, .var, .spl_context, ...) {\n n_fun <- sum(!is.na(x), na.rm = TRUE)\n if (n_fun == 0) {\n mean_sd_fun <- c(NA, NA)\n median_fun <- NA\n min_max_fun <- c(NA, NA)\n } else {\n mean_sd_fun <- c(mean(x, na.rm = TRUE), sd(x, na.rm = TRUE))\n median_fun <- median(x, na.rm = TRUE)\n min_max_fun <- c(min(x), max(x))\n }\n is_chg <- .var == \"CHG\"\n is_baseline <- .spl_context$value[which(.spl_context$split == \"AVISIT\")] == \"BASELINE\"\n if (is_baseline && is_chg) n_fun <- mean_sd_fun <- median_fun <- min_max_fun <- NULL\n\n in_rows(\n \"n\" = n_fun,\n \"Mean (SD)\" = mean_sd_fun,\n \"Median\" = median_fun,\n \"Min - Max\" = min_max_fun,\n .formats = list(\"n\" = \"xx\", \"Mean (SD)\" = \"xx.xx (xx.xx)\", \"Median\" = \"xx.xx\", \"Min - Max\" = \"xx.xx - xx.xx\"),\n .format_na_strs = list(\"n\" = \"NE\", \"Mean (SD)\" = \"NE (NE)\", \"Median\" = \"NE\", \"Min - Max\" = \"NE - NE\")\n )\n}\n\nlyt <- basic_table() %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adqs$PARAM)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adqs$AVISIT)\n ) %>%\n split_cols_by_multivar(\n vars = c(\"AVAL\", \"CHG\"),\n varlabels = c(\"Value at Visit\", \"Change from\\nBaseline\")\n ) %>%\n analyze_colvars(afun = afun)\n\nresult <- build_table(lyt, adqs)\nresult\n\n A: Drug X B: Placebo C: Combination \nParameter Change from Change from Change from \n Analysis Visit Value at Visit Baseline Value at Visit Baseline Value at Visit Baseline \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nBFI All Questions \n BASELINE \n n 134 134 132 \n Mean (SD) 49.93 (7.44) 49.74 (8.29) 50.30 (9.06) \n Median 48.69 49.28 49.74 \n Min - Max 33.72 - 65.91 25.82 - 71.47 26.04 - 69.99 \n WEEK 1 DAY 8 \n n 134 134 134 134 132 132 \n Mean (SD) 54.51 (8.61) 4.58 (11.23) 56.33 (7.86) 6.59 (11.81) 54.03 (8.31) 3.72 (12.66) \n Median 55.15 5.47 56.39 6.96 53.76 3.71 \n Min - Max 34.26 - 75.42 -25.52 - 29.68 36.82 - 74.45 -25.10 - 31.05 26.89 - 75.95 -26.81 - 33.75\n WEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 60.98 (10.31) 11.05 (12.46) 59.68 (9.59) 9.94 (12.84) 60.11 (8.76) 9.80 (12.59) \n Median 60.60 10.45 58.18 8.95 61.08 10.04 \n Min - Max 35.94 - 96.53 -14.02 - 45.01 40.44 - 84.70 -17.59 - 40.52 32.76 - 78.25 -26.57 - 39.56\n WEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 64.64 (9.88) 14.72 (11.99) 65.78 (10.17) 16.04 (13.80) 63.65 (10.50) 13.35 (13.39) \n Median 65.21 15.10 66.28 15.49 63.79 12.24 \n Min - Max 40.49 - 95.35 -16.76 - 43.40 42.16 - 92.32 -17.70 - 46.85 29.29 - 88.41 -22.40 - 39.94\n WEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 69.43 (11.12) 19.51 (13.83) 69.79 (11.46) 20.05 (14.38) 70.68 (10.23) 20.37 (12.99) \n Median 69.22 19.90 70.37 20.99 70.85 20.94 \n Min - Max 38.38 - 95.48 -17.34 - 49.18 45.79 - 93.33 -19.66 - 58.05 30.53 - 90.61 -14.01 - 60.23\n WEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 74.31 (12.44) 24.38 (14.75) 74.73 (12.96) 24.99 (14.67) 75.89 (13.54) 25.59 (17.18) \n Median 76.12 25.20 74.13 22.81 76.70 25.32 \n Min - Max 39.45 - 103.92 -7.53 - 56.23 38.19 - 109.61 -18.42 - 64.15 43.79 - 102.40 -16.11 - 67.78\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADQS <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADQS <- df_explicit_na(ADQS)\n})\ndatanames <- c(\"ADSL\", \"ADQS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADQS <- data[[\"ADQS\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Efficacy Data and Change from Baseline by Visit\",\n dataname = \"ADQS\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADQS, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"AVISIT\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADQS, c(\"AVAL\", \"CHG\")),\n selected = c(\"AVAL\", \"CHG\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADQS, \"PARAMCD\", \"PARAM\"),\n selected = \"BFIALL\"\n ),\n add_total = FALSE,\n parallel_vars = TRUE\n )\n ),\n filter = teal_slices(\n teal_slice(\"ADQS\", \"AVISIT\", selected = NULL),\n teal_slice(\"ADQS\", \"AVAL\", selected = NULL)\n )\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADQS-filter-ADQS_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:36:52 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\nget_param_unit_range <- function(dataset) {\n u_rng <- lapply(unique(dataset$PARAMCD), function(p) {\n dat <- dataset %>% filter(PARAMCD == p)\n list(\n unit = unique(dat$AVALU),\n range = paste0(unique(dat$ANRLO), \"-\", unique(dat$ANRHI))\n )\n })\n names(u_rng) <- unique(dataset$PARAMCD)\n u_rng\n}\n\neg_u_rng <- get_param_unit_range(adeg)\n\nadeg_sub <- adeg %>%\n filter(!is.na(AVAL) & SAFFL == \"Y\" & ANL01FL == \"Y\" & !is.na(EGSEQ) & PARAMCD != \"ECGINTP\") %>%\n mutate(\n CRTNPT = paste(SITEID, sub(\"^.*-([[:alnum:]]+)$\", \"\\\\1\", SUBJID), sep = \"/\"),\n AGSXRC = paste(AGE, SEX, RACE, sep = \"/\"),\n AVAL = format(round(AVAL, 2), nsmall = 2),\n AVAL_ANRIND = ifelse(ANRIND %in% c(\"NORMAL\", \"\"), AVAL, paste(AVAL, substr(ANRIND, 1, 1), sep = \"/\")),\n CHG = format(round(CHG, 2), nsmall = 2)\n )\n\nanl_eg <- adeg_sub %>%\n select(SUBJID, CRTNPT, AGSXRC, TRT01A, PARAMCD, AVAL_ANRIND, CHG, ADY, AVISIT, ADTM) %>%\n tidyr::pivot_wider(\n id_cols = c(SUBJID, CRTNPT, AGSXRC, TRT01A, ADY, AVISIT, ADTM),\n names_from = PARAMCD,\n values_from = c(AVAL_ANRIND, CHG)\n )\n\nout <- anl_eg %>%\n select(\n CRTNPT,\n AGSXRC,\n TRT01A,\n AVISIT,\n ADY,\n AVAL_ANRIND_HR,\n CHG_HR,\n AVAL_ANRIND_QT,\n CHG_QT,\n AVAL_ANRIND_RR,\n CHG_RR\n ) %>%\n var_relabel(\n CRTNPT = \"Center/Subject ID\",\n AGSXRC = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n AVISIT = \"Visit\",\n ADY = \"Study\\nDay\",\n AVAL_ANRIND_HR = paste0(\"Heart Rate Result\\n(\", eg_u_rng$HR$unit, \");\\nRange:(\", eg_u_rng$HR$range, \")\"),\n CHG_HR = \"Heart Rate\\nChange from BL\",\n AVAL_ANRIND_QT = paste0(\"QT Duration Result\\n(\", eg_u_rng$QT$unit, \");\\nRange:(\", eg_u_rng$QT$range, \")\"),\n CHG_QT = \"QT Duration\\nChange from BL\",\n AVAL_ANRIND_RR = paste0(\"RR Duration Result\\n(\", eg_u_rng$RR$unit, \");\\nRange:(\", eg_u_rng$RR$range, \")\"),\n CHG_RR = \"RR Duration\\nChange from BL\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CRTNPT\", \"AGSXRC\", \"AVISIT\", \"ADY\"),\n disp_cols = names(out),\n main_title = \"Listing of ECG Data: Safety-Evaluable Patients\",\n main_footer = \"Baseline is the patient's last observation prior to initiation of study drug. Abnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range.\" \n)\n\nhead(lsting, 20)\n\nListing of ECG Data: Safety-Evaluable Patients\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Heart Rate Result QT Duration Result RR Duration Result \n Study (beats/min); Heart Rate (msec); QT Duration (msec); RR Duration \nTreatment Center/Subject ID Age/Sex/Race Visit Day Range:(40-100) Change from BL Range:(200-500) Change from BL Range:(600-1500) Change from BL\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/105 38/M/BLACK OR AFRICAN AMERICAN BASELINE 149 66.94 NA 441.78 NA 896.59 NA \n WEEK 1 DAY 8 314 63.18 -3.76 365.68 -76.10 1376.26 479.67 \n WEEK 2 DAY 15 398 57.57 -9.37 355.48 -86.29 799.57 -97.02 \n WEEK 3 DAY 22 470 73.36 6.42 352.45 -89.33 1015.00 118.41 \n WEEK 4 DAY 29 528 53.72 -13.22 388.42 -53.36 1189.29 292.70 \n WEEK 5 DAY 36 535 58.25 -8.69 291.77 -150.01 936.09 39.50 \n BRA-1/134 47/M/WHITE BASELINE 227 46.99 NA 385.29 NA 835.17 NA \n WEEK 1 DAY 8 255 48.38 1.39 453.74 68.46 901.86 66.68 \n WEEK 2 DAY 15 269 35.40/L -11.59 413.54 28.26 892.01 56.84 \n WEEK 3 DAY 22 357 60.50 13.51 394.23 8.95 490.18/L -344.99 \n WEEK 4 DAY 29 436 82.28 35.29 398.29 13.00 757.96 -77.21 \n WEEK 5 DAY 36 440 38.89/L -8.10 339.38 -45.91 880.26 45.08 \n BRA-1/42 36/M/BLACK OR AFRICAN AMERICAN BASELINE 477 56.19 NA 190.94/L NA 1276.65 NA \n WEEK 1 DAY 8 534 85.24 29.05 483.71 292.77 735.11 -541.54 \n WEEK 2 DAY 15 550 55.53 -0.66 386.60 195.66 1092.71 -183.94 \n WEEK 3 DAY 22 569 65.37 9.18 311.08 120.14 1227.15 -49.50 \n WEEK 4 DAY 29 608 65.13 8.93 329.78 138.83 250.18/L -1026.47 \n WEEK 5 DAY 36 675 49.03 -7.16 470.67 279.73 1321.21 44.56 \n BRA-1/93 34/F/ASIAN BASELINE 73 72.12 NA 306.64 NA 1324.80 NA \n WEEK 1 DAY 8 207 66.88 -5.24 190.50/L -116.14 1495.37 170.58 \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nBaseline is the patient's last observation prior to initiation of study drug. Abnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:26 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "CFBT01" + "Listings", + "ECG", + "EGL01" ] }, { - "objectID": "tables/efficacy/coxt01.html", - "href": "tables/efficacy/coxt01.html", - "title": "COXT01", + "objectID": "listings/concomitant-medications/cml02a_gl.html", + "href": "listings/concomitant-medications/cml02a_gl.html", + "title": "CML02A_GL", "section": "", - "text": "Cox models are the most commonly used methods to estimate the magnitude of the effect in survival analyses. It assumes proportional hazards; that is, it assumes that the ratio of the hazards of the two groups (e.g. two arms) is constant over time. This ratio is referred to as the “hazard ratio” and is one of the most commonly reported metrics to describe the effect size in survival analysis.\n\n\nData Setup\nCox Regression\nCox Regression with Interaction Term\nCox Regression Specifying Covariates\nCox Regression Setting Strata, Ties, Alpha Level\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadtte <- df_explicit_na(adtte)\n\nadsl_filtered <- adsl %>% dplyr::filter(\n RACE %in% c(\"ASIAN\", \"BLACK OR AFRICAN AMERICAN\", \"WHITE\")\n)\nadtte_filtered <- dplyr::inner_join(\n x = adsl_filtered[, c(\"STUDYID\", \"USUBJID\")],\n y = adtte,\n by = c(\"STUDYID\", \"USUBJID\")\n)\n\nanl <- adtte_filtered %>%\n filter(PARAMCD == \"OS\") %>%\n mutate(EVENT = 1 - CNSR) %>%\n filter(ARM %in% c(\"B: Placebo\", \"A: Drug X\")) %>%\n mutate(ARM = droplevels(relevel(ARM, \"B: Placebo\"))) %>%\n mutate(RACE = droplevels(RACE) %>% formatters::with_label(\"Race\"))\n\n# Add variable for column split label\nanl <- anl %>% mutate(col_label = \"Treatment Effect Adjusted for Covariate\")\n\n\n\n\nThe summarize_coxreg function fits, tidies and arranges a Cox regression model in a table layout using the rtables framework. For a Cox regression model, arguments variables, control, and at can be specified (see ?summarize_coxreg for more details and customization options). All variables specified within variables must be present in the data used when building the table.\nTo see the same model as a data.frame object, these three arguments (as well as the data) can be passed to the fit_coxreg_univar function, and the resulting list tidied using broom::tidy().\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARM\",\n covariates = c(\"AGE\", \"SEX\", \"RACE\")\n)\n\nlyt <- basic_table() %>%\n split_cols_by(\"col_label\") %>%\n summarize_coxreg(variables = variables) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\n Treatment Effect Adjusted for Covariate \nEffect/Covariate Included in the Model n Hazard Ratio 95% CI p-value \n—————————————————————————————————————————————————————————————————————————————————————————\nTreatment: \n A: Drug X vs control (B: Placebo) 247 0.97 (0.66, 1.43) 0.8934 \nCovariate: \n Age 247 0.95 (0.65, 1.40) 0.7948 \n Sex 247 0.98 (0.67, 1.43) 0.8970 \n Race 247 0.98 (0.67, 1.44) 0.9239 \n\n\n\n\nThe argument control can be used to modify standard outputs; control_coxreg() helps in adopting the right settings (see ?control_coxreg). For instance, control is used to include the interaction terms.\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARM\",\n covariates = c(\"AGE\", \"RACE\")\n)\n\nlyt <- basic_table() %>%\n split_cols_by(\"col_label\") %>%\n summarize_coxreg(\n variables = variables,\n control = control_coxreg(interaction = TRUE),\n .stats = c(\"n\", \"hr\", \"ci\", \"pval\", \"pval_inter\")\n ) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\n Treatment Effect Adjusted for Covariate \nEffect/Covariate Included in the Model n Hazard Ratio 95% CI p-value Interaction p-value\n——————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment: \n A: Drug X vs control (B: Placebo) 247 0.97 (0.66, 1.43) 0.8934 \nCovariate: \n Age 247 0.7878 \n 34 0.95 (0.65, 1.40) \n Race 247 0.6850 \n ASIAN 1.05 (0.63, 1.75) \n BLACK OR AFRICAN AMERICAN 1.08 (0.51, 2.29) \n WHITE 0.67 (0.27, 1.71) \n\n\n\n\nThe optional argument at allows the user to provide the expected level of estimation for the interaction when the predictor is a quantitative variable. For instance, it might be relevant to choose the age at which the hazard ratio should be estimated. If no input is provided to at, the median value is used in the row name (as in the previous tab).\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARM\",\n covariates = c(\"AGE\", \"SEX\")\n)\n\nlyt <- basic_table() %>%\n split_cols_by(\"col_label\") %>%\n summarize_coxreg(\n variables = variables,\n control = control_coxreg(interaction = TRUE),\n at = list(AGE = c(30, 40, 50)),\n .stats = c(\"n\", \"hr\", \"ci\", \"pval\", \"pval_inter\")\n ) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\n Treatment Effect Adjusted for Covariate \nEffect/Covariate Included in the Model n Hazard Ratio 95% CI p-value Interaction p-value\n——————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment: \n A: Drug X vs control (B: Placebo) 247 0.97 (0.66, 1.43) 0.8934 \nCovariate: \n Age 247 0.7878 \n 30 0.98 (0.63, 1.51) \n 40 0.91 (0.54, 1.51) \n 50 0.84 (0.32, 2.20) \n Sex 247 0.1455 \n F 0.77 (0.47, 1.27) \n M 1.38 (0.75, 2.52) \n\n\n\n\nAdditional controls can be customized using control_coxreg (see ?control_coxreg) such as the ties calculation method and the confidence level. Stratification variables can be added via the strata element of the variables list.\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARM\",\n covariates = c(\"AGE\", \"RACE\"),\n strata = \"SEX\"\n)\n\ncontrol <- control_coxreg(\n ties = \"breslow\",\n interaction = TRUE,\n conf_level = 0.90\n)\n\nlyt <- basic_table() %>%\n split_cols_by(\"col_label\") %>%\n summarize_coxreg(\n variables = variables,\n control = control,\n at = list(AGE = c(30, 40, 50)),\n .stats = c(\"n\", \"hr\", \"ci\", \"pval\", \"pval_inter\")\n ) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\n Treatment Effect Adjusted for Covariate \nEffect/Covariate Included in the Model n Hazard Ratio 90% CI p-value Interaction p-value\n——————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment: \n A: Drug X vs control (B: Placebo) 247 0.98 (0.71, 1.35) 0.9063 \nCovariate: \n Age 247 0.7733 \n 30 0.98 (0.68, 1.42) \n 40 0.91 (0.59, 1.39) \n 50 0.84 (0.38, 1.87) \n Race 247 0.6501 \n ASIAN 1.07 (0.64, 1.77) \n BLACK OR AFRICAN AMERICAN 1.08 (0.51, 2.29) \n WHITE 0.66 (0.26, 1.67) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADTTE <- df_explicit_na(ADTTE)\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADTTE <- data[[\"ADTTE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_coxreg(\n label = \"Cox Reg.\",\n dataname = \"ADTTE\",\n arm_var = choices_selected(c(\"ARM\", \"ACTARMCD\"), \"ARM\"),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADTTE, \"PARAMCD\", \"PARAM\"), \"OS\"\n ),\n strata_var = choices_selected(\n c(\"SEX\", \"STRATA1\", \"STRATA2\"), NULL\n ),\n cov_var = choices_selected(\n c(\"AGE\", \"SEX\", \"RACE\"), \"AGE\"\n ),\n multivariate = FALSE\n )\n )\n)\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:37:20 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 stringr_1.5.1 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 utf8_1.2.4 \n[19] promises_1.2.1 rmarkdown_2.26 ps_1.7.6 \n[22] purrr_1.0.2 xfun_0.42 shinyvalidate_0.1.3 \n[25] cachem_1.0.8 teal.reporter_0.3.1.9002 jsonlite_1.8.8 \n[28] later_1.3.2 broom_1.0.5 R6_2.5.1 \n[31] bslib_0.6.1 stringi_1.8.3 car_3.1-2 \n[34] brio_1.1.4 jquerylib_0.1.4 estimability_1.5 \n[37] Rcpp_1.0.12 knitr_1.45 zoo_1.8-12 \n[40] teal.logger_0.2.0.9001 httpuv_1.6.14 Matrix_1.6-5 \n[43] splines_4.3.3 tidyselect_1.2.1 abind_1.4-5 \n[46] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[49] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[52] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[55] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[58] shinycssloaders_1.0.0 carData_3.0-5 checkmate_2.3.1 \n[61] shinyjs_2.1.0 generics_0.1.3 chromote_0.2.0 \n[64] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[67] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[70] tools_4.3.3 webshot2_0.1.1 webshot_0.5.5 \n[73] forcats_1.0.0 mvtnorm_1.2-4 grid_4.3.3 \n[76] tidyr_1.3.1 rbibutils_2.2.16 colorspace_2.1-0 \n[79] nlme_3.1-164 cli_3.6.2 fansi_1.0.6 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] shinyWidgets_0.8.2 mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nout <- adcm %>%\n select(ATC2, CMDECOD, CMTRT) %>%\n unique()\n\nvar_labels(out) <- c(\n ATC2 = \"ATC Class Level 2\",\n CMDECOD = \"WHODrug Preferred Name\",\n CMTRT = \"Investigator-Specified\\nTreatment Term\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"ATC2\", \"CMDECOD\", \"CMTRT\"),\n disp_cols = names(out),\n main_title = \"Listing of Concomitant Medication Class Level 2, Preferred Name, and Investigator-Specified Terms\"\n)\n\nhead(lsting, 20)\n\nListing of Concomitant Medication Class Level 2, Preferred Name, and Investigator-Specified Terms\n\n———————————————————————————————————————————————————————————————————\n Investigator-Specified\nATC Class Level 2 WHODrug Preferred Name Treatment Term \n———————————————————————————————————————————————————————————————————\n ATCCLAS2 A medname A_1/3 A_1/3 \n medname A_2/3 A_2/3 \n medname A_3/3 A_3/3 \n ATCCLAS2 A p2 medname A_3/3 A_3/3 \n ATCCLAS2 B medname B_1/4 B_1/4 \n medname B_2/4 B_2/4 \n medname B_3/4 B_3/4 \n medname B_4/4 B_4/4 \n ATCCLAS2 B p2 medname B_1/4 B_1/4 \n medname B_2/4 B_2/4 \n ATCCLAS2 B p3 medname B_1/4 B_1/4 \n medname B_2/4 B_2/4 \n ATCCLAS2 C medname C_1/2 C_1/2 \n medname C_2/2 C_2/2 \n ATCCLAS2 C p2 medname C_1/2 C_1/2 \n medname C_2/2 C_2/2 \n ATCCLAS2 C p3 medname C_2/2 C_2/2 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:33 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Tables", - "Efficacy", - "COXT01" - ] + "Listings", + "Concomitant Medications", + "CML02A_GL" + ] }, { - "objectID": "tables/efficacy/ttet01.html", - "href": "tables/efficacy/ttet01.html", - "title": "TTET01", + "objectID": "listings/vital-signs/vsl01.html", + "href": "listings/vital-signs/vsl01.html", + "title": "VSL01", + "section": "", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadvs <- synthetic_cdisc_dataset(\"latest\", \"advs\")\n\nget_param_unit_range <- function(dataset) {\n u_rng <- lapply(unique(dataset$PARAMCD), function(p) {\n dat <- dataset %>% filter(PARAMCD == p)\n list(\n unit = unique(dat$AVALU),\n range = paste0(unique(dat$ANRLO), \"-\", unique(dat$ANRHI))\n )\n })\n names(u_rng) <- unique(dataset$PARAMCD)\n u_rng\n}\n\nvs_u_rng <- get_param_unit_range(advs)\n\nadvs_sub <- advs %>%\n filter(!is.na(AVAL) & SAFFL == \"Y\" & ONTRTFL == \"Y\" & !is.na(VSSEQ)) %>%\n mutate(\n CRTNPT = paste(SITEID, sub(\"^.*-([[:alnum:]]+)$\", \"\\\\1\", SUBJID), sep = \"/\"),\n AGSXRC = paste(AGE, SEX, RACE, sep = \"/\"),\n AVAL = format(round(AVAL, 2), nsmall = 2),\n AVAL_ANRIND = ifelse(ANRIND %in% c(\"NORMAL\", \"\"), AVAL, paste(AVAL, substr(ANRIND, 1, 1), sep = \"/\")),\n CHG = format(round(CHG, 2), nsmall = 2)\n )\n\nanl_vs <- advs_sub %>%\n select(SUBJID, CRTNPT, AGSXRC, TRT01A, PARAMCD, AVAL_ANRIND, CHG, ADY, AVISIT, ADTM) %>%\n tidyr::pivot_wider(\n id_cols = c(SUBJID, CRTNPT, AGSXRC, TRT01A, ADY, AVISIT, ADTM),\n names_from = PARAMCD,\n values_from = c(AVAL_ANRIND, CHG)\n )\n\nout <- anl_vs %>%\n select(\n CRTNPT, AGSXRC, TRT01A, AVISIT, ADY, AVAL_ANRIND_WEIGHT, CHG_WEIGHT, AVAL_ANRIND_TEMP, CHG_TEMP, AVAL_ANRIND_DIABP,\n CHG_DIABP, AVAL_ANRIND_SYSBP, CHG_SYSBP, AVAL_ANRIND_PULSE, CHG_PULSE, AVAL_ANRIND_RESP, CHG_RESP\n ) %>%\n var_relabel(\n CRTNPT = \"Center/Subject ID\",\n AGSXRC = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n AVISIT = \"Visit\",\n ADY = \"Study\\nDay\",\n AVAL_ANRIND_WEIGHT = paste0(\n \"Weight\\nResult\\n(\",\n vs_u_rng$WEIGHT$unit,\n \");\\nRange:(\",\n vs_u_rng$WEIGHT$range,\n \")\"\n ),\n CHG_WEIGHT = \"Weight\\nChange from BL\",\n AVAL_ANRIND_TEMP = paste0(\n \"Temperature Result\\n(\",\n vs_u_rng$TEMP$unit,\n \");\\nRange:(\",\n vs_u_rng$TEMP$range,\n \")\"\n ),\n CHG_TEMP = \"Temperature Rate\\nChange from BL\",\n AVAL_ANRIND_DIABP = paste0(\n \"Diastolic Blood\\nPressure,\\nSitting\\nResult\\n(\",\n vs_u_rng$DIABP$unit,\n \");\\nRange:(\",\n vs_u_rng$DIABP$range,\n \")\"\n ),\n CHG_DIABP = \"Diastolic Blood\\nPressure,\\nSitting\\nChange from BL\",\n AVAL_ANRIND_SYSBP = paste0(\n \"Systolic Blood\\nPressure,\\nSitting\\n(\",\n vs_u_rng$SYSBP$unit,\n \");\\nRange:(\",\n vs_u_rng$SYSBP$range,\n \")\"\n ),\n CHG_SYSBP = \"Systolic Blood\\nPressure,\\nSitting\\nChange from BL\",\n AVAL_ANRIND_PULSE = paste0(\n \"Pulse Rate Result\\n(\",\n vs_u_rng$PULSE$unit,\n \");\\nRange:(\",\n vs_u_rng$PULSE$range,\n \")\"\n ),\n CHG_PULSE = \"Pulse Rate\\nChange from BL\",\n AVAL_ANRIND_RESP = paste0(\n \"Respiratory Rate\\nResult\\n(\",\n vs_u_rng$RESP$unit,\n \");\\nRange:(\",\n vs_u_rng$RESP$range,\n \")\"\n ),\n CHG_RESP = \"Respiratory Rate\\nChange from BL\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CRTNPT\", \"AGSXRC\", \"AVISIT\"),\n disp_cols = names(out),\n main_title = \"Listing of Vital Signs: Safety-Evaluable Patients\",\n main_footer = \"Baseline is the patient's last observation prior to initiation of study drug. Abnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range.\" \n)\n\nhead(lsting, 20)\n\nListing of Vital Signs: Safety-Evaluable Patients\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Diastolic Blood \n Pressure, Systolic Blood \n Weight Sitting Diastolic Blood Pressure, Systolic Blood Respiratory Rate \n Result Temperature Result Result Pressure, Sitting Pressure, Pulse Rate Result Result \n Study (Kg); Weight (C); Temperature Rate (Pa); Sitting (Pa); Sitting (beats/min); Pulse Rate (breaths/min); Respiratory Rate\nTreatment Center/Subject ID Age/Sex/Race Visit Day Range:(40-100) Change from BL Range:(36.1-37.2) Change from BL Range:(80-120) Change from BL Range:(120-180) Change from BL Range:(60-100) Change from BL Range:(12-20) Change from BL \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/105 38/M/BLACK OR AFRICAN AMERICAN WEEK 1 DAY 8 189 90.96 24.62 36.79 -1.88 101.10 -12.65 181.05/H 3.70 84.91 -2.05 18.34 1.13 \n WEEK 2 DAY 15 323 41.40 -24.93 36.52 -2.14 111.02 -2.72 132.47 -44.88 71.54 -15.42 9.81/L -7.40 \n WEEK 3 DAY 22 492 60.55 -5.78 35.03/L -3.64 88.35 -25.39 112.67/L -64.68 33.75/L -53.22 21.23/H 4.02 \n WEEK 4 DAY 29 550 69.69 3.36 35.71/L -2.95 100.74 -13.00 194.88/H 17.53 97.51 10.54 12.50 -4.71 \n WEEK 5 DAY 36 628 81.64 15.30 36.01/L -2.65 123.17/H 9.43 140.33 -37.02 62.50 -24.47 10.91/L -6.30 \n BRA-1/134 47/M/WHITE WEEK 1 DAY 8 203 42.95 -12.51 36.39 -1.38 112.71 26.38 148.69 -52.75 69.12 3.72 15.31 -2.84 \n WEEK 2 DAY 15 326 20.36/L -35.09 35.75/L -2.03 98.42 12.09 188.08/H -13.36 68.79 3.40 17.60 -0.55 \n WEEK 3 DAY 22 363 46.33 -9.12 35.43/L -2.34 97.88 11.55 160.05 -41.39 90.21 24.81 18.15 0.00 \n WEEK 4 DAY 29 367 43.83 -11.62 36.01/L -1.76 98.97 12.65 132.19 -69.25 88.39 23.00 19.62 1.48 \n WEEK 5 DAY 36 417 31.75/L -23.71 36.35 -1.42 124.26/H 37.94 134.30 -67.14 88.64 23.25 20.08/H 1.94 \n BRA-1/42 36/M/BLACK OR AFRICAN AMERICAN WEEK 1 DAY 8 265 115.27/H 8.42 37.35/H -1.67 107.32 5.90 173.89 27.40 66.14 26.13 9.23/L 7.13 \n WEEK 2 DAY 15 313 45.84 -61.01 36.01/L -3.01 110.97 9.55 144.75 -1.74 109.71/H 69.70 7.18/L 5.08 \n WEEK 3 DAY 22 325 85.70 -21.14 37.71/H -1.31 124.13/H 22.71 89.08/L -57.41 90.29 50.28 25.16/H 23.05 \n WEEK 4 DAY 29 535 44.64 -62.21 36.44 -2.58 79.51/L -21.91 140.78 -5.71 82.44 42.43 14.06 11.95 \n WEEK 5 DAY 36 729 85.21 -21.64 35.78/L -3.23 105.26 3.84 126.60 -19.89 88.71 48.70 25.98/H 23.87 \n BRA-1/93 34/F/ASIAN WEEK 1 DAY 8 402 47.51 -35.34 35.50/L -0.83 94.27 17.98 98.82/L -61.71 72.44 -7.85 14.97 0.22 \n WEEK 2 DAY 15 460 67.64 -15.21 37.96/H 1.62 109.98 33.69 104.21/L -56.32 104.70/H 24.41 14.90 0.16 \n WEEK 3 DAY 22 464 53.06 -29.78 36.33 -0.01 90.17 13.87 139.66 -20.87 111.13/H 30.85 22.86/H 8.12 \n WEEK 4 DAY 29 496 61.68 -21.17 33.52/L -2.82 112.76 36.47 128.82 -31.70 72.89 -7.39 20.77/H 6.03 \n WEEK 5 DAY 36 538 53.98 -28.86 35.71/L -0.63 80.20 3.91 137.16 -23.37 96.63 16.35 18.10 3.36 \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nBaseline is the patient's last observation prior to initiation of study drug. Abnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:41 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "crumbs": [ + "Listings", + "Vital Signs", + "VSL01" + ] + }, + { + "objectID": "listings/lab-results/lbl01.html", + "href": "listings/lab-results/lbl01.html", + "title": "LBL01", + "section": "", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_x <- adlb %>%\n filter(!is.na(AVAL) & !is.na(LBSEQ) & !is.na(ADY) & ANRIND != \"\") %>%\n mutate(\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n PARAM_U = paste0(PARAMCD, \"\\n(\", AVALU, \" / NCI CTCAE grade)\"),\n ANRIND = factor(\n case_when(\n ANRIND == \"LOW\" ~ \"L\",\n ANRIND == \"HIGH\" ~ \"H\",\n TRUE ~ as.character(ANRIND)\n ),\n levels = c(\"\", \"H\", \"L\", \"NORMAL\")\n ),\n AVALC = as.character(format(round(AVAL, 2), nsmall = 2))\n ) %>%\n mutate(AVAL_GR = ifelse(\n !ANRIND %in% c(\"H\", \"L\"),\n AVALC,\n paste(AVALC, paste0(ANRIND, sub(\"-\", \"\", ATOXGR)), sep = \" / \")\n )) %>%\n select(CPID, TRT01A, ADY, LBSEQ, PARAM_U, AVAL_GR) %>%\n unique()\n\nout <- adlb_x %>%\n arrange(CPID, ADY, PARAM_U, LBSEQ) %>%\n tidyr::pivot_wider(\n id_cols = c(TRT01A, CPID, ADY),\n names_from = PARAM_U,\n values_from = AVAL_GR\n ) %>%\n group_by(CPID) %>%\n mutate(DLD = ADY - lag(ADY)) %>%\n ungroup() %>%\n select(CPID, TRT01A, ADY, DLD, unique(adlb_x$PARAM_U))\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n TRT01A = \"Treatment\",\n CPID = \"Center/Patient ID\",\n ADY = \"Study\\nDay\",\n DLD = \"Days Since\\nLast Dose of\\nStudy Drug\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CPID\"),\n disp_cols = names(out),\n main_title = \"Listing of Laboratory Test Results\",\n main_footer = \"NCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\"\n)\n\nhead(lsting, 20)\n\nListing of Laboratory Test Results\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Days Since \n Study Last Dose of ALT CRP IGA \nTreatment Center/Patient ID Day Study Drug (U/L / NCI CTCAE grade) (mg/L / NCI CTCAE grade) (g/L / NCI CTCAE grade)\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-105 80 NA 4.30 / L4 9.09 2.84 \n 149 69 24.70 9.15 2.93 \n 314 165 24.87 10.89 / H2 2.66 \n 398 84 3.67 / L3 8.14 2.86 \n 470 72 18.55 10.59 / H3 2.88 \n 528 58 7.73 10.09 / H3 2.93 \n 535 7 23.51 9.20 2.88 \n BRA-1/id-134 225 NA 7.37 10.46 / H1 2.86 \n 227 2 16.42 7.43 / L1 2.76 \n 255 28 11.16 9.41 2.75 \n 269 14 15.89 10.02 / H4 2.84 \n 357 88 24.35 8.01 2.86 \n 436 79 16.03 8.51 2.98 \n 440 4 17.21 7.63 / L3 2.78 \n BRA-1/id-42 176 NA 16.56 8.88 2.75 \n 477 301 16.49 8.11 2.95 \n 534 57 18.71 8.78 2.95 \n 550 16 11.44 9.53 2.99 \n 569 19 21.66 10.32 / H2 3.00 / H1 \n 608 39 24.61 7.95 / L2 2.78 \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:49 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "crumbs": [ + "Listings", + "Lab Results", + "LBL01" + ] + }, + { + "objectID": "listings/lab-results/lbl01_rls.html", + "href": "listings/lab-results/lbl01_rls.html", + "title": "LBL01_RLS", "section": "", - "text": "Data Setup\nStandard Table\nTable Selecting Sections to Display\nTable Modifying Analysis Details like Conf. Type, Ties, Alpha Level\nTable with Stratified Analysis\nTable Modifying Time Point for the “XX Months” Analysis\nTable Requesting > 1 p-value\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n# Ensure that character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadtte <- df_explicit_na(adtte)\n\nadtte_f <- adtte %>%\n dplyr::filter(PARAMCD == \"OS\") %>%\n dplyr::mutate(\n AVAL = day2month(AVAL),\n is_event = CNSR == 0,\n is_not_event = CNSR == 1,\n EVNT1 = factor(\n case_when(\n is_event == TRUE ~ \"Patients with event (%)\",\n is_event == FALSE ~ \"Patients without event (%)\"\n ),\n levels = c(\"Patients with event (%)\", \"Patients without event (%)\")\n ),\n EVNTDESC = factor(EVNTDESC)\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n var = \"ARM\", ref_group = \"A: Drug X\"\n ) %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Patients with event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 1L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n time_point = c(6, 12),\n is_event = \"is_event\",\n method = \"both\",\n control = control_surv_timepoint()\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \n Earliest contributing event \n Death 58 58 69 \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 95% CI (9.3, NA) (9.4, NA) (7.6, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \n6 Months \n Patients remaining at risk 97 97 90 \n Event Free Rate (%) 72.39 72.39 68.18 \n 95% CI (64.82, 79.96) (64.82, 79.96) (60.24, 76.13) \n Difference in Event Free Rate 0.00 -4.21 \n 95% CI (-10.71, 10.71) (-15.18, 6.77) \n p-value (Z-test) 1.0000 0.4525 \n12 Months \n Patients remaining at risk 49 48 37 \n Event Free Rate (%) 56.72 56.72 47.73 \n 95% CI (48.33, 65.11) (48.33, 65.11) (39.21, 56.25) \n Difference in Event Free Rate 0.00 -8.99 \n 95% CI (-11.86, 11.86) (-20.95, 2.97) \n p-value (Z-test) 1.0000 0.1406 \n—————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n—————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"A: Drug X\") %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n analyze_vars(\n \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n is_event = \"is_event\",\n method = \"surv\",\n time_point = c(6, 12)\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 95% CI (9.3, NA) (9.4, NA) (7.6, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \n6 Months \n Patients remaining at risk 97 97 90 \n Event Free Rate (%) 72.39 72.39 68.18 \n 95% CI (64.82, 79.96) (64.82, 79.96) (60.24, 76.13) \n12 Months \n Patients remaining at risk 49 48 37 \n Event Free Rate (%) 56.72 56.72 47.73 \n 95% CI (48.33, 65.11) (48.33, 65.11) (39.21, 56.25) \n——————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n——————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"A: Drug X\") %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Patients with event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 1L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n control = control_surv_time(conf_level = 0.9, conf_type = \"log-log\"),\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(\n pval_method = \"log-rank\",\n conf_level = 0.95,\n ties = \"efron\"\n ),\n table_names = \"coxph_unstratified\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n is_event = \"is_event\",\n time_point = 12,\n control = control_surv_timepoint(conf_level = 0.9, conf_type = \"log-log\"),\n table_names_suffix = \"_log_log\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n show_labels = \"hidden\",\n is_event = \"is_event\",\n time_point = 12,\n method = \"surv_diff\",\n control = control_surv_timepoint(conf_level = 0.975),\n table_names_suffix = \"_975_pct\"\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \n Earliest contributing event \n Death 58 58 69 \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 90% CI (9.6, NA) (9.6, NA) (7.7, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \n12 Months \n Patients remaining at risk 49 48 37 \n Event Free Rate (%) 56.72 56.72 47.73 \n 90% CI (49.37, 63.41) (49.37, 63.41) (40.42, 54.66) \nDifference in Event Free Rate 0.00 -8.99 \n 97.5% CI (-13.57, 13.57) (-22.66, 4.69) \n p-value (Z-test) 1.0000 0.1406 \n———————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n———————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"A: Drug X\") %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Patients with event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 1L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Unstratified Analysis\",\n table_names = \"coxph_unstratified\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Stratified Analysis\",\n strata = \"SEX\",\n table_names = \"coxph_stratified\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n is_event = \"is_event\",\n method = \"both\",\n time_point = 12\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \n Earliest contributing event \n Death 58 58 69 \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 95% CI (9.3, NA) (9.4, NA) (7.6, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \nStratified Analysis \n p-value (log-rank) 0.9978 0.1733 \n Hazard Ratio 1.00 1.27 \n 95% CI (0.69, 1.44) (0.90, 1.81) \n12 Months \n Patients remaining at risk 49 48 37 \n Event Free Rate (%) 56.72 56.72 47.73 \n 95% CI (48.33, 65.11) (48.33, 65.11) (39.21, 56.25) \n Difference in Event Free Rate 0.00 -8.99 \n 95% CI (-11.86, 11.86) (-20.95, 2.97) \n p-value (Z-test) 1.0000 0.1406 \n—————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n—————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"A: Drug X\") %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Patients with event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 1L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n is_event = \"is_event\",\n time_point = 6,\n method = \"both\"\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \n Earliest contributing event \n Death 58 58 69 \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 95% CI (9.3, NA) (9.4, NA) (7.6, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \n6 Months \n Patients remaining at risk 97 97 90 \n Event Free Rate (%) 72.39 72.39 68.18 \n 95% CI (64.82, 79.96) (64.82, 79.96) (60.24, 76.13) \n Difference in Event Free Rate 0.00 -4.21 \n 95% CI (-10.71, 10.71) (-15.18, 6.77) \n p-value (Z-test) 1.0000 0.4525 \n—————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n—————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\", ref_group = \"A: Drug X\") %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients with event (%)\")\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Patients with event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 1L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Patients without event (%)\"),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Time to Event (Months)\",\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(pval_method = \"log-rank\"),\n .stats = \"pvalue\",\n table_names = \"coxph_unstratified\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n show_labels = \"hidden\",\n control = control_coxph(pval_method = \"wald\"),\n .stats = \"pvalue\",\n .indent_mods = c(pvalue = 1L),\n table_names = \"coxph_wald_pvalue\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n show_labels = \"hidden\",\n control = control_coxph(pval_method = \"likelihood\"),\n .indent_mods = c(pvalue = 1L, hr = 2L, hr_ci = 3L),\n table_names = \"coxph_likelihood_pvalue\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months\",\n is_event = \"is_event\",\n time_point = 12,\n method = \"both\"\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nPatients with event (%) 58 (43.3%) 58 (43.3%) 69 (52.3%) \n Earliest contributing event \n Death 58 58 69 \nPatients without event (%) 76 (56.7%) 76 (56.7%) 63 (47.7%) \nTime to Event (Months) \n Median NA NA 9.4 \n 95% CI (9.3, NA) (9.4, NA) (7.6, NA) \n 25% and 75%-ile 5.6, NA 5.6, NA 5.0, NA \n Range 0.5 to 16.4 {1} 0.9 to 16.3 {1} 0.5 to 16.3 {1}\nUnstratified Analysis \n p-value (log-rank) 0.9998 0.1541 \n p-value (wald) 0.9998 0.1552 \n p-value (likelihood) 0.9998 0.1543 \n Hazard Ratio 1.00 1.29 \n 95% CI (0.69, 1.44) (0.91, 1.83) \n12 Months \n Patients remaining at risk 49 48 37 \n Event Free Rate (%) 56.72 56.72 47.73 \n 95% CI (48.33, 65.11) (48.33, 65.11) (39.21, 56.25) \n Difference in Event Free Rate 0.00 -8.99 \n 95% CI (-11.86, 11.86) (-20.95, 2.97) \n p-value (Z-test) 1.0000 0.1406 \n—————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observation: range maximum\n—————————————————————————————————————————————————————————————————————————————————————\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADTTE <- df_explicit_na(ADTTE)\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADTTE <- data[[\"ADTTE\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_tte(\n label = \"Time To Event Table\",\n dataname = \"ADTTE\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADTTE, \"PARAMCD\", \"PARAM\"),\n \"OS\"\n ),\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"SEX\", \"BMRKR2\")),\n \"SEX\"\n ),\n time_points = choices_selected(c(6, 8), 6),\n event_desc_var = choices_selected(\n variable_choices(ADTTE, \"EVNTDESC\"),\n \"EVNTDESC\",\n fixed = TRUE\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:38:01 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n filter(!is.na(AVAL))\n\nadlb_x <- adlb %>%\n mutate(ANRIND = factor(\n case_when(\n ANRIND == \"LOW\" & AVAL > stats::quantile(adlb$AVAL, probs = c(0.1)) ~ \"L\",\n ANRIND == \"HIGH\" & AVAL < stats::quantile(adlb$AVAL, probs = c(0.9)) ~ \"H\",\n ANRIND == \"LOW\" & AVAL <= stats::quantile(adlb$AVAL, probs = c(0.1)) ~ \"LL\",\n ANRIND == \"HIGH\" & AVAL >= stats::quantile(adlb$AVAL, probs = c(0.9)) ~ \"HH\",\n TRUE ~ as.character(ANRIND)\n ),\n levels = c(\"\", \"H\", \"HH\", \"L\", \"LL\", \"NORMAL\")\n ))\n\nadlb_x <- adlb_x %>%\n filter(!is.na(LBSEQ) & !is.na(ADY) & ANRIND != \"\") %>%\n mutate(\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n PARAM_U = paste0(PARAMCD, \"\\n(\", AVALU, \")\"),\n AVALC = as.character(format(round(AVAL, 2), nsmall = 2))\n ) %>%\n mutate(AVAL_GR = ifelse(\n !ANRIND %in% c(\"H\", \"HH\", \"L\", \"LL\"),\n AVALC,\n paste(AVALC, ANRIND, sep = \" / \")\n )) %>%\n select(CPID, TRT01A, ADY, LBSEQ, PARAM_U, AVAL_GR) %>%\n unique()\n\nout <- adlb_x %>%\n arrange(CPID, ADY, PARAM_U, LBSEQ) %>%\n tidyr::pivot_wider(\n id_cols = c(TRT01A, CPID, ADY),\n names_from = PARAM_U,\n values_from = AVAL_GR\n ) %>%\n group_by(CPID) %>%\n mutate(DLD = ADY - lag(ADY)) %>%\n ungroup() %>%\n select(CPID, TRT01A, ADY, DLD, unique(adlb_x$PARAM_U))\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n TRT01A = \"Treatment\",\n CPID = \"Center/Patient ID\",\n ADY = \"Study\\nDay\",\n DLD = \"Days Since\\nLast Dose of\\nStudy Drug\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CPID\"),\n disp_cols = names(out),\n main_title = \"Listing of Laboratory Test Results Using Roche Safety Lab Standardization\",\n main_footer = \"Abnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range; high high (HH) or low low (LL) if outside the Roche marked reference range with a clinically relevant change from baseline. \" \n)\n\nhead(lsting, 20)\n\nListing of Laboratory Test Results Using Roche Safety Lab Standardization\n\n————————————————————————————————————————————————————————————————————————————————————————\n Days Since \n Study Last Dose of ALT CRP IGA \nTreatment Center/Patient ID Day Study Drug (U/L) (mg/L) (g/L) \n————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-105 80 NA 4.30 / L 9.09 2.84 \n 149 69 24.70 9.15 2.93 \n 314 165 24.87 10.89 / H 2.66 \n 398 84 3.67 / L 8.14 2.86 \n 470 72 18.55 10.59 / H 2.88 \n 528 58 7.73 10.09 / H 2.93 \n 535 7 23.51 9.20 2.88 \n BRA-1/id-134 225 NA 7.37 10.46 / H 2.86 \n 227 2 16.42 7.43 / L 2.76 \n 255 28 11.16 9.41 2.75 \n 269 14 15.89 10.02 / H 2.84 \n 357 88 24.35 8.01 2.86 \n 436 79 16.03 8.51 2.98 \n 440 4 17.21 7.63 / L 2.78 \n BRA-1/id-42 176 NA 16.56 8.88 2.75 \n 477 301 16.49 8.11 2.95 \n 534 57 18.71 8.78 2.95 \n 550 16 11.44 9.53 2.99 \n 569 19 21.66 10.32 / H 3.00 / H\n 608 39 24.61 7.95 / L 2.78 \n————————————————————————————————————————————————————————————————————————————————————————\n\nAbnormalities are flagged as high (H) or low (L) if outside the Roche standard reference range; high high (HH) or low low (LL) if outside the Roche marked reference range with a clinically relevant change from baseline. \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:35:56 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "crumbs": [ + "Listings", + "Lab Results", + "LBL01_RLS" + ] + }, + { + "objectID": "listings/exposure/exl01.html", + "href": "listings/exposure/exl01.html", + "title": "EXL01", + "section": "", + "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\nout <- adex %>%\n filter(PARAMCD == \"DOSE\" & !is.na(AVAL) & SAFFL == \"Y\") %>%\n mutate(\n CRTNPT = paste(SITEID, SUBJID, sep = \"/\")\n ) %>%\n arrange(CRTNPT, AVISIT) %>%\n select(CRTNPT, AVISIT, EXSTDY, EXENDY, TRT01A, AVAL, AVALU, EXDOSFRQ, EXROUTE)\n\nvar_labels(out) <- c(\n CRTNPT = \"Center/Subject ID\",\n AVISIT = \"Visit\",\n EXSTDY = \"Study Day\\nFrom\",\n EXENDY = \"Study Day\\nTo\",\n TRT01A = \"Treatment\",\n AVAL = \"Dose\",\n AVALU = \"Unit\",\n EXDOSFRQ = \"Frequency\",\n EXROUTE = \"Route\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CRTNPT\", \"AVISIT\"),\n disp_cols = names(out),\n main_title = \"Listing of Exposure to Study Drug\"\n)\n\nhead(lsting, 20)\n\nListing of Exposure to Study Drug\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Study Day Study Day \nTreatment Center/Subject ID Visit From To Dose Unit Frequency Route \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-105 SCREENING -1 -1 960 mg ONCE INTRAVENOUS \n BASELINE 1 1 960 mg ONCE INTRAVENOUS \n WEEK 1 DAY 8 8 8 720 mg ONCE SUBCUTANEOUS\n WEEK 2 DAY 15 15 15 480 mg ONCE INTRAVENOUS \n WEEK 3 DAY 22 22 22 480 mg ONCE INTRAVENOUS \n WEEK 4 DAY 29 29 29 720 mg ONCE INTRAVENOUS \n WEEK 5 DAY 36 36 36 720 mg ONCE INTRAVENOUS \n BRA-1/id-134 SCREENING -1 -1 960 mg ONCE INTRAVENOUS \n BASELINE 1 1 720 mg ONCE INTRAVENOUS \n WEEK 1 DAY 8 8 8 720 mg ONCE INTRAVENOUS \n WEEK 2 DAY 15 15 15 960 mg ONCE INTRAVENOUS \n WEEK 3 DAY 22 22 22 720 mg ONCE INTRAVENOUS \n WEEK 4 DAY 29 29 29 960 mg ONCE INTRAVENOUS \n WEEK 5 DAY 36 36 36 960 mg ONCE INTRAVENOUS \n BRA-1/id-42 SCREENING -1 -1 960 mg ONCE INTRAVENOUS \n BASELINE 1 1 960 mg ONCE INTRAVENOUS \n WEEK 1 DAY 8 8 8 720 mg ONCE SUBCUTANEOUS\n WEEK 2 DAY 15 15 15 720 mg ONCE INTRAVENOUS \n WEEK 3 DAY 22 22 22 720 mg ONCE INTRAVENOUS \n WEEK 4 DAY 29 29 29 480 mg ONCE INTRAVENOUS \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:36:04 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9012 tibble_3.2.1 formatters_0.5.5.9018\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "crumbs": [ + "Listings", + "Exposure", + "EXL01" + ] + }, + { + "objectID": "tables/ADA/adat03.html", + "href": "tables/ADA/adat03.html", + "title": "ADAT03", + "section": "", + "text": "Data Setup\nStandard Table (μg/mL)\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\")\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadab <- df_explicit_na(adab)\nadpc <- df_explicit_na(adpc)\n\n# Adjust zzz parameter\nmax_conc <- 15\n\nadpc <- adpc %>% select(USUBJID, NFRLT, AVAL, AVALU, AVALCAT1)\n\nanl <- adab %>%\n filter(., PARAM == \"ADA interpreted per sample result\") %>%\n select(-AVAL, AVALC, AVALU)\n\nanl <- merge(anl, adpc, by = c(\"USUBJID\", \"NFRLT\")) %>%\n mutate(AVAL_LT = ifelse(AVAL <= max_conc, TRUE, FALSE))\n\n\n\n\n\nCode# parameters in columns\nadat03_stats <- c(\"n\", \"mean\", \"sd\", \"median\", \"min\", \"max\", \"cv\", \"geom_mean\", \"count_fraction\")\nadat03_lbls <- c(\n n = \"Total Number\\nof Measurable\\n Samples\",\n mean = \"Mean\",\n sd = \"SD\",\n median = \"Median\",\n min = \"Minimum\",\n max = \"Maximum\",\n cv = \"CV (%)\",\n geom_mean = \"Geometric Mean\",\n count_fraction = paste0(\"Samples with\\nConcentration\\n≤ \", max_conc, \"μg/mL\")\n)\nadat03_fmts <- c(\n n = \"xx.\",\n mean = format_sigfig(3),\n sd = format_sigfig(3),\n median = format_sigfig(3),\n min = format_sigfig(3),\n max = format_sigfig(3),\n cv = \"xx.x\",\n geom_mean = format_sigfig(3),\n count_fraction = format_count_fraction\n)\n\nafun_list <- lapply(\n 1:9,\n function(i) make_afun(s_summary, .stats = adat03_stats[i], .formats = adat03_fmts[i], .labels = \"Overall\")\n)\n\n# lyt creation\nlyt <- basic_table() %>%\n split_rows_by(\n var = \"ARM\",\n label_pos = \"topleft\",\n split_label = \"Treatment Group\",\n split_fun = drop_split_levels,\n section_div = \"\"\n ) %>%\n add_rowcounts() %>%\n split_rows_by(\n var = \"VISIT\",\n label_pos = \"topleft\",\n split_label = \"Visit\",\n split_fun = drop_split_levels,\n child_labels = \"hidden\"\n ) %>%\n analyze_vars_in_cols(\n vars = c(rep(\"AVAL\", 8), \"AVAL_LT\"),\n .stats = adat03_stats,\n .labels = adat03_lbls,\n .formats = adat03_fmts\n ) %>%\n analyze_colvars(\n afun_list,\n nested = FALSE,\n extra_args = list(\".labels\" = \"Overall\")\n )\n\nresult <- build_table(lyt, anl, alt_counts_df = adsl)\n\nmain_title(result) <- paste(\n \"Summary of Serum Concentrations (μg/mL) at Timepoints Where ADA Samples Were Collected and Analyzed\\n\n Protocol:\", unique(adab$PARCAT1)[1]\n)\nsubtitles(result) <- paste(\"Analyte:\", unique(adab$PARAMCD)[1])\nfnotes_at_path(result, rowpath = NULL, colpath = c(\"multivars\", \"AVAL\")) <- \"Refers to the total no. of measurable ADA samples that have a corresponding measurable drug concentration sample (i.e. results with valid numeric values and LTRs). LTR results on post-dose samples are replaced by aaa µg/mL i.e. half of MQC value.\" \nfnotes_at_path(result, rowpath = NULL, colpath = c(\"multivars\", \"AVAL_LT\")) <- \"In validation, the assay was able to detect yyy ng/mL of surrogate ADA in the presence of zzz µg/mL of [drug]. BLQ = Below Limit of Quantitation, LTR = Lower than Reportable, MQC = Minimum Quantifiable Concentration, ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies). RXXXXXXX is also known as [drug]\" \n\nresult\n\nSummary of Serum Concentrations (μg/mL) at Timepoints Where ADA Samples Were Collected and Analyzed\n\n Protocol: A: Drug X Antibody\nAnalyte: R1800000\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Total Number Samples with \nTreatment Group of Measurable Concentration\n Visit Samples {1} Mean SD Median Minimum Maximum CV (%) Geometric Mean ≤ 15μg/mL {2}\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X (N=536) \n Day 1 402 0 0 0 0 0 NA NA 402 (100%) \n Day 2 134 16.2 1.63 16.2 12.6 19.9 10.0 16.1 39 (29.1%) \n\nC: Combination (N=792) \n Day 1 528 0 0 0 0 0 NA NA 528 (100%) \n Day 2 264 24.7 8.65 22.5 12.6 39.5 35.0 23.2 28 (10.6%) \n\nOverall 1328 6.54 11.0 0 0 39.5 167.5 NA 997 (75.1%) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Refers to the total no. of measurable ADA samples that have a corresponding measurable drug concentration sample (i.e. results with valid numeric values and LTRs). LTR results on post-dose samples are replaced by aaa µg/mL i.e. half of MQC value.\n{2} - In validation, the assay was able to detect yyy ng/mL of surrogate ADA in the presence of zzz µg/mL of [drug]. BLQ = Below Limit of Quantitation, LTR = Lower than Reportable, MQC = Minimum Quantifiable Concentration, ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies). RXXXXXXX is also known as [drug]\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:36:16 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 withr_3.0.0 \n[33] Rdpack_2.6 digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 \n[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Efficacy", - "TTET01" + "ADA", + "ADAT03" ] }, { - "objectID": "tables/concomitant-medications/cmt01.html", - "href": "tables/concomitant-medications/cmt01.html", - "title": "CMT01", + "objectID": "tables/ADA/adat02.html", + "href": "tables/ADA/adat02.html", + "title": "ADAT02", "section": "", - "text": "Data Setup\nStandard Table\nTable Showing Medications Prior to the Start of the Study\nTable Sorted by Total Column Showing Additional “All Patients” Column\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\n# The following tables require ADCM data structure that follows the legacy concomitant medication coding.\n# WHO coding is not used.\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\n# Below step is to set up example data based on legacy standard.\nadcm <- adcm %>%\n select(-starts_with(\"ATC\")) %>%\n unique()\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadcm <- df_explicit_na(adcm)\n\nadcm_con <- adcm %>%\n filter(ATIREL == \"CONCOMITANT\")\n\nadcm_prior <- adcm %>%\n filter(ATIREL == \"PRIOR\")\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\"CMCLAS\",\n split_fun = split_fun,\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = 1L,\n label_pos = \"topleft\",\n split_label = obj_label(adcm_con$CMCLAS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm_con, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adcm_con,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"CMCLAS\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedication Class A: Drug X B: Placebo C: Combination\n Standardized Medication Name (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \n medcl A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \n medcl B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \n medcl C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\"CMCLAS\",\n split_fun = split_fun,\n child_labels = \"visible\",\n nested = FALSE,\n label_pos = \"topleft\",\n split_label = obj_label(adcm_con$CMCLAS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm_prior, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adcm_prior,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"CMCLAS\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedication Class A: Drug X B: Placebo C: Combination\n Standardized Medication Name (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 89 (66.4%) 95 (70.9%) 106 (80.3%) \nTotal number of treatments 194 208 243 \nmedcl A \n Total number of patients with at least one treatment 54 (40.3%) 49 (36.6%) 69 (52.3%) \n Total number of treatments 71 70 99 \n medname A_1/3 54 (40.3%) 49 (36.6%) 69 (52.3%) \nmedcl B \n Total number of patients with at least one treatment 76 (56.7%) 80 (59.7%) 81 (61.4%) \n Total number of treatments 123 138 144 \n medname B_2/4 52 (38.8%) 55 (41.0%) 56 (42.4%) \n medname B_3/4 47 (35.1%) 47 (35.1%) 52 (39.4%) \n\n\nTable with Subtotal Per Medication Class Suppressed\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\"CMCLAS\",\n split_fun = split_fun, child_labels = \"visible\",\n nested = FALSE,\n label_pos = \"topleft\",\n split_label = obj_label(adcm_con$CMCLAS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .labels = c(unique = \"Total number of patients with at least one treatment\"),\n .stats = \"unique\"\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm_con, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adcm_con,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"CMCLAS\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedication Class A: Drug X B: Placebo C: Combination\n Standardized Medication Name (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nmedcl A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nmedcl B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nmedcl C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n add_overall_col(\"All Patients\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n \"Total number of patients with at least one treatment (%)\",\n \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"CMCLAS\",\n split_fun = split_fun,\n child_labels = \"visible\",\n nested = FALSE,\n label_pos = \"topleft\",\n split_label = obj_label(adcm_con$CMCLAS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n \"Total number of patients with at least one treatment (%)\",\n \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm_con, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adcm_con,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"CMCLAS\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"CMCLAS\"),\n scorefun = cont_n_allcols,\n decreasing = TRUE\n )\n\nresult\n\nMedication Class A: Drug X B: Placebo C: Combination All Patients\n Standardized Medication Name (N=134) (N=134) (N=132) (N=400) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment (%) 117 (87.3%) 116 (86.6%) 116 (87.9%) 349 (87.2%) \nTotal number of treatments 415 414 460 1289 \nmedcl C \n Total number of patients with at least one treatment (%) 82 (61.2%) 84 (62.7%) 89 (67.4%) 255 (63.7%) \n Total number of treatments 140 140 155 435 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) 170 (42.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) 157 (39.2%) \nmedcl B \n Total number of patients with at least one treatment (%) 83 (61.9%) 74 (55.2%) 88 (66.7%) 245 (61.3%) \n Total number of treatments 141 137 162 440 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) 168 (42.0%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) 150 (37.5%) \nmedcl A \n Total number of patients with at least one treatment (%) 75 (56.0%) 79 (59.0%) 81 (61.4%) 235 (58.8%) \n Total number of treatments 134 137 143 414 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) 159 (39.8%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) 147 (36.8%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nHere, adcm is processed to keep only one path per treatment.\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADCM <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADCM <- df_explicit_na(ADCM)\n\n ADCM <- ADCM %>%\n group_by(STUDYID, USUBJID, CMDECOD) %>%\n slice(1) %>%\n ungroup()\n})\ndatanames <- c(\"ADSL\", \"ADCM\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADCM <- data[[\"ADCM\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Concomitant Medication Table\",\n dataname = \"ADCM\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADCM, \"CMDECOD\"),\n selected = \"CMDECOD\"\n ),\n hlt = choices_selected(\n choices = variable_choices(ADCM, \"CMCLAS\"),\n selected = c(\"CMCLAS\")\n ),\n add_total = TRUE,\n event_type = \"treatment\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:38:36 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadab <- df_explicit_na(adab) %>%\n mutate(ADPBLPFL = \"Y\") %>% # temp fix\n filter(\n ADPBLPFL == \"Y\",\n !PARAM %in% c(\n \"NAB interpreted per sample result\",\n \"NAB Status of a patient\",\n \"Treatment enhanced ADA\"\n )\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU, -ARRLT, -NRRLT) %>%\n unique() %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate(\n across(\n any_of(c(\n \"Treatment induced ADA\",\n \"Transient ADA\",\n \"Persistent ADA\"\n )),\n as.logical\n )\n ) %>%\n mutate(\n ADPBLPFL = ADPBLPFL == \"Y\",\n TI_ADA = if (exists(\"Treatment induced ADA\", where = .)) `Treatment induced ADA` else FALSE\n ) %>%\n var_relabel(\n ADPBLPFL = \"Post-baseline evaluable patients\",\n TI_ADA = \"Treatment-induced ADA patients\"\n )\n\nadab_ti <- adab %>%\n filter(TI_ADA)\n\n\n\n\n\nCode# Layout for post-baseline evaluable patient variables from adab dataset.\nlyt_adab <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = drop_split_levels\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"ADPBLPFL\",\n .stats = \"count\",\n table_names = \"post_baseline\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"TI_ADA\"\n )\n\n# Layout for treatment-induced patient variables from adab dataset.\nlyt_adab_ti <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = keep_split_levels(c(\"A: Drug X\", \"C: Combination\", \"<Missing>\")) # temp fix\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"Transient ADA\", \"Persistent ADA\"),\n var_labels = \"Treatment-induced ADA patients with\",\n show_labels = \"visible\"\n ) %>%\n analyze_vars(\n \"Time to onset of ADA\",\n .stats = \"median\",\n nested = FALSE,\n .labels = c(median = \"Median time to onset of ADA (weeks)\")\n ) %>%\n analyze_vars(\n \"Antibody titer units\",\n .stats = \"range\",\n nested = FALSE,\n .labels = c(range = \"ADA titer range (min - max)\")\n )\n\nresult_adab <- build_table(lyt_adab, df = adab, alt_counts_df = adsl)\nresult_adab_ti <- build_table(lyt_adab_ti, df = adab_ti, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adab) <- col_info(result_adab_ti)\nresult <- rbind(\n result_adab,\n result_adab_ti\n)\n\nmain_title(result) <- paste(\n \"Summary of Patients with Treatment-Induced ADA, PK Population\"\n)\nsubtitles(result) <- paste(\"Protocol:\", unique(adab$PARCAT1)[1])\nmain_footer(result) <- paste(\n \"ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic\n Antibodies)\n Treatment-induced ADA = negative or missing baseline.\n ADA result(s) and at least one positive post-baseline ADA result.\n Transient ADA = ADA positive result detected (a) at only one post-baseline\n sampling timepoint (excluding last timepoint) OR (b) at 2 or more timepoints\n during treatment where the first and last ADA positive samples are separated\n by a period of < 16 weeks, irrespective of any negative samples in between.\n Persistent ADA = ADA positive result detected (a) at the last post-baseline\n sampling timepoint, OR (b) at 2 or more time points during treatment where\n the first and last ADA positive samples are separated by a period ≥ 16\n weeks, irrespective of any negative samples in between.\"\n)\nresult\n\nSummary of Patients with Treatment-Induced ADA, PK Population\nProtocol: A: Drug X Antibody\n\n—————————————————————————————————————————————————————————————————————————————\n A: Drug X C: Combination <Missing> \n (N=134) (N=132) (N=0) \n—————————————————————————————————————————————————————————————————————————————\nPost-baseline evaluable patients 134 132 266 \nTreatment-induced ADA patients 0 0 64 (24.1%)\nTreatment-induced ADA patients with \n Transient ADA 0 0 0 \n Persistent ADA 0 0 0 \nMedian time to onset of ADA (weeks) NA NA 0.1 \nADA titer range (min - max) NA NA NA \n—————————————————————————————————————————————————————————————————————————————\n\nADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic\n Antibodies)\n Treatment-induced ADA = negative or missing baseline.\n ADA result(s) and at least one positive post-baseline ADA result.\n Transient ADA = ADA positive result detected (a) at only one post-baseline\n sampling timepoint (excluding last timepoint) OR (b) at 2 or more timepoints\n during treatment where the first and last ADA positive samples are separated\n by a period of < 16 weeks, irrespective of any negative samples in between.\n Persistent ADA = ADA positive result detected (a) at the last post-baseline\n sampling timepoint, OR (b) at 2 or more time points during treatment where\n the first and last ADA positive samples are separated by a period ≥ 16\n weeks, irrespective of any negative samples in between.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:36:28 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 dplyr_1.1.4 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 withr_3.0.0 \n[33] Rdpack_2.6 digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 \n[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Concomitant Medications", - "CMT01" + "ADA", + "ADAT02" ] }, { - "objectID": "tables/concomitant-medications/cmt02_pt.html", - "href": "tables/concomitant-medications/cmt02_pt.html", - "title": "CMT02_PT", + "objectID": "tables/demography/dmt01.html", + "href": "tables/demography/dmt01.html", + "title": "DMT01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nadcm$CMSEQ <- as.factor(adcm$CMSEQ)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n# If you want your missing levels to show as \"No Coding Available\", please use\nadsl <- df_explicit_na(adsl, na_level = \"No Coding Available\")\nadcm <- df_explicit_na(adcm, na_level = \"No Coding Available\")\n\n# Keep only safety-evaluable patients and concomitant medications\nadsl <- adsl %>%\n filter(SAFFL == \"Y\")\n\n# Keep only concomitant medications\nadcm <- adcm %>% filter(ATIREL == \"CONCOMITANT\")\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n add_overall_col(\"All Patients\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n ),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(vars = \"CMDECOD\") %>%\n append_topleft(paste(\"\\nOther Treatment\"))\n\nresult <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%\n sort_at_path(\n path = c(\"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\nOther Treatment (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) 349 (87.2%) \nTotal number of treatments 415 414 460 1289 \nmedname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) 170 (42.5%) \nmedname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) 168 (42.0%) \nmedname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) 159 (39.8%) \nmedname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) 157 (39.2%) \nmedname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) 150 (37.5%) \nmedname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) 147 (36.8%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\nadcm_keys <- c(\"STUDYID\", \"USUBJID\", \"ASTDTM\", \"CMSEQ\", \"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADCM <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n ADCM$CMSEQ <- as.integer(ADCM$CMSEQ)\n\n ADSL <- df_explicit_na(ADSL)\n ADCM <- df_explicit_na(ADCM)\n})\ndatanames <- c(\"ADSL\", \"ADCM\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\njoin_keys(data)[\"ADCM\", \"ADCM\"] <- adcm_keys\n\n## Reusable Configuration For Modules\nADCM <- data[[\"ADCM\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_mult_events(\n label = \"Concomitant Medications by Medication Class and Preferred Name\",\n dataname = \"ADCM\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n seq_var = choices_selected(\"CMSEQ\", selected = \"CMSEQ\", fixed = TRUE),\n hlt = choices_selected(\n choices = variable_choices(ADCM, c(\"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")),\n selected = c(\"ATC1\")\n ),\n llt = choices_selected(\n choices = variable_choices(ADCM, c(\"CMDECOD\")),\n selected = c(\"CMDECOD\")\n ),\n add_total = TRUE,\n event_type = \"treatment\"\n )\n ),\n filter = teal_slices(\n teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"),\n teal_slice(\"ADCM\", \"ATIREL\", selected = \"CONCOMITANT\")\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:39:10 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nTable with an Additional Study-Specific Continuous Variable\nTable with an Additional Study-Specific Categorical Variable\nTable with Subgrouping for Some Analyses\nTable with Additional Vital Signs Baseline Values\nTable with Additional Values from ADSUB\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(tidyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadvs <- synthetic_cdisc_dataset(\"latest\", \"advs\")\nadsub <- synthetic_cdisc_dataset(\"latest\", \"adsub\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadvs <- df_explicit_na(advs)\nadsub <- df_explicit_na(adsub)\n\n# Change description in variable SEX.\nadsl <- adsl %>%\n mutate(\n SEX = factor(case_when(\n SEX == \"M\" ~ \"Male\",\n SEX == \"F\" ~ \"Female\",\n SEX == \"U\" ~ \"Unknown\",\n SEX == \"UNDIFFERENTIATED\" ~ \"Undifferentiated\"\n )),\n AGEGR1 = factor(\n case_when(\n between(AGE, 18, 40) ~ \"18-40\",\n between(AGE, 41, 64) ~ \"41-64\",\n AGE > 64 ~ \">=65\"\n ),\n levels = c(\"18-40\", \"41-64\", \">=65\")\n ),\n BMRKR1_CAT = factor(\n case_when(\n BMRKR1 < 3.5 ~ \"LOW\",\n BMRKR1 >= 3.5 & BMRKR1 < 10 ~ \"MEDIUM\",\n BMRKR1 >= 10 ~ \"HIGH\"\n ),\n levels = c(\"LOW\", \"MEDIUM\", \"HIGH\")\n )\n ) %>%\n var_relabel(\n BMRKR1_CAT = \"Biomarker 1 Categories\"\n )\n# The developer needs to do pre-processing to add necessary variables based on ADVS to analysis dataset.\n# Obtain SBP, DBP and weight.\nget_param_advs <- function(pname, plabel) {\n ds <- advs %>%\n filter(PARAM == plabel & AVISIT == \"BASELINE\") %>%\n select(USUBJID, AVAL)\n\n colnames(ds) <- c(\"USUBJID\", pname)\n\n ds\n}\n# The developer needs to do pre-processing to add necessary variables based on ADSUB to analysis dataset.\n# Obtain baseline BMI (BBMISI).\nget_param_adsub <- function(pname, plabel) {\n ds <- adsub %>%\n filter(PARAM == plabel) %>%\n select(USUBJID, AVAL)\n\n colnames(ds) <- c(\"USUBJID\", pname)\n\n ds\n}\nadsl <- adsl %>%\n left_join(get_param_advs(\"SBP\", \"Systolic Blood Pressure\"), by = \"USUBJID\") %>%\n left_join(get_param_advs(\"DBP\", \"Diastolic Blood Pressure\"), by = \"USUBJID\") %>%\n left_join(get_param_advs(\"WGT\", \"Weight\"), by = \"USUBJID\") %>%\n left_join(get_param_adsub(\"BBMISI\", \"Baseline BMI\"), by = \"USUBJID\")\n\n\n\n\n\nCodevars <- c(\"AGE\", \"AGEGR1\", \"SEX\", \"ETHNIC\", \"RACE\", \"BMRKR1\")\nvar_labels <- c(\n \"Age (yr)\",\n \"Age Group\",\n \"Sex\",\n \"Ethnicity\",\n \"Race\",\n \"Continous Level Biomarker 1\"\n)\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n add_overall_col(\"All Patients\") %>%\n analyze_vars(\n vars = vars,\n var_labels = var_labels\n ) %>%\n build_table(adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————————————————\nAge (yr) \n n 134 134 132 400 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) 34.9 (7.4) \n Median 33.0 35.0 35.0 34.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 20.0 - 69.0 \nAge Group \n n 134 134 132 400 \n 18-40 113 (84.3%) 103 (76.9%) 106 (80.3%) 322 (80.5%) \n 41-64 21 (15.7%) 31 (23.1%) 25 (18.9%) 77 (19.2%) \n >=65 0 0 1 (0.8%) 1 (0.2%) \nSex \n n 134 134 132 400 \n Female 79 (59%) 82 (61.2%) 70 (53%) 231 (57.8%) \n Male 55 (41%) 52 (38.8%) 62 (47%) 169 (42.2%) \nEthnicity \n n 134 134 132 400 \n HISPANIC OR LATINO 15 (11.2%) 18 (13.4%) 15 (11.4%) 48 (12%) \n NOT HISPANIC OR LATINO 104 (77.6%) 103 (76.9%) 101 (76.5%) 308 (77%) \n NOT REPORTED 6 (4.5%) 10 (7.5%) 11 (8.3%) 27 (6.8%) \n UNKNOWN 9 (6.7%) 3 (2.2%) 5 (3.8%) 17 (4.2%) \nRace \n n 134 134 132 400 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) 208 (52%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) 91 (22.8%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) 74 (18.5%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) 25 (6.2%) \n MULTIPLE 0 1 (0.7%) 0 1 (0.2%) \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 1 (0.2%) \n OTHER 0 0 0 0 \n UNKNOWN 0 0 0 0 \nContinous Level Biomarker 1 \n n 134 134 132 400 \n Mean (SD) 6.0 (3.6) 5.7 (3.3) 5.6 (3.5) 5.8 (3.4) \n Median 5.4 4.8 4.6 4.8 \n Min - Max 0.4 - 17.7 0.6 - 14.2 0.2 - 21.4 0.2 - 21.4 \n\n\n\n\n\nCodevars <- c(\"AGE\", \"AGEGR1\", \"SEX\", \"ETHNIC\", \"RACE\", \"BMRKR1_CAT\")\nvar_labels <- c(\n \"Age (yr)\",\n \"Age Group\",\n \"Sex\",\n \"Ethnicity\",\n \"Race\",\n \"Biomarker 1 Categories\"\n)\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_vars(\n vars = vars,\n var_labels = var_labels\n ) %>%\n build_table(adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————\nAge (yr) \n n 134 134 132 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) \n Median 33.0 35.0 35.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 \nAge Group \n n 134 134 132 \n 18-40 113 (84.3%) 103 (76.9%) 106 (80.3%) \n 41-64 21 (15.7%) 31 (23.1%) 25 (18.9%) \n >=65 0 0 1 (0.8%) \nSex \n n 134 134 132 \n Female 79 (59%) 82 (61.2%) 70 (53%) \n Male 55 (41%) 52 (38.8%) 62 (47%) \nEthnicity \n n 134 134 132 \n HISPANIC OR LATINO 15 (11.2%) 18 (13.4%) 15 (11.4%) \n NOT HISPANIC OR LATINO 104 (77.6%) 103 (76.9%) 101 (76.5%) \n NOT REPORTED 6 (4.5%) 10 (7.5%) 11 (8.3%) \n UNKNOWN 9 (6.7%) 3 (2.2%) 5 (3.8%) \nRace \n n 134 134 132 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) \n MULTIPLE 0 1 (0.7%) 0 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 \n OTHER 0 0 0 \n UNKNOWN 0 0 0 \nBiomarker 1 Categories \n n 134 134 132 \n LOW 33 (24.6%) 41 (30.6%) 38 (28.8%) \n MEDIUM 84 (62.7%) 76 (56.7%) 80 (60.6%) \n HIGH 17 (12.7%) 17 (12.7%) 14 (10.6%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_vars(\n vars = c(\"AGE\", \"SEX\", \"RACE\"),\n var_labels = c(\"Age\", \"Sex\", \"Race\")\n ) %>%\n split_rows_by(\"STRATA1\",\n split_fun = split_fun\n ) %>%\n analyze_vars(\"BMRKR1\") %>%\n build_table(adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————\nAge \n n 134 134 132 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) \n Median 33.0 35.0 35.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 \nSex \n n 134 134 132 \n Female 79 (59%) 82 (61.2%) 70 (53%) \n Male 55 (41%) 52 (38.8%) 62 (47%) \nRace \n n 134 134 132 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) \n MULTIPLE 0 1 (0.7%) 0 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 \n OTHER 0 0 0 \n UNKNOWN 0 0 0 \nA \n n 38 44 40 \n Mean (SD) 5.8 (3.8) 5.4 (3.2) 5.1 (3.2) \n Median 5.1 4.5 3.8 \n Min - Max 0.4 - 17.7 1.4 - 14.2 1.5 - 14.0 \nB \n n 47 45 43 \n Mean (SD) 6.1 (3.6) 5.8 (3.6) 5.7 (3.4) \n Median 5.2 4.8 5.1 \n Min - Max 1.6 - 17.2 0.6 - 13.3 0.2 - 16.5 \nC \n n 49 45 49 \n Mean (SD) 6.0 (3.4) 5.9 (3.2) 6.0 (3.8) \n Median 5.8 5.6 4.5 \n Min - Max 0.5 - 15.1 1.5 - 13.9 1.2 - 21.4 \n\n\n\n\n\nCoderesult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_vars(\n vars = c(\"AGE\", \"SEX\", \"RACE\", \"DBP\", \"SBP\"),\n var_labels = c(\n \"Age (yr)\",\n \"Sex\",\n \"Race\",\n \"Diastolic Blood Pressure\",\n \"Systolic Blood Pressure\"\n )\n ) %>%\n build_table(adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————\nAge (yr) \n n 134 134 132 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) \n Median 33.0 35.0 35.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 \nSex \n n 134 134 132 \n Female 79 (59%) 82 (61.2%) 70 (53%) \n Male 55 (41%) 52 (38.8%) 62 (47%) \nRace \n n 134 134 132 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) \n MULTIPLE 0 1 (0.7%) 0 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 \n OTHER 0 0 0 \n UNKNOWN 0 0 0 \nDiastolic Blood Pressure \n n 134 134 132 \n Mean (SD) 96.5 (19.9) 101.1 (19.9) 102.8 (19.5) \n Median 96.0 100.4 102.0 \n Min - Max 44.3 - 136.6 29.2 - 143.8 49.4 - 153.5 \nSystolic Blood Pressure \n n 134 134 132 \n Mean (SD) 151.7 (31.5) 149.5 (26.5) 144.7 (30.1) \n Median 150.1 153.0 146.5 \n Min - Max 69.1 - 231.2 87.2 - 220.9 71.8 - 220.2 \n\n\n\n\n\nCoderesult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_vars(\n vars = c(\"AGE\", \"SEX\", \"RACE\", \"BBMISI\"),\n var_labels = c(\n \"Age (yr)\",\n \"Sex\",\n \"Race\",\n \"Baseline BMI\"\n )\n ) %>%\n build_table(adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————\nAge (yr) \n n 134 134 132 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) \n Median 33.0 35.0 35.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 \nSex \n n 134 134 132 \n Female 79 (59%) 82 (61.2%) 70 (53%) \n Male 55 (41%) 52 (38.8%) 62 (47%) \nRace \n n 134 134 132 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) \n MULTIPLE 0 1 (0.7%) 0 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 \n OTHER 0 0 0 \n UNKNOWN 0 0 0 \nBaseline BMI \n n 134 134 132 \n Mean (SD) 30.0 (18.3) 32.4 (23.2) 30.1 (18.4) \n Median 27.1 31.1 30.0 \n Min - Max -6.9 - 75.9 -26.6 - 117.9 -44.2 - 87.5 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n # Include `EOSDY` and `DCSREAS` variables below because they contain missing data.\n stopifnot(\n any(is.na(ADSL$EOSDY)),\n any(is.na(ADSL$DCSREAS))\n )\n})\ndatanames <- \"ADSL\"\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary(\n label = \"Demographic Table\",\n dataname = \"ADSL\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n summarize_vars = choices_selected(\n c(\"SEX\", \"RACE\", \"BMRKR2\", \"EOSDY\", \"DCSREAS\"),\n c(\"SEX\", \"RACE\")\n ),\n useNA = \"ifany\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:36:50 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tidyr_1.3.1 \n [9] dplyr_1.1.4 scda_0.1.6.9017 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 glue_1.7.0 ps_1.7.6 \n[58] codetools_0.2-19 stringi_1.8.3 gtable_0.3.4 \n[61] later_1.3.2 shinycssloaders_1.0.0 munsell_0.5.0 \n[64] tibble_3.2.1 logger_0.3.0 pillar_1.9.0 \n[67] htmltools_0.5.7 brio_1.1.4 R6_2.5.1 \n[70] Rdpack_2.6 evaluate_0.23 lattice_0.22-6 \n[73] rbibutils_2.2.16 backports_1.4.1 memoise_2.0.1 \n[76] broom_1.0.5 teal.reporter_0.3.1.9002 bslib_0.6.1 \n[79] httpuv_1.6.14 Rcpp_1.0.12 shinyvalidate_0.1.3 \n[82] coda_0.19-4.1 nlme_3.1-164 checkmate_2.3.1 \n[85] xfun_0.42 zoo_1.8-12 forcats_1.0.0 \n[88] pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Concomitant Medications", - "CMT02_PT" + "Demography", + "DMT01" ] }, { - "objectID": "tables/ECG/egt04.html", - "href": "tables/ECG/egt04.html", - "title": "EGT04", + "objectID": "tables/efficacy/cmht01.html", + "href": "tables/efficacy/cmht01.html", + "title": "CMHT01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\nFor the EGT04 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N. For illustration purposes, missing data are added to the example dataset.\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\nset.seed(123)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadeg <- df_explicit_na(adeg, omit_columns = c(\"AVALC\", \"BASEC\"))\n\nadeg_labels <- var_labels(adeg)\n\nadeg_f <- subset(\n adeg,\n PARAMCD == \"ECGINTP\" & # Analysis in terms of \"NORMAL\"/\"ABNORMAL\" (AVALC)\n SAFFL == \"Y\" & # \"Safety Population Flag\"\n ONTRTFL == \"Y\" & # \"On Treatment Record Flag\"\n WORS02FL == \"Y\" # \"Worst Post-Baseline Observation\"\n)\n\nadeg_f$AVALC[sample(seq_len(nrow(adeg_f)), size = 5)] <- \"Missing\"\nadeg_f$BASEC[sample(seq_len(nrow(adeg_f)), size = 5)] <- \"Missing\"\nadeg_f$AVALC <- factor(\n adeg_f$AVALC,\n levels = c(\"NORMAL\", \"ABNORMAL\", \"Missing\"),\n labels = c(\"Normal\", \"Abnormal\", \"Missing\")\n)\nadeg_f$BASEC <- factor(\n adeg_f$BASEC,\n levels = c(\"NORMAL\", \"ABNORMAL\", \"Missing\"),\n labels = c(\"Normal\", \"Abnormal\", \"Missing\")\n)\n\nvar_labels(adeg_f) <- adeg_labels\nadeg_f <- adeg_f %>%\n var_relabel(BASEC = \"Baseline\")\n\n# Temprary solution for over arching column\nadeg_f <- adeg_f %>% mutate(postbaseline_label = \"Post-Baseline\")\n\n\n\n\nThe EGT04 template consists of a stacked list of contingency tables, one per group. For each group, the n’s across all cells must add up to the group N in the analysis, and percentages are calculated using N as the denominator.\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n split_cols_by(\"postbaseline_label\") %>%\n split_cols_by(\"AVALC\") %>%\n split_rows_by(\"ARM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adeg_f$ARM)) %>%\n add_rowcounts() %>%\n analyze_vars(\n \"BASEC\",\n denom = \"N_row\",\n .stats = \"count_fraction\",\n na.rm = FALSE\n ) %>%\n append_varlabels(adeg_f, c(\"BASEC\"), indent = 1L)\n\nresult <- build_table(lyt, adeg_f)\nresult\n\nDescription of Planned Arm Post-Baseline \n Baseline Normal Abnormal Missing \n———————————————————————————————————————————————————————————————\nA: Drug X (N=134) \n Normal 20 (14.9%) 81 (60.4%) 1 (0.7%)\n Abnormal 11 (8.2%) 19 (14.2%) 0 \n Missing 0 1 (0.7%) 1 (0.7%)\nB: Placebo (N=134) \n Normal 18 (13.4%) 81 (60.4%) 2 (1.5%)\n Abnormal 3 (2.2%) 28 (20.9%) 0 \n Missing 0 2 (1.5%) 0 \nC: Combination (N=132) \n Normal 26 (19.7%) 69 (52.3%) 1 (0.8%)\n Abnormal 6 (4.5%) 29 (22%) 0 \n Missing 1 (0.8%) 0 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:39:34 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9016 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nTable of Single Parameter\nTable of Multiple Parameters\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadqs <- df_explicit_na(adqs)\n\n\n\n\n\n\nCodeanl_01 <- adqs %>%\n filter(PARAMCD == \"FKSI-FWB\" & AVISIT == \"WEEK 1 DAY 8\") %>%\n mutate(is_rsp = PCHG > 15) %>%\n mutate(ARM = relevel(ARM, ref = \"A: Drug X\")) %>%\n var_relabel(ARM = \"Description of Planned Arm\") %>%\n mutate(strata = interaction(STRATA1, STRATA2, drop = TRUE))\n\nlyt_01 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(vars = \"is_rsp\", table_names = \"est_prop\") %>%\n estimate_proportion_diff(\n var_labels = \"Unstratified Analysis\",\n vars = \"is_rsp\",\n show_labels = \"visible\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(vars = \"is_rsp\", table_names = \"test_prop\") %>%\n estimate_odds_ratio(vars = \"is_rsp\", table_names = \"est_or\") %>%\n estimate_proportion_diff(\n var_labels = \"Stratified Analysis\",\n vars = \"is_rsp\",\n show_labels = \"visible\",\n method = \"cmh\",\n variables = list(strata = \"strata\"),\n table_names = \"est_prop_diff_strat\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n method = \"cmh\",\n variables = list(strata = \"strata\"),\n table_names = \"test_prop_strat\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n variables = list(strata = \"strata\", arm = \"ARM\"),\n table_names = \"est_or_strat\"\n )\n\nresult <- build_table(\n lyt = lyt_01,\n df = anl_01,\n alt_counts_df = adsl\n)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nResponders 49 (36.6%) 51 (38.1%) 47 (35.6%) \n95% CI (Wald, with correction) (28.0, 45.1) (29.5, 46.7) (27.1, 44.2) \nUnstratified Analysis \n Difference in Response rate (%) 1.5 -1.0 \n 95% CI (Wald, with correction) (-10.8, 13.8) (-13.3, 11.3) \n p-value (Chi-Squared Test) 0.8006 0.8704 \nOdds Ratio (95% CI) 1.07 (0.65 - 1.75) 0.96 (0.58 - 1.58)\nStratified Analysis \n Difference in Response rate (%) 2.8 -1.5 \n 95% CI (CMH, without correction) (-8.2, 13.8) (-13.0, 9.9) \n p-value (Cochran-Mantel-Haenszel Test) 0.6397 0.7952 \nOdds Ratio (95% CI) 1.12 (0.68 - 1.83) 0.99 (0.60 - 1.64)\n\n\n\n\n\n\nCodeanl_02 <- adqs %>%\n filter(AVISIT == \"WEEK 1 DAY 8\") %>%\n mutate(is_rsp = PCHG > 15) %>%\n mutate(PARAM = droplevels(PARAM)) %>%\n mutate(ARM = relevel(ARM, ref = \"A: Drug X\")) %>%\n var_relabel(ARM = \"Description of Planned Arm\") %>%\n mutate(strata = interaction(STRATA1, STRATA2, drop = TRUE))\n\nvar_labels(anl_02)[\"PARAM\"] <- \"Parameter\"\n\nsplit_fun <- drop_split_levels\n\nlyt_02 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n split_rows_by(\n var = \"PARAM\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(anl_02$PARAM)\n ) %>%\n estimate_proportion(vars = \"is_rsp\", table_names = \"est_prop\") %>%\n estimate_proportion_diff(\n var_labels = \"Unstratified Analysis\",\n vars = \"is_rsp\",\n show_labels = \"visible\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(vars = \"is_rsp\", table_names = \"test_prop\") %>%\n estimate_odds_ratio(vars = \"is_rsp\", table_names = \"est_or\") %>%\n estimate_proportion_diff(\n var_labels = \"Stratified Analysis\",\n vars = \"is_rsp\",\n show_labels = \"visible\",\n method = \"cmh\",\n variables = list(strata = \"strata\"),\n table_names = \"est_prop_diff_strat\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n method = \"cmh\",\n variables = list(strata = \"strata\"),\n table_names = \"test_prop_strat\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n variables = list(strata = \"strata\", arm = \"ARM\"),\n table_names = \"est_or_strat\"\n )\n\nresult <- build_table(\n lyt = lyt_02,\n df = anl_02,\n alt_counts_df = adsl\n)\nresult\n\n A: Drug X B: Placebo C: Combination \nParameter (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nBFI All Questions \n Responders 57 (42.5%) 65 (48.5%) 50 (37.9%) \n 95% CI (Wald, with correction) (33.8, 51.3) (39.7, 57.3) (29.2, 46.5) \n Unstratified Analysis \n Difference in Response rate (%) 6.0 -4.7 \n 95% CI (Wald, with correction) (-6.7, 18.6) (-17.2, 7.9) \n p-value (Chi-Squared Test) 0.3264 0.4385 \n Odds Ratio (95% CI) 1.27 (0.79 - 2.06) 0.82 (0.50 - 1.35)\n Stratified Analysis \n Difference in Response rate (%) 6.7 -5.1 \n 95% CI (CMH, without correction) (-5.0, 18.4) (-16.8, 6.6) \n p-value (Cochran-Mantel-Haenszel Test) 0.2781 0.4056 \n Odds Ratio (95% CI) 1.30 (0.80 - 2.11) 0.80 (0.49 - 1.32)\nFatigue Interference \n Responders 66 (49.3%) 50 (37.3%) 48 (36.4%) \n 95% CI (Wald, with correction) (40.4, 58.1) (28.8, 45.9) (27.8, 44.9) \n Unstratified Analysis \n Difference in Response rate (%) -11.9 -12.9 \n 95% CI (Wald, with correction) (-24.5, 0.6) (-25.4, -0.3) \n p-value (Chi-Squared Test) 0.0485 0.0337 \n Odds Ratio (95% CI) 0.61 (0.38 - 1.00) 0.59 (0.36 - 0.96)\n Stratified Analysis \n Difference in Response rate (%) -12.0 -13.3 \n 95% CI (CMH, without correction) (-23.7, -0.2) (-24.9, -1.6) \n p-value (Cochran-Mantel-Haenszel Test) 0.0518 0.0303 \n Odds Ratio (95% CI) 0.61 (0.37 - 0.99) 0.58 (0.36 - 0.96)\nFKSI-19 All Questions \n Responders 60 (44.8%) 57 (42.5%) 68 (51.5%) \n 95% CI (Wald, with correction) (36.0, 53.6) (33.8, 51.3) (42.6, 60.4) \n Unstratified Analysis \n Difference in Response rate (%) -2.2 6.7 \n 95% CI (Wald, with correction) (-14.9, 10.4) (-6.0, 19.5) \n p-value (Chi-Squared Test) 0.7118 0.2714 \n Odds Ratio (95% CI) 0.91 (0.56 - 1.48) 1.31 (0.81 - 2.12)\n Stratified Analysis \n Difference in Response rate (%) -2.8 5.6 \n 95% CI (CMH, without correction) (-14.3, 8.8) (-6.2, 17.4) \n p-value (Cochran-Mantel-Haenszel Test) 0.6442 0.3683 \n Odds Ratio (95% CI) 0.90 (0.56 - 1.47) 1.26 (0.77 - 2.04)\nFunction/Well-Being (GF1,GF3,GF7) \n Responders 49 (36.6%) 51 (38.1%) 47 (35.6%) \n 95% CI (Wald, with correction) (28.0, 45.1) (29.5, 46.7) (27.1, 44.2) \n Unstratified Analysis \n Difference in Response rate (%) 1.5 -1.0 \n 95% CI (Wald, with correction) (-10.8, 13.8) (-13.3, 11.3) \n p-value (Chi-Squared Test) 0.8006 0.8704 \n Odds Ratio (95% CI) 1.07 (0.65 - 1.75) 0.96 (0.58 - 1.58)\n Stratified Analysis \n Difference in Response rate (%) 2.8 -1.5 \n 95% CI (CMH, without correction) (-8.2, 13.8) (-13.0, 9.9) \n p-value (Cochran-Mantel-Haenszel Test) 0.6397 0.7952 \n Odds Ratio (95% CI) 1.12 (0.68 - 1.83) 0.99 (0.60 - 1.64)\nTreatment Side Effects (GP2,C5,GP5) \n Responders 62 (46.3%) 49 (36.6%) 51 (38.6%) \n 95% CI (Wald, with correction) (37.5, 55.1) (28.0, 45.1) (30.0, 47.3) \n Unstratified Analysis \n Difference in Response rate (%) -9.7 -7.6 \n 95% CI (Wald, with correction) (-22.2, 2.8) (-20.2, 5.0) \n p-value (Chi-Squared Test) 0.1069 0.2080 \n Odds Ratio (95% CI) 0.67 (0.41 - 1.09) 0.73 (0.45 - 1.19)\n Stratified Analysis \n Difference in Response rate (%) -9.6 -7.1 \n 95% CI (CMH, without correction) (-21.0, 1.8) (-18.8, 4.6) \n p-value (Cochran-Mantel-Haenszel Test) 0.1168 0.2426 \n Odds Ratio (95% CI) 0.67 (0.41 - 1.10) 0.73 (0.45 - 1.19)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADRS <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n})\ndatanames <- c(\"ADSL\", \"ADRS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADRS <- data[[\"ADRS\"]]\narm_ref_comp <- list(\n ARMCD = list(ref = \"ARM B\", comp = c(\"ARM A\", \"ARM C\")),\n ARM = list(ref = \"B: Placebo\", comp = c(\"A: Drug X\", \"C: Combination\"))\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_binary_outcome(\n label = \"Responders\",\n dataname = \"ADRS\",\n paramcd = choices_selected(\n choices = value_choices(ADRS, \"PARAMCD\", \"PARAM\"),\n selected = \"BESRSPI\"\n ),\n arm_var = choices_selected(\n choices = variable_choices(ADRS, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n selected = \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n strata_var = choices_selected(\n choices = variable_choices(ADRS, c(\"SEX\", \"BMRKR2\")),\n select = NULL\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:37:35 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "ECG", - "EGT04" + "Efficacy", + "CMHT01" ] }, { - "objectID": "tables/ECG/egt02.html", - "href": "tables/ECG/egt02.html", - "title": "EGT02", + "objectID": "tables/efficacy/dort01.html", + "href": "tables/efficacy/dort01.html", + "title": "DORT01", "section": "", - "text": "Data Setup\nECG Abnormalities Regardless of Abnormality at Baseline\nECG Abnormalities Among Subjects Without Abnormality at Baseline\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadeg <- df_explicit_na(adeg)\n\n# Note: We keep only post-baseline for analysis.\nadeg_f <- adeg %>%\n filter(ONTRTFL == \"Y\") %>%\n filter(PARAM %in% c(\"Heart Rate\", \"QT Duration\", \"RR Duration\")) %>%\n filter(ANRIND != \"<Missing>\") %>%\n var_relabel(\n PARAM = \"Assessment\",\n ANRIND = \"Abnormality\"\n )\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adeg_f$PARAM)\n ) %>%\n count_abnormal(\"ANRIND\", abnormal = list(Low = \"LOW\", High = \"HIGH\"), exclude_base_abn = FALSE) %>%\n append_varlabels(adeg_f, \"ANRIND\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adeg_f, alt_counts_df = adsl)\nresult\n\nAssessment A: Drug X B: Placebo C: Combination\n Abnormality (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————\nHeart Rate \n Low 40/134 (29.9%) 43/134 (32.1%) 37/132 (28%) \n High 39/134 (29.1%) 45/134 (33.6%) 36/132 (27.3%)\nQT Duration \n Low 33/134 (24.6%) 44/134 (32.8%) 47/132 (35.6%)\n High 30/134 (22.4%) 42/134 (31.3%) 34/132 (25.8%)\nRR Duration \n Low 45/134 (33.6%) 26/134 (19.4%) 38/132 (28.8%)\n High 29/134 (21.6%) 49/134 (36.6%) 27/132 (20.5%)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adeg_f$PARAM)\n ) %>%\n count_abnormal(\"ANRIND\", abnormal = list(Low = \"LOW\", High = \"HIGH\"), exclude_base_abn = TRUE) %>%\n append_varlabels(adeg_f, \"ANRIND\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adeg_f, alt_counts_df = adsl)\nresult\n\nAssessment A: Drug X B: Placebo C: Combination\n Abnormality (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————\nHeart Rate \n Low 39/128 (30.5%) 42/124 (33.9%) 33/117 (28.2%)\n High 37/127 (29.1%) 43/129 (33.3%) 31/122 (25.4%)\nQT Duration \n Low 29/113 (25.7%) 42/126 (33.3%) 43/124 (34.7%)\n High 30/125 (24%) 40/130 (30.8%) 30/119 (25.2%)\nRR Duration \n Low 45/129 (34.9%) 26/123 (21.1%) 37/126 (29.4%)\n High 27/127 (21.3%) 43/122 (35.2%) 25/125 (20%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEG <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n})\ndatanames <- c(\"ADSL\", \"ADEG\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADEG <- data[[\"ADEG\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_abnormality(\n label = \"Abnormality Table\",\n dataname = \"ADEG\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADEG, subset = c(\"EGCAT\", \"PARAM\", \"AVISIT\")),\n selected = c(\"PARAM\"),\n keep_order = TRUE\n ),\n grade = choices_selected(\n choices = variable_choices(ADEG, subset = \"ANRIND\"),\n selected = \"ANRIND\",\n fixed = TRUE\n ),\n abnormal = list(Low = \"LOW\", High = \"HIGH\"),\n exclude_base_abn = FALSE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:40:05 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 scda_0.1.6.9017 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Selecting Sections to Display\nTable Modifying Analysis Details like Conf. Type and Alpha Level\nTable Modifying Time Point for the “XX Months duration” Analysis\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadtte <- df_explicit_na(adtte)\n\nadtte_f <- adtte %>%\n filter(PARAMCD == \"CRSD\" & BMEASIFL == \"Y\") %>%\n dplyr::mutate(\n AVAL = day2month(AVAL),\n is_event = CNSR == 0,\n is_not_event = CNSR == 1,\n EVNT1 = factor(\n case_when(\n is_event == TRUE ~ \"Responders with subsequent event (%)\",\n is_event == FALSE ~ \"Responders without subsequent event (%)\"\n ),\n levels = c(\"Responders with subsequent event (%)\", \"Responders without subsequent event (%)\")\n ),\n EVNTDESC = factor(EVNTDESC)\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n count_values(\n vars = \"USUBJID\",\n values = unique(adtte$USUBJID),\n .labels = \"Responders\",\n .stats = \"count\"\n ) %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders with subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n show_labels = \"hidden\",\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Responders with subsequent event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 2L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders without subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Duration of response (Months)\",\n is_event = \"is_event\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months duration\",\n is_event = \"is_event\",\n time_point = 12\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table(prune_func = prune_zeros_only)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————\nResponders 68 73 62 \n Responders with subsequent event (%) 46 (67.6%) 39 (53.4%) 32 (51.6%) \n Earliest contributing event \n Death 26 24 16 \n Disease Progression 20 15 16 \n Responders without subsequent event (%) 22 (32.4%) 34 (46.6%) 30 (48.4%) \nDuration of response (Months) \n Median 5.3 6.2 5.3 \n 95% CI (4.6, 5.8) (5.4, 6.3) (4.6, 5.8) \n 25% and 75%-ile 3.8, 6.3 4.6, 6.4 4.0, 6.1 \n Range 0.5 to 6.4 0.9 to 6.5 0.6 to 6.6 \n12 Months duration \n Patients remaining at risk NA NA NA \n Event Free Rate (%) NA NA NA \n 95% CI NA NA NA \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n count_values(\n vars = \"USUBJID\",\n values = unique(adtte$USUBJID),\n .labels = \"Responders\",\n .stats = \"count\"\n ) %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders with subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n show_labels = \"hidden\",\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Responders with subsequent event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 2L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders without subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Duration of response (Months)\",\n is_event = \"is_event\",\n table_names = \"surv_time\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = c(\"Unstratified Analysis\"),\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"cox_pair\"\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table(prune_func = prune_zeros_only)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nResponders 68 73 62 \n Responders with subsequent event (%) 46 (67.6%) 39 (53.4%) 32 (51.6%) \n Earliest contributing event \n Death 26 24 16 \n Disease Progression 20 15 16 \n Responders without subsequent event (%) 22 (32.4%) 34 (46.6%) 30 (48.4%) \nDuration of response (Months) \n Median 5.3 6.2 5.3 \n 95% CI (4.6, 5.8) (5.4, 6.3) (4.6, 5.8) \n 25% and 75%-ile 3.8, 6.3 4.6, 6.4 4.0, 6.1 \n Range 0.5 to 6.4 0.9 to 6.5 0.6 to 6.6 \nUnstratified Analysis \n p-value (log-rank) 0.0223 0.6659 \n Hazard Ratio 0.60 0.90 \n 95% CI (0.39, 0.93) (0.57, 1.44) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n count_values(\n vars = \"USUBJID\",\n values = unique(adtte$USUBJID),\n .labels = \"Responders\",\n .stats = \"count\"\n ) %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders with subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n show_labels = \"hidden\",\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Responders with subsequent event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 2L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders without subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Duration of response (Months)\",\n is_event = \"is_event\",\n control = control_surv_time(conf_level = 0.90, conf_type = \"log-log\")\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months duration\",\n is_event = \"is_event\",\n time_point = 12,\n control = control_surv_timepoint(conf_level = 0.975)\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table(prune_func = prune_zeros_only)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————\nResponders 68 73 62 \n Responders with subsequent event (%) 46 (67.6%) 39 (53.4%) 32 (51.6%) \n Earliest contributing event \n Death 26 24 16 \n Disease Progression 20 15 16 \n Responders without subsequent event (%) 22 (32.4%) 34 (46.6%) 30 (48.4%) \nDuration of response (Months) \n Median 5.3 6.2 5.3 \n 90% CI (4.6, 5.8) (5.5, 6.3) (4.6, 5.7) \n 25% and 75%-ile 3.8, 6.3 4.6, 6.4 4.0, 6.1 \n Range 0.5 to 6.4 0.9 to 6.5 0.6 to 6.6 \n12 Months duration \n Patients remaining at risk NA NA NA \n Event Free Rate (%) NA NA NA \n 97.5% CI NA NA NA \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n count_values(\n vars = \"USUBJID\",\n values = unique(adtte$USUBJID),\n .labels = \"Responders\",\n .stats = \"count\"\n ) %>%\n analyze_vars(\n vars = \"is_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders with subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n show_labels = \"hidden\",\n ) %>%\n split_rows_by(\n \"EVNT1\",\n split_label = \"Earliest contributing event\",\n split_fun = keep_split_levels(\"Responders with subsequent event (%)\"),\n label_pos = \"visible\",\n child_labels = \"hidden\",\n indent_mod = 2L,\n ) %>%\n analyze(\"EVNTDESC\") %>%\n analyze_vars(\n vars = \"is_not_event\",\n .stats = \"count_fraction\",\n .labels = c(count_fraction = \"Responders without subsequent event (%)\"),\n .indent_mods = c(count_fraction = 1L),\n nested = FALSE,\n show_labels = \"hidden\"\n ) %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = \"Duration of response (Months)\",\n is_event = \"is_event\"\n ) %>%\n surv_timepoint(\n vars = \"AVAL\",\n var_labels = \"Months duration\",\n is_event = \"is_event\",\n time_point = 6\n )\n\nresult <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%\n prune_table(prune_func = prune_zeros_only)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————\nResponders 68 73 62 \n Responders with subsequent event (%) 46 (67.6%) 39 (53.4%) 32 (51.6%) \n Earliest contributing event \n Death 26 24 16 \n Disease Progression 20 15 16 \n Responders without subsequent event (%) 22 (32.4%) 34 (46.6%) 30 (48.4%) \nDuration of response (Months) \n Median 5.3 6.2 5.3 \n 95% CI (4.6, 5.8) (5.4, 6.3) (4.6, 5.8) \n 25% and 75%-ile 3.8, 6.3 4.6, 6.4 4.0, 6.1 \n Range 0.5 to 6.4 0.9 to 6.5 0.6 to 6.6 \n6 Months duration \n Patients remaining at risk 10 18 7 \n Event Free Rate (%) 33.46 50.23 30.56 \n 95% CI (20.88, 46.05) (36.54, 63.92) (13.56, 47.57)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(tern)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADTTE <- df_explicit_na(ADTTE)\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADTTE <- data[[\"ADTTE\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_tte(\n label = \"Time To Event Table\",\n dataname = \"ADTTE\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADTTE, \"PARAMCD\", \"PARAM\"),\n \"CRSD\"\n ),\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"SEX\", \"BMRKR2\")),\n \"SEX\"\n ),\n time_points = choices_selected(c(6, 8), 6),\n event_desc_var = choices_selected(\n variable_choices(ADTTE, \"EVNTDESC\"),\n \"EVNTDESC\",\n fixed = TRUE\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:38:11 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "ECG", - "EGT02" + "Efficacy", + "DORT01" ] }, { - "objectID": "tables/ECG/egt03.html", - "href": "tables/ECG/egt03.html", - "title": "EGT03", + "objectID": "tables/efficacy/cfbt01.html", + "href": "tables/efficacy/cfbt01.html", + "title": "CFBT01", "section": "", - "text": "Data Setup\nTable of Baseline Versus Minimum Post-Baseline\nTable of Baseline Versus Maximum Post-Baseline\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadeg <- df_explicit_na(adeg)\n\nadeg_labels <- var_labels(adeg)\n\nadeg_f_pbmin <- subset(\n adeg,\n PARAMCD == \"HR\" & # Heart Rate\n SAFFL == \"Y\" & # \"Safety Population Flag\"\n ONTRTFL == \"Y\" & # \"On Treatment Record Flag\"\n AVISIT == \"POST-BASELINE MINIMUM\" # \"Analysis Visit\"\n)\n\nadeg_f_pbmax <- subset(\n adeg,\n PARAMCD == \"HR\" & # Heart Rate\n SAFFL == \"Y\" & # \"Safety Population Flag\"\n ONTRTFL == \"Y\" & # \"On Treatment Record Flag\"\n AVISIT == \"POST-BASELINE MAXIMUM\" # \"Analysis Visit\"\n)\n\nvar_labels(adeg_f_pbmin) <- adeg_labels\nvar_labels(adeg_f_pbmax) <- adeg_labels\n\n\n\n\nFor the EGT03 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N. For illustration purposes, missing data are added to the example dataset.\n\nCodeset.seed(123, kind = \"Mersenne-Twister\")\n\nadeg_f_pbmin$BNRIND <- factor(\n adeg_f_pbmin$BNRIND,\n levels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\"),\n labels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\")\n)\nadeg_f_pbmin$ANRIND <- factor(\n adeg_f_pbmin$ANRIND,\n levels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\"),\n labels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\")\n)\n\nadeg_f_pbmin$BNRIND[sample(seq_len(nrow(adeg_f_pbmin)), size = 5)] <- \"Missing\"\nadeg_f_pbmin$ANRIND[sample(seq_len(nrow(adeg_f_pbmin)), size = 5)] <- \"Missing\"\n\nattr(adeg_f_pbmin$ANRIND, \"label\") <- \"Analysis Reference Range Indicator\"\nattr(adeg_f_pbmin$BNRIND, \"label\") <- \"Baseline Reference Range Indicator\"\n\n# Temporary solution for overarching column\nadeg_f_pbmin <- adeg_f_pbmin %>% mutate(min_label = \"Minimum Post-Baseline Assessment\")\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n split_cols_by(\"min_label\") %>%\n split_cols_by(\"ANRIND\") %>%\n split_rows_by(\"ARMCD\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adeg_f_pbmin$ARMCD)) %>%\n add_rowcounts() %>%\n analyze_vars(\"BNRIND\", denom = \"N_row\", .stats = \"count_fraction\") %>%\n append_varlabels(adeg_f_pbmin, c(\"BNRIND\"), indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adeg_f_pbmin\n)\n\nresult\n\nPlanned Arm Code Minimum Post-Baseline Assessment \n Baseline Reference Range Indicator LOW NORMAL HIGH Missing \n————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n LOW 1 (0.7%) 5 (3.7%) 0 0 \n NORMAL 36 (26.9%) 83 (61.9%) 0 1 (0.7%)\n HIGH 2 (1.5%) 4 (3%) 0 0 \n Missing 1 (0.7%) 0 0 1 (0.7%)\nARM B (N=134) \n LOW 1 (0.7%) 9 (6.7%) 0 0 \n NORMAL 40 (29.9%) 75 (56%) 0 2 (1.5%)\n HIGH 1 (0.7%) 4 (3%) 0 0 \n Missing 1 (0.7%) 1 (0.7%) 0 0 \nARM C (N=132) \n LOW 4 (3%) 11 (8.3%) 0 0 \n NORMAL 31 (23.5%) 75 (56.8%) 0 0 \n HIGH 1 (0.8%) 8 (6.1%) 0 1 (0.8%)\n Missing 1 (0.8%) 0 0 0 \n\n\n\n\nFor the EGT03 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N. For illustration purpose, missing data are added to the example dataset.\n\nCodeset.seed(123, kind = \"Mersenne-Twister\")\n\nadeg_f_pbmax$BNRIND <- factor(\n adeg_f_pbmax$BNRIND,\n levels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\"),\n labels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\")\n)\nadeg_f_pbmax$ANRIND <- factor(\n adeg_f_pbmax$ANRIND,\n levels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\"),\n labels = c(\"LOW\", \"NORMAL\", \"HIGH\", \"Missing\")\n)\n\nadeg_f_pbmax$BNRIND[sample(seq_len(nrow(adeg_f_pbmax)), size = 5)] <- \"Missing\"\nadeg_f_pbmax$ANRIND[sample(seq_len(nrow(adeg_f_pbmax)), size = 5)] <- \"Missing\"\n\nattr(adeg_f_pbmax$ANRIND, \"label\") <- \"Analysis Reference Range Indicator\"\nattr(adeg_f_pbmax$BNRIND, \"label\") <- \"Baseline Reference Range Indicator\"\n\n# Temporary solution for overarching column\nadeg_f_pbmax <- adeg_f_pbmax %>% mutate(max_label = \"Maximum Post-Baseline Assessment\")\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n split_cols_by(\"max_label\") %>%\n split_cols_by(\"ANRIND\") %>%\n split_rows_by(\"ARMCD\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adeg_f_pbmax$ARMCD)) %>%\n add_rowcounts() %>%\n analyze_vars(\"BNRIND\", denom = \"N_row\", .stats = \"count_fraction\") %>%\n append_varlabels(adeg_f_pbmax, c(\"BNRIND\"), indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adeg_f_pbmax\n)\n\nresult\n\nPlanned Arm Code Maximum Post-Baseline Assessment \n Baseline Reference Range Indicator LOW NORMAL HIGH Missing \n————————————————————————————————————————————————————————————————————————————————\nARM A (N=134) \n LOW 0 2 (1.5%) 4 (3%) 0 \n NORMAL 0 88 (65.7%) 31 (23.1%) 1 (0.7%)\n HIGH 0 5 (3.7%) 1 (0.7%) 0 \n Missing 0 0 1 (0.7%) 1 (0.7%)\nARM B (N=134) \n LOW 0 8 (6%) 2 (1.5%) 0 \n NORMAL 0 76 (56.7%) 39 (29.1%) 2 (1.5%)\n HIGH 0 3 (2.2%) 2 (1.5%) 0 \n Missing 0 1 (0.7%) 1 (0.7%) 0 \nARM C (N=132) \n LOW 0 12 (9.1%) 3 (2.3%) 0 \n NORMAL 0 79 (59.8%) 27 (20.5%) 0 \n HIGH 0 5 (3.8%) 4 (3%) 1 (0.8%)\n Missing 0 0 1 (0.8%) 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEG <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n})\ndatanames <- c(\"ADSL\", \"ADEG\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADEG <- data[[\"ADEG\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_shift_by_arm(\n label = \"Shift by Arm Table\",\n dataname = \"ADEG\",\n arm_var = choices_selected(\n variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n paramcd = choices_selected(\n value_choices(ADEG, \"PARAMCD\"),\n selected = \"HR\"\n ),\n visit_var = choices_selected(\n value_choices(ADEG, \"AVISIT\"),\n selected = \"POST-BASELINE MINIMUM\"\n ),\n aval_var = choices_selected(\n variable_choices(ADEG, subset = \"ANRIND\"),\n selected = \"ANRIND\", fixed = TRUE\n ),\n baseline_var = choices_selected(\n variable_choices(ADEG, subset = \"BNRIND\"),\n selected = \"BNRIND\", fixed = TRUE\n ),\n treatment_flag_var = choices_selected(\n variable_choices(ADEG, subset = \"ONTRTFL\"),\n selected = \"ONTRTFL\", fixed = TRUE\n ),\n treatment_flag = choices_selected(\n value_choices(ADEG, \"ONTRTFL\"),\n selected = \"Y\", fixed = TRUE\n )\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:40:42 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadqs <- df_explicit_na(adqs)\n\n# This example focuses on \"BFI All Questions\" starting from baseline.\nadqs <- adqs %>%\n dplyr::filter(\n PARAM == \"BFI All Questions\",\n AVISIT != \"SCREENING\"\n )\n\n# Define the split function for AVISIT\nsplit_fun <- drop_split_levels\n\n\n\n\n\nCodeafun <- function(x, .var, .spl_context, ...) {\n n_fun <- sum(!is.na(x), na.rm = TRUE)\n if (n_fun == 0) {\n mean_sd_fun <- c(NA, NA)\n median_fun <- NA\n min_max_fun <- c(NA, NA)\n } else {\n mean_sd_fun <- c(mean(x, na.rm = TRUE), sd(x, na.rm = TRUE))\n median_fun <- median(x, na.rm = TRUE)\n min_max_fun <- c(min(x), max(x))\n }\n is_chg <- .var == \"CHG\"\n is_baseline <- .spl_context$value[which(.spl_context$split == \"AVISIT\")] == \"BASELINE\"\n if (is_baseline && is_chg) n_fun <- mean_sd_fun <- median_fun <- min_max_fun <- NULL\n\n in_rows(\n \"n\" = n_fun,\n \"Mean (SD)\" = mean_sd_fun,\n \"Median\" = median_fun,\n \"Min - Max\" = min_max_fun,\n .formats = list(\"n\" = \"xx\", \"Mean (SD)\" = \"xx.xx (xx.xx)\", \"Median\" = \"xx.xx\", \"Min - Max\" = \"xx.xx - xx.xx\"),\n .format_na_strs = list(\"n\" = \"NE\", \"Mean (SD)\" = \"NE (NE)\", \"Median\" = \"NE\", \"Min - Max\" = \"NE - NE\")\n )\n}\n\nlyt <- basic_table() %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adqs$PARAM)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adqs$AVISIT)\n ) %>%\n split_cols_by_multivar(\n vars = c(\"AVAL\", \"CHG\"),\n varlabels = c(\"Value at Visit\", \"Change from\\nBaseline\")\n ) %>%\n analyze_colvars(afun = afun)\n\nresult <- build_table(lyt, adqs)\nresult\n\n A: Drug X B: Placebo C: Combination \nParameter Change from Change from Change from \n Analysis Visit Value at Visit Baseline Value at Visit Baseline Value at Visit Baseline \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nBFI All Questions \n BASELINE \n n 134 134 132 \n Mean (SD) 49.93 (7.44) 49.74 (8.29) 50.30 (9.06) \n Median 48.69 49.28 49.74 \n Min - Max 33.72 - 65.91 25.82 - 71.47 26.04 - 69.99 \n WEEK 1 DAY 8 \n n 134 134 134 134 132 132 \n Mean (SD) 54.51 (8.61) 4.58 (11.23) 56.33 (7.86) 6.59 (11.81) 54.03 (8.31) 3.72 (12.66) \n Median 55.15 5.47 56.39 6.96 53.76 3.71 \n Min - Max 34.26 - 75.42 -25.52 - 29.68 36.82 - 74.45 -25.10 - 31.05 26.89 - 75.95 -26.81 - 33.75\n WEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 60.98 (10.31) 11.05 (12.46) 59.68 (9.59) 9.94 (12.84) 60.11 (8.76) 9.80 (12.59) \n Median 60.60 10.45 58.18 8.95 61.08 10.04 \n Min - Max 35.94 - 96.53 -14.02 - 45.01 40.44 - 84.70 -17.59 - 40.52 32.76 - 78.25 -26.57 - 39.56\n WEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 64.64 (9.88) 14.72 (11.99) 65.78 (10.17) 16.04 (13.80) 63.65 (10.50) 13.35 (13.39) \n Median 65.21 15.10 66.28 15.49 63.79 12.24 \n Min - Max 40.49 - 95.35 -16.76 - 43.40 42.16 - 92.32 -17.70 - 46.85 29.29 - 88.41 -22.40 - 39.94\n WEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 69.43 (11.12) 19.51 (13.83) 69.79 (11.46) 20.05 (14.38) 70.68 (10.23) 20.37 (12.99) \n Median 69.22 19.90 70.37 20.99 70.85 20.94 \n Min - Max 38.38 - 95.48 -17.34 - 49.18 45.79 - 93.33 -19.66 - 58.05 30.53 - 90.61 -14.01 - 60.23\n WEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 74.31 (12.44) 24.38 (14.75) 74.73 (12.96) 24.99 (14.67) 75.89 (13.54) 25.59 (17.18) \n Median 76.12 25.20 74.13 22.81 76.70 25.32 \n Min - Max 39.45 - 103.92 -7.53 - 56.23 38.19 - 109.61 -18.42 - 64.15 43.79 - 102.40 -16.11 - 67.78\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADQS <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADQS <- df_explicit_na(ADQS)\n})\ndatanames <- c(\"ADSL\", \"ADQS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADQS <- data[[\"ADQS\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Efficacy Data and Change from Baseline by Visit\",\n dataname = \"ADQS\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADQS, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"AVISIT\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADQS, c(\"AVAL\", \"CHG\")),\n selected = c(\"AVAL\", \"CHG\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADQS, \"PARAMCD\", \"PARAM\"),\n selected = \"BFIALL\"\n ),\n add_total = FALSE,\n parallel_vars = TRUE\n )\n ),\n filter = teal_slices(\n teal_slice(\"ADQS\", \"AVISIT\", selected = NULL),\n teal_slice(\"ADQS\", \"AVAL\", selected = NULL)\n )\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADQS-filter-ADQS_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:38:45 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "ECG", - "EGT03" + "Efficacy", + "CFBT01" ] }, { - "objectID": "tables/ADA/adat03.html", - "href": "tables/ADA/adat03.html", - "title": "ADAT03", + "objectID": "tables/efficacy/rspt01.html", + "href": "tables/efficacy/rspt01.html", + "title": "RSPT01", "section": "", - "text": "Data Setup\nStandard Table (μg/mL)\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\")\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadab <- df_explicit_na(adab)\nadpc <- df_explicit_na(adpc)\n\n# Adjust zzz parameter\nmax_conc <- 15\n\nadpc <- adpc %>% select(USUBJID, NFRLT, AVAL, AVALU, AVALCAT1)\n\nanl <- adab %>%\n filter(., PARAM == \"ADA interpreted per sample result\") %>%\n select(-AVAL, AVALC, AVALU)\n\nanl <- merge(anl, adpc, by = c(\"USUBJID\", \"NFRLT\")) %>%\n mutate(AVAL_LT = ifelse(AVAL <= max_conc, TRUE, FALSE))\n\n\n\n\n\nCode# parameters in columns\nadat03_stats <- c(\"n\", \"mean\", \"sd\", \"median\", \"min\", \"max\", \"cv\", \"geom_mean\", \"count_fraction\")\nadat03_lbls <- c(\n n = \"Total Number\\nof Measurable\\n Samples\",\n mean = \"Mean\",\n sd = \"SD\",\n median = \"Median\",\n min = \"Minimum\",\n max = \"Maximum\",\n cv = \"CV (%)\",\n geom_mean = \"Geometric Mean\",\n count_fraction = paste0(\"Samples with\\nConcentration\\n≤ \", max_conc, \"μg/mL\")\n)\nadat03_fmts <- c(\n n = \"xx.\",\n mean = format_sigfig(3),\n sd = format_sigfig(3),\n median = format_sigfig(3),\n min = format_sigfig(3),\n max = format_sigfig(3),\n cv = \"xx.x\",\n geom_mean = format_sigfig(3),\n count_fraction = format_count_fraction\n)\n\nafun_list <- lapply(\n 1:9,\n function(i) make_afun(s_summary, .stats = adat03_stats[i], .formats = adat03_fmts[i], .labels = \"Overall\")\n)\n\n# lyt creation\nlyt <- basic_table() %>%\n split_rows_by(\n var = \"ARM\",\n label_pos = \"topleft\",\n split_label = \"Treatment Group\",\n split_fun = drop_split_levels,\n section_div = \"\"\n ) %>%\n add_rowcounts() %>%\n split_rows_by(\n var = \"VISIT\",\n label_pos = \"topleft\",\n split_label = \"Visit\",\n split_fun = drop_split_levels,\n child_labels = \"hidden\"\n ) %>%\n analyze_vars_in_cols(\n vars = c(rep(\"AVAL\", 8), \"AVAL_LT\"),\n .stats = adat03_stats,\n .labels = adat03_lbls,\n .formats = adat03_fmts\n ) %>%\n analyze_colvars(\n afun_list,\n nested = FALSE,\n extra_args = list(\".labels\" = \"Overall\")\n )\n\nresult <- build_table(lyt, anl, alt_counts_df = adsl)\n\nmain_title(result) <- paste(\n \"Summary of Serum Concentrations (μg/mL) at Timepoints Where ADA Samples Were Collected and Analyzed\\n\n Protocol:\", unique(adab$PARCAT1)[1]\n)\nsubtitles(result) <- paste(\"Analyte:\", unique(adab$PARAMCD)[1])\nfnotes_at_path(result, rowpath = NULL, colpath = c(\"multivars\", \"AVAL\")) <- \"Refers to the total no. of measurable ADA samples that have a corresponding measurable drug concentration sample (i.e. results with valid numeric values and LTRs). LTR results on post-dose samples are replaced by aaa µg/mL i.e. half of MQC value.\" \nfnotes_at_path(result, rowpath = NULL, colpath = c(\"multivars\", \"AVAL_LT\")) <- \"In validation, the assay was able to detect yyy ng/mL of surrogate ADA in the presence of zzz µg/mL of [drug]. BLQ = Below Limit of Quantitation, LTR = Lower than Reportable, MQC = Minimum Quantifiable Concentration, ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies). RXXXXXXX is also known as [drug]\" \n\nresult\n\nSummary of Serum Concentrations (μg/mL) at Timepoints Where ADA Samples Were Collected and Analyzed\n\n Protocol: A: Drug X Antibody\nAnalyte: R1800000\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Total Number Samples with \nTreatment Group of Measurable Concentration\n Visit Samples {1} Mean SD Median Minimum Maximum CV (%) Geometric Mean ≤ 15μg/mL {2}\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X (N=536) \n Day 1 402 0 0 0 0 0 NA NA 402 (100%) \n Day 2 134 16.2 1.63 16.2 12.6 19.9 10.0 16.1 39 (29.1%) \n\nC: Combination (N=792) \n Day 1 528 0 0 0 0 0 NA NA 528 (100%) \n Day 2 264 24.7 8.65 22.5 12.6 39.5 35.0 23.2 28 (10.6%) \n\nOverall 1328 6.54 11.0 0 0 39.5 167.5 NA 997 (75.1%) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Refers to the total no. of measurable ADA samples that have a corresponding measurable drug concentration sample (i.e. results with valid numeric values and LTRs). LTR results on post-dose samples are replaced by aaa µg/mL i.e. half of MQC value.\n{2} - In validation, the assay was able to detect yyy ng/mL of surrogate ADA in the presence of zzz µg/mL of [drug]. BLQ = Below Limit of Quantitation, LTR = Lower than Reportable, MQC = Minimum Quantifiable Concentration, ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies). RXXXXXXX is also known as [drug]\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:40:55 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 withr_3.0.0 \n[33] Rdpack_2.6 digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 \n[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Selecting Sections to Display\nTable Modifying Analysis Details like Type of Confidence Interval, Alpha Level, Test Statistic\nTable with Stratified Analysis\nTable Modifying the Definition of Overall Response\nTable Defining New Sections to Display\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadrs <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadrs <- df_explicit_na(adrs)\n\nanl_adrs <- adrs %>%\n filter(PARAMCD == \"INVET\") %>%\n select(STUDYID, USUBJID, PARAMCD, AVISIT, AVALC)\nanl_adsl <- adsl %>%\n select(STUDYID, USUBJID, ARM, STRATA1)\n\n\nData pre-processing is done to label the analysis value (AVALC) so as to improve the readability of the output table. In addition, the response is binary defined (is_rsp, responder yes/no) depending on the analysis value. Finally, for comparison purposes, the reference arm is specified.\n\nCode# Pre-Processing\n\nanl <- anl_adsl %>%\n left_join(anl_adrs, by = c(\"STUDYID\", \"USUBJID\")) %>%\n mutate(rsp_lab = d_onco_rsp_label(AVALC)) %>%\n mutate(is_rsp = AVALC %in% c(\"CR\", \"PR\")) %>%\n mutate(ARM = relevel(ARM, ref = \"A: Drug X\")) %>%\n var_relabel(ARM = \"Description of Planned Arm\")\n\n\n\n\nThe tabulation layout is built in layers for the analysis of overall response and applied to the pre-processed dataset.\n\nCodelyt_01 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"is_rsp\",\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"is_rsp\",\n show_labels = \"visible\",\n var_labels = \"Unstratified Analysis\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n table_names = \"test_prop_diff\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n table_names = \"est_or\"\n ) %>%\n estimate_multinomial_response(var = \"rsp_lab\")\n\nresult <- build_table(lyt = lyt_01, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————\nResponders 100 (74.6%) 84 (62.7%) 81 (61.4%) \n95% CI (Wald, with correction) (66.9, 82.4) (54.1, 71.2) (52.7, 70.0) \nUnstratified Analysis \n Difference in Response rate (%) -11.9 -13.3 \n 95% CI (Wald, with correction) (-23.7, -0.2) (-25.1, -1.4) \n p-value (Chi-Squared Test) 0.0351 0.0204 \nOdds Ratio (95% CI) 0.57 (0.34 - 0.96) 0.54 (0.32 - 0.91)\nComplete Response (CR) 60 (44.8%) 47 (35.1%) 57 (43.2%) \n 95% CI (Wald, with correction) (35.98, 53.57) (26.62, 43.53) (34.35, 52.01) \nPartial Response (PR) 40 (29.9%) 37 (27.6%) 24 (18.2%) \n 95% CI (Wald, with correction) (21.73, 37.97) (19.67, 35.55) (11.22, 25.14) \nStable Disease (SD) 9 (6.7%) 22 (16.4%) 13 (9.8%) \n 95% CI (Wald, with correction) (2.11, 11.33) (9.77, 23.06) (4.39, 15.31) \nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 95% CI (Wald, with correction) (11.05, 24.78) (6.08, 17.80) (17.23, 32.77) \nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 95% CI (Wald, with correction) (0.00, 2.58) (3.75, 14.16) (0.15, 7.42) \n\n\n\n\nRemove (or add) rows of results by removing/adding the corresponding layers from the layout. For instance, the odds-ratio row is removed by simply removing the estimate_odds_ratio call:\n\nCodelyt_02 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"is_rsp\",\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"is_rsp\",\n show_labels = \"visible\",\n var_labels = \"Unstratified Analysis\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n table_names = \"test_prop\"\n ) %>%\n estimate_multinomial_response(var = \"rsp_lab\")\n\nresult <- build_table(lyt = lyt_02, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nResponders 100 (74.6%) 84 (62.7%) 81 (61.4%) \n95% CI (Wald, with correction) (66.9, 82.4) (54.1, 71.2) (52.7, 70.0) \nUnstratified Analysis \n Difference in Response rate (%) -11.9 -13.3 \n 95% CI (Wald, with correction) (-23.7, -0.2) (-25.1, -1.4) \n p-value (Chi-Squared Test) 0.0351 0.0204 \nComplete Response (CR) 60 (44.8%) 47 (35.1%) 57 (43.2%) \n 95% CI (Wald, with correction) (35.98, 53.57) (26.62, 43.53) (34.35, 52.01)\nPartial Response (PR) 40 (29.9%) 37 (27.6%) 24 (18.2%) \n 95% CI (Wald, with correction) (21.73, 37.97) (19.67, 35.55) (11.22, 25.14)\nStable Disease (SD) 9 (6.7%) 22 (16.4%) 13 (9.8%) \n 95% CI (Wald, with correction) (2.11, 11.33) (9.77, 23.06) (4.39, 15.31) \nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 95% CI (Wald, with correction) (11.05, 24.78) (6.08, 17.80) (17.23, 32.77)\nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 95% CI (Wald, with correction) (0.00, 2.58) (3.75, 14.16) (0.15, 7.42) \n\n\n\n\nThe confidence level is controlled by the conf_level parameter to the estimation functions. Similarly, the methods for tests and confidence interval can be modified (see ?estimate_proportion_diff).\n\nCodeconf_level <- 0.90\nlyt_03 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"is_rsp\",\n conf_level = conf_level,\n method = \"clopper-pearson\",\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"is_rsp\",\n show_labels = \"visible\",\n var_labels = \"Unstratified Analysis\",\n conf_level = conf_level,\n method = \"ha\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n method = \"fisher\",\n table_names = \"test_prop\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n conf_level = conf_level,\n table_names = \"est_or\"\n ) %>%\n estimate_multinomial_response(\n var = \"rsp_lab\",\n conf_level = conf_level,\n method = \"clopper-pearson\"\n )\n\nresult <- build_table(lyt = lyt_03, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————\nResponders 100 (74.6%) 84 (62.7%) 81 (61.4%) \n90% CI (Clopper-Pearson) (67.7, 80.7) (55.3, 69.7) (53.9, 68.5) \nUnstratified Analysis \n Difference in Response rate (%) -11.9 -13.3 \n 90% CI (Anderson-Hauck) (-21.6, -2.3) (-23.0, -3.5) \n p-value (Fisher's Exact Test) 0.0479 0.0253 \nOdds Ratio (90% CI) 0.57 (0.37 - 0.89) 0.54 (0.35 - 0.84)\nComplete Response (CR) 60 (44.8%) 47 (35.1%) 57 (43.2%) \n 90% CI (Clopper-Pearson) (37.48, 52.25) (28.22, 42.43) (35.88, 50.71) \nPartial Response (PR) 40 (29.9%) 37 (27.6%) 24 (18.2%) \n 90% CI (Clopper-Pearson) (23.36, 37.02) (21.31, 34.67) (12.87, 24.61) \nStable Disease (SD) 9 (6.7%) 22 (16.4%) 13 (9.8%) \n 90% CI (Clopper-Pearson) (3.55, 11.43) (11.38, 22.61) (5.92, 15.20) \nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 90% CI (Clopper-Pearson) (12.67, 24.25) (7.63, 17.57) (18.90, 31.97) \nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 90% CI (Clopper-Pearson) (0.04, 3.49) (5.25, 14.11) (1.50, 7.80) \n\n\n\n\nThe stratified analysis section can be added by defining the analyses needed with control_binary_comparison for the argument strat_analysis and identifying the stratification variables to use.\n\n\nCodestrata <- \"STRATA1\"\nlyt_04 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\", ref_group = \"A: Drug X\") %>%\n estimate_proportion(\n vars = \"is_rsp\",\n table_names = \"est_prop\"\n ) %>%\n estimate_proportion_diff(\n vars = \"is_rsp\",\n show_labels = \"visible\",\n var_labels = \"Unstratified Analysis\",\n table_names = \"est_prop_diff\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n table_names = \"test_prop\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n table_names = \"est_or\"\n ) %>%\n estimate_proportion_diff(\n vars = \"is_rsp\",\n show_labels = \"visible\",\n var_labels = \"Stratified Analysis\",\n method = \"cmh\",\n variables = list(strata = strata),\n table_names = \"est_prop_diff_strat\"\n ) %>%\n test_proportion_diff(\n vars = \"is_rsp\",\n method = \"cmh\",\n variables = list(strata = strata),\n table_names = \"test_prop_strat\"\n ) %>%\n estimate_odds_ratio(\n vars = \"is_rsp\",\n variables = list(strata = strata, arm = \"ARM\"),\n table_names = \"est_or_strat\"\n ) %>%\n estimate_multinomial_response(var = \"rsp_lab\")\n\nresult <- build_table(lyt = lyt_04, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nResponders 100 (74.6%) 84 (62.7%) 81 (61.4%) \n95% CI (Wald, with correction) (66.9, 82.4) (54.1, 71.2) (52.7, 70.0) \nUnstratified Analysis \n Difference in Response rate (%) -11.9 -13.3 \n 95% CI (Wald, with correction) (-23.7, -0.2) (-25.1, -1.4) \n p-value (Chi-Squared Test) 0.0351 0.0204 \nOdds Ratio (95% CI) 0.57 (0.34 - 0.96) 0.54 (0.32 - 0.91)\nStratified Analysis \n Difference in Response rate (%) -11.9 -13.5 \n 95% CI (CMH, without correction) (-22.7, -1.0) (-24.5, -2.5) \n p-value (Cochran-Mantel-Haenszel Test) 0.0366 0.0180 \nOdds Ratio (95% CI) 0.57 (0.34 - 0.96) 0.54 (0.32 - 0.90)\nComplete Response (CR) 60 (44.8%) 47 (35.1%) 57 (43.2%) \n 95% CI (Wald, with correction) (35.98, 53.57) (26.62, 43.53) (34.35, 52.01) \nPartial Response (PR) 40 (29.9%) 37 (27.6%) 24 (18.2%) \n 95% CI (Wald, with correction) (21.73, 37.97) (19.67, 35.55) (11.22, 25.14) \nStable Disease (SD) 9 (6.7%) 22 (16.4%) 13 (9.8%) \n 95% CI (Wald, with correction) (2.11, 11.33) (9.77, 23.06) (4.39, 15.31) \nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 95% CI (Wald, with correction) (11.05, 24.78) (6.08, 17.80) (17.23, 32.77) \nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 95% CI (Wald, with correction) (0.00, 2.58) (3.75, 14.16) (0.15, 7.42) \n\n\n\n\nThe definition of responders is realized during the pre-processing step. The layout does not need to be modified and can be reused.\n\nCodeanl <- anl_adsl %>%\n left_join(anl_adrs, by = c(\"STUDYID\", \"USUBJID\")) %>%\n mutate(rsp_lab = d_onco_rsp_label(AVALC)) %>%\n mutate(is_rsp = AVALC == \"CR\") %>%\n mutate(ARM = relevel(ARM, ref = \"A: Drug X\")) %>%\n var_relabel(ARM = \"Description of Planned Arm\")\n\nresult <- build_table(lyt = lyt_01, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————\nResponders 60 (44.8%) 47 (35.1%) 57 (43.2%) \n95% CI (Wald, with correction) (36.0, 53.6) (26.6, 43.5) (34.4, 52.0) \nUnstratified Analysis \n Difference in Response rate (%) -9.7 -1.6 \n 95% CI (Wald, with correction) (-22.1, 2.7) (-14.3, 11.1) \n p-value (Chi-Squared Test) 0.1049 0.7934 \nOdds Ratio (95% CI) 0.67 (0.41 - 1.09) 0.94 (0.58 - 1.52)\nComplete Response (CR) 60 (44.8%) 47 (35.1%) 57 (43.2%) \n 95% CI (Wald, with correction) (35.98, 53.57) (26.62, 43.53) (34.35, 52.01) \nPartial Response (PR) 40 (29.9%) 37 (27.6%) 24 (18.2%) \n 95% CI (Wald, with correction) (21.73, 37.97) (19.67, 35.55) (11.22, 25.14) \nStable Disease (SD) 9 (6.7%) 22 (16.4%) 13 (9.8%) \n 95% CI (Wald, with correction) (2.11, 11.33) (9.77, 23.06) (4.39, 15.31) \nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 95% CI (Wald, with correction) (11.05, 24.78) (6.08, 17.80) (17.23, 32.77) \nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 95% CI (Wald, with correction) (0.00, 2.58) (3.75, 14.16) (0.15, 7.42) \n\n\n\n\nSimilarly to in the previous tab, redefinition or relabeling of the result is a pre-processing step and the original table layout can be reused.\n\nCodeanl <- anl_adsl %>%\n left_join(anl_adrs, by = c(\"STUDYID\", \"USUBJID\")) %>%\n mutate(rsp_lab = as.character(d_onco_rsp_label(AVALC))) %>%\n mutate(\n rsp_lab = case_when(\n rsp_lab == \"Complete Response (CR)\" ~ \"No Progression\",\n rsp_lab == \"Partial Response (PR)\" ~ \"No Progression\",\n rsp_lab == \"Stable Disease (SD)\" ~ \"No Progression\",\n TRUE ~ rsp_lab\n )\n ) %>%\n mutate(is_rsp = rsp_lab %in% \"No Progression\") %>%\n mutate(ARM = relevel(ARM, ref = \"A: Drug X\")) %>%\n var_relabel(ARM = \"Description of Planned Arm\")\n\nresult <- build_table(lyt = lyt_01, df = anl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————\nResponders 109 (81.3%) 106 (79.1%) 94 (71.2%) \n95% CI (Wald, with correction) (74.4, 88.3) (71.8, 86.4) (63.1, 79.3) \nUnstratified Analysis \n Difference in Response rate (%) -2.2 -10.1 \n 95% CI (Wald, with correction) (-12.5, 8.0) (-21.0, 0.8) \n p-value (Chi-Squared Test) 0.6455 0.0520 \nOdds Ratio (95% CI) 0.87 (0.48 - 1.59) 0.57 (0.32 - 1.01)\nProgressive Disease (PD) 24 (17.9%) 16 (11.9%) 33 (25.0%) \n 95% CI (Wald, with correction) (11.05, 24.78) (6.08, 17.80) (17.23, 32.77) \nNo Progression 109 (81.3%) 106 (79.1%) 94 (71.2%) \n 95% CI (Wald, with correction) (74.37, 88.31) (71.85, 86.36) (63.11, 79.31) \nNot Evaluable (NE) 1 (0.7%) 12 (9.0%) 5 (3.8%) \n 95% CI (Wald, with correction) (0.00, 2.58) (3.75, 14.16) (0.15, 7.42) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADRS <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADRS <- df_explicit_na(ADRS)\n\n ADSL <- ADSL %>%\n mutate(Dum_ARM = factor(rep(\"Single ARM\", nrow(.))))\n ADRS <- ADRS %>%\n mutate(Dum_ARM = factor(rep(\"Single ARM\", nrow(.))))\n})\ndatanames <- c(\"ADSL\", \"ADRS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADRS <- data[[\"ADRS\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_binary_outcome(\n label = \"Responders\",\n dataname = \"ADRS\",\n paramcd = choices_selected(\n choices = value_choices(ADRS, \"PARAMCD\", \"PARAM\"),\n selected = \"BESRSPI\"\n ),\n arm_var = choices_selected(\n choices = variable_choices(ADRS, c(\"ARM\", \"ARMCD\", \"ACTARMCD\", \"Dum_ARM\")),\n selected = \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n strata_var = choices_selected(\n choices = variable_choices(ADRS, c(\"SEX\", \"BMRKR2\")),\n select = NULL\n ),\n rsp_table = TRUE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:39:16 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "ADA", - "ADAT03" + "Efficacy", + "RSPT01" ] }, { - "objectID": "tables/ADA/adat04a.html", - "href": "tables/ADA/adat04a.html", - "title": "ADAT04A", + "objectID": "tables/efficacy/coxt02.html", + "href": "tables/efficacy/coxt02.html", + "title": "COXT02", "section": "", - "text": "Data Setup\nSummary of Treatment Emergent NAbs\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\nlibrary(tibble)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\")\n\ncombodf <- tribble(\n ~valname, ~label, ~levelcombo, ~exargs,\n \"all_X\", \"All Drug X\", c(\"A: Drug X\", \"C: Combination\"), list(),\n \"all_pt\", \"All Patients\", c(\"A: Drug X\", \"B: Placebo\", \"C: Combination\"), list()\n)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\n# Baseline Pts\nadab_b <- df_explicit_na(adab) %>%\n filter(\n ABLFL == \"Y\",\n ADABLPFL == \"Y\",\n PARAM %in% c(\n \"ADA interpreted per sample result\",\n \"NAB interpreted per sample result\"\n )\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU) %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate(\n across(\n any_of(c(\n \"ADA interpreted per sample result\",\n \"NAB interpreted per sample result\"\n )),\n as.logical\n )\n ) %>%\n mutate(\n ADABLPFL = ADABLPFL == \"Y\",\n PADABLPFL = if (exists(\"ADA interpreted per sample result\", where = .)) {\n `ADA interpreted per sample result` == \"TRUE\"\n } else {\n FALSE\n },\n PNABBLFL = if (exists(\"NAB interpreted per sample result\", where = .)) {\n `NAB interpreted per sample result` == \"TRUE\"\n } else {\n FALSE\n },\n NNABBLFL = if (exists(\"NAB interpreted per sample result\", where = .)) {\n `NAB interpreted per sample result` == \"FALSE\"\n } else {\n FALSE\n }\n ) %>%\n var_relabel(\n ADABLPFL = \"Baseline evaluable patients for ADA\",\n PADABLPFL = \"Patients with a positive ADA sample at baseline\",\n PNABBLFL = \"Patients with a positive NAb sample at baseline\",\n NNABBLFL = \"Patient with no positive NAb samples at baseline\"\n )\n\n# Post Baseline Treatment Enhanced NAb positive Pts\nadab_pb <- df_explicit_na(adab) %>%\n filter(\n ABLFL != \"Y\",\n ADPBLPFL == \"Y\",\n PARAM %in% c(\n \"ADA interpreted per sample result\",\n \"Treatment Emergent - Positive, Neutralizing Antibody\",\n \"Treatment induced ADA, Neutralizing Antibody\",\n \"Treatment enhanced ADA, Neutralizing Antibody\",\n \"NAB interpreted per sample result\",\n \"Treatment unaffected, Neutralizing Antibody\"\n )\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU, -ARRLT, -NRRLT) %>%\n unique() %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n mutate(\n across(\n any_of(c(\n \"ADA interpreted per sample result\", \"NAB interpreted per sample result\",\n \"Treatment Emergent - Positive, Neutralizing Antibody\",\n \"Treatment induced ADA, Neutralizing Antibody\",\n \"Treatment enhanced ADA, Neutralizing Antibody\",\n \"Treatment unaffected, Neutralizing Antibody\"\n )),\n as.logical\n )\n ) %>%\n mutate(\n ADPBLPFL = ADPBLPFL == \"Y\",\n ADAPFL = if (exists(\"ADA interpreted per sample result\", where = .)) {\n `ADA interpreted per sample result` == \"TRUE\"\n } else {\n FALSE\n },\n TENABPFL = if (exists(\"Treatment Emergent - Positive, Neutralizing Antibody\", where = .)) {\n `Treatment Emergent - Positive, Neutralizing Antibody` == \"TRUE\"\n } else {\n FALSE\n },\n TINPBFL = if (exists(\"Treatment induced ADA, Neutralizing Antibody\", where = .)) {\n `Treatment induced ADA, Neutralizing Antibody` == \"TRUE\"\n } else {\n FALSE\n },\n TENPBFL = if (exists(\"Treatment enhanced ADA, Neutralizing Antibody\", where = .)) {\n `Treatment enhanced ADA, Neutralizing Antibody` == \"TRUE\"\n } else {\n FALSE\n },\n NABNFL = if (exists(\"NAB interpreted per sample result\", where = .)) {\n `NAB interpreted per sample result` == \"FALSE\"\n } else {\n FALSE\n },\n TUNPBFL = if (exists(\"Treatment unaffected, Neutralizing Antibody\", where = .)) {\n `Treatment unaffected, Neutralizing Antibody` == \"TRUE\"\n } else {\n FALSE\n }\n ) %>%\n var_relabel(\n ADPBLPFL = \"Post-baseline evaluable patients for ADA\",\n ADAPFL = \"Patients positive for ADA\",\n TENABPFL = \"Patients positive for Treatment Emergent NAb\",\n TINPBFL = \"Treatment-induced NAb\",\n TENPBFL = \"Treatment-enhanced NAb\",\n NABNFL = \"Patients negative for NAb\",\n TUNPBFL = \"Treatment unaffected\"\n )\n\n\n\n\n\n\nCode# Layout for Baseline Prevalence of NAbs\nlyt_bl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"ADABLPFL\", \"PADABLPFL\"),\n table_names = \"t1\",\n .stats = \"count\",\n var_labels = \"Baseline Prevalence of NAbs\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"PNABBLFL\",\n table_names = \"t2\",\n .indent_mods = 1L\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NNABBLFL\",\n .stats = \"count\",\n table_names = \"t3\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n )\n\n# Layout for incidence of NAbs\nlyt_pb <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_combo_levels(combodf)\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"ADPBLPFL\", \"ADAPFL\"),\n .stats = \"count\",\n var_labels = \"Incidence of Treatment Emergent NAbs\",\n show_labels = \"visible\",\n table_names = \"tb1\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"TENABPFL\",\n table_names = \"tb2\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = c(\"TINPBFL\", \"TENPBFL\"),\n .stats = \"count\",\n table_names = \"tb3\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"NABNFL\",\n table_names = \"tb4\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = \"TUNPBFL\",\n .stats = \"count\",\n table_names = \"tb5\",\n .indent_mods = 1L,\n show_labels = \"hidden\"\n )\n\nresult_1 <- build_table(lyt_bl, df = adab_b, alt_counts_df = adsl)\nresult_2 <- build_table(lyt_pb, df = adab_pb, alt_counts_df = adsl)\n\n# Combine tables\nresult <- rbind(result_1, result_2)\n\n# Change the column order\nresult <- cbind_rtables(result[, 1], result[, 3]) %>%\n cbind_rtables(result[, 4]) %>%\n cbind_rtables(result[, 2]) %>%\n cbind_rtables(result[, 5])\n\nmain_title(result) <- paste(\n \"Baseline Prevalence and Incidence of Treatment Emergent NAbs\"\n)\nsubtitles(result) <- paste(\"Protocol:\", unique(adab$PARCAT1)[1])\n\nmain_footer(result) <- \"NAb = Neutralizing Antibodies ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient for ADA = a patient with an ADA assay result from a baseline sample(s)\n Baseline evaluable patient for NAb = a patient with a NAb assay result from a baseline sample(s)\n Post-baseline evaluable patient for ADA = a patient with an ADA assay result from at least one post-baseline sample\n Post-baseline evaluable patient for NAb = a patient with a NAb assay result from at least one post-baseline sample\n Number of patients positive for ADA = the number of post-baseline evaluable patients for ADA determined to have Treatment Emergent ADA during the study period.\nNumber of patients positive for Treatment Emergent NAb = the number (and percentage) of post-baseline evaluable patients for ADA determined to have treatment-induced NAb or treatment-enhanced NAb during the study period.\nTreatment-induced = a patient with negative or missing baseline result(s) and at least one positive post-baseline result. Treatment-enhanced = a patient with positive result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\nNumber of patients negative for Treatment Emergent NAb = number of post-baseline evaluable patients with negative or missing baseline NAb result(s) and all negative post-baseline NAb results, or a patient who is NAb treatment unaffected.\nTreatment unaffected = A post-baseline evaluable patient with a positive result at baseline and (a) where all post-baseline titer results are less than 0.60 t.u. greater than the baseline titer result, OR (b) where all post-baseline results are negative or missing. For any positive sample with titer result less than the minimum reportable titer or any positive sample where a titer cannot be obtained, titer value is imputed as equal to the minimum reportable titer.\"\n\nresult\n\nBaseline Prevalence and Incidence of Treatment Emergent NAbs\nProtocol: A: Drug X Antibody\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X C: Combination <Missing> B: Placebo All Drug X\n (N=134) (N=132) (N=0) (N=134) (N=266) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nBaseline Prevalence of NAbs \n Baseline evaluable patients for ADA 134 132 0 0 266 \n Patients with a positive ADA sample at baseline 63 64 0 0 127 \nPatients with a positive NAb sample at baseline 0 0 0 0 0 \nPatient with no positive NAb samples at baseline 0 0 0 0 0 \nIncidence of Treatment Emergent NAbs \n Post-baseline evaluable patients for ADA 134 132 0 0 266 \n Patients positive for ADA 66 59 0 0 125 \nPatients positive for Treatment Emergent NAb 0 0 0 0 0 \nTreatment-induced NAb 0 0 0 0 0 \nTreatment-enhanced NAb 0 0 0 0 0 \nPatients negative for NAb 0 0 0 0 0 \nTreatment unaffected 0 0 0 0 0 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNAb = Neutralizing Antibodies ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient for ADA = a patient with an ADA assay result from a baseline sample(s)\n Baseline evaluable patient for NAb = a patient with a NAb assay result from a baseline sample(s)\n Post-baseline evaluable patient for ADA = a patient with an ADA assay result from at least one post-baseline sample\n Post-baseline evaluable patient for NAb = a patient with a NAb assay result from at least one post-baseline sample\n Number of patients positive for ADA = the number of post-baseline evaluable patients for ADA determined to have Treatment Emergent ADA during the study period.\nNumber of patients positive for Treatment Emergent NAb = the number (and percentage) of post-baseline evaluable patients for ADA determined to have treatment-induced NAb or treatment-enhanced NAb during the study period.\nTreatment-induced = a patient with negative or missing baseline result(s) and at least one positive post-baseline result. Treatment-enhanced = a patient with positive result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\nNumber of patients negative for Treatment Emergent NAb = number of post-baseline evaluable patients with negative or missing baseline NAb result(s) and all negative post-baseline NAb results, or a patient who is NAb treatment unaffected.\nTreatment unaffected = A post-baseline evaluable patient with a positive result at baseline and (a) where all post-baseline titer results are less than 0.60 t.u. greater than the baseline titer result, OR (b) where all post-baseline results are negative or missing. For any positive sample with titer result less than the minimum reportable titer or any positive sample where a titer cannot be obtained, titer value is imputed as equal to the minimum reportable titer.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:41:07 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tibble_3.2.1 scda_0.1.6.9017 dplyr_1.1.4 \n[4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[7] formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Analysis based on multivariable Cox models is usually not performed for the Clinical Study Report (CSR) or regulatory documents, serving exploratory purposes only (e.g. for publication). In practice, the model usually includes only the main effects (without interaction terms). It produces the estimates for each of the covariates included in the model. The analysis follows the same principles (i.e. stratified vs. unstratified analysis and tie handling) as the general Cox model analysis also used in COXT01. Since there is usually no pre-specified hypothesis testing for such analysis, the p-values must be interpreted with caution.\n\n\nData Setup\nMultivariable Cox Regression\nMultivariable Cox Regression with Interaction Term\nMultivariable Cox Regression Specifying Covariates\nMultivariable Cox Regression Specifying Covariates from ADSUB\nMultivariable Cox Regression Setting Strata, Ties, Alpha Level, Statistics\nMultivariable Cox Regression with Selection Process for Covariates\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\nlibrary(broom)\n\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadtte <- df_explicit_na(adtte)\n\nanl <- adtte %>%\n filter(\n PARAMCD == \"OS\",\n SEX %in% c(\"F\", \"M\"),\n RACE %in% c(\"ASIAN\", \"BLACK OR AFRICAN AMERICAN\", \"WHITE\")\n ) %>%\n mutate(\n ARM = droplevels(relevel(ARM, \"B: Placebo\")),\n SEX = droplevels(SEX),\n RACE = droplevels(RACE)\n ) %>%\n mutate(EVENT = 1 - CNSR) %>%\n var_relabel(\n ARM = \"Planned Arm\",\n SEX = \"Sex\",\n RACE = \"Race\",\n AGE = \"Age\"\n )\n\n\n\n\nThe summarize_coxreg function fits, tidies and arranges a Cox regression model in a table layout using the rtables framework. For a multivariable Cox regression model, argument multivar must be set to TRUE. Arguments variables and control can be specified to set up the model (see ?summarize_coxreg for more details and customization options). All variables specified within variables must be present in the data used when building the table.\nTo see the same model as a data.frame object, these two arguments (as well as the data) can be passed to the fit_coxreg_multivar function, and the resulting list tidied using broom::tidy().\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARM\",\n covariates = c(\"SEX\", \"AGE\")\n)\n\nlyt <- basic_table() %>%\n summarize_coxreg(variables = variables, multivar = TRUE) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\nEffect/Covariate Included in the Model Hazard Ratio 95% CI p-value\n——————————————————————————————————————————————————————————————————————————————\nTreatment: \n Planned Arm (reference = B: Placebo) 0.2643 \n A: Drug X 0.96 (0.66, 1.42) 0.8536 \n C: Combination 1.27 (0.88, 1.83) 0.2010 \nCovariate: \n Sex (reference = F) \n M 1.09 (0.80, 1.48) 0.5987 \n Age \n All 0.99 (0.97, 1.01) 0.5104 \n\n\n\n\nThe estimation of interaction terms is not supported.\nInteraction terms are not included in the GDSR. For this reason and because we must take precautions when fitting such models, this functionality has not been translated in fit_coxreg_multivar. Please remove interaction terms or, if required by the study, refer to the survival::coxph function. Aside from this, using tern the developer must add the necessary variables to the analysis dataset during pre-processing based on ADVS or ADSUB. An example can be found in DMT01.\n\n\nThis option is not supported.\nSee the Multivariable Cox Regression with Interaction Term tab for more details.\n\n\nThis option is not supported.\nSee the Multivariable Cox Regression with Interaction Term tab for more details.\n\n\nAdditional controls can be customized using control_coxreg (see ?control_coxreg) such as the ties calculation method and the confidence level. Stratification variables can be added via the strata element of the variables list.\n\nCodevariables <- list(\n time = \"AVAL\",\n event = \"EVENT\",\n arm = \"ARMCD\",\n covariates = c(\"SEX\", \"AGE\"),\n strata = \"RACE\"\n)\n\ncontrol <- control_coxreg(\n conf_level = 0.9,\n ties = \"efron\"\n)\n\nlyt <- basic_table() %>%\n summarize_coxreg(\n variables = variables,\n control = control,\n multivar = TRUE,\n .stats = c(\"hr\", \"ci\")\n ) %>%\n append_topleft(\"Effect/Covariate Included in the Model\")\n\nresult <- build_table(lyt = lyt, df = anl)\nresult\n\nEffect/Covariate Included in the Model Hazard Ratio 90% CI \n————————————————————————————————————————————————————————————————————\nTreatment: \n Planned Arm Code (reference = ARM A) \n ARM B 1.03 (0.74, 1.42)\n ARM C 1.30 (0.96, 1.77)\nCovariate: \n Sex (reference = F) \n M 1.08 (0.83, 1.40)\n Age \n All 0.99 (0.98, 1.01)\n\n\n\n\nSee the Multivariable Cox Regression with Interaction Term tab.\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADTTE <- data[[\"ADTTE\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_coxreg(\n label = \"Cox Reg.\",\n dataname = \"ADTTE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\", \"ACTARMCD\"), \"ARM\"),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADTTE, \"PARAMCD\", \"PARAM\"), \"OS\"\n ),\n strata_var = choices_selected(\n c(\"SEX\", \"STRATA1\", \"STRATA2\"), NULL\n ),\n cov_var = choices_selected(\n c(\"AGE\", \"SEX\", \"RACE\"), c(\"AGE\", \"SEX\")\n ),\n multivariate = TRUE\n )\n )\n)\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:39:55 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 broom_1.0.5 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 stringr_1.5.1 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 utf8_1.2.4 \n[19] promises_1.2.1 rmarkdown_2.26 ps_1.7.6 \n[22] purrr_1.0.2 xfun_0.42 shinyvalidate_0.1.3 \n[25] cachem_1.0.8 teal.reporter_0.3.1.9002 jsonlite_1.8.8 \n[28] later_1.3.2 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 car_3.1-2 brio_1.1.4 \n[34] jquerylib_0.1.4 estimability_1.5 Rcpp_1.0.12 \n[37] knitr_1.45 zoo_1.8-12 teal.logger_0.2.0.9001 \n[40] httpuv_1.6.14 Matrix_1.6-5 splines_4.3.3 \n[43] tidyselect_1.2.1 abind_1.4-5 yaml_2.3.8 \n[46] codetools_0.2-19 websocket_1.4.1 processx_3.8.4 \n[49] teal.widgets_0.4.2.9009 lattice_0.22-6 tibble_3.2.1 \n[52] withr_3.0.0 coda_0.19-4.1 evaluate_0.23 \n[55] survival_3.5-8 pillar_1.9.0 shinycssloaders_1.0.0 \n[58] carData_3.0-5 checkmate_2.3.1 shinyjs_2.1.0 \n[61] generics_0.1.3 chromote_0.2.0 ggplot2_3.5.0 \n[64] munsell_0.5.0 scales_1.3.0 xtable_1.8-4 \n[67] glue_1.7.0 emmeans_1.10.0 tools_4.3.3 \n[70] webshot2_0.1.1 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 geepack_1.3.10 \n[82] gtable_0.3.4 sass_0.4.9 digest_0.6.35 \n[85] TH.data_1.1-2 htmlwidgets_1.6.4 memoise_2.0.1 \n[88] htmltools_0.5.7 lifecycle_1.0.4 shinyWidgets_0.8.2 \n[91] mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "ADA", - "ADAT04A" + "Efficacy", + "COXT02" ] }, { - "objectID": "tables/disposition/dst01.html", - "href": "tables/disposition/dst01.html", - "title": "DST01", + "objectID": "tables/efficacy/aovt03.html", + "href": "tables/efficacy/aovt03.html", + "title": "AOVT03", "section": "", - "text": "Data Setup\nStandard Table\nTable with Grouping of Reasons\nTable Adding Optional Rows\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nset.seed(1, kind = \"Mersenne-Twister\")\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# reorder EOSSTT factor levels so DISCONTINUED is the last level\nadsl <- df_explicit_na(adsl) %>%\n mutate(EOSSTT = factor(EOSSTT, levels = c(\"COMPLETED\", \"ONGOING\", \"DISCONTINUED\")))\n\nadsl_gp_added <- adsl %>%\n mutate(DCSREASGP = case_when(\n DCSREAS %in% c(\"ADVERSE EVENT\", \"DEATH\") ~ \"Safety\",\n (DCSREAS != \"<Missing>\" & !DCSREAS %in% c(\"ADVERSE EVENT\", \"DEATH\")) ~ \"Non-Safety\",\n DCSREAS == \"<Missing>\" ~ \"<Missing>\"\n ) %>% factor(levels = c(\"Safety\", \"Non-Safety\", \"<Missing>\")))\n\nadsl_eotstt_added <- adsl_gp_added %>%\n mutate(\n EOTSTT = sample(\n c(\"ONGOING\", \"COMPLETED\", \"DISCONTINUED\"),\n size = nrow(adsl),\n replace = TRUE\n ) %>% factor(levels = c(\"COMPLETED\", \"ONGOING\", \"DISCONTINUED\"))\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_occurrences(\n \"EOSSTT\",\n show_labels = \"hidden\"\n ) %>%\n analyze_vars(\n \"DCSREAS\",\n .stats = \"count_fraction\",\n denom = \"N_col\",\n show_labels = \"hidden\",\n .indent_mods = c(count_fraction = 1L)\n )\n\nresult1 <- build_table(lyt = lyt, df = adsl)\nresult1\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————————————————————————————\nCOMPLETED 68 (50.7%) 66 (49.3%) 73 (55.3%) 207 (51.7%) \nONGOING 24 (17.9%) 28 (20.9%) 21 (15.9%) 73 (18.2%) \nDISCONTINUED 42 (31.3%) 40 (29.9%) 38 (28.8%) 120 (30.0%) \n ADVERSE EVENT 3 (2.2%) 6 (4.5%) 5 (3.8%) 14 (3.5%) \n DEATH 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \n LACK OF EFFICACY 2 (1.5%) 2 (1.5%) 3 (2.3%) 7 (1.8%) \n PHYSICIAN DECISION 2 (1.5%) 3 (2.2%) 2 (1.5%) 7 (1.8%) \n PROTOCOL VIOLATION 5 (3.7%) 3 (2.2%) 4 (3%) 12 (3%) \n WITHDRAWAL BY PARENT/GUARDIAN 4 (3%) 2 (1.5%) 1 (0.8%) 7 (1.8%) \n WITHDRAWAL BY SUBJECT 1 (0.7%) 1 (0.7%) 1 (0.8%) 3 (0.8%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_occurrences(\n \"EOSSTT\",\n show_labels = \"hidden\"\n ) %>%\n split_rows_by(\"DCSREASGP\", indent_mod = 1L) %>%\n analyze_vars(\n \"DCSREAS\",\n .stats = \"count_fraction\",\n denom = \"N_col\",\n show_labels = \"hidden\"\n )\n\ntbl <- build_table(lyt = lyt, df = adsl_gp_added)\nresult2 <- prune_table(tbl) # remove rows containing all zeros\n\nresult2\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————\nCOMPLETED 68 (50.7%) 66 (49.3%) 73 (55.3%) 207 (51.7%) \nONGOING 24 (17.9%) 28 (20.9%) 21 (15.9%) 73 (18.2%) \nDISCONTINUED 42 (31.3%) 40 (29.9%) 38 (28.8%) 120 (30.0%) \n Safety \n ADVERSE EVENT 3 (2.2%) 6 (4.5%) 5 (3.8%) 14 (3.5%) \n DEATH 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \n Non-Safety \n LACK OF EFFICACY 2 (1.5%) 2 (1.5%) 3 (2.3%) 7 (1.8%) \n PHYSICIAN DECISION 2 (1.5%) 3 (2.2%) 2 (1.5%) 7 (1.8%) \n PROTOCOL VIOLATION 5 (3.7%) 3 (2.2%) 4 (3%) 12 (3%) \n WITHDRAWAL BY PARENT/GUARDIAN 4 (3%) 2 (1.5%) 1 (0.8%) 7 (1.8%) \n WITHDRAWAL BY SUBJECT 1 (0.7%) 1 (0.7%) 1 (0.8%) 3 (0.8%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_occurrences(\n \"EOTSTT\",\n show_labels = \"hidden\"\n )\n\ntbl <- build_table(lyt = lyt, df = adsl_eotstt_added)\ntbl <- prune_table(tbl) # remove rows containing all zeros\n\n# Combine tables\ncol_info(result2) <- col_info(tbl)\nresult3 <- rbind(result2, tbl)\n\nresult3\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————\nCOMPLETED 68 (50.7%) 66 (49.3%) 73 (55.3%) 207 (51.7%) \nONGOING 24 (17.9%) 28 (20.9%) 21 (15.9%) 73 (18.2%) \nDISCONTINUED 42 (31.3%) 40 (29.9%) 38 (28.8%) 120 (30.0%) \n Safety \n ADVERSE EVENT 3 (2.2%) 6 (4.5%) 5 (3.8%) 14 (3.5%) \n DEATH 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \n Non-Safety \n LACK OF EFFICACY 2 (1.5%) 2 (1.5%) 3 (2.3%) 7 (1.8%) \n PHYSICIAN DECISION 2 (1.5%) 3 (2.2%) 2 (1.5%) 7 (1.8%) \n PROTOCOL VIOLATION 5 (3.7%) 3 (2.2%) 4 (3%) 12 (3%) \n WITHDRAWAL BY PARENT/GUARDIAN 4 (3%) 2 (1.5%) 1 (0.8%) 7 (1.8%) \n WITHDRAWAL BY SUBJECT 1 (0.7%) 1 (0.7%) 1 (0.8%) 3 (0.8%) \nCOMPLETED 46 (34.3%) 38 (28.4%) 41 (31.1%) 125 (31.2%) \nONGOING 50 (37.3%) 51 (38.1%) 46 (34.8%) 147 (36.8%) \nDISCONTINUED 38 (28.4%) 45 (33.6%) 45 (34.1%) 128 (32.0%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n set.seed(1, kind = \"Mersenne-Twister\")\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADSL <- df_explicit_na(ADSL)\n ADSL <- ADSL %>%\n mutate(\n DCSREASGP = case_when(\n DCSREAS %in% c(\"ADVERSE EVENT\", \"DEATH\") ~ \"Safety\",\n (DCSREAS != \"<Missing>\" & !DCSREAS %in% c(\"ADVERSE EVENT\", \"DEATH\")) ~ \"Non-Safety\",\n DCSREAS == \"<Missing>\" ~ \"<Missing>\"\n ) %>% as.factor(),\n EOTSTT = sample(\n c(\"ONGOING\", \"COMPLETED\", \"DISCONTINUED\"),\n size = nrow(ADSL),\n replace = TRUE\n ) %>% as.factor()\n ) %>%\n col_relabel(\n EOTSTT = \"End Of Treatment Status\"\n )\n\n date_vars_asl <- names(ADSL)[vapply(ADSL, function(x) inherits(x, c(\"Date\", \"POSIXct\", \"POSIXlt\")), logical(1))]\n demog_vars_asl <- names(ADSL)[!(names(ADSL) %in% c(\"USUBJID\", \"STUDYID\", date_vars_asl))]\n})\ndatanames <- \"ADSL\"\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\ndemog_vars_asl <- data[[\"demog_vars_asl\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary(\n label = \"Disposition Table\",\n dataname = \"ADSL\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n summarize_vars = choices_selected(\n variable_choices(ADSL, demog_vars_asl),\n c(\"EOSSTT\", \"DCSREAS\", \"EOTSTT\")\n ),\n useNA = \"ifany\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:41:27 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "This example will focus on data from multiple visits and take the interaction between visits and arms into consideration.\n\n\nData Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\nadqs_in <- adqs %>%\n filter(AVISIT %in% c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\", \"WEEK 5 DAY 36\")) %>%\n droplevels() %>%\n filter(PARAM %in% c(\"BFI All Questions\", \"Fatigue Interference\")) %>%\n mutate(CHG = ifelse(BMEASIFL == \"Y\", CHG, NA)) # only analyze evaluable population\n\n\n\n\n\nCoderesult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\", ref_group = \"ARM A\") %>%\n split_rows_by(\"PARAM\", split_fun = drop_split_levels) %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(arm = \"ARMCD\", covariates = c(\"BASE\", \"AVISIT\", \"AVISIT*ARMCD\")),\n conf_level = 0.95,\n var_labels = \"WEEK 1 DAY 8\",\n table_names = \"WEEK 1 DAY 8\",\n interaction_y = \"WEEK 1 DAY 8\",\n interaction_item = \"AVISIT\"\n ) %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(arm = \"ARMCD\", covariates = c(\"BASE\", \"AVISIT\", \"AVISIT*ARMCD\")),\n conf_level = 0.95,\n var_labels = \"WEEK 2 DAY 15\",\n table_names = \"WEEK 2 DAY 15\",\n interaction_y = \"WEEK 2 DAY 15\",\n interaction_item = \"AVISIT\"\n ) %>%\n summarize_ancova(\n vars = \"CHG\",\n variables = list(arm = \"ARMCD\", covariates = c(\"BASE\", \"AVISIT\", \"AVISIT*ARMCD\")),\n conf_level = 0.95,\n var_labels = \"WEEK 5 DAY 36\",\n table_names = \"WEEK 5 DAY 36\",\n interaction_y = \"WEEK 5 DAY 36\",\n interaction_item = \"AVISIT\"\n ) %>%\n build_table(adqs_in, alt_counts_df = adsl)\n\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————\nBFI All Questions \n WEEK 1 DAY 8 \n n 68 73 62 \n Adjusted Mean 4.34 5.96 3.90 \n Difference in Adjusted Means 1.62 -0.44 \n 95% CI (-1.75, 4.98) (-3.94, 3.06)\n p-value 0.3460 0.8059 \n WEEK 2 DAY 15 \n n 68 73 62 \n Adjusted Mean 12.99 11.23 9.86 \n Difference in Adjusted Means -1.76 -3.13 \n 95% CI (-5.12, 1.60) (-6.64, 0.37)\n p-value 0.3048 0.0795 \n WEEK 5 DAY 36 \n n 68 73 62 \n Adjusted Mean 23.88 23.08 28.21 \n Difference in Adjusted Means -0.81 4.33 \n 95% CI (-4.17, 2.56) (0.83, 7.83) \n p-value 0.6383 0.0155 \nFatigue Interference \n WEEK 1 DAY 8 \n n 68 73 62 \n Adjusted Mean 5.97 5.19 5.21 \n Difference in Adjusted Means -0.78 -0.76 \n 95% CI (-4.17, 2.61) (-4.30, 2.78)\n p-value 0.6522 0.6729 \n WEEK 2 DAY 15 \n n 68 73 62 \n Adjusted Mean 11.39 9.42 9.55 \n Difference in Adjusted Means -1.96 -1.84 \n 95% CI (-5.35, 1.43) (-5.37, 1.70)\n p-value 0.2560 0.3084 \n WEEK 5 DAY 36 \n n 68 73 62 \n Adjusted Mean 22.79 25.37 23.43 \n Difference in Adjusted Means 2.58 0.64 \n 95% CI (-0.81, 5.97) (-2.89, 4.18)\n p-value 0.1353 0.7212 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:40:22 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9018 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] sandwich_3.1-0 utf8_1.2.4 generics_0.1.3 tidyr_1.3.1 \n [5] stringi_1.8.3 lattice_0.22-6 digest_0.6.35 evaluate_0.23 \n [9] grid_4.3.3 estimability_1.5 mvtnorm_1.2-4 fastmap_1.1.1 \n[13] jsonlite_1.8.8 Matrix_1.6-5 backports_1.4.1 brio_1.1.4 \n[17] survival_3.5-8 multcomp_1.4-25 purrr_1.0.2 fansi_1.0.6 \n[21] scales_1.3.0 TH.data_1.1-2 codetools_0.2-19 Rdpack_2.6 \n[25] cli_3.6.2 rlang_1.1.3 rbibutils_2.2.16 munsell_0.5.0 \n[29] splines_4.3.3 yaml_2.3.8 tools_4.3.3 checkmate_2.3.1 \n[33] coda_0.19-4.1 colorspace_2.1-0 ggplot2_3.5.0 broom_1.0.5 \n[37] vctrs_0.6.5 R6_2.5.1 zoo_1.8-12 lifecycle_1.0.4 \n[41] emmeans_1.10.0 htmlwidgets_1.6.4 MASS_7.3-60.0.1 pkgconfig_2.0.3 \n[45] pillar_1.9.0 gtable_0.3.4 glue_1.7.0 xfun_0.42 \n[49] tibble_3.2.1 tidyselect_1.2.1 knitr_1.45 xtable_1.8-4 \n[53] htmltools_0.5.7 rmarkdown_2.26 testthat_3.2.1 compiler_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Disposition", - "DST01" + "Efficacy", + "AOVT03" ] }, { - "objectID": "tables/disposition/pdt01.html", - "href": "tables/disposition/pdt01.html", - "title": "PDT01", + "objectID": "tables/efficacy/lgrt02.html", + "href": "tables/efficacy/lgrt02.html", + "title": "LGRT02", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\naddv <- synthetic_cdisc_dataset(\"latest\", \"addv\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\naddv <- df_explicit_na(addv)\n\naddv <- addv %>%\n var_relabel(\n DVDECOD = \"Category\",\n DVTERM = \"Description\"\n )\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one major protocol deviation\",\n nonunique = \"Total number of major protocol deviations\"\n )\n ) %>%\n split_rows_by(\n \"DVDECOD\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(addv$DVDECOD)\n ) %>%\n count_occurrences(vars = \"DVTERM\") %>%\n append_varlabels(addv, \"DVTERM\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = addv, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(path = c(\"DVDECOD\", \"*\", \"DVTERM\"), scorefun = score_occurrences)\n\nresult\n\nCategory A: Drug X B: Placebo C: Combination\n Description (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one major protocol deviation 28 (20.9%) 22 (16.4%) 18 (13.6%) \nTotal number of major protocol deviations 49 35 35 \nEXCLUSION CRITERIA \n Active or untreated or other excluded cns metastases 2 (1.5%) 4 (3.0%) 1 (0.8%) \n Pregnancy criteria 3 (2.2%) 3 (2.2%) 1 (0.8%) \n History of other malignancies within the last 5 years 3 (2.2%) 1 (0.7%) 1 (0.8%) \n Uncontrolled concurrent condition 2 (1.5%) 0 3 (2.3%) \n Other exclusion criteria 1 (0.7%) 0 2 (1.5%) \n Received prior prohibited therapy or medication 2 (1.5%) 1 (0.7%) 0 \nINCLUSION CRITERIA \n No signed ICF at study entry 5 (3.7%) 0 6 (4.5%) \n Ineligible cancer type or current cancer stage 3 (2.2%) 2 (1.5%) 4 (3.0%) \n Inclusion lab values outside allowed limits 4 (3.0%) 1 (0.7%) 0 \n Does not meet prior therapy requirements 2 (1.5%) 1 (0.7%) 1 (0.8%) \n Inclusion-related test not done/out of window 1 (0.7%) 1 (0.7%) 0 \nMEDICATION \n Discontinued study drug for unspecified reason 3 (2.2%) 2 (1.5%) 1 (0.8%) \n Significant deviation from planned dose 3 (2.2%) 1 (0.7%) 2 (1.5%) \n Received incorrect study medication 0 3 (2.2%) 1 (0.8%) \n Received prohibited concomitant medication 1 (0.7%) 2 (1.5%) 1 (0.8%) \n Dose missed or significantly out of window 2 (1.5%) 0 1 (0.8%) \nPROCEDURAL \n Eligibility-related test not done/out of window 2 (1.5%) 4 (3.0%) 3 (2.3%) \n Omission of screening tumor assessment 4 (3.0%) 1 (0.7%) 3 (2.3%) \n Missed assessment affecting safety/study outcomes 2 (1.5%) 3 (2.2%) 1 (0.8%) \n Failure to sign updated ICF within two visits 2 (1.5%) 1 (0.7%) 1 (0.8%) \n Missed 2 or more efficacy assessments 1 (0.7%) 2 (1.5%) 0 \n Omission of complete lab panel required by protocol 0 0 1 (0.8%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADDV <- synthetic_cdisc_dataset(\"latest\", \"addv\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADDV <- df_explicit_na(ADDV)\n})\ndatanames <- c(\"ADSL\", \"ADDV\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADDV <- data[[\"ADDV\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Major Protocol Deviations Table\",\n dataname = \"ADDV\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADDV, c(\"DVTERM\")),\n selected = c(\"DVTERM\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADDV, c(\"DVDECOD\")),\n selected = \"DVDECOD\"\n ),\n add_total = TRUE,\n event_type = \"major protocol deviation\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:41:46 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nMulti-Variable Logistic Regression\nMulti-Variable Logistic Regression with Interaction Term\nMulti-Variable Logistic Regression Specifying Covariates\nMulti-Variable Logistic Regression Setting an Event, Alpha Level, and Level for Interaction\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadrs <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadrs <- df_explicit_na(adrs)\n\nadsl <- adsl %>%\n dplyr::filter(SEX %in% c(\"F\", \"M\"))\n\nadrs <- adrs %>%\n dplyr::filter(PARAMCD == \"BESRSPI\") %>%\n dplyr::mutate(\n Response = case_when(AVALC %in% c(\"PR\", \"CR\") ~ 1, TRUE ~ 0),\n SEX = factor(SEX, c(\"M\", \"F\")),\n RACE = factor(\n RACE,\n levels = c(\n \"AMERICAN INDIAN OR ALASKA NATIVE\", \"ASIAN\", \"BLACK OR AFRICAN AMERICAN\",\n \"WHITE\", \"MULTIPLE\", \"NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER\"\n )\n )\n ) %>%\n var_relabel(Response = \"Response\", SEX = \"Sex\", RACE = \"Race\")\n\n\n\n\n\nCodemodel <- fit_logistic(\n adrs,\n variables = list(response = \"Response\", arm = \"ARMCD\", covariates = c(\"SEX\", \"AGE\"))\n)\nconf_level <- 0.95\ndf <- broom::tidy(model, conf_level = conf_level)\n\n# empty string flag\ndf <- df_explicit_na(df, na_level = \"_NA_\")\n\nresult <- basic_table() %>%\n summarize_logistic(\n conf_level = conf_level,\n drop_and_remove_str = \"_NA_\"\n ) %>%\n append_topleft(\"Logistic regression\") %>%\n build_table(df = df)\nresult\n\nLogistic regression Degrees of Freedom Parameter Estimate Standard Error Odds Ratio Wald 95% CI p-value\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nPlanned Arm Code 2 0.0408 \n Reference ARM A, n = 134 \n ARM B, n = 134 1 -2.094 1.080 0.12 (0.01, 1.02) 0.0524 \n ARM C, n = 132 1 -0.074 1.423 0.93 (0.06, 15.09) 0.9584 \nSex \n Reference M, n = 169 \n F, n = 231 1 0.331 0.695 1.39 (0.36, 5.44) 0.6339 \nAge \n Age 1 0.070 0.054 1.07 (0.97, 1.19) 0.1945 \n\n\n\n\n\nCodemodel <- fit_logistic(\n adrs,\n variables = list(\n response = \"Response\",\n arm = \"ARMCD\",\n covariates = c(\"SEX\", \"AGE\"),\n interaction = \"SEX\"\n )\n)\nconf_level <- 0.95\ndf <- broom::tidy(model, conf_level = conf_level)\n\n# empty string flag\ndf <- df_explicit_na(df, na_level = \"_NA_\")\n\nresult <- basic_table() %>%\n summarize_logistic(\n conf_level = conf_level,\n drop_and_remove_str = \"_NA_\"\n ) %>%\n append_topleft(\"Logistic regression with interaction\") %>%\n build_table(df = df)\nresult\n\nLogistic regression with interaction Degrees of Freedom Parameter Estimate Standard Error Odds Ratio Wald 95% CI p-value\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAge \n Age 1 0.067 0.054 1.07 (0.96, 1.19) 0.2084 \nPlanned Arm Code 2 0.4882 \n Reference ARM A, n = 134 \n ARM B, n = 134 1 -17.850 2362.767 0.9940 \n Sex \n F 0.23 (0.02, 2.11) \n M 0.00 (0.00, >999.99) \n ARM C, n = 132 1 -16.442 2362.767 0.9944 \n Sex \n F >999.99 (0.00, >999.99) \n M 0.00 (0.00, >999.99) \nSex \n Reference M, n = 169 \n F, n = 231 1 -16.044 2362.767 0.9946 \n Planned Arm Code \n ARM A 0.00 (0.00, >999.99) \n ARM B 1.39 (0.29, 6.59) \n ARM C >999.99 (0.00, >999.99) \nInteraction of Planned Arm Code * Sex 2 0.9999 \n Reference ARM A or M, n = 248 \n ARM B * F, n = 82 1 16.373 2362.767 0.9945 \n ARM C * F, n = 70 1 32.492 3156.732 0.9918 \n\n\n\n\n\nCodemodel <- fit_logistic(\n adrs,\n variables = list(\n response = \"Response\",\n arm = \"ARMCD\",\n covariates = c(\"SEX\", \"AGE\", \"RACE\")\n )\n)\nconf_level <- 0.95\ndf <- broom::tidy(model, conf_level = conf_level)\n\n# empty string flag\ndf <- df_explicit_na(df, na_level = \"_NA_\")\n\nresult <- basic_table() %>%\n summarize_logistic(\n conf_level = conf_level,\n drop_and_remove_str = \"_NA_\"\n ) %>%\n append_topleft(\"y ~ ARM + SEX + AGE + RACE\") %>%\n build_table(df = df)\nresult\n\ny ~ ARM + SEX + AGE + RACE Degrees of Freedom Parameter Estimate Standard Error Odds Ratio Wald 95% CI p-value\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nPlanned Arm Code 2 0.0346 \n Reference ARM A, n = 134 \n ARM B, n = 134 1 -2.162 1.084 0.12 (0.01, 0.96) 0.0461 \n ARM C, n = 132 1 -0.090 1.426 0.91 (0.06, 14.97) 0.9499 \nSex \n Reference M, n = 169 \n F, n = 231 1 0.364 0.701 1.44 (0.36, 5.69) 0.6032 \nAge \n Age 1 0.071 0.053 1.07 (0.97, 1.19) 0.1866 \nRace 5 0.9685 \n Reference AMERICAN INDIAN OR ALASKA NATIVE, n = 25 \n ASIAN, n = 208 1 -16.246 2017.122 0.00 (0.00, >999.99) 0.9936 \n BLACK OR AFRICAN AMERICAN, n = 91 1 -15.205 2017.122 0.00 (0.00, >999.99) 0.9940 \n WHITE, n = 74 1 -15.955 2017.122 0.00 (0.00, >999.99) 0.9937 \n MULTIPLE, n = 1 1 -0.363 10941.553 0.70 (0.00, >999.99) 1.0000 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER, n = 1 1 1.036 10941.553 2.82 (0.00, >999.99) 0.9999 \n\n\n\n\n\nCodemodel <- fit_logistic(\n adrs,\n variables = list(\n response = \"Response\",\n arm = \"ARMCD\",\n covariates = c(\"SEX\", \"AGE\"),\n interaction = \"AGE\"\n ),\n response_definition = \"1 - response\"\n)\nconf_level <- 0.9\ndf <- broom::tidy(model, conf_level = conf_level, at = c(30, 50))\n\n# empty string flag\ndf <- df_explicit_na(df, na_level = \"_NA_\")\n\nresult <- basic_table() %>%\n summarize_logistic(\n conf_level = conf_level,\n drop_and_remove_str = \"_NA_\"\n ) %>%\n append_topleft(\"Estimations at age 30 and 50\") %>%\n build_table(df = df)\nresult\n\nEstimations at age 30 and 50 Degrees of Freedom Parameter Estimate Standard Error Odds Ratio Wald 90% CI p-value\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nSex \n Reference M, n = 169 \n F, n = 231 1 -0.381 0.710 0.68 (0.21, 2.20) 0.5915 \nPlanned Arm Code 2 0.2768 \n Reference ARM A, n = 134 \n ARM B, n = 134 1 -20.020 13.714 0.1443 \n Age \n 30 234.91 (0.30, >999.99) \n 50 >999.99 (0.04, >999.99) \n ARM C, n = 132 1 -15.622 14.810 0.2915 \n Age \n 30 31.95 (0.03, >999.99) \n 50 >999.99 (<0.01, >999.99) \nAge \n Age 1 -0.877 0.581 0.1309 \n Planned Arm Code \n ARM A 0.42 (0.16, 1.08) \n ARM B 0.97 (0.89, 1.06) \n ARM C 0.79 (0.55, 1.11) \nInteraction of Planned Arm Code * Age 2 0.2213 \n Reference ARM A, n = 134 \n ARM B, n = 134 1 0.849 0.583 0.1449 \n ARM C, n = 132 1 0.636 0.618 0.3034 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADRS <- synthetic_cdisc_dataset(\"latest\", \"adrs\") %>%\n filter(PARAMCD %in% c(\"BESRSPI\", \"INVET\"))\n})\ndatanames <- c(\"ADSL\", \"ADRS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADRS <- data[[\"ADRS\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_logistic(\n label = \"Logistic Regression\",\n dataname = \"ADRS\",\n arm_var = choices_selected(\n choices = variable_choices(ADRS, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n choices = value_choices(ADRS, \"PARAMCD\", \"PARAM\"),\n selected = \"BESRSPI\"\n ),\n cov_var = choices_selected(\n choices = c(\"SEX\", \"AGE\", \"BMRKR1\", \"BMRKR2\"),\n selected = \"SEX\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:40:57 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] processx_3.8.4 survival_3.5-8 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 abind_1.4-5 \n[25] multcomp_1.4-25 withr_3.0.0 purrr_1.0.2 \n[28] shinyWidgets_0.8.2 geepack_1.3.10 grid_4.3.3 \n[31] fansi_1.0.6 teal.logger_0.2.0.9001 xtable_1.8-4 \n[34] colorspace_2.1-0 ggplot2_3.5.0 emmeans_1.10.0 \n[37] scales_1.3.0 MASS_7.3-60.0.1 cli_3.6.2 \n[40] mvtnorm_1.2-4 rmarkdown_2.26 generics_0.1.3 \n[43] cachem_1.0.8 chromote_0.2.0 splines_4.3.3 \n[46] formatR_1.14 vctrs_0.6.5 webshot_0.5.5 \n[49] Matrix_1.6-5 sandwich_3.1-0 jsonlite_1.8.8 \n[52] carData_3.0-5 callr_3.7.5 car_3.1-2 \n[55] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[58] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[61] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[64] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[67] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[70] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[73] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[76] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[79] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[82] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[85] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[88] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[91] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Disposition", - "PDT01" + "Efficacy", + "LGRT02" ] }, { - "objectID": "tables/adverse-events/aet05_all.html", - "href": "tables/adverse-events/aet05_all.html", - "title": "AET05_ALL", + "objectID": "tables/medical-history/mht01.html", + "href": "tables/medical-history/mht01.html", + "title": "MHT01", "section": "", - "text": "Data Setup\nStandard Table\nTable Setting Type of Confidence Interval\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadaette <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadaette <- df_explicit_na(adaette)\n\n# Create analysis dataset anl from the 2 parameters AEREPTTE & AETOT1\nanl_events <- adaette %>%\n filter(PARAMCD == \"AETOT1\") %>%\n select(USUBJID, ARM, ARMCD, n_events = AVAL) %>%\n mutate(n_events = as.integer(n_events))\n\nanl_tte <- adaette %>%\n filter(PARAMCD == \"AEREPTTE\") %>%\n select(USUBJID, ARM, ARMCD, AVAL)\n\nanl <- full_join(anl_tte, anl_events, by = c(\"USUBJID\", \"ARM\", \"ARMCD\"))\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n estimate_incidence_rate(\n vars = \"AVAL\",\n n_events = \"n_events\",\n control = control_incidence_rate(num_pt_year = 100)\n )\n\nresult <- build_table(lyt, anl, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————\nTotal patient-years at risk 337.9 331.8 341.6 \nNumber of adverse events observed 343 380 397 \nAE rate per 100 patient-years 101.51 114.51 116.22 \n95% CI (90.77, 112.25) (103.00, 126.02) (104.79, 127.65)\n\n\n\n\nThe type of confidence interval can be specified through the conf_type argument.\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n estimate_incidence_rate(\n vars = \"AVAL\",\n n_events = \"n_events\",\n control = control_incidence_rate(conf_type = \"exact\", num_pt_year = 100)\n )\n\nresult <- build_table(lyt, anl, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination \n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————\nTotal patient-years at risk 337.9 331.8 341.6 \nNumber of adverse events observed 343 380 397 \nAE rate per 100 patient-years 101.51 114.51 116.22 \n95% CI (91.05, 112.84) (103.28, 126.62) (105.07, 128.24)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAETTE <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAETTE <- df_explicit_na(ADAETTE)\n\n # Create analysis dataset anl from the 2 parameters AEREPTTE & AETOT1\n anl_events <- ADAETTE %>%\n filter(PARAMCD %in% c(\"AETOT1\", \"AETOT2\", \"AETOT3\")) %>%\n select(USUBJID, STUDYID, PARAMCD, ARM, ARMCD, n_events = AVAL) %>%\n mutate(n_events = as.integer(n_events))\n\n anl_tte <- ADAETTE %>%\n filter(PARAMCD == \"AEREPTTE\") %>%\n select(USUBJID, STUDYID, ARM, ARMCD, AVAL, AVALU)\n\n ADAETTE <- full_join(anl_tte, anl_events, by = c(\"USUBJID\", \"STUDYID\", \"ARM\", \"ARMCD\"))\n})\ndatanames <- c(\"ADSL\", \"ADAETTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAETTE <- data[[\"ADAETTE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_patyear(\n label = \"AE Rate Adjusted for Patient-Years at Risk - All Occurrences Table\",\n dataname = \"ADAETTE\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARMCD\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADAETTE, \"PARAMCD\"),\n selected = \"AETOT1\"\n ),\n events_var = choices_selected(\n choices = variable_choices(ADAETTE, \"n_events\"),\n selected = \"n_events\",\n fixed = TRUE\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:42:16 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable of History Prior to Study\nTable with Total Number of Conditions Suppressed\nTable with Total Number of Conditions Per Body System After The Summary of Patients\nTable Showing Additional “All Patients” Column\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadmh <- synthetic_cdisc_dataset(\"latest\", \"admh\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadmh <- df_explicit_na(admh)\n\nadsl_f <- adsl %>%\n filter(SAFFL == \"Y\") %>%\n select(USUBJID, ACTARM)\n\nadmh_f <- admh %>%\n filter(SAFFL == \"Y\" & MHBODSYS != \"\" & MHDECOD != \"\") %>%\n var_relabel(\n MHBODSYS = \"MedDRA System Organ Class\",\n MHDECOD = \"MedDRA Preferred Term\"\n )\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\"Total number of patients with at least one condition\", \"Total number of conditions\")\n ) %>%\n split_rows_by(\n var = \"MHBODSYS\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(admh_f$MHBODSYS)\n ) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\"Total number of patients with at least one condition\", \"Total number of conditions\"),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(vars = \"MHDECOD\") %>%\n append_varlabels(admh_f, \"MHDECOD\", indent = 1L)\n\nresult <- build_table(lyt, admh_f, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one condition 122 (91.0%) 123 (91.8%) 120 (90.9%) \nTotal number of conditions 609 622 703 \ncl A \n Total number of patients with at least one condition 78 (58.2%) 75 (56.0%) 89 (67.4%) \n Total number of conditions 132 130 160 \n trm A_1/2 50 (37.3%) 45 (33.6%) 63 (47.7%) \n trm A_2/2 48 (35.8%) 48 (35.8%) 50 (37.9%) \ncl B \n Total number of patients with at least one condition 96 (71.6%) 89 (66.4%) 97 (73.5%) \n Total number of conditions 185 198 205 \n trm B_1/3 47 (35.1%) 49 (36.6%) 43 (32.6%) \n trm B_2/3 49 (36.6%) 44 (32.8%) 52 (39.4%) \n trm B_3/3 48 (35.8%) 54 (40.3%) 51 (38.6%) \ncl C \n Total number of patients with at least one condition 67 (50.0%) 75 (56.0%) 79 (59.8%) \n Total number of conditions 103 116 129 \n trm C_1/2 43 (32.1%) 46 (34.3%) 43 (32.6%) \n trm C_2/2 35 (26.1%) 48 (35.8%) 55 (41.7%) \ncl D \n Total number of patients with at least one condition 96 (71.6%) 90 (67.2%) 98 (74.2%) \n Total number of conditions 189 178 209 \n trm D_1/3 50 (37.3%) 42 (31.3%) 51 (38.6%) \n trm D_2/3 48 (35.8%) 42 (31.3%) 50 (37.9%) \n trm D_3/3 47 (35.1%) 58 (43.3%) 57 (43.2%) \n\n\n\n\n\nCodeadmh_f_prior <- admh_f %>%\n filter(ASTDY <= 0)\n\nresult <- build_table(lyt, admh_f_prior, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one condition 0 0 1 (0.8%) \nTotal number of conditions 0 0 1 \ncl D \n Total number of patients with at least one condition 0 0 1 (0.8%) \n Total number of conditions 0 0 1 \n trm D_2/3 0 0 1 (0.8%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\"Total number of patients with at least one condition\")\n ) %>%\n split_rows_by(\n var = \"MHBODSYS\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(admh_f$MHBODSYS)\n ) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\"Total number of patients with at least one condition\"),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(vars = \"MHDECOD\") %>%\n append_varlabels(admh_f, \"MHDECOD\", indent = 1L)\n\nresult <- build_table(lyt, admh_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one condition 122 (91.0%) 123 (91.8%) 120 (90.9%) \ncl A \n Total number of patients with at least one condition 78 (58.2%) 75 (56.0%) 89 (67.4%) \n trm A_1/2 50 (37.3%) 45 (33.6%) 63 (47.7%) \n trm A_2/2 48 (35.8%) 48 (35.8%) 50 (37.9%) \ncl B \n Total number of patients with at least one condition 96 (71.6%) 89 (66.4%) 97 (73.5%) \n trm B_1/3 47 (35.1%) 49 (36.6%) 43 (32.6%) \n trm B_2/3 49 (36.6%) 44 (32.8%) 52 (39.4%) \n trm B_3/3 48 (35.8%) 54 (40.3%) 51 (38.6%) \ncl C \n Total number of patients with at least one condition 67 (50.0%) 75 (56.0%) 79 (59.8%) \n trm C_1/2 43 (32.1%) 46 (34.3%) 43 (32.6%) \n trm C_2/2 35 (26.1%) 48 (35.8%) 55 (41.7%) \ncl D \n Total number of patients with at least one condition 96 (71.6%) 90 (67.2%) 98 (74.2%) \n trm D_1/3 50 (37.3%) 42 (31.3%) 51 (38.6%) \n trm D_2/3 48 (35.8%) 42 (31.3%) 50 (37.9%) \n trm D_3/3 47 (35.1%) 58 (43.3%) 57 (43.2%) \n\n\n\n\nNot currently supported by rtables. Users, please notify us if this variation is important to you.\n\n\nConditions are further sorted by decreasing high level terms and low level terms.\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n add_overall_col(\"All Patients\") %>%\n analyze_num_patients(\n \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(unique = \"Total number of patients with at least one event\", nonunique = \"Total number of conditions\")\n ) %>%\n split_rows_by(\n var = \"MHBODSYS\",\n split_fun = split_fun,\n child_labels = \"visible\",\n label_pos = \"topleft\",\n split_label = obj_label(admh_f$MHBODSYS)\n ) %>%\n summarize_num_patients(\n \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(unique = \"Total number of patients with at least one event\", nonunique = \"Total number of conditions\")\n ) %>%\n count_occurrences(vars = \"MHDECOD\", .indent_mods = -1L) %>%\n append_varlabels(admh_f, \"MHDECOD\", indent = 1L)\n\nscorefun_hlt <- cont_n_allcols\nscorefun_llt <- score_occurrences_cols(col_indices = nlevels(adsl_f$ACTARM) + 1)\n\nresult <- build_table(lyt, admh_f, alt_counts_df = adsl_f) %>%\n prune_table() %>%\n sort_at_path(path = c(\"MHBODSYS\"), scorefun = scorefun_hlt) %>%\n sort_at_path(path = c(\"MHBODSYS\", \"*\", \"MHDECOD\"), scorefun = scorefun_llt)\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination All Patients\n MedDRA Preferred Term (N=134) (N=134) (N=132) (N=400) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one event 122 (91.0%) 123 (91.8%) 120 (90.9%) 365 (91.2%) \nTotal number of conditions 609 622 703 1934 \ncl D \n Total number of patients with at least one event 96 (71.6%) 90 (67.2%) 98 (74.2%) 284 (71.0%) \n Total number of conditions 189 178 209 576 \n trm D_3/3 47 (35.1%) 58 (43.3%) 57 (43.2%) 162 (40.5%) \n trm D_1/3 50 (37.3%) 42 (31.3%) 51 (38.6%) 143 (35.8%) \n trm D_2/3 48 (35.8%) 42 (31.3%) 50 (37.9%) 140 (35.0%) \ncl B \n Total number of patients with at least one event 96 (71.6%) 89 (66.4%) 97 (73.5%) 282 (70.5%) \n Total number of conditions 185 198 205 588 \n trm B_3/3 48 (35.8%) 54 (40.3%) 51 (38.6%) 153 (38.2%) \n trm B_2/3 49 (36.6%) 44 (32.8%) 52 (39.4%) 145 (36.2%) \n trm B_1/3 47 (35.1%) 49 (36.6%) 43 (32.6%) 139 (34.8%) \ncl A \n Total number of patients with at least one event 78 (58.2%) 75 (56.0%) 89 (67.4%) 242 (60.5%) \n Total number of conditions 132 130 160 422 \n trm A_1/2 50 (37.3%) 45 (33.6%) 63 (47.7%) 158 (39.5%) \n trm A_2/2 48 (35.8%) 48 (35.8%) 50 (37.9%) 146 (36.5%) \ncl C \n Total number of patients with at least one event 67 (50.0%) 75 (56.0%) 79 (59.8%) 221 (55.2%) \n Total number of conditions 103 116 129 348 \n trm C_2/2 35 (26.1%) 48 (35.8%) 55 (41.7%) 138 (34.5%) \n trm C_1/2 43 (32.1%) 46 (34.3%) 43 (32.6%) 132 (33.0%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>%\n filter(SAFFL == \"Y\")\n ADMH <- synthetic_cdisc_dataset(\"latest\", \"admh\") %>%\n filter(SAFFL == \"Y\" & MHBODSYS != \"\" & MHDECOD != \"\")\n})\ndatanames <- c(\"ADSL\", \"ADMH\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADMH <- data[[\"ADMH\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Medical History Table\",\n dataname = \"ADMH\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADMH, c(\"MHTERM\", \"MHDECOD\")),\n selected = c(\"MHDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADMH, c(\"MHBODSYS\", \"MHSOC\")),\n selected = \"MHBODSYS\"\n ),\n add_total = TRUE,\n event_type = \"condition\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:41:20 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Adverse Events", - "AET05_ALL" + "Medical History", + "MHT01" ] }, { - "objectID": "tables/adverse-events/aet06_smq.html", - "href": "tables/adverse-events/aet06_smq.html", - "title": "AET06_SMQ", + "objectID": "tables/adverse-events/aet05.html", + "href": "tables/adverse-events/aet05.html", + "title": "AET05", "section": "", - "text": "Data Setup\nAdverse Events by Sex, by SMQ and Preferred Term\nAdverse Events by Sex, by SMQ and Preferred Term (with Customized Queries)\nAdverse Events by Other Baseline Characteristics (e.g. Age Group)\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\nlibrary(stringr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nadsl_labels <- var_labels(adsl)\nadae_labels <- var_labels(adae)\n\nadsl <- adsl %>%\n mutate(\n AGE65 = case_when(\n AGE >= 65 ~ \">= 65\",\n TRUE ~ \"< 65\"\n ),\n AGE65 = factor(\n AGE65,\n levels = c(\"< 65\", \">= 65\")\n )\n )\n\nadae <- adae %>%\n mutate(\n AGE65 = case_when(\n AGE >= 65 ~ \">= 65\",\n TRUE ~ \"< 65\"\n ),\n AGE65 = factor(\n AGE65,\n levels = c(\"< 65\", \">= 65\")\n )\n )\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing\n# levels. For details, refer to Teal and Study Data article.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\n# Simulate a random AAG dataset.\naag <- data.frame(\n NAMVAR = c(\"SMQ01NAM\", \"SMQ01NAM\", \"SMQ02NAM\", \"CQ01NAM\", \"CQ01NAM\"),\n SRCVAR = rep(\"AEDECOD\", 5),\n GRPTYPE = c(\"SMQ\", \"SMQ\", \"SMQ\", \"CUSTOM\", \"CUSTOM\"),\n REFID = c(1, 1, 2, 3, 3),\n REFNAME = c(rep(\"C.1.1.1.3/B.2.2.3.1 AESI\", 2), \"non observed SMQ02NAM level\", rep(\"D.2.1.5.3/A.1.1.1.1 AESI\", 2)),\n SCOPE = c(\"BROAD\", \"BROAD\", \"BROAD\", \"\", \"\"),\n REFTERM = c(\"C.1.1.1.3\", \"B.2.2.3.1\", \"Z.9.9.9.9\", \"D.2.1.5.3\", \"A.1.1.1.1\"),\n stringsAsFactors = FALSE\n)\n\n# Create summary AAG dataset (used for labelling).\n# Note it's important to incorporate SCOPE into the basket names for SMQs so as to\n# match the flags present in ADAE.\naag_summary <- aag %>%\n select(NAMVAR, REFNAME, SCOPE) %>%\n unique() %>%\n mutate(\n REFNAME_SCOPE = ifelse(SCOPE == \"\", REFNAME, paste0(REFNAME, \"(\", SCOPE, \")\"))\n ) %>%\n rename(basket = NAMVAR, basket_name = REFNAME_SCOPE) %>%\n select(basket, basket_name)\n\n# Make a summary of the full ADAE based on AAG by using h_stack_by_baskets helper function\nadae_smq_all <- h_stack_by_baskets(\n df = adae,\n aag_summary = aag_summary,\n keys = c(\"STUDYID\", \"USUBJID\", \"ACTARMCD\", \"AEDECOD\", \"SEX\", \"AGE65\")\n)\n# Post-process adae_smq_all to keep only certain baskets of interest for variant 1\n# Not need to drop baskets for variant 2 as all baskets will be considered.\nbaskets_to_drop_variant <- aag_summary$basket_name[!aag_summary$basket %in% c(\"SMQ01NAM\")]\n\n# Adjust the analysis dataset based on basket subset for variant 1.\nadae_smq_1 <- adae_smq_all %>%\n filter(!adae_smq_all$SMQ %in% baskets_to_drop_variant) %>%\n mutate(\n SMQ = tern::fct_discard(SMQ, discard = baskets_to_drop_variant)\n )\n\n\n\n\n\nCodecriteria_fun <- function(tr) !is(tr, \"ContentRow\") && all_zero_or_na(tr)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_cols_by(\"SEX\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(unique = \"Total number of patients with at least one adverse event\")\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", drop = FALSE) %>%\n append_varlabels(adae_smq_1, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae_smq_1,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = cont_n_allcols) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\n ARM A ARM B ARM C \nStandardized MedDRA Query F M F M F M \n Dictionary-Derived Term (N=79) (N=55) (N=82) (N=52) (N=70) (N=62) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 47 (59.5%) 25 (45.5%) 51 (62.2%) 28 (53.8%) 42 (60.0%) 33 (53.2%)\nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 47 (59.5%) 25 (45.5%) 51 (62.2%) 28 (53.8%) 42 (60.0%) 33 (53.2%)\n Total number of events 79 40 95 44 81 60 \n dcd B.2.2.3.1 30 (38.0%) 18 (32.7%) 32 (39.0%) 22 (42.3%) 26 (37.1%) 25 (40.3%)\n dcd C.1.1.1.3 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\n\n\n\n\n\nCodecriteria_fun <- function(tr) {\n !is(tr, \"ContentRow\") && all_zero_or_na(tr) && !grepl(\"Total number of\", obj_label(tr))\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_cols_by(\"SEX\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(unique = \"Total number of patients with at least one adverse event\")\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n ),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(vars = \"AEDECOD\", drop = FALSE) %>%\n append_varlabels(adae_smq_all, \"AEDECOD\", indent = 1L)\n\nscore_ae_pts <- function(tt) {\n count_vals <- cell_values(tree_children(tt)[[\"USUBJID\"]])[[1]]\n sum(matrix(unlist(count_vals), nrow = length(count_vals), byrow = TRUE)[, 1])\n}\n\nresult <- build_table(\n lyt = lyt,\n df = adae_smq_all,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = score_ae_pts) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\n ARM A ARM B ARM C \nStandardized MedDRA Query F M F M F M \n Dictionary-Derived Term (N=79) (N=55) (N=82) (N=52) (N=70) (N=62) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 59 (74.7%) 36 (65.5%) 68 (82.9%) 35 (67.3%) 61 (87.1%) 47 (75.8%)\nD.2.1.5.3/A.1.1.1.1 AESI \n Total number of patients with at least one adverse event 45 (57.0%) 29 (52.7%) 54 (65.9%) 26 (50.0%) 50 (71.4%) 37 (59.7%)\n Total number of events 78 48 91 43 88 74 \n dcd D.2.1.5.3 26 (32.9%) 21 (38.2%) 40 (48.8%) 18 (34.6%) 34 (48.6%) 23 (37.1%)\n dcd A.1.1.1.1 34 (43.0%) 16 (29.1%) 31 (37.8%) 14 (26.9%) 33 (47.1%) 30 (48.4%)\nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 47 (59.5%) 25 (45.5%) 51 (62.2%) 28 (53.8%) 42 (60.0%) 33 (53.2%)\n Total number of events 79 40 95 44 81 60 \n dcd B.2.2.3.1 30 (38.0%) 18 (32.7%) 32 (39.0%) 22 (42.3%) 26 (37.1%) 25 (40.3%)\n dcd C.1.1.1.3 30 (38.0%) 13 (23.6%) 36 (43.9%) 10 (19.2%) 27 (38.6%) 16 (25.8%)\nnon observed SMQ02NAM level(BROAD) \n Total number of patients with at least one adverse event 0 0 0 0 0 0 \n Total number of events 0 0 0 0 0 0 \n\n\n\n\n\nCodecriteria_fun <- function(tr) !is(tr, \"ContentRow\") && all_zero_or_na(tr)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_cols_by(\"AGE65\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(unique = \"Total number of patients with at least one adverse event\")\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", drop = FALSE) %>%\n append_varlabels(adae_smq_1, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adae_smq_1,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = cont_n_allcols) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\n ARM A ARM B ARM C \nStandardized MedDRA Query < 65 >= 65 < 65 >= 65 < 65 >= 65\n Dictionary-Derived Term (N=134) (N=0) (N=134) (N=0) (N=131) (N=1)\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 72 (53.7%) 0 79 (59.0%) 0 75 (57.3%) 0 \nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 72 (53.7%) 0 79 (59.0%) 0 75 (57.3%) 0 \n Total number of events 119 0 139 0 141 0 \n dcd B.2.2.3.1 48 (35.8%) 0 54 (40.3%) 0 51 (38.9%) 0 \n dcd C.1.1.1.3 43 (32.1%) 0 46 (34.3%) 0 43 (32.8%) 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>%\n mutate(\n AGE65 = case_when(\n AGE >= 65 ~ \">= 65\",\n TRUE ~ \"< 65\"\n ),\n AGE65 = factor(\n AGE65,\n levels = c(\"< 65\", \">= 65\")\n )\n )\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\") %>%\n mutate(\n AGE65 = case_when(\n AGE >= 65 ~ \">= 65\",\n TRUE ~ \"< 65\"\n ),\n AGE65 = factor(\n AGE65,\n levels = c(\"< 65\", \">= 65\")\n )\n )\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAE <- data[[\"ADAE\"]]\n\nnames_baskets <- grep(\"^(SMQ|CQ).*NAM$\", names(ADAE), value = TRUE)\nnames_scopes <- grep(\"^SMQ.*SC$\", names(ADAE), value = TRUE)\n\ncs_baskets <- choices_selected(\n choices = variable_choices(ADAE, subset = names_baskets),\n selected = names_baskets\n)\ncs_scopes <- choices_selected(\n choices = variable_choices(ADAE, subset = names_scopes),\n selected = names_scopes,\n fixed = TRUE\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_smq(\n label = \"Adverse events by `SMQ` Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"SEX\", \"AGE65\")),\n selected = c(\"ARM\", \"SEX\")\n ),\n add_total = FALSE,\n baskets = cs_baskets,\n scopes = cs_scopes,\n llt = choices_selected(\n choices = variable_choices(ADAE, subset = c(\"AEDECOD\")),\n selected = \"AEDECOD\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:42:55 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 stringr_1.5.1 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Setting Type of Confidence Interval\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadaette <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadaette <- df_explicit_na(adaette)\n\nanl <- adaette %>%\n dplyr::filter(PARAM == \"Time to first occurrence of any adverse event\") %>%\n dplyr::mutate(is_event = CNSR == 0) %>%\n dplyr::mutate(n_events = as.integer(is_event))\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n estimate_incidence_rate(\n vars = \"AVAL\",\n n_events = \"n_events\",\n control = control_incidence_rate(num_pt_year = 100)\n )\n\nresult <- build_table(lyt, anl, alt_counts_df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nTotal patient-years at risk 162.4 103.9 172.6 \nNumber of adverse events observed 78 104 67 \nAE rate per 100 patient-years 48.03 100.14 38.82 \n95% CI (37.37, 58.69) (80.89, 119.38) (29.53, 48.12)\n\n\n\n\nThe type of confidence interval can be specified through the conf_type argument.\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n estimate_incidence_rate(\n vars = \"AVAL\",\n n_events = \"n_events\",\n control = control_incidence_rate(\n conf_level = 0.95,\n conf_type = \"exact\",\n num_pt_year = 100\n )\n )\n\nresult <- build_table(lyt, anl, alt_counts_df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\nTotal patient-years at risk 162.4 103.9 172.6 \nNumber of adverse events observed 78 104 67 \nAE rate per 100 patient-years 48.03 100.14 38.82 \n95% CI (37.97, 59.94) (81.82, 121.34) (30.09, 49.30)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAETTE <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAETTE <- df_explicit_na(ADAETTE)\n\n ADAETTE <- ADAETTE %>%\n filter(PARAMCD %in% c(\"AETTE1\", \"AETTE2\", \"AETTE3\")) %>%\n mutate(is_event = CNSR == 0) %>%\n mutate(n_events = as.integer(is_event))\n})\ndatanames <- c(\"ADSL\", \"ADAETTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAETTE <- data[[\"ADAETTE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_patyear(\n label = \"AE rate adjusted for patient-years at risk Table\",\n dataname = \"ADAETTE\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARMCD\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADAETTE, \"PARAMCD\", \"PARAM\"),\n selected = \"AETTE1\"\n ),\n events_var = choices_selected(\n choices = variable_choices(ADAETTE, \"n_events\"),\n selected = \"n_events\",\n fixed = TRUE\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:41:54 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 scda_0.1.6.9017 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", - "AET06_SMQ" + "AET05" ] }, { @@ -1259,7 +1271,7 @@ "href": "tables/adverse-events/aet04.html", "title": "AET04", "section": "", - "text": "Data Setup\nStandard Table\nTable with Fill-In of Treatment Groups\nTable with Fill-In of Grades\nTable with Collapsing of Grades\nTable Using Worst Grade Flags from ADAE\nTable with an Incidence Rate \\(\\geq\\) 40%, Totals Restricted\nTable with an Incidence Rate \\(\\geq\\) X%, Totals Unrestricted\nTable with an Incidence Rate \\(\\geq\\) 58 Patients\nTable with a Difference in Incidence Rate \\(\\geq\\) 10%\nTable with an Incidence Rate \\(\\geq\\) 5%, SOCs < 5% Removed\nTable with an Incidence Rate \\(\\geq\\) 40%, All SOCs w/o Preferred Terms Removed\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl) %>% filter(TRT01A != \"<Missing>\")\nadae <- df_explicit_na(adae) %>%\n var_relabel(\n AEBODSYS = \"MedDRA System Organ Class\",\n AEDECOD = \"MedDRA Preferred Term\"\n ) %>%\n filter(\n ANL01FL == \"Y\",\n AETOXGR != \"<Missing>\"\n )\n\n# Pre-Processing\ngrade_groups <- list(\n \"Grade 1-2\" = c(\"1\", \"2\"),\n \"Grade 3-4\" = c(\"3\", \"4\"),\n \"Grade 5\" = \"5\"\n)\nadae$TOTAL_VAR <- \"- Any adverse events - \"\n\n# Helper function to avoid filtering also the first part of the table, where general information is given.\nmy_row_condition <- function(row_fnc_condition) {\n function(table_row) {\n if (indent_mod(table_row) == 0) {\n return(TRUE)\n } else {\n row_fnc_condition(table_row)\n }\n }\n}\n\n# Helper function to calculate sum from first nested row\nscore_all_sum <- function(tt) {\n cleaf <- collect_leaves(tt)[[1]]\n if (NROW(cleaf) == 0) {\n stop(\"score_all_sum score function used at subtable [\", obj_name(tt), \"] that has no content.\")\n }\n sum(sapply(row_values(cleaf), function(cv) cv[1]))\n}\n\n# Raw table used by variant 8/10\nraw_table <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\") %>%\n build_table(adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\")\n\nresult <- lyt %>%\n build_table(adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodeadae2 <- adae %>% filter(ACTARM == \"A: Drug X\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\")\n\nresult <- lyt %>%\n build_table(adae2, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 0 0 \n Grade 1-2 10 (7.5%) 0 0 \n 1 5 (3.7%) 0 0 \n 2 5 (3.7%) 0 0 \n Grade 3-4 26 (19.4%) 0 0 \n 3 13 (9.7%) 0 0 \n 4 13 (9.7%) 0 0 \n Grade 5 64 (47.8%) 0 0 \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 0 0 \n Grade 1-2 68 (50.7%) 0 0 \n 1 27 (20.1%) 0 0 \n 2 41 (30.6%) 0 0 \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 0 0 \n Grade 1-2 45 (33.6%) 0 0 \n 1 45 (33.6%) 0 0 \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 0 0 \n Grade 1-2 41 (30.6%) 0 0 \n 2 41 (30.6%) 0 0 \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 0 0 \n Grade 3-4 22 (16.4%) 0 0 \n 3 22 (16.4%) 0 0 \n Grade 5 42 (31.3%) 0 0 \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 0 0 \n Grade 5 42 (31.3%) 0 0 \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 0 0 \n Grade 3-4 38 (28.4%) 0 0 \n 3 38 (28.4%) 0 0 \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 0 0 \n Grade 1-2 23 (17.2%) 0 0 \n 1 23 (17.2%) 0 0 \n Grade 3-4 39 (29.1%) 0 0 \n 3 39 (29.1%) 0 0 \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 0 0 \n Grade 3-4 39 (29.1%) 0 0 \n 3 39 (29.1%) 0 0 \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 0 0 \n Grade 1-2 38 (28.4%) 0 0 \n 1 38 (28.4%) 0 0 \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 0 0 \n Grade 5 38 (28.4%) 0 0 \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 0 0 \n Grade 5 38 (28.4%) 0 0 \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 0 0 \n Grade 1-2 37 (27.6%) 0 0 \n 1 37 (27.6%) 0 0 \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 0 0 \n Grade 1-2 37 (27.6%) 0 0 \n 1 37 (27.6%) 0 0 \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 0 0 \n Grade 3-4 36 (26.9%) 0 0 \n 4 36 (26.9%) 0 0 \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 0 0 \n Grade 3-4 36 (26.9%) 0 0 \n 4 36 (26.9%) 0 0 \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 0 0 \n Grade 1-2 28 (20.9%) 0 0 \n 2 28 (20.9%) 0 0 \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 0 0 \n Grade 1-2 28 (20.9%) 0 0 \n 2 28 (20.9%) 0 0 \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\")\n\nresult <- lyt %>%\n build_table(adae, alt_counts_df = adsl) %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 1 0 0 0 \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 2 0 0 0 \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 4 0 0 0 \n Grade 5 0 0 0 \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 4 0 0 0 \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 4 0 0 0 \n Grade 5 0 0 0 \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 1 0 0 0 \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 1 0 0 0 \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 3 0 0 0 \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 5 0 0 0 \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 3 0 0 0 \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 5 0 0 0 \n\n\n\n\n\nCodegrade_groups_1 <- list(\n \"Grade 1-2\" = c(\"1\", \"2\"),\n \"Grade 3-5\" = c(\"3\", \"4\", \"5\")\n)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups_1,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups_1,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\")\n\nresult <- lyt %>%\n build_table(adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-5 90 (67.2%) 83 (61.9%) 93 (70.5%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-5 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-5 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-5 64 (47.8%) 54 (40.3%) 68 (51.5%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 3-5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-5 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 3-5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 3-5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-5 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-5 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCode# No Worst Grade Flags found in the ADAE data set.\n\n\n\n\n\nCode# Simple wrapper to return subset ADAE to a threshold of xx%.\nget_adae_trimmed <- function(adsl, adae, cutoff_rate) {\n n_per_arm <- adsl %>%\n dplyr::count(ACTARM)\n\n anl_terms <- adae %>%\n dplyr::group_by(ACTARM, AEBODSYS, AEDECOD) %>%\n dplyr::count(\n unique_terms = n_distinct(USUBJID)\n ) %>%\n dplyr::select(-n) %>%\n dplyr::ungroup()\n\n anl_terms <- dplyr::left_join(\n anl_terms,\n n_per_arm,\n by = \"ACTARM\"\n ) %>%\n dplyr::mutate(\n ae_rate = unique_terms / n\n ) %>%\n dplyr::filter(ae_rate >= cutoff_rate) %>%\n dplyr::select(AEDECOD) %>%\n unique()\n\n anl <- dplyr::left_join(\n anl_terms,\n adae,\n by = \"AEDECOD\"\n )\n anl\n}\n\nadae6 <- get_adae_trimmed(adsl, adae, cutoff_rate = 0.4)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\")\n\nresult <- lyt %>%\n build_table(adae6, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCode# Variant 7 was not created.\n# With this variant, the SOC level is not trimmed (even if there are no terms left).\n\n\n\n\n\nCodecutoff <- 58L\nrow_condition <- has_count_in_any_col(atleast = cutoff, col_names = levels(adsl$ACTARM))\n\nresult <- prune_table(raw_table, keep_content_rows(my_row_condition(row_condition)))\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodecutoff <- 0.1\nrow_condition <- has_fractions_difference(atleast = cutoff, col_names = levels(adsl$ACTARM))\n\nresult <- prune_table(raw_table, keep_content_rows(my_row_condition(row_condition)))\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCode# Variant 10 was not done\n# With this variant, SOC levels above the threshold are still in the table even if\n# there are no terms left.\n\n\n\n\n\nCodecutoff <- 0.4\nrow_condition <- has_fraction_in_any_col(atleast = cutoff, col_names = levels(adsl$ACTARM))\n\nresult <- prune_table(raw_table, keep_content_rows(my_row_condition(row_condition)))\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_by_grade(\n label = \"Adverse Events by Grade Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = \"AEBODSYS\"\n ),\n grade = choices_selected(\n choices = variable_choices(ADAE, c(\"AETOXGR\", \"AESEV\")),\n selected = \"AETOXGR\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:43:37 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable with Fill-In of Treatment Groups\nTable with Fill-In of Grades\nTable with Collapsing of Grades\nTable Using Worst Grade Flags from ADAE\nTable with an Incidence Rate \\(\\geq\\) 40%, Totals Restricted\nTable with an Incidence Rate \\(\\geq\\) X%, Totals Unrestricted\nTable with an Incidence Rate \\(\\geq\\) 58 Patients\nTable with a Difference in Incidence Rate \\(\\geq\\) 10%\nTable with an Incidence Rate \\(\\geq\\) 5%, SOCs < 5% Removed\nTable with an Incidence Rate \\(\\geq\\) 40%, All SOCs w/o Preferred Terms Removed\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl) %>% filter(TRT01A != \"<Missing>\")\nadae <- df_explicit_na(adae) %>%\n var_relabel(\n AEBODSYS = \"MedDRA System Organ Class\",\n AEDECOD = \"MedDRA Preferred Term\"\n ) %>%\n filter(\n ANL01FL == \"Y\",\n AETOXGR != \"<Missing>\"\n )\n\n# Pre-Processing\ngrade_groups <- list(\n \"Grade 1-2\" = c(\"1\", \"2\"),\n \"Grade 3-4\" = c(\"3\", \"4\"),\n \"Grade 5\" = \"5\"\n)\nadae$TOTAL_VAR <- \"- Any adverse events - \"\n\n# Helper function to avoid filtering also the first part of the table, where general information is given.\nmy_row_condition <- function(row_fnc_condition) {\n function(table_row) {\n if (indent_mod(table_row) == 0) {\n return(TRUE)\n } else {\n row_fnc_condition(table_row)\n }\n }\n}\n\n# Helper function to calculate sum from first nested row\nscore_all_sum <- function(tt) {\n cleaf <- collect_leaves(tt)[[1]]\n if (NROW(cleaf) == 0) {\n stop(\"score_all_sum score function used at subtable [\", obj_name(tt), \"] that has no content.\")\n }\n sum(sapply(row_values(cleaf), function(cv) cv[1]))\n}\n\n# Raw table used by variant 8/10\nraw_table <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\") %>%\n build_table(adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\")\n\nresult <- lyt %>%\n build_table(adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodeadae2 <- adae %>% filter(ACTARM == \"A: Drug X\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\")\n\nresult <- lyt %>%\n build_table(adae2, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 0 0 \n Grade 1-2 10 (7.5%) 0 0 \n 1 5 (3.7%) 0 0 \n 2 5 (3.7%) 0 0 \n Grade 3-4 26 (19.4%) 0 0 \n 3 13 (9.7%) 0 0 \n 4 13 (9.7%) 0 0 \n Grade 5 64 (47.8%) 0 0 \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 0 0 \n Grade 1-2 68 (50.7%) 0 0 \n 1 27 (20.1%) 0 0 \n 2 41 (30.6%) 0 0 \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 0 0 \n Grade 1-2 45 (33.6%) 0 0 \n 1 45 (33.6%) 0 0 \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 0 0 \n Grade 1-2 41 (30.6%) 0 0 \n 2 41 (30.6%) 0 0 \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 0 0 \n Grade 3-4 22 (16.4%) 0 0 \n 3 22 (16.4%) 0 0 \n Grade 5 42 (31.3%) 0 0 \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 0 0 \n Grade 5 42 (31.3%) 0 0 \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 0 0 \n Grade 3-4 38 (28.4%) 0 0 \n 3 38 (28.4%) 0 0 \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 0 0 \n Grade 1-2 23 (17.2%) 0 0 \n 1 23 (17.2%) 0 0 \n Grade 3-4 39 (29.1%) 0 0 \n 3 39 (29.1%) 0 0 \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 0 0 \n Grade 3-4 39 (29.1%) 0 0 \n 3 39 (29.1%) 0 0 \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 0 0 \n Grade 1-2 38 (28.4%) 0 0 \n 1 38 (28.4%) 0 0 \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 0 0 \n Grade 5 38 (28.4%) 0 0 \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 0 0 \n Grade 5 38 (28.4%) 0 0 \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 0 0 \n Grade 1-2 37 (27.6%) 0 0 \n 1 37 (27.6%) 0 0 \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 0 0 \n Grade 1-2 37 (27.6%) 0 0 \n 1 37 (27.6%) 0 0 \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 0 0 \n Grade 3-4 36 (26.9%) 0 0 \n 4 36 (26.9%) 0 0 \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 0 0 \n Grade 3-4 36 (26.9%) 0 0 \n 4 36 (26.9%) 0 0 \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 0 0 \n Grade 1-2 28 (20.9%) 0 0 \n 2 28 (20.9%) 0 0 \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 0 0 \n Grade 1-2 28 (20.9%) 0 0 \n 2 28 (20.9%) 0 0 \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\")\n\nresult <- lyt %>%\n build_table(adae, alt_counts_df = adsl) %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 1 0 0 0 \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 2 0 0 0 \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 4 0 0 0 \n Grade 5 0 0 0 \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 4 0 0 0 \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 4 0 0 0 \n Grade 5 0 0 0 \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 1 0 0 0 \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 1 0 0 0 \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 0 0 0 \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 3 0 0 0 \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 5 0 0 0 \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 1-2 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 3 0 0 0 \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 5 0 0 0 \n\n\n\n\n\nCodegrade_groups_1 <- list(\n \"Grade 1-2\" = c(\"1\", \"2\"),\n \"Grade 3-5\" = c(\"3\", \"4\", \"5\")\n)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups_1,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups_1,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\")\n\nresult <- lyt %>%\n build_table(adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-5 90 (67.2%) 83 (61.9%) 93 (70.5%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-5 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-5 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-5 64 (47.8%) 54 (40.3%) 68 (51.5%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 3-5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-5 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 3-5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 3-5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-5 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-5 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCode# No Worst Grade Flags found in the ADAE data set.\n\n\n\n\n\nCode# Simple wrapper to return subset ADAE to a threshold of xx%.\nget_adae_trimmed <- function(adsl, adae, cutoff_rate) {\n n_per_arm <- adsl %>%\n dplyr::count(ACTARM)\n\n anl_terms <- adae %>%\n dplyr::group_by(ACTARM, AEBODSYS, AEDECOD) %>%\n dplyr::count(\n unique_terms = n_distinct(USUBJID)\n ) %>%\n dplyr::select(-n) %>%\n dplyr::ungroup()\n\n anl_terms <- dplyr::left_join(\n anl_terms,\n n_per_arm,\n by = \"ACTARM\"\n ) %>%\n dplyr::mutate(\n ae_rate = unique_terms / n\n ) %>%\n dplyr::filter(ae_rate >= cutoff_rate) %>%\n dplyr::select(AEDECOD) %>%\n unique()\n\n anl <- dplyr::left_join(\n anl_terms,\n adae,\n by = \"AEDECOD\"\n )\n anl\n}\n\nadae6 <- get_adae_trimmed(adsl, adae, cutoff_rate = 0.4)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n var = \"TOTAL_VAR\",\n label_pos = \"hidden\",\n child_labels = \"visible\",\n indent_mod = -1L\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 7L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 6L\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = drop_split_levels,\n split_label = var_labels(adae)[[\"AEBODSYS\"]],\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n split_fun = add_overall_level(\"- Overall -\", trim = TRUE),\n split_label = var_labels(adae)[[\"AEDECOD\"]],\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"- Any Grade -\",\n .indent_mods = 6L\n ) %>%\n count_occurrences_by_grade(\n var = \"AETOXGR\",\n grade_groups = grade_groups,\n .indent_mods = 5L\n ) %>%\n append_topleft(\" Grade\")\n\nresult <- lyt %>%\n build_table(adae6, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = score_all_sum,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_all_sum,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCode# Variant 7 was not created.\n# With this variant, the SOC level is not trimmed (even if there are no terms left).\n\n\n\n\n\nCodecutoff <- 58L\nrow_condition <- has_count_in_any_col(atleast = cutoff, col_names = levels(adsl$ACTARM))\n\nresult <- prune_table(raw_table, keep_content_rows(my_row_condition(row_condition)))\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodecutoff <- 0.1\nrow_condition <- has_fractions_difference(atleast = cutoff, col_names = levels(adsl$ACTARM))\n\nresult <- prune_table(raw_table, keep_content_rows(my_row_condition(row_condition)))\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCode# Variant 10 was not done\n# With this variant, SOC levels above the threshold are still in the table even if\n# there are no terms left.\n\n\n\n\n\nCodecutoff <- 0.4\nrow_condition <- has_fraction_in_any_col(atleast = cutoff, col_names = levels(adsl$ACTARM))\n\nresult <- prune_table(raw_table, keep_content_rows(my_row_condition(row_condition)))\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Grade (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————\n- Any adverse events - \n - Any Grade - 100 (74.6%) 98 (73.1%) 103 (78.0%) \n Grade 1-2 10 (7.5%) 15 (11.2%) 10 (7.6%) \n 1 5 (3.7%) 7 (5.2%) 4 (3.0%) \n 2 5 (3.7%) 8 (6.0%) 6 (4.5%) \n Grade 3-4 26 (19.4%) 31 (23.1%) 29 (22.0%) \n 3 13 (9.7%) 13 (9.7%) 14 (10.6%) \n 4 13 (9.7%) 18 (13.4%) 15 (11.4%) \n Grade 5 64 (47.8%) 52 (38.8%) 64 (48.5%) \ncl A.1 \n - Overall - \n - Any Grade - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Grade 1-2 68 (50.7%) 58 (43.3%) 76 (57.6%) \n 1 27 (20.1%) 19 (14.2%) 34 (25.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n dcd A.1.1.1.1 \n - Any Grade - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n Grade 1-2 45 (33.6%) 31 (23.1%) 52 (39.4%) \n 1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 \n - Any Grade - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n Grade 1-2 41 (30.6%) 39 (29.1%) 42 (31.8%) \n 2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n - Overall - \n - Any Grade - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Grade 1-2 23 (17.2%) 22 (16.4%) 28 (21.2%) \n 1 23 (17.2%) 22 (16.4%) 28 (21.2%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \n dcd B.2.2.3.1 \n - Any Grade - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Grade 1-2 38 (28.4%) 40 (29.9%) 45 (34.1%) \n 1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Grade - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Grade 3-4 39 (29.1%) 34 (25.4%) 46 (34.8%) \n 3 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n - Overall - \n - Any Grade - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Grade 3-4 22 (16.4%) 22 (16.4%) 22 (16.7%) \n 3 22 (16.4%) 22 (16.4%) 22 (16.7%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.1.1 \n - Any Grade - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Grade 5 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 \n - Any Grade - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Grade 3-4 38 (28.4%) 34 (25.4%) 40 (30.3%) \n 3 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n - Overall - \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \n dcd D.2.1.5.3 \n - Any Grade - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Grade 1-2 37 (27.6%) 46 (34.3%) 50 (37.9%) \n 1 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n - Overall - \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n dcd C.2.1.2.1 \n - Any Grade - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Grade 1-2 28 (20.9%) 36 (26.9%) 48 (36.4%) \n 2 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n - Overall - \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \n dcd B.1.1.1.1 \n - Any Grade - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Grade 5 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n - Overall - \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Grade - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Grade 3-4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n 4 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_by_grade(\n label = \"Adverse Events by Grade Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = \"AEBODSYS\"\n ),\n grade = choices_selected(\n choices = variable_choices(ADAE, c(\"AETOXGR\", \"AESEV\")),\n selected = \"AETOXGR\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:42:45 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", @@ -1267,63 +1279,63 @@ ] }, { - "objectID": "tables/adverse-events/aet07.html", - "href": "tables/adverse-events/aet07.html", - "title": "AET07", + "objectID": "tables/adverse-events/aet02.html", + "href": "tables/adverse-events/aet02.html", + "title": "AET02", "section": "", - "text": "Data Setup\nStandard Table\nTable with Fill-In of Treatment Groups without Deaths\nteal App\nReproducibility\n\n\n\nFor illustrative purposes, we will pre-process AESDTH in ADAE so there are no deaths in arm A and concatenate AEBODSYS and AEDECOD as per GDSR output standards for AET07.\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nadae_f <- adae %>%\n mutate(\n AESDTH = as.character(AESDTH), # characterizing AESDTH for next step\n AESDTH = case_when(\n ARM == \"A: Drug X\" ~ NA_character_, # For demonstration purpose only,\n TRUE ~ AESDTH\n ), # make \"A: Drug X\" as the arm without AE leading to death\n AESDTH = as.factor(AESDTH),\n SOC_PT = factor(paste(AEBODSYS, \"/\", AEDECOD))\n ) %>%\n filter(AESDTH == \"Y\") %>%\n mutate(ARM = droplevels(ARM))\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", split_fun = drop_split_levels) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = \"unique\",\n .labels = c(unique = \"Total number of deaths\"),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(\n vars = \"SOC_PT\"\n ) %>%\n append_topleft(\"MedDRA SOC and Preferred Term\")\n\nresult <- build_table(\n lyt = lyt,\n df = adae_f,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = \"SOC_PT\",\n scorefun = score_occurrences,\n decreasing = TRUE\n )\n\nresult\n\n B: Placebo C: Combination\nMedDRA SOC and Preferred Term (N=134) (N=132) \n———————————————————————————————————————————————————————————\nTotal number of deaths 70 (52.2%) 75 (56.8%) \ncl D.1 / dcd D.1.1.1.1 42 (31.3%) 51 (38.6%) \ncl B.1 / dcd B.1.1.1.1 49 (36.6%) 43 (32.6%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = \"unique\",\n .labels = c(unique = \"Total number of deaths\"),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(\n vars = \"SOC_PT\"\n ) %>%\n append_topleft(\"MedDRA SOC and Preferred Term\")\n\nresult <- build_table(\n lyt = lyt,\n df = adae_f,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = \"SOC_PT\",\n scorefun = score_occurrences,\n decreasing = TRUE\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination\nMedDRA SOC and Preferred Term (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————\nTotal number of deaths 0 70 (52.2%) 75 (56.8%) \ncl D.1 / dcd D.1.1.1.1 0 42 (31.3%) 51 (38.6%) \ncl B.1 / dcd B.1.1.1.1 0 49 (36.6%) 43 (32.6%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAE <- df_explicit_na(ADAE)\n\n ADSL <- ADSL %>%\n mutate(\n DTHFL = case_when(\n !is.na(DTHDT) ~ \"Y\",\n TRUE ~ \"\"\n )\n ) %>%\n col_relabel(\n DTHFL = \"Subject Death Flag\"\n )\n\n ADAE <- ADAE %>%\n mutate(\n AESDTH = as.character(AESDTH), # characterizing AESDTH for next step\n AESDTH = case_when(\n ARM == \"A: Drug X\" ~ NA_character_, # For demonstration purpose only,\n TRUE ~ AESDTH\n ), # make \"A: Drug X\" as the arm without AE leading to death\n AESDTH = as.factor(AESDTH),\n SOC_PT = factor(paste(AEBODSYS, \"/\", AEDECOD))\n ) %>%\n filter(AESDTH == \"Y\") %>%\n mutate(ARM = droplevels(ARM)) %>%\n col_relabel(SOC_PT = \"MedDRA SOC and Preferred Term\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Adverse Event Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\", \"SOC_PT\")),\n selected = c(\"SOC_PT\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\", \"SOC_PT\")),\n selected = NULL\n ),\n add_total = FALSE,\n event_type = \"adverse event\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:44:14 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable with Event Totals\nTable with High-Level Term\nTable with Preferred Terms Only\nTable with Fill-In of Treatment Groups\nTable of AEs with an Incidence Rate \\(\\geq\\) 5% in Any Treatment Group (subsetting preferred terms based on frequency)\nTable of AEs with an Incidence Rate \\(\\geq\\) 5% in Any Treatment Group (subsetting preferred terms based on frequency with high-level terms)\nTable of AEs with an Incidence Rate \\(\\geq\\) 10% in Any Treatment Group (subsetting preferred terms based on frequency)\nTable of AEs with an Incidence Rate \\(\\geq\\) 3 Patients in Any Treatment Group (subsetting preferred terms based on number of patients)\nTable of AEs with a Difference in Incidence Rate \\(\\geq\\) 5% Between Any Treatment (subsetting preferred terms based on difference in percentage between treatment groups)\nTable of AEs with an Incidence Rate \\(\\geq\\) 5% in B: Placebo (subsetting preferred terms based on frequency for a particular treatment group)\nTable of AEs with a Difference in Incidence Rate \\(\\geq\\) 5% Between Arm A and Arm B or Arm C (displaying preferred terms with a difference of at least x% between selected treatment groups)\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae) %>%\n var_relabel(\n AEBODSYS = \"MedDRA System Organ Class\",\n AEDECOD = \"MedDRA Preferred Term\"\n ) %>%\n filter(ANL01FL == \"Y\")\n\n# Define the split function\nsplit_fun <- drop_split_levels\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = -1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl)\n\n\nThe variable result corresponds to the adverse events table. However, it includes many empty rows accounting for events which were not reported. The table can be post-processed to prune empty rows and to sort rows, for example by occurrence.\n\nCoderesult <- result %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination All Patients\n MedDRA Preferred Term (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 100 (74.6%) 98 (73.1%) 103 (78.0%) 301 (75.2%) \nOverall total number of events 502 480 604 1586 \ncl A.1 \n Total number of patients with at least one adverse event 68 (50.7%) 58 (43.3%) 76 (57.6%) 202 (50.5%) \n Total number of events 115 99 137 351 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) 128 (32.0%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) 122 (30.5%) \ncl B.2 \n Total number of patients with at least one adverse event 62 (46.3%) 56 (41.8%) 74 (56.1%) 192 (48.0%) \n Total number of events 102 106 127 335 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) 123 (30.8%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) 119 (29.8%) \ncl D.1 \n Total number of patients with at least one adverse event 64 (47.8%) 54 (40.3%) 68 (51.5%) 186 (46.5%) \n Total number of events 106 84 114 304 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) 120 (30.0%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) 112 (28.0%) \ncl D.2 \n Total number of patients with at least one adverse event 37 (27.6%) 46 (34.3%) 50 (37.9%) 133 (33.2%) \n Total number of events 49 57 65 171 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) 133 (33.2%) \ncl C.2 \n Total number of patients with at least one adverse event 28 (20.9%) 36 (26.9%) 48 (36.4%) 112 (28.0%) \n Total number of events 39 40 57 136 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) 112 (28.0%) \ncl B.1 \n Total number of patients with at least one adverse event 38 (28.4%) 37 (27.6%) 36 (27.3%) 111 (27.8%) \n Total number of events 44 43 50 137 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) 111 (27.8%) \ncl C.1 \n Total number of patients with at least one adverse event 36 (26.9%) 34 (25.4%) 36 (27.3%) 106 (26.5%) \n Total number of events 47 51 54 152 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) 106 (26.5%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L) %>%\n count_values(\n \"STUDYID\",\n values = as.character(unique(adae$STUDYID)),\n .stats = \"count\",\n .labels = c(count = \"Total number of events\"),\n .indent_mods = c(count = -1L)\n )\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n )\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination All Patients\n MedDRA Preferred Term (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 100 (74.6%) 98 (73.1%) 103 (78.0%) 301 (75.2%) \nOverall total number of events 502 480 604 1586 \ncl A.1 \n Total number of patients with at least one adverse event 68 (50.7%) 58 (43.3%) 76 (57.6%) 202 (50.5%) \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) 128 (32.0%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) 122 (30.5%) \n Total number of events 115 99 137 351 \ncl B.2 \n Total number of patients with at least one adverse event 62 (46.3%) 56 (41.8%) 74 (56.1%) 192 (48.0%) \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) 123 (30.8%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) 119 (29.8%) \n Total number of events 102 106 127 335 \ncl D.1 \n Total number of patients with at least one adverse event 64 (47.8%) 54 (40.3%) 68 (51.5%) 186 (46.5%) \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) 120 (30.0%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) 112 (28.0%) \n Total number of events 106 84 114 304 \ncl D.2 \n Total number of patients with at least one adverse event 37 (27.6%) 46 (34.3%) 50 (37.9%) 133 (33.2%) \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) 133 (33.2%) \n Total number of events 49 57 65 171 \ncl C.2 \n Total number of patients with at least one adverse event 28 (20.9%) 36 (26.9%) 48 (36.4%) 112 (28.0%) \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) 112 (28.0%) \n Total number of events 39 40 57 136 \ncl B.1 \n Total number of patients with at least one adverse event 38 (28.4%) 37 (27.6%) 36 (27.3%) 111 (27.8%) \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) 111 (27.8%) \n Total number of events 44 43 50 137 \ncl C.1 \n Total number of patients with at least one adverse event 36 (26.9%) 34 (25.4%) 36 (27.3%) 106 (26.5%) \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) 106 (26.5%) \n Total number of events 47 51 54 152 \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEHLT\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n indent_mod = -1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEHLT)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, c(\"AEDECOD\"), indent = 2L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedDRA System Organ Class \n High Level Term A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 100 (74.6%) 98 (73.1%) 103 (78.0%) \nOverall total number of events 502 480 604 \ncl A.1 \n Total number of patients with at least one adverse event 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Total number of events 115 99 137 \n hlt A.1.1.1 \n Total number of patients with at least one adverse event 68 (50.7%) 58 (43.3%) 76 (57.6%) \n Total number of events 115 99 137 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n Total number of patients with at least one adverse event 62 (46.3%) 56 (41.8%) 74 (56.1%) \n Total number of events 102 106 127 \n hlt B.2.2.3 \n Total number of patients with at least one adverse event 38 (28.4%) 40 (29.9%) 45 (34.1%) \n Total number of events 50 55 68 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n hlt B.2.1.2 \n Total number of patients with at least one adverse event 39 (29.1%) 34 (25.4%) 46 (34.8%) \n Total number of events 52 51 59 \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n Total number of patients with at least one adverse event 64 (47.8%) 54 (40.3%) 68 (51.5%) \n Total number of events 106 84 114 \n hlt D.1.1.1 \n Total number of patients with at least one adverse event 42 (31.3%) 32 (23.9%) 46 (34.8%) \n Total number of events 52 40 64 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n hlt D.1.1.4 \n Total number of patients with at least one adverse event 38 (28.4%) 34 (25.4%) 40 (30.3%) \n Total number of events 54 44 50 \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n Total number of patients with at least one adverse event 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Total number of events 49 57 65 \n hlt D.2.1.5 \n Total number of patients with at least one adverse event 37 (27.6%) 46 (34.3%) 50 (37.9%) \n Total number of events 49 57 65 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n Total number of patients with at least one adverse event 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Total number of events 39 40 57 \n hlt C.2.1.2 \n Total number of patients with at least one adverse event 28 (20.9%) 36 (26.9%) 48 (36.4%) \n Total number of events 39 40 57 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n Total number of patients with at least one adverse event 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Total number of events 44 43 50 \n hlt B.1.1.1 \n Total number of patients with at least one adverse event 38 (28.4%) 37 (27.6%) 36 (27.3%) \n Total number of events 44 43 50 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n Total number of patients with at least one adverse event 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Total number of events 47 51 54 \n hlt C.1.1.1 \n Total number of patients with at least one adverse event 36 (26.9%) 34 (25.4%) 36 (27.3%) \n Total number of events 47 51 54 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n ),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(vars = \"AEDECOD\") %>%\n append_varlabels(adae, \"AEDECOD\")\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n sort_at_path(\n path = c(\"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination\nMedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of events 502 480 604 \ndcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ndcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \ndcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \ndcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ndcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \ndcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ndcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ndcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ndcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ndcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodeadae_5 <- adae %>% dplyr::filter(ACTARM != \"C: Combination\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Overall total number of events\"\n )\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(vars = \"AEDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae_5, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 100 (74.6%) 98 (73.1%) 0 \nOverall total number of events 502 480 0 \ncl A.1 \n Total number of patients with at least one adverse event 68 (50.7%) 58 (43.3%) 0 \n Total number of events 115 99 0 \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 0 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 0 \ncl B.2 \n Total number of patients with at least one adverse event 62 (46.3%) 56 (41.8%) 0 \n Total number of events 102 106 0 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 0 \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 0 \ncl D.1 \n Total number of patients with at least one adverse event 64 (47.8%) 54 (40.3%) 0 \n Total number of events 106 84 0 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 0 \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 0 \ncl D.2 \n Total number of patients with at least one adverse event 37 (27.6%) 46 (34.3%) 0 \n Total number of events 49 57 0 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 0 \ncl B.1 \n Total number of patients with at least one adverse event 38 (28.4%) 37 (27.6%) 0 \n Total number of events 44 43 0 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 0 \ncl C.1 \n Total number of patients with at least one adverse event 36 (26.9%) 34 (25.4%) 0 \n Total number of events 47 51 0 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 0 \ncl C.2 \n Total number of patients with at least one adverse event 28 (20.9%) 36 (26.9%) 0 \n Total number of events 39 40 0 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 0 \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_fraction_in_any_col(\n atleast = 0.05,\n col_names = names(table(adsl$ACTARM))\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n split_rows_by(\n \"AEHLT\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEHLT)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(vars = \"AEDECOD\") %>%\n append_varlabels(adae, c(\"AEDECOD\"), indent = 2L)\n\nresult <- build_table(lyt, adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\"),\n scorefun = cont_n_allcols,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEHLT\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences,\n decreasing = TRUE\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_fraction_in_any_col(\n atleast = 0.05,\n col_names = names(table(adsl$ACTARM))\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class \n High Level Term A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n hlt A.1.1.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n hlt B.2.2.3 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n hlt B.2.1.2 \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n hlt D.1.1.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n hlt D.1.1.4 \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n hlt D.2.1.5 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n hlt C.2.1.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n hlt B.1.1.1 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n hlt C.1.1.1 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_fraction_in_any_col(\n atleast = 0.10,\n col_names = names(table(adsl$ACTARM))\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n split_label = obj_label(adae$AEBODSYS),\n label_pos = \"topleft\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_count_in_any_col(\n atleast = 3,\n col_names = names(table(adsl$ACTARM))\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_fractions_difference(\n atleast = 0.05,\n col_names = levels(adsl$ACTARM)\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition <- has_fraction_in_cols(\n atleast = 0.05,\n col_names = c(\"B: Placebo\")\n)\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \n dcd A.1.1.1.2 41 (30.6%) 39 (29.1%) 42 (31.8%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \n dcd D.1.1.4.2 38 (28.4%) 34 (25.4%) 40 (30.3%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \ncl B.1 \n dcd B.1.1.1.1 38 (28.4%) 37 (27.6%) 36 (27.3%) \ncl C.1 \n dcd C.1.1.1.3 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = -1L,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = 1L\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = cont_n_allcols\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences\n )\n\ncriteria_fun <- function(tr) is(tr, \"ContentRow\")\nresult <- trim_rows(result, criteria = criteria_fun)\n\nrow_condition1 <- has_fractions_difference(atleast = 0.05, col_names = c(\"A: Drug X\", \"B: Placebo\"))\nrow_condition2 <- has_fractions_difference(atleast = 0.05, col_names = c(\"A: Drug X\", \"C: Combination\"))\nrow_condition <- row_condition1 | row_condition2\nresult <- prune_table(result, keep_rows(row_condition))\n\nresult\n\nMedDRA System Organ Class A: Drug X B: Placebo C: Combination\n MedDRA Preferred Term (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————————\ncl A.1 \n dcd A.1.1.1.1 45 (33.6%) 31 (23.1%) 52 (39.4%) \ncl B.2 \n dcd B.2.2.3.1 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 39 (29.1%) 34 (25.4%) 46 (34.8%) \ncl D.1 \n dcd D.1.1.1.1 42 (31.3%) 32 (23.9%) 46 (34.8%) \ncl D.2 \n dcd D.2.1.5.3 37 (27.6%) 46 (34.3%) 50 (37.9%) \ncl C.2 \n dcd C.2.1.2.1 28 (20.9%) 36 (26.9%) 48 (36.4%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAE <- df_explicit_na(ADAE)\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Adverse Event Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = \"AEBODSYS\"\n ),\n add_total = TRUE,\n event_type = \"adverse event\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:43:23 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", - "AET07" + "AET02" ] }, { - "objectID": "tables/adverse-events/aet03.html", - "href": "tables/adverse-events/aet03.html", - "title": "AET03", + "objectID": "tables/adverse-events/aet02_smq.html", + "href": "tables/adverse-events/aet02_smq.html", + "title": "AET02_SMQ", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae) %>%\n var_relabel(\n AEBODSYS = \"MedDRA System Organ Class\",\n AEDECOD = \"MedDRA Preferred Term\"\n ) %>%\n filter(ANL01FL == \"Y\")\n\n\nFor illustrative purposes, we will create a new factor variable in ADAE, ASEV, with all intensity levels including \"LIFE THREATENING\".\n\nCodeadae <- adae %>% mutate(ASEV = as.character(AESEV))\nadae$ASEV[1:15] <- \"LIFE THREATENING\"\nadae <- adae %>% mutate(ASEV = factor(ASEV, levels = c(\"MILD\", \"MODERATE\", \"SEVERE\", \"LIFE THREATENING\")))\n\n\n\n\n\nCodegrade_groups <- list(\"- Any Intensity -\" = c(\"MILD\", \"MODERATE\", \"SEVERE\", \"LIFE THREATENING\"))\n\nsplit_fun <- trim_levels_in_group\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_occurrences_by_grade(\n var = \"ASEV\",\n grade_groups = grade_groups\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun(\"ASEV\"),\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_occurrences_by_grade(\n var = \"ASEV\",\n grade_groups = grade_groups\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n nested = TRUE,\n indent_mod = -1L,\n split_fun = split_fun(\"ASEV\"),\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEDECOD)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = c(\"- Any Intensity -\")\n ) %>%\n count_occurrences_by_grade(\n var = \"ASEV\",\n .indent_mods = -1L\n ) %>%\n append_varlabels(adae, \"AESEV\", indent = 2L)\n\nresult <- lyt %>%\n build_table(\n adae,\n alt_counts_df = adsl\n ) %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = cont_n_allcols,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = cont_n_allcols,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Severity/Intensity (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————\n- Any Intensity - 100 (74.6%) 98 (73.1%) 103 (78.0%) \nMILD 5 (3.7%) 7 (5.2%) 4 (3.0%) \nMODERATE 17 (12.7%) 21 (15.7%) 20 (15.2%) \nSEVERE 77 (57.5%) 69 (51.5%) 77 (58.3%) \nLIFE THREATENING 1 (0.7%) 1 (0.7%) 2 (1.5%) \ncl A.1 \n - Any Intensity - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n MILD 27 (20.1%) 19 (14.2%) 34 (25.8%) \n MODERATE 40 (29.9%) 39 (29.1%) 41 (31.1%) \n LIFE THREATENING 1 (0.7%) 0 1 (0.8%) \n dcd A.1.1.1.1 \n - Any Intensity - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n MILD 45 (33.6%) 31 (23.1%) 51 (38.6%) \n LIFE THREATENING 0 0 1 (0.8%) \n dcd A.1.1.1.2 \n - Any Intensity - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n MODERATE 40 (29.9%) 39 (29.1%) 41 (31.1%) \n LIFE THREATENING 1 (0.7%) 0 1 (0.8%) \ncl B.2 \n - Any Intensity - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n MILD 23 (17.2%) 22 (16.4%) 28 (21.2%) \n MODERATE 38 (28.4%) 34 (25.4%) 45 (34.1%) \n LIFE THREATENING 1 (0.7%) 0 1 (0.8%) \n dcd B.2.2.3.1 \n - Any Intensity - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n MILD 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Intensity - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n MODERATE 38 (28.4%) 34 (25.4%) 45 (34.1%) \n LIFE THREATENING 1 (0.7%) 0 1 (0.8%) \ncl D.1 \n - Any Intensity - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n MODERATE 21 (15.7%) 22 (16.4%) 22 (16.7%) \n SEVERE 42 (31.3%) 32 (23.9%) 44 (33.3%) \n LIFE THREATENING 1 (0.7%) 0 2 (1.5%) \n dcd D.1.1.1.1 \n - Any Intensity - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n SEVERE 42 (31.3%) 32 (23.9%) 45 (34.1%) \n LIFE THREATENING 0 0 1 (0.8%) \n dcd D.1.1.4.2 \n - Any Intensity - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n MODERATE 37 (27.6%) 34 (25.4%) 39 (29.5%) \n LIFE THREATENING 1 (0.7%) 0 1 (0.8%) \ncl D.2 \n - Any Intensity - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n MILD 37 (27.6%) 46 (34.3%) 49 (37.1%) \n LIFE THREATENING 0 0 1 (0.8%) \n dcd D.2.1.5.3 \n - Any Intensity - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n MILD 37 (27.6%) 46 (34.3%) 49 (37.1%) \n LIFE THREATENING 0 0 1 (0.8%) \ncl C.2 \n - Any Intensity - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n MODERATE 28 (20.9%) 36 (26.9%) 47 (35.6%) \n LIFE THREATENING 0 0 1 (0.8%) \n dcd C.2.1.2.1 \n - Any Intensity - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n MODERATE 28 (20.9%) 36 (26.9%) 47 (35.6%) \n LIFE THREATENING 0 0 1 (0.8%) \ncl B.1 \n - Any Intensity - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n SEVERE 38 (28.4%) 36 (26.9%) 36 (27.3%) \n LIFE THREATENING 0 1 (0.7%) 0 \n dcd B.1.1.1.1 \n - Any Intensity - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n SEVERE 38 (28.4%) 36 (26.9%) 36 (27.3%) \n LIFE THREATENING 0 1 (0.7%) 0 \ncl C.1 \n - Any Intensity - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n SEVERE 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Intensity - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n SEVERE 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_by_grade(\n label = \"Adverse Events by Grade Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = \"AEBODSYS\"\n ),\n grade = choices_selected(\n choices = variable_choices(ADAE, c(\"AETOXGR\", \"AESEV\")),\n selected = \"AESEV\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:44:47 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable with Customized Queries\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\nlibrary(stringr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\n# Simulate a random AAG dataset.\naag <- data.frame(\n NAMVAR = c(\"SMQ01NAM\", \"SMQ01NAM\", \"SMQ02NAM\", \"CQ01NAM\", \"CQ01NAM\"),\n SRCVAR = rep(\"AEDECOD\", 5),\n GRPTYPE = c(\"SMQ\", \"SMQ\", \"SMQ\", \"CUSTOM\", \"CUSTOM\"),\n REFID = c(1, 1, 2, 3, 3),\n REFNAME = c(rep(\"C.1.1.1.3/B.2.2.3.1 AESI\", 2), \"non observed SMQ02NAM level\", rep(\"D.2.1.5.3/A.1.1.1.1 AESI\", 2)),\n SCOPE = c(\"BROAD\", \"BROAD\", \"BROAD\", \"\", \"\"),\n REFTERM = c(\"C.1.1.1.3\", \"B.2.2.3.1\", \"Z.9.9.9.9\", \"D.2.1.5.3\", \"A.1.1.1.1\"),\n stringsAsFactors = FALSE\n)\n\n# Create summary AAG dataset (used for labelling).\n# Note it's important to incorporate SCOPE into the basket names for SMQs so as to\n# match the flags present in ADAE.\naag_summary <- aag %>%\n select(NAMVAR, REFNAME, SCOPE) %>%\n unique() %>%\n mutate(\n REFNAME_SCOPE = ifelse(SCOPE == \"\", REFNAME, paste0(REFNAME, \"(\", SCOPE, \")\"))\n ) %>%\n rename(basket = NAMVAR, basket_name = REFNAME_SCOPE) %>%\n select(basket, basket_name)\n\n# Make a summary of the full ADAE based on AAG by using h_stack_by_baskets helper function\nadae_smq_all <- h_stack_by_baskets(\n df = adae,\n aag_summary = aag_summary,\n keys = c(\"STUDYID\", \"USUBJID\", \"ACTARMCD\", \"AEDECOD\")\n)\n\n# Post-process adae_smq_all to keep only certain baskets of interest for variant 1\n# Not need to drop baskets for variant 2 as all baskets will be considered.\nbaskets_to_drop_variant <- aag_summary$basket_name[!aag_summary$basket %in% c(\"SMQ01NAM\")]\n\n# Adjust the analysis dataset based on basket subset for variant 1.\nadae_smq_1 <- adae_smq_all %>%\n filter(!adae_smq_all$SMQ %in% baskets_to_drop_variant) %>%\n mutate(\n SMQ = tern::fct_discard(SMQ, discard = baskets_to_drop_variant)\n )\n\n\n\n\n\nCodecriteria_fun <- function(tr) !is(tr, \"ContentRow\") && all_zero_or_na(tr)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\"\n )\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = -1L,\n drop = FALSE\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt,\n df = adae_smq_1,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = cont_n_allcols) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\nStandardized MedDRA Query ARM A ARM B ARM C \n Dictionary-Derived Term (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 72 (53.7%) 79 (59.0%) 75 (56.8%)\nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 72 (53.7%) 79 (59.0%) 75 (56.8%)\n Total number of events 119 139 141 \n dcd B.2.2.3.1 48 (35.8%) 54 (40.3%) 51 (38.6%)\n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%)\n\n\n\n\n\nCodecriteria_fun <- function(tr) {\n !is(tr, \"ContentRow\") && all_zero_or_na(tr) && !grepl(\"Total number of\", obj_label(tr))\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\"\n )\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n ),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n drop = FALSE\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nscore_ae_pts <- function(tt) {\n count_vals <- cell_values(tree_children(tt)[[\"USUBJID\"]])[[1]]\n sum(matrix(unlist(count_vals), nrow = length(count_vals), byrow = TRUE)[, 1])\n}\n\nresult <- build_table(\n lyt,\n df = adae_smq_all,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = score_ae_pts) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\nStandardized MedDRA Query ARM A ARM B ARM C \n Dictionary-Derived Term (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 95 (70.9%) 103 (76.9%) 108 (81.8%)\nD.2.1.5.3/A.1.1.1.1 AESI \n Total number of patients with at least one adverse event 74 (55.2%) 80 (59.7%) 87 (65.9%) \n Total number of events 126 134 162 \n dcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%) \n dcd A.1.1.1.1 50 (37.3%) 45 (33.6%) 63 (47.7%) \nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 72 (53.7%) 79 (59.0%) 75 (56.8%) \n Total number of events 119 139 141 \n dcd B.2.2.3.1 48 (35.8%) 54 (40.3%) 51 (38.6%) \n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%) \nnon observed SMQ02NAM level(BROAD) \n Total number of patients with at least one adverse event 0 0 0 \n Total number of events 0 0 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAE <- data[[\"ADAE\"]]\nnames_baskets <- grep(\"^(SMQ|CQ).*NAM$\", names(ADAE), value = TRUE)\nnames_scopes <- grep(\"^SMQ.*SC$\", names(ADAE), value = TRUE)\n\ncs_baskets <- choices_selected(\n choices = variable_choices(ADAE, subset = names_baskets),\n selected = names_baskets\n)\ncs_scopes <- choices_selected(\n choices = variable_choices(ADAE, subset = names_scopes),\n selected = names_scopes,\n fixed = TRUE\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_smq(\n label = \"Adverse events by `SMQ` Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"SEX\")),\n selected = \"ARM\"\n ),\n add_total = FALSE,\n baskets = cs_baskets,\n scopes = cs_scopes,\n llt = choices_selected(\n choices = variable_choices(ADAE, subset = c(\"AEDECOD\")),\n selected = \"AEDECOD\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:43:55 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 stringr_1.5.1 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", - "AET03" + "AET02_SMQ" ] }, { - "objectID": "tables/adverse-events/aet01.html", - "href": "tables/adverse-events/aet01.html", - "title": "AET01", + "objectID": "tables/adverse-events/aet04_pi.html", + "href": "tables/adverse-events/aet04_pi.html", + "title": "AET04_PI", "section": "", - "text": "Data Setup\nStandard Table\nTable with Medical Concepts Section\nTable with Modified Rows\nTable with Rows Counting Events & Additional Sections\nteal App\nReproducibility\n\n\n\nTo illustrate, additional variables such as flags (TRUE/FALSE) for select AEs of interest and select AE baskets are added to the adae dataset.\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(\n adae,\n omit_columns = c(\"SMQ01NAM\", \"SMQ01SC\", \"SMQ02NAM\", \"SMQ02SC\", \"CQ01NAM\", \"STUDYID\", \"USUBJID\")\n)\n\nset.seed(99)\n\nadae <- adae %>%\n mutate(\n AEDECOD = with_label(as.character(AEDECOD), \"Dictionary-Derived Term\"),\n AESDTH = with_label(\n sample(c(\"N\", \"Y\"), size = nrow(adae), replace = TRUE, prob = c(0.99, 0.01)),\n \"Results in Death\"\n ),\n AEACN = with_label(\n sample(\n c(\"DOSE NOT CHANGED\", \"DOSE INCREASED\", \"DRUG INTERRUPTED\", \"DRUG WITHDRAWN\"),\n size = nrow(adae),\n replace = TRUE, prob = c(0.68, 0.02, 0.25, 0.05)\n ),\n \"Action Taken with Study Treatment\"\n ),\n FATAL = with_label(AESDTH == \"Y\", \"AE with fatal outcome\"),\n SEV = with_label(AESEV == \"SEVERE\", \"Severe AE (at greatest intensity)\"),\n SER = with_label(AESER == \"Y\", \"Serious AE\"),\n SERWD = with_label(AESER == \"Y\" & AEACN == \"DRUG WITHDRAWN\", \"Serious AE leading to withdrawal from treatment\"),\n SERDSM = with_label(\n AESER == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Serious AE leading to dose modification/interruption\"\n ),\n RELSER = with_label(AESER == \"Y\" & AEREL == \"Y\", \"Related Serious AE\"),\n WD = with_label(AEACN == \"DRUG WITHDRAWN\", \"AE leading to withdrawal from treatment\"),\n DSM = with_label(\n AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"), \"AE leading to dose modification/interruption\"\n ),\n REL = with_label(AEREL == \"Y\", \"Related AE\"),\n RELWD = with_label(AEREL == \"Y\" & AEACN == \"DRUG WITHDRAWN\", \"Related AE leading to withdrawal from treatment\"),\n RELDSM = with_label(\n AEREL == \"Y\" & AEACN %in% c(\"DRUG INTERRUPTED\", \"DOSE INCREASED\", \"DOSE REDUCED\"),\n \"Related AE leading to dose modification/interruption\"\n ),\n CTC35 = with_label(AETOXGR %in% c(\"3\", \"4\", \"5\"), \"Grade 3-5 AE\"),\n CTC45 = with_label(AETOXGR %in% c(\"4\", \"5\"), \"Grade 4/5 AE\"),\n SMQ01 = with_label(SMQ01NAM != \"\", aesi_label(adae$SMQ01NAM, adae$SMQ01SC)),\n SMQ02 = with_label(SMQ02NAM != \"\", aesi_label(adae$SMQ02NAM, adae$SMQ02SC)),\n CQ01 = with_label(CQ01NAM != \"\", aesi_label(adae$CQ01NAM)),\n USUBJID_AESEQ = paste(USUBJID, AESEQ, sep = \"@@\") # Create unique ID per AE in dataset.\n ) %>%\n filter(ANL01FL == \"Y\")\n\n\n\n\n\n\nCodeaesi_vars <- c(\"FATAL\", \"SER\", \"SERWD\", \"SERDSM\", \"RELSER\", \"WD\", \"DSM\", \"REL\", \"RELWD\", \"RELDSM\", \"SEV\")\n\n# Layout for variables from adsl dataset.\nlyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DTHFL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of deaths\")\n ) %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DCSREAS\" = \"ADVERSE EVENT\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients withdrawn from study due to an AE\"),\n table_names = \"tot_wd\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl, alt_counts_df = adsl)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one AE\",\n nonunique = \"Total number of AEs\"\n ),\n .formats = list(unique = format_count_fraction_fixed_dp, nonunique = \"xx\"),\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_vars,\n denom = \"N_col\",\n var_labels = \"Total number of patients with at least one\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adae[1:2, ],\n result_adsl,\n result_adae[3:nrow(result_adae), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) \nTotal number of patients withdrawn from study due to an AE 3 (2.2%) 6 (4.5%) 5 (3.8%) \nTotal number of patients with at least one \n AE with fatal outcome 5 (3.7%) 5 (3.7%) 6 (4.5%) \n Serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n Serious AE leading to withdrawal from treatment 6 (4.5%) 12 (9.0%) 9 (6.8%) \n Serious AE leading to dose modification/interruption 36 (26.9%) 40 (29.9%) 47 (35.6%) \n Related Serious AE 64 (47.8%) 52 (38.8%) 64 (48.5%) \n AE leading to withdrawal from treatment 20 (14.9%) 24 (17.9%) 26 (19.7%) \n AE leading to dose modification/interruption 63 (47.0%) 70 (52.2%) 77 (58.3%) \n Related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n Related AE leading to withdrawal from treatment 10 (7.5%) 9 (6.7%) 12 (9.1%) \n Related AE leading to dose modification/interruption 44 (32.8%) 44 (32.8%) 51 (38.6%) \n Severe AE (at greatest intensity) 77 (57.5%) 70 (52.2%) 79 (59.8%) \n\n\n\n\n\nCodeaesi_vars <- c(\"FATAL\", \"SER\", \"SERWD\", \"SERDSM\", \"RELSER\", \"WD\", \"DSM\", \"REL\", \"RELWD\", \"RELDSM\", \"CTC35\")\nbasket_vars <- c(\"SMQ01\", \"SMQ02\", \"CQ01\")\n\n# Layout for variables from adsl dataset.\nlyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DTHFL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of deaths\")\n ) %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DCSREAS\" = \"ADVERSE EVENT\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients withdrawn from study due to an AE\"),\n table_names = \"tot_wd\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl, alt_counts_df = adsl)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one AE\",\n nonunique = \"Total number of AEs\"\n ),\n .formats = list(unique = format_count_fraction_fixed_dp, nonunique = \"xx\"),\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_vars,\n denom = \"N_col\",\n var_labels = \"Total number of patients with at least one\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = basket_vars,\n table_names = \"table_aesi\",\n denom = \"N_col\",\n var_labels = \"Total number of patients with at least one\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adae[1:2, ],\n result_adsl,\n result_adae[3:nrow(result_adae), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) \nTotal number of patients withdrawn from study due to an AE 3 (2.2%) 6 (4.5%) 5 (3.8%) \nTotal number of patients with at least one \n AE with fatal outcome 5 (3.7%) 5 (3.7%) 6 (4.5%) \n Serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n Serious AE leading to withdrawal from treatment 6 (4.5%) 12 (9.0%) 9 (6.8%) \n Serious AE leading to dose modification/interruption 36 (26.9%) 40 (29.9%) 47 (35.6%) \n Related Serious AE 64 (47.8%) 52 (38.8%) 64 (48.5%) \n AE leading to withdrawal from treatment 20 (14.9%) 24 (17.9%) 26 (19.7%) \n AE leading to dose modification/interruption 63 (47.0%) 70 (52.2%) 77 (58.3%) \n Related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n Related AE leading to withdrawal from treatment 10 (7.5%) 9 (6.7%) 12 (9.1%) \n Related AE leading to dose modification/interruption 44 (32.8%) 44 (32.8%) 51 (38.6%) \n Grade 3-5 AE 90 (67.2%) 83 (61.9%) 93 (70.5%) \nTotal number of patients with at least one \n C.1.1.1.3/B.2.2.3.1 AESI (BROAD) 58 (43.3%) 60 (44.8%) 66 (50.0%) \n SMQ 02 Reference Name 0 0 0 \n D.2.1.5.3/A.1.1.1.1 AESI 62 (46.3%) 61 (45.5%) 76 (57.6%) \n\n\n\n\n\nCodeaesi_vars <- c(\"FATAL\", \"SER\", \"WD\", \"REL\", \"CTC35\", \"CTC45\")\n# Layout for variables from adsl dataset.\nlyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DTHFL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of deaths\")\n ) %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DCSREAS\" = \"ADVERSE EVENT\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients withdrawn from study due to an AE\"),\n table_names = \"tot_wd\"\n ) %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DCSREAS\" = \"WITHDRAWAL BY SUBJECT\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients withdrawn informed consent\"),\n table_names = \"tot_dscsreas_wd\"\n )\nresult_adsl <- build_table(lyt_adsl, df = adsl, alt_counts_df = adsl)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one AE\",\n nonunique = \"Total number of AEs\"\n ),\n .formats = list(unique = format_count_fraction_fixed_dp, nonunique = \"xx\"),\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = aesi_vars,\n denom = \"N_col\",\n var_labels = \"Total number of patients with at least one\",\n show_labels = \"visible\"\n )\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adae[1:2, ],\n result_adsl,\n result_adae[3:nrow(result_adae), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) \nTotal number of patients withdrawn from study due to an AE 3 (2.2%) 6 (4.5%) 5 (3.8%) \nTotal number of patients withdrawn informed consent 1 (0.7%) 1 (0.7%) 1 (0.8%) \nTotal number of patients with at least one \n AE with fatal outcome 5 (3.7%) 5 (3.7%) 6 (4.5%) \n Serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n AE leading to withdrawal from treatment 20 (14.9%) 24 (17.9%) 26 (19.7%) \n Related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n Grade 3-5 AE 90 (67.2%) 83 (61.9%) 93 (70.5%) \n Grade 4/5 AE 77 (57.5%) 70 (52.2%) 79 (59.8%) \n\n\n\n\n\nCodecount_subj_vars <- c(\"FATAL\", \"SER\", \"WD\", \"DSM\", \"REL\", \"CTC35\")\ncount_term_vars <- c(\"SER\", \"DSM\", \"REL\", \"CTC35\", \"CTC45\")\ncount_ae_vars <- c(\"SER\", \"DSM\", \"REL\", \"CTC35\", \"CTC45\")\n\n# Layout for variables from adsl dataset.\nlyt_adsl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DTHFL\" = \"Y\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of deaths\")\n ) %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"DCSREAS\" = \"ADVERSE EVENT\"),\n denom = \"N_col\",\n .labels = c(count_fraction = \"Total number of patients withdrawn from study due to an AE\"),\n table_names = \"tot_wd\"\n )\n\nresult_adsl <- build_table(lyt_adsl, df = adsl, alt_counts_df = adsl)\n\n# Layout for variables from adae dataset.\nlyt_adae <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one AE\",\n nonunique = \"Total number of AEs\"\n ),\n .formats = list(unique = format_count_fraction_fixed_dp, nonunique = \"xx\"),\n show_labels = \"hidden\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID\",\n flag_variables = count_subj_vars,\n denom = \"N_col\",\n var_labels = \"Total number of patients with at least one\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"AEDECOD\",\n flag_variables = count_term_vars,\n .stats = \"count\",\n .formats = c(count = \"xx\"),\n table_names = \"table_term\",\n var_labels = \"Total number of unique preferred terms which are\",\n show_labels = \"visible\"\n ) %>%\n count_patients_with_flags(\n \"USUBJID_AESEQ\",\n flag_variables = count_ae_vars,\n .stats = \"count\",\n .formats = c(count = \"xx\"),\n table_names = \"table_ae\",\n var_labels = \"Total number of adverse events which are\",\n show_labels = \"visible\"\n )\n\nresult_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)\n\n# Combine tables.\ncol_info(result_adsl) <- col_info(result_adae)\nresult <- rbind(\n result_adae[1:2, ],\n result_adsl,\n result_adae[3:nrow(result_adae), ]\n)\n\nresult\n\n A: Drug X B: Placebo C: Combination\n (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one AE 100 (74.6%) 98 (73.1%) 103 (78.0%) \nTotal number of AEs 502 480 604 \nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) \nTotal number of patients withdrawn from study due to an AE 3 (2.2%) 6 (4.5%) 5 (3.8%) \nTotal number of patients with at least one \n AE with fatal outcome 5 (3.7%) 5 (3.7%) 6 (4.5%) \n Serious AE 85 (63.4%) 80 (59.7%) 87 (65.9%) \n AE leading to withdrawal from treatment 20 (14.9%) 24 (17.9%) 26 (19.7%) \n AE leading to dose modification/interruption 63 (47.0%) 70 (52.2%) 77 (58.3%) \n Related AE 86 (64.2%) 85 (63.4%) 92 (69.7%) \n Grade 3-5 AE 90 (67.2%) 83 (61.9%) 93 (70.5%) \nTotal number of unique preferred terms which are \n Serious AE 4 4 4 \n AE leading to dose modification/interruption 10 10 10 \n Related AE 5 5 5 \n Grade 3-5 AE 5 5 5 \n Grade 4/5 AE 3 3 3 \nTotal number of adverse events which are \n Serious AE 204 194 245 \n AE leading to dose modification/interruption 123 135 158 \n Related AE 231 231 290 \n Grade 3-5 AE 249 229 277 \n Grade 4/5 AE 143 134 168 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n add_event_flags <- function(dat) {\n dat %>%\n mutate(\n TMPFL_SER = AESER == \"Y\",\n TMPFL_REL = AEREL == \"Y\",\n TMPFL_GR5 = AETOXGR == \"5\",\n TMP_SMQ01 = !is.na(SMQ01NAM),\n TMP_SMQ02 = !is.na(SMQ02NAM),\n TMP_CQ01 = !is.na(CQ01NAM)\n ) %>%\n col_relabel(\n TMPFL_SER = \"Serious AE\",\n TMPFL_REL = \"Related AE\",\n TMPFL_GR5 = \"Grade 5 AE\",\n TMP_SMQ01 = aesi_label(dat[[\"SMQ01NAM\"]], dat[[\"SMQ01SC\"]]),\n TMP_SMQ02 = aesi_label(dat[[\"SMQ02NAM\"]], dat[[\"SMQ02SC\"]]),\n TMP_CQ01 = aesi_label(dat[[\"CQ01NAM\"]])\n )\n }\n\n # Generating user-defined event flags.\n ADAE <- ADAE %>% add_event_flags()\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAE <- data[[\"ADAE\"]]\nae_anl_vars <- names(ADAE)[startsWith(names(ADAE), \"TMPFL_\")]\naesi_vars <- names(ADAE)[startsWith(names(ADAE), \"TMP_\")]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_summary(\n label = \"Adverse Events Summary\",\n dataname = \"ADAE\",\n arm_var = choices_selected(\n choices = variable_choices(\"ADSL\", c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n flag_var_anl = choices_selected(\n choices = variable_choices(\"ADAE\", ae_anl_vars),\n selected = ae_anl_vars[1],\n keep_order = TRUE,\n fixed = FALSE\n ),\n flag_var_aesi = choices_selected(\n choices = variable_choices(\"ADAE\", aesi_vars),\n selected = aesi_vars[1],\n keep_order = TRUE,\n fixed = FALSE\n ),\n add_total = TRUE\n )\n )\n)\n\nWarning in rlang::hash(list(data = data, modules = modules)):\n'package:teal.modules.clinical' may not be available when loading\n\nCodeshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:45:17 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable with Patients Treated with a Particular Treatment by Highest NCI CTCAE Grade (specifying a treatment for selecting preferred terms)\nAdverse Events Reported in \\(\\geq\\) 5% of Patients by Highest NCI CTCAE Grade (changing the threshold)\nAdverse Events Reported in \\(\\geq\\) 5% of Patients and \\(\\geq\\) 2% Difference Between Treatments by Highest NCI CTCAE Grade (using more than one condition)\nAdverse Events Reported in \\(\\geq\\) 10% of Patients for Any Grade or \\(\\geq\\) 5% of Patients for Grade 3-4 by Highest NCI CTCAE Grade (using different condition depending on the grade)\nStandard Table with Modified Grade Grouping\nStandard Table with Overlapping Grade Groupings\nStandard Table without SOCs\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\npreprocess_adae <- function(adae) {\n adae %>%\n dplyr::group_by(ACTARM, USUBJID, AEBODSYS, AEDECOD) %>%\n dplyr::summarize(\n MAXAETOXGR = max(as.numeric(AETOXGR)),\n .groups = \"drop\"\n ) %>%\n dplyr::ungroup() %>%\n dplyr::mutate(\n MAXAETOXGR = factor(MAXAETOXGR),\n AEDECOD = droplevels(as.factor(AEDECOD))\n )\n}\n\nfull_table_aet04_pi <- function(adsl, adae_max) {\n grade_groups <- list(\n \"Any Grade (%)\" = c(\"1\", \"2\", \"3\", \"4\", \"5\"),\n \"Grade 3-4 (%)\" = c(\"3\", \"4\"),\n \"Grade 5 (%)\" = \"5\"\n )\n\n col_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))\n basic_table() %>%\n split_cols_by(\"ACTARM\") %>%\n split_cols_by_groups(\"MAXAETOXGR\", groups_list = grade_groups) %>%\n split_rows_by(\"AEBODSYS\",\n child_labels = \"visible\", nested = FALSE, indent_mod = -1L,\n split_fun = trim_levels_in_group(\"AEDECOD\")\n ) %>%\n append_topleft(\"MedDRA System Organ Class\") %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n analyze_vars(\n \"AEDECOD\",\n na.rm = FALSE,\n denom = \"N_col\",\n .stats = \"count_fraction\",\n .formats = c(count_fraction = format_fraction_threshold(0.01))\n ) %>%\n append_topleft(\" MedDRA Preferred Term\") %>%\n build_table(adae_max, col_counts = col_counts)\n}\n\ncriteria_fun <- function(tr) {\n is(tr, \"ContentRow\")\n}\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae_max <- synthetic_cdisc_dataset(\"latest\", \"adae\") %>%\n preprocess_adae() %>%\n df_explicit_na()\n\n\n\n\n\nCodefull_table <- full_table_aet04_pi(adsl, adae_max) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nat_least_10percent_any <- has_fraction_in_any_col(atleast = 0.1, col_indices = c(1, 4, 7))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_10percent_any))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 0 0 34 0 0 48 0 0 \ndcd A.1.1.1.2 36 0 0 36 0 0 38 0 0 \ncl B.2 \ndcd B.2.2.3.1 36 0 0 40 0 0 39 0 0 \ndcd B.2.1.2.1 37 37 0 33 33 0 39 39 0 \ncl D.1 \ndcd D.1.1.1.1 37 0 37 31 0 31 39 0 39 \ndcd D.1.1.4.2 36 36 0 31 31 0 38 38 0 \ncl D.2 \ndcd D.2.1.5.3 35 0 0 43 0 0 43 0 0 \ncl B.1 \ndcd B.1.1.1.1 35 0 35 37 0 37 33 0 33 \ncl C.2 \ndcd C.2.1.2.1 26 0 0 36 0 0 42 0 0 \ncl C.1 \ndcd C.1.1.1.3 32 32 0 34 34 0 33 33 0 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example uses the “Any Grade” column for treatment A: Drug X with a filtering threshold at 0.37; AEs reported in greater than 37% of patients in treatment A: Drug X are shown. This can be changed by varying the parameter values in the has_fraction_in_cols function.\n\nCodefull_table <- full_table_aet04_pi(adsl, adae_max) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nat_least_37percent_any_drugx <- has_fraction_in_cols(atleast = 0.37, col_indices = 1)\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_37percent_any_drugx))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 0 0 34 0 0 48 0 0 \ncl D.1 \ndcd D.1.1.1.1 37 0 37 31 0 31 39 0 39 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 with a filtering threshold at 0.40 to demonstrate the filtering ability; AEs reported in greater than 40% of patients are shown. This can be changed by varying the parameter values in the has_fraction_in_any_col function.\n\nCodefull_table <- full_table_aet04_pi(adsl, adae_max) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nat_least_40percent_any <- has_fraction_in_any_col(atleast = 0.40, col_indices = c(1, 4, 7))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_40percent_any))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 0 0 34 0 0 48 0 0 \ncl B.2 \ndcd B.2.2.3.1 36 0 0 40 0 0 39 0 0 \ncl D.2 \ndcd D.2.1.5.3 35 0 0 43 0 0 43 0 0 \ncl C.2 \ndcd C.2.1.2.1 26 0 0 36 0 0 42 0 0 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 to filter for AEs reported in \\(\\geq\\) 30% of patients and AEs reported with a \\(\\geq\\) 15% difference between treatments to demonstrate the filtering ability; this can be changed by varying the parameter values in the has_fraction_in_any_col and has_fractions_difference functions.\n\nCodefull_table <- full_table_aet04_pi(adsl, adae_max) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nat_least_30percent_any <- has_fraction_in_any_col(atleast = 0.3, col_indices = c(1, 4, 7))\n\nat_least_15percent_diff <- has_fractions_difference(atleast = 0.15, col_indices = c(1, 4, 7))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_30percent_any & at_least_15percent_diff))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl C.2 \ndcd C.2.1.2.1 26 0 0 36 0 0 42 0 0 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example filters using column indices 1, 4, and 7 to include AEs reported in \\(\\geq\\) 40% of patients and using column indices 2, 5, and 8 to include grade 3-4 AEs reported in \\(\\geq\\) 20% of patients. These thresholds are chosen to demonstrate the filtering ability; they can be changed by varying parameter values in the has_fraction_in_any_col function.\n\nCodefull_table <- full_table_aet04_pi(adsl, adae_max) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nat_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 4, 7))\n\nat_least_20percent_g34 <- has_fraction_in_any_col(atleast = 0.20, col_indices = c(2, 5, 8))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_40percent_any | at_least_20percent_g34))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 0 0 34 0 0 48 0 0 \ncl B.2 \ndcd B.2.2.3.1 36 0 0 40 0 0 39 0 0 \ndcd B.2.1.2.1 37 37 0 33 33 0 39 39 0 \ncl D.1 \ndcd D.1.1.4.2 36 36 0 31 31 0 38 38 0 \ncl D.2 \ndcd D.2.1.5.3 35 0 0 43 0 0 43 0 0 \ncl C.2 \ndcd C.2.1.2.1 26 0 0 36 0 0 42 0 0 \ncl C.1 \ndcd C.1.1.1.3 32 32 0 34 34 0 33 33 0 \n\n\n\n\nNote: User can specify/modify the grouping of grades, as shown in this example. In addition, the user needs to specify the column index for filtering the table. The current example uses the “Any Grade” columns with a filtering threshold at 0.40; this can be changed by varying the parameter values in the has_fraction_in_any_col function.\n\nCodegrade_groups <- list(\n \"Any Grade (%)\" = c(\"1\", \"2\", \"3\", \"4\", \"5\"),\n \"Grade 1-2 (%)\" = c(\"1\", \"2\"),\n \"Grade 3-4 (%)\" = c(\"3\", \"4\"),\n \"Grade 5 (%)\" = \"5\"\n)\n\ncol_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))\n\nfull_table <- basic_table() %>%\n split_cols_by(\"ACTARM\") %>%\n split_cols_by_groups(\"MAXAETOXGR\", groups_list = grade_groups) %>%\n split_rows_by(\"AEBODSYS\",\n child_labels = \"visible\", nested = FALSE, indent_mod = -1L,\n split_fun = trim_levels_in_group(\"AEDECOD\")\n ) %>%\n append_topleft(\"MedDRA System Organ Class\") %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n analyze_vars(\n \"AEDECOD\",\n na.rm = FALSE,\n denom = \"N_col\",\n .stats = \"count_fraction\",\n .formats = c(count_fraction = format_fraction_threshold(0.01))\n ) %>%\n append_topleft(\" MedDRA Preferred Term\") %>%\n build_table(adae_max, col_counts = col_counts) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 5, 9)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 5, 9)),\n decreasing = TRUE\n )\n\nat_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 5, 9))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_40percent_any))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 1-2 (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 1-2 (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 1-2 (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 37 0 0 34 34 0 0 48 48 0 0 \ncl B.2 \ndcd B.2.2.3.1 36 36 0 0 40 40 0 0 39 39 0 0 \ncl D.2 \ndcd D.2.1.5.3 35 35 0 0 43 43 0 0 43 43 0 0 \ncl C.2 \ndcd C.2.1.2.1 26 26 0 0 36 36 0 0 42 42 0 0 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example uses column indices 1, 5, and 9 with a filtering threshold at 0.40 to demonstrate the filtering ability; any grade AEs reported in greater than 40% of patients are shown. This can be changed by varying the parameter values in the has_fraction_in_any_col function.\n\nCodegrade_groups <- list(\n \"Any Grade (%)\" = c(\"1\", \"2\", \"3\", \"4\", \"5\"),\n \"Grade 3-4 (%)\" = c(\"3\", \"4\"),\n \"Grade 3-5 (%)\" = c(\"3\", \"4\", \"5\"),\n \"Grade 5 (%)\" = \"5\"\n)\n\ncol_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))\nfull_table <- basic_table() %>%\n split_cols_by(\"ACTARM\") %>%\n split_cols_by_groups(\"MAXAETOXGR\", groups_list = grade_groups) %>%\n split_rows_by(\"AEBODSYS\",\n child_labels = \"visible\", nested = FALSE, indent_mod = -1L,\n split_fun = trim_levels_in_group(\"AEDECOD\")\n ) %>%\n append_topleft(\"MedDRA System Organ Class\") %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n analyze_vars(\n \"AEDECOD\",\n na.rm = FALSE,\n denom = \"N_col\",\n .stats = \"count_fraction\",\n .formats = c(count_fraction = format_fraction_threshold(0.01))\n ) %>%\n append_topleft(\" MedDRA Preferred Term\") %>%\n build_table(adae_max, col_counts = col_counts) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 5, 9)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 5, 9)),\n decreasing = TRUE\n )\n\nat_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 5, 9))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_40percent_any))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 3-5 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 3-5 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 3-5 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 0 0 0 34 0 0 0 48 0 0 0 \ncl B.2 \ndcd B.2.2.3.1 36 0 0 0 40 0 0 0 39 0 0 0 \ncl D.2 \ndcd D.2.1.5.3 35 0 0 0 43 0 0 0 43 0 0 0 \ncl C.2 \ndcd C.2.1.2.1 26 0 0 0 36 0 0 0 42 0 0 0 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 with a filtering threshold at 0.20 to demonstrate the filtering ability; any grade AEs (Preferred Terms Only) reported in greater than 20% of patients are shown. This can be changed by varying the parameter values in the has_fraction_in_any_col function.\n\nCodegrade_groups <- list(\n \"Any Grade (%)\" = c(\"1\", \"2\", \"3\", \"4\", \"5\"),\n \"Grade 3-4 (%)\" = c(\"3\", \"4\"),\n \"Grade 5 (%)\" = \"5\"\n)\n\ncol_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))\n\nfull_table <- basic_table() %>%\n split_cols_by(\"ACTARM\") %>%\n split_cols_by_groups(\"MAXAETOXGR\", groups_list = grade_groups) %>%\n analyze_vars(\n \"AEDECOD\",\n na.rm = FALSE,\n denom = \"N_col\",\n .stats = \"count_fraction\",\n .formats = c(count_fraction = format_fraction_threshold(0.01))\n ) %>%\n append_topleft(\"MedDRA Preferred Term\") %>%\n build_table(adae_max, col_counts = col_counts)\n\nat_least_20percent_any <- has_fraction_in_any_col(atleast = 0.2, col_indices = c(1, 4, 7))\n\nresult <- full_table %>%\n prune_table(keep_rows(at_least_20percent_any)) %>%\n sort_at_path(\n path = c(\"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination \n Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\nMedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ndcd D.2.1.5.3 35 0 0 43 0 0 43 0 0 \ndcd A.1.1.1.1 37 0 0 34 0 0 48 0 0 \ndcd B.2.2.3.1 36 0 0 40 0 0 39 0 0 \ndcd A.1.1.1.2 36 0 0 36 0 0 38 0 0 \ndcd B.2.1.2.1 37 37 0 33 33 0 39 39 0 \ndcd D.1.1.1.1 37 0 37 31 0 31 39 0 39 \ndcd D.1.1.4.2 36 36 0 31 31 0 38 38 0 \ndcd B.1.1.1.1 35 0 35 37 0 37 33 0 33 \ndcd C.2.1.2.1 26 0 0 36 0 0 42 0 0 \ndcd C.1.1.1.3 32 32 0 34 34 0 33 33 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_by_grade(\n label = \"Adverse Events by Grade Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n col_by_grade = TRUE,\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = \"AEBODSYS\"\n ),\n grade = choices_selected(\n choices = variable_choices(ADAE, c(\"AETOXGR\", \"AESEV\")),\n selected = \"AETOXGR\"\n ),\n # List of column groups for grades used when `col_by_grade` = TRUE.\n grading_groups = list(\n `Any Grade (%)` = c(\"1\", \"2\", \"3\", \"4\", \"5\"),\n `Grade 3-4 (%)` = c(\"3\", \"4\"),\n `Grade 5 (%)` = \"5\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:44:34 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", - "AET01" + "AET04_PI" ] }, { - "objectID": "tables/adverse-events/aet04_pi.html", - "href": "tables/adverse-events/aet04_pi.html", - "title": "AET04_PI", + "objectID": "tables/adverse-events/aet09_smq.html", + "href": "tables/adverse-events/aet09_smq.html", + "title": "AET09_SMQ", "section": "", - "text": "Data Setup\nStandard Table\nTable with Patients Treated with a Particular Treatment by Highest NCI CTCAE Grade (specifying a treatment for selecting preferred terms)\nAdverse Events Reported in \\(\\geq\\) 5% of Patients by Highest NCI CTCAE Grade (changing the threshold)\nAdverse Events Reported in \\(\\geq\\) 5% of Patients and \\(\\geq\\) 2% Difference Between Treatments by Highest NCI CTCAE Grade (using more than one condition)\nAdverse Events Reported in \\(\\geq\\) 10% of Patients for Any Grade or \\(\\geq\\) 5% of Patients for Grade 3-4 by Highest NCI CTCAE Grade (using different condition depending on the grade)\nStandard Table with Modified Grade Grouping\nStandard Table with Overlapping Grade Groupings\nStandard Table without SOCs\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\npreprocess_adae <- function(adae) {\n adae %>%\n dplyr::group_by(ACTARM, USUBJID, AEBODSYS, AEDECOD) %>%\n dplyr::summarize(\n MAXAETOXGR = max(as.numeric(AETOXGR)),\n .groups = \"drop\"\n ) %>%\n dplyr::ungroup() %>%\n dplyr::mutate(\n MAXAETOXGR = factor(MAXAETOXGR),\n AEDECOD = droplevels(as.factor(AEDECOD))\n )\n}\n\nfull_table_aet04_pi <- function(adsl, adae_max) {\n grade_groups <- list(\n \"Any Grade (%)\" = c(\"1\", \"2\", \"3\", \"4\", \"5\"),\n \"Grade 3-4 (%)\" = c(\"3\", \"4\"),\n \"Grade 5 (%)\" = \"5\"\n )\n\n col_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))\n basic_table() %>%\n split_cols_by(\"ACTARM\") %>%\n split_cols_by_groups(\"MAXAETOXGR\", groups_list = grade_groups) %>%\n split_rows_by(\"AEBODSYS\",\n child_labels = \"visible\", nested = FALSE, indent_mod = -1L,\n split_fun = trim_levels_in_group(\"AEDECOD\")\n ) %>%\n append_topleft(\"MedDRA System Organ Class\") %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n analyze_vars(\n \"AEDECOD\",\n na.rm = FALSE,\n denom = \"N_col\",\n .stats = \"count_fraction\",\n .formats = c(count_fraction = format_fraction_threshold(0.01))\n ) %>%\n append_topleft(\" MedDRA Preferred Term\") %>%\n build_table(adae_max, col_counts = col_counts)\n}\n\ncriteria_fun <- function(tr) {\n is(tr, \"ContentRow\")\n}\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae_max <- synthetic_cdisc_dataset(\"latest\", \"adae\") %>%\n preprocess_adae() %>%\n df_explicit_na()\n\n\n\n\n\nCodefull_table <- full_table_aet04_pi(adsl, adae_max) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nat_least_10percent_any <- has_fraction_in_any_col(atleast = 0.1, col_indices = c(1, 4, 7))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_10percent_any))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 0 0 34 0 0 48 0 0 \ndcd A.1.1.1.2 36 0 0 36 0 0 38 0 0 \ncl B.2 \ndcd B.2.2.3.1 36 0 0 40 0 0 39 0 0 \ndcd B.2.1.2.1 37 37 0 33 33 0 39 39 0 \ncl D.1 \ndcd D.1.1.1.1 37 0 37 31 0 31 39 0 39 \ndcd D.1.1.4.2 36 36 0 31 31 0 38 38 0 \ncl D.2 \ndcd D.2.1.5.3 35 0 0 43 0 0 43 0 0 \ncl B.1 \ndcd B.1.1.1.1 35 0 35 37 0 37 33 0 33 \ncl C.2 \ndcd C.2.1.2.1 26 0 0 36 0 0 42 0 0 \ncl C.1 \ndcd C.1.1.1.3 32 32 0 34 34 0 33 33 0 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example uses the “Any Grade” column for treatment A: Drug X with a filtering threshold at 0.37; AEs reported in greater than 37% of patients in treatment A: Drug X are shown. This can be changed by varying the parameter values in the has_fraction_in_cols function.\n\nCodefull_table <- full_table_aet04_pi(adsl, adae_max) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nat_least_37percent_any_drugx <- has_fraction_in_cols(atleast = 0.37, col_indices = 1)\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_37percent_any_drugx))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 0 0 34 0 0 48 0 0 \ncl D.1 \ndcd D.1.1.1.1 37 0 37 31 0 31 39 0 39 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 with a filtering threshold at 0.40 to demonstrate the filtering ability; AEs reported in greater than 40% of patients are shown. This can be changed by varying the parameter values in the has_fraction_in_any_col function.\n\nCodefull_table <- full_table_aet04_pi(adsl, adae_max) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nat_least_40percent_any <- has_fraction_in_any_col(atleast = 0.40, col_indices = c(1, 4, 7))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_40percent_any))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 0 0 34 0 0 48 0 0 \ncl B.2 \ndcd B.2.2.3.1 36 0 0 40 0 0 39 0 0 \ncl D.2 \ndcd D.2.1.5.3 35 0 0 43 0 0 43 0 0 \ncl C.2 \ndcd C.2.1.2.1 26 0 0 36 0 0 42 0 0 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 to filter for AEs reported in \\(\\geq\\) 30% of patients and AEs reported with a \\(\\geq\\) 15% difference between treatments to demonstrate the filtering ability; this can be changed by varying the parameter values in the has_fraction_in_any_col and has_fractions_difference functions.\n\nCodefull_table <- full_table_aet04_pi(adsl, adae_max) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nat_least_30percent_any <- has_fraction_in_any_col(atleast = 0.3, col_indices = c(1, 4, 7))\n\nat_least_15percent_diff <- has_fractions_difference(atleast = 0.15, col_indices = c(1, 4, 7))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_30percent_any & at_least_15percent_diff))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl C.2 \ndcd C.2.1.2.1 26 0 0 36 0 0 42 0 0 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example filters using column indices 1, 4, and 7 to include AEs reported in \\(\\geq\\) 40% of patients and using column indices 2, 5, and 8 to include grade 3-4 AEs reported in \\(\\geq\\) 20% of patients. These thresholds are chosen to demonstrate the filtering ability; they can be changed by varying parameter values in the has_fraction_in_any_col function.\n\nCodefull_table <- full_table_aet04_pi(adsl, adae_max) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nat_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 4, 7))\n\nat_least_20percent_g34 <- has_fraction_in_any_col(atleast = 0.20, col_indices = c(2, 5, 8))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_40percent_any | at_least_20percent_g34))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 0 0 34 0 0 48 0 0 \ncl B.2 \ndcd B.2.2.3.1 36 0 0 40 0 0 39 0 0 \ndcd B.2.1.2.1 37 37 0 33 33 0 39 39 0 \ncl D.1 \ndcd D.1.1.4.2 36 36 0 31 31 0 38 38 0 \ncl D.2 \ndcd D.2.1.5.3 35 0 0 43 0 0 43 0 0 \ncl C.2 \ndcd C.2.1.2.1 26 0 0 36 0 0 42 0 0 \ncl C.1 \ndcd C.1.1.1.3 32 32 0 34 34 0 33 33 0 \n\n\n\n\nNote: User can specify/modify the grouping of grades, as shown in this example. In addition, the user needs to specify the column index for filtering the table. The current example uses the “Any Grade” columns with a filtering threshold at 0.40; this can be changed by varying the parameter values in the has_fraction_in_any_col function.\n\nCodegrade_groups <- list(\n \"Any Grade (%)\" = c(\"1\", \"2\", \"3\", \"4\", \"5\"),\n \"Grade 1-2 (%)\" = c(\"1\", \"2\"),\n \"Grade 3-4 (%)\" = c(\"3\", \"4\"),\n \"Grade 5 (%)\" = \"5\"\n)\n\ncol_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))\n\nfull_table <- basic_table() %>%\n split_cols_by(\"ACTARM\") %>%\n split_cols_by_groups(\"MAXAETOXGR\", groups_list = grade_groups) %>%\n split_rows_by(\"AEBODSYS\",\n child_labels = \"visible\", nested = FALSE, indent_mod = -1L,\n split_fun = trim_levels_in_group(\"AEDECOD\")\n ) %>%\n append_topleft(\"MedDRA System Organ Class\") %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n analyze_vars(\n \"AEDECOD\",\n na.rm = FALSE,\n denom = \"N_col\",\n .stats = \"count_fraction\",\n .formats = c(count_fraction = format_fraction_threshold(0.01))\n ) %>%\n append_topleft(\" MedDRA Preferred Term\") %>%\n build_table(adae_max, col_counts = col_counts) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 5, 9)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 5, 9)),\n decreasing = TRUE\n )\n\nat_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 5, 9))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_40percent_any))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 1-2 (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 1-2 (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 1-2 (%) Grade 3-4 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 37 0 0 34 34 0 0 48 48 0 0 \ncl B.2 \ndcd B.2.2.3.1 36 36 0 0 40 40 0 0 39 39 0 0 \ncl D.2 \ndcd D.2.1.5.3 35 35 0 0 43 43 0 0 43 43 0 0 \ncl C.2 \ndcd C.2.1.2.1 26 26 0 0 36 36 0 0 42 42 0 0 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example uses column indices 1, 5, and 9 with a filtering threshold at 0.40 to demonstrate the filtering ability; any grade AEs reported in greater than 40% of patients are shown. This can be changed by varying the parameter values in the has_fraction_in_any_col function.\n\nCodegrade_groups <- list(\n \"Any Grade (%)\" = c(\"1\", \"2\", \"3\", \"4\", \"5\"),\n \"Grade 3-4 (%)\" = c(\"3\", \"4\"),\n \"Grade 3-5 (%)\" = c(\"3\", \"4\", \"5\"),\n \"Grade 5 (%)\" = \"5\"\n)\n\ncol_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))\nfull_table <- basic_table() %>%\n split_cols_by(\"ACTARM\") %>%\n split_cols_by_groups(\"MAXAETOXGR\", groups_list = grade_groups) %>%\n split_rows_by(\"AEBODSYS\",\n child_labels = \"visible\", nested = FALSE, indent_mod = -1L,\n split_fun = trim_levels_in_group(\"AEDECOD\")\n ) %>%\n append_topleft(\"MedDRA System Organ Class\") %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = \"Total number of patients with at least one adverse event\"\n ) %>%\n analyze_vars(\n \"AEDECOD\",\n na.rm = FALSE,\n denom = \"N_col\",\n .stats = \"count_fraction\",\n .formats = c(count_fraction = format_fraction_threshold(0.01))\n ) %>%\n append_topleft(\" MedDRA Preferred Term\") %>%\n build_table(adae_max, col_counts = col_counts) %>%\n sort_at_path(\n path = c(\"AEBODSYS\"),\n scorefun = score_occurrences_cont_cols(col_indices = c(1, 5, 9)),\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 5, 9)),\n decreasing = TRUE\n )\n\nat_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 5, 9))\n\nresult <- full_table %>%\n trim_rows(criteria = criteria_fun) %>%\n prune_table(keep_rows(at_least_40percent_any))\n\nresult\n\n A: Drug X B: Placebo C: Combination \nMedDRA System Organ Class Any Grade (%) Grade 3-4 (%) Grade 3-5 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 3-5 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 3-5 (%) Grade 5 (%)\n MedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ncl A.1 \ndcd A.1.1.1.1 37 0 0 0 34 0 0 0 48 0 0 0 \ncl B.2 \ndcd B.2.2.3.1 36 0 0 0 40 0 0 0 39 0 0 0 \ncl D.2 \ndcd D.2.1.5.3 35 0 0 0 43 0 0 0 43 0 0 0 \ncl C.2 \ndcd C.2.1.2.1 26 0 0 0 36 0 0 0 42 0 0 0 \n\n\n\n\nNote: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 with a filtering threshold at 0.20 to demonstrate the filtering ability; any grade AEs (Preferred Terms Only) reported in greater than 20% of patients are shown. This can be changed by varying the parameter values in the has_fraction_in_any_col function.\n\nCodegrade_groups <- list(\n \"Any Grade (%)\" = c(\"1\", \"2\", \"3\", \"4\", \"5\"),\n \"Grade 3-4 (%)\" = c(\"3\", \"4\"),\n \"Grade 5 (%)\" = \"5\"\n)\n\ncol_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))\n\nfull_table <- basic_table() %>%\n split_cols_by(\"ACTARM\") %>%\n split_cols_by_groups(\"MAXAETOXGR\", groups_list = grade_groups) %>%\n analyze_vars(\n \"AEDECOD\",\n na.rm = FALSE,\n denom = \"N_col\",\n .stats = \"count_fraction\",\n .formats = c(count_fraction = format_fraction_threshold(0.01))\n ) %>%\n append_topleft(\"MedDRA Preferred Term\") %>%\n build_table(adae_max, col_counts = col_counts)\n\nat_least_20percent_any <- has_fraction_in_any_col(atleast = 0.2, col_indices = c(1, 4, 7))\n\nresult <- full_table %>%\n prune_table(keep_rows(at_least_20percent_any)) %>%\n sort_at_path(\n path = c(\"AEDECOD\"),\n scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),\n decreasing = TRUE\n )\n\nresult\n\n A: Drug X B: Placebo C: Combination \n Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%) Any Grade (%) Grade 3-4 (%) Grade 5 (%)\nMedDRA Preferred Term (N=134) (N=134) (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\ndcd D.2.1.5.3 35 0 0 43 0 0 43 0 0 \ndcd A.1.1.1.1 37 0 0 34 0 0 48 0 0 \ndcd B.2.2.3.1 36 0 0 40 0 0 39 0 0 \ndcd A.1.1.1.2 36 0 0 36 0 0 38 0 0 \ndcd B.2.1.2.1 37 37 0 33 33 0 39 39 0 \ndcd D.1.1.1.1 37 0 37 31 0 31 39 0 39 \ndcd D.1.1.4.2 36 36 0 31 31 0 38 38 0 \ndcd B.1.1.1.1 35 0 35 37 0 37 33 0 33 \ndcd C.2.1.2.1 26 0 0 36 0 0 42 0 0 \ndcd C.1.1.1.3 32 32 0 34 34 0 33 33 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_by_grade(\n label = \"Adverse Events by Grade Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n col_by_grade = TRUE,\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = \"AEBODSYS\"\n ),\n grade = choices_selected(\n choices = variable_choices(ADAE, c(\"AETOXGR\", \"AESEV\")),\n selected = \"AETOXGR\"\n ),\n # List of column groups for grades used when `col_by_grade` = TRUE.\n grading_groups = list(\n `Any Grade (%)` = c(\"1\", \"2\", \"3\", \"4\", \"5\"),\n `Grade 3-4 (%)` = c(\"3\", \"4\"),\n `Grade 5 (%)` = \"5\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:45:55 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable with Customized Queries\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\nlibrary(stringr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing\n# levels. For details, refer to Teal and Study Data article.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\n# AEs are filtered for relatedness to study drug.\nadae_rel <- adae %>% filter(AEREL == \"Y\")\n\n# Simulate a random AAG dataset.\naag <- data.frame(\n NAMVAR = c(\"SMQ01NAM\", \"SMQ01NAM\", \"SMQ02NAM\", \"CQ01NAM\", \"CQ01NAM\"),\n SRCVAR = rep(\"AEDECOD\", 5),\n GRPTYPE = c(\"SMQ\", \"SMQ\", \"SMQ\", \"CUSTOM\", \"CUSTOM\"),\n REFID = c(1, 1, 2, 3, 3),\n REFNAME = c(rep(\"C.1.1.1.3/B.2.2.3.1 AESI\", 2), \"non observed SMQ02NAM level\", rep(\"D.2.1.5.3/A.1.1.1.1 AESI\", 2)),\n SCOPE = c(\"BROAD\", \"BROAD\", \"BROAD\", \"\", \"\"),\n REFTERM = c(\"C.1.1.1.3\", \"B.2.2.3.1\", \"Z.9.9.9.9\", \"D.2.1.5.3\", \"A.1.1.1.1\"),\n stringsAsFactors = FALSE\n)\n\n# Create summary AAG dataset (used for labelling).\n# Note it's important to incorporate SCOPE into the basket names for SMQs so as to\n# match the flags present in ADAE.\naag_summary <- aag %>%\n select(NAMVAR, REFNAME, SCOPE) %>%\n unique() %>%\n mutate(\n REFNAME_SCOPE = ifelse(SCOPE == \"\", REFNAME, paste0(REFNAME, \"(\", SCOPE, \")\"))\n ) %>%\n rename(basket = NAMVAR, basket_name = REFNAME_SCOPE) %>%\n select(basket, basket_name)\n\n# Make a summary of the full ADAE based on AAG by using h_stack_by_baskets helper function\nadae_smq_all <- h_stack_by_baskets(\n df = adae_rel,\n aag_summary = aag_summary,\n keys = c(\"STUDYID\", \"USUBJID\", \"ACTARMCD\", \"AEDECOD\")\n)\n\n# Post-process adae_smq_all to keep only certain baskets of interest for variant 1\n# Not need to drop baskets for variant 2 as all baskets will be considered.\nbaskets_to_drop_variant <- aag_summary$basket_name[!aag_summary$basket %in% c(\"SMQ01NAM\")]\n\n# Adjust the analysis dataset based on basket subset for variant 1.\nadae_smq_1 <- adae_smq_all %>%\n filter(!adae_smq_all$SMQ %in% baskets_to_drop_variant) %>%\n mutate(\n SMQ = tern::fct_discard(SMQ, discard = baskets_to_drop_variant)\n )\n\n\n\n\n\nCodecriteria_fun <- function(tr) !is(tr, \"ContentRow\") && all_zero_or_na(tr)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\"\n )\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n )\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n .indent_mods = -1L,\n drop = FALSE\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt,\n df = adae_smq_1,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = cont_n_allcols) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\nStandardized MedDRA Query ARM A ARM B ARM C \n Dictionary-Derived Term (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 43 (32.1%) 46 (34.3%) 43 (32.6%)\nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 43 (32.1%) 46 (34.3%) 43 (32.6%)\n Total number of events 55 63 64 \n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%)\n\n\n\n\n\nCodecriteria_fun <- function(tr) {\n !is(tr, \"ContentRow\") && all_zero_or_na(tr) && !grepl(\"Total number of\", obj_label(tr))\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\"\n )\n ) %>%\n split_rows_by(\n \"SMQ\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = trim_levels_in_group(\"AEDECOD\", drop_outlevs = FALSE),\n label_pos = \"topleft\",\n split_label = \"Standardized MedDRA Query\"\n ) %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one adverse event\",\n nonunique = \"Total number of events\"\n ),\n show_labels = \"hidden\"\n ) %>%\n count_occurrences(\n vars = \"AEDECOD\",\n drop = FALSE\n ) %>%\n append_varlabels(adae, \"AEDECOD\", indent = 1L)\n\nscore_ae_pts <- function(tt) {\n count_vals <- cell_values(tree_children(tt)[[\"USUBJID\"]])[[1]]\n sum(matrix(unlist(count_vals), nrow = length(count_vals), byrow = TRUE)[, 1])\n}\n\nresult <- build_table(\n lyt,\n df = adae_smq_all,\n alt_counts_df = adsl\n) %>%\n sort_at_path(path = c(\"SMQ\"), scorefun = score_ae_pts) %>%\n sort_at_path(path = c(\"SMQ\", \"*\", \"AEDECOD\"), scorefun = score_occurrences, na.pos = \"last\") %>%\n trim_rows(criteria = criteria_fun)\n\nresult\n\nStandardized MedDRA Query ARM A ARM B ARM C \n Dictionary-Derived Term (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one adverse event 69 (51.5%) 78 (58.2%) 77 (58.3%)\nD.2.1.5.3/A.1.1.1.1 AESI \n Total number of patients with at least one adverse event 47 (35.1%) 58 (43.3%) 57 (43.2%)\n Total number of events 62 72 74 \n dcd D.2.1.5.3 47 (35.1%) 58 (43.3%) 57 (43.2%)\nC.1.1.1.3/B.2.2.3.1 AESI(BROAD) \n Total number of patients with at least one adverse event 43 (32.1%) 46 (34.3%) 43 (32.6%)\n Total number of events 55 63 64 \n dcd C.1.1.1.3 43 (32.1%) 46 (34.3%) 43 (32.6%)\nnon observed SMQ02NAM level(BROAD) \n Total number of patients with at least one adverse event 0 0 0 \n Total number of events 0 0 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nNote that filtering AEs for relatedness to study drug is not a necessary data pre-processing step for the module. It can be achieved using the teal module filter panel. The example here pre-sets the filters using AEREL = \"Y\" in adae.\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAE <- data[[\"ADAE\"]]\n\nnames_baskets <- grep(\"^(SMQ|CQ).*NAM$\", names(ADAE), value = TRUE)\nnames_scopes <- grep(\"^SMQ.*SC$\", names(ADAE), value = TRUE)\n\ncs_baskets <- choices_selected(\n choices = variable_choices(ADAE, subset = names_baskets),\n selected = names_baskets\n)\ncs_scopes <- choices_selected(\n choices = variable_choices(ADAE, subset = names_scopes),\n selected = names_scopes,\n fixed = TRUE\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_smq(\n label = \"Adverse Events by SMQ Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"SEX\")),\n selected = \"ARM\"\n ),\n add_total = FALSE,\n baskets = cs_baskets,\n scopes = cs_scopes,\n llt = choices_selected(\n choices = variable_choices(ADAE, subset = c(\"AEDECOD\")),\n selected = \"AEDECOD\"\n )\n )\n ),\n filter = teal_slices(teal_slice(\"ADAE\", \"AEREL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:45:05 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 stringr_1.5.1 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Adverse Events", - "AET04_PI" + "AET09_SMQ" ] }, { - "objectID": "tables/vital-signs/vst01.html", - "href": "tables/vital-signs/vst01.html", - "title": "VST01", + "objectID": "tables/adverse-events/aet03.html", + "href": "tables/adverse-events/aet03.html", + "title": "AET03", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadvs <- synthetic_cdisc_dataset(\"latest\", \"advs\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadvs <- df_explicit_na(advs)\n\nadvs_label <- var_labels(advs)\n\nadvs <- advs %>%\n filter(\n PARAMCD == \"DIABP\",\n PARAM == \"Diastolic Blood Pressure\"\n ) %>%\n mutate(\n PARAMCD = droplevels(PARAMCD),\n PARAM = droplevels(PARAM)\n )\n\n# post-baseline\nadvs_pb <- advs %>%\n filter(ABLFL != \"Y\", ABLFL2 != \"Y\")\n\nadvs_pb_max <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(desc(AVAL)) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Maximum\")\n\nadvs_pb_min <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(AVAL) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Minimum\")\n\nadvs_pb_last <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(desc(AVISITN)) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Last\")\n\n# Please note that for real data, per ADaM Spec 1.1, the advs_f can be obtained by filtering on PARAMCD, then\n# ANL01FL == 'Y' or AVISIT in c('POST-BASELINE MAXIMUM', 'POST-BASELINE MINIMUM', 'POST-BASELINE LAST')\n\nadvs_f <- rbind(\n advs,\n advs_pb_last,\n advs_pb_min,\n advs_pb_max\n)\n\nadvs_f <- advs_f %>%\n mutate(AVISIT = droplevels(AVISIT))\n\nvar_labels(advs_f) <- advs_label\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nafun <- function(x, .var, .spl_context, ...) {\n n_fun <- sum(!is.na(x), na.rm = TRUE)\n if (n_fun == 0) {\n mean_sd_fun <- c(NA, NA)\n median_fun <- NA\n min_max_fun <- c(NA, NA)\n } else {\n mean_sd_fun <- c(mean(x, na.rm = TRUE), sd(x, na.rm = TRUE))\n median_fun <- median(x, na.rm = TRUE)\n min_max_fun <- c(min(x), max(x))\n }\n is_chg <- .var == \"CHG\"\n is_baseline <- .spl_context$value[which(.spl_context$split == \"AVISIT\")] == \"BASELINE\"\n if (is_baseline && is_chg) n_fun <- mean_sd_fun <- median_fun <- min_max_fun <- NULL\n\n in_rows(\n \"n\" = n_fun,\n \"Mean (SD)\" = mean_sd_fun,\n \"Median\" = median_fun,\n \"Min - Max\" = min_max_fun,\n .formats = list(\"n\" = \"xx\", \"Mean (SD)\" = \"xx.xx (xx.xx)\", \"Median\" = \"xx.xx\", \"Min - Max\" = \"xx.xx - xx.xx\"),\n .format_na_strs = list(\"n\" = \"NE\", \"Mean (SD)\" = \"NE (NE)\", \"Median\" = \"NE\", \"Min - Max\" = \"NE - NE\")\n )\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = \"\\n\\nAnalysis Visit\") %>%\n split_cols_by_multivar(\n vars = c(\"AVAL\", \"CHG\"),\n varlabels = c(\"Value at Visit\", \"Change from\\nBaseline\")\n ) %>%\n analyze_colvars(afun = afun)\n\nresult <- build_table(lyt = lyt, df = advs_f, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination \n Change from Change from Change from \n Value at Visit Baseline Value at Visit Baseline Value at Visit Baseline \nAnalysis Visit (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nSCREENING \n n 134 0 134 0 132 0 \n Mean (SD) 99.92 (17.99) NE (NE) 101.88 (21.07) NE (NE) 100.48 (19.07) NE (NE) \n Median 99.26 NE 100.22 NE 99.10 NE \n Min - Max 54.22 - 152.98 NE - NE 48.15 - 148.03 NE - NE 42.22 - 149.95 NE - NE \nBASELINE \n n 134 134 132 \n Mean (SD) 96.50 (19.90) 101.10 (19.87) 102.77 (19.48) \n Median 96.05 100.45 102.01 \n Min - Max 44.28 - 136.59 29.21 - 143.77 49.37 - 153.50 \nWEEK 1 DAY 8 \n n 134 134 134 134 132 132 \n Mean (SD) 100.65 (18.79) 4.14 (26.93) 99.19 (19.36) -1.92 (27.37) 97.14 (19.72) -5.63 (25.95) \n Median 100.22 1.52 99.37 -2.79 94.19 -5.57 \n Min - Max 57.60 - 147.46 -50.92 - 74.84 59.28 - 141.21 -64.50 - 70.93 50.98 - 142.47 -55.15 - 56.11\nWEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 102.09 (19.62) 5.58 (29.38) 99.29 (21.11) -1.81 (31.11) 99.95 (20.85) -2.81 (29.10) \n Median 103.59 7.82 100.57 -1.77 102.52 -5.68 \n Min - Max 54.73 - 150.85 -59.71 - 98.08 51.60 - 145.28 -71.00 - 92.43 37.06 - 138.92 -73.10 - 76.80\nWEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 101.78 (19.54) 5.28 (27.16) 97.73 (19.85) -3.37 (27.76) 99.86 (19.15) -2.91 (27.25) \n Median 100.39 6.53 98.83 -5.79 100.06 -1.54 \n Min - Max 47.68 - 162.22 -64.46 - 76.64 36.25 - 142.78 -70.23 - 84.74 53.80 - 146.37 -74.30 - 67.46\nWEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 100.18 (20.18) 3.68 (27.21) 99.06 (17.75) -2.04 (26.59) 99.27 (20.12) -3.50 (27.62) \n Median 98.17 3.00 97.98 -1.89 99.61 -0.46 \n Min - Max 48.52 - 153.41 -77.30 - 61.90 56.78 - 142.45 -82.96 - 89.87 46.87 - 146.12 -88.68 - 70.90\nWEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 101.42 (18.83) 4.92 (28.02) 95.92 (19.90) -5.19 (29.34) 97.73 (18.92) -5.04 (26.64) \n Median 98.56 3.93 94.30 -7.18 98.09 -5.62 \n Min - Max 62.66 - 155.52 -63.05 - 78.66 51.06 - 151.52 -78.07 - 72.91 51.48 - 157.27 -76.13 - 86.42\nPost-Baseline Last \n n 134 134 134 134 132 132 \n Mean (SD) 101.42 (18.83) 4.92 (28.02) 95.92 (19.90) -5.19 (29.34) 97.73 (18.92) -5.04 (26.64) \n Median 98.56 3.93 94.30 -7.18 98.09 -5.62 \n Min - Max 62.66 - 155.52 -63.05 - 78.66 51.06 - 151.52 -78.07 - 72.91 51.48 - 157.27 -76.13 - 86.42\nPost-Baseline Minimum \n n 134 134 134 134 132 132 \n Mean (SD) 78.98 (11.94) -17.52 (23.92) 75.77 (13.25) -25.33 (25.39) 76.35 (13.13) -26.41 (22.78)\n Median 80.14 -13.96 75.71 -26.70 76.26 -27.17 \n Min - Max 47.68 - 110.54 -77.30 - 33.00 36.25 - 113.53 -82.96 - 69.23 37.06 - 112.35 -88.68 - 34.24\nPost-Baseline Maximum \n n 134 134 134 134 132 132 \n Mean (SD) 125.08 (12.28) 28.57 (23.20) 121.33 (12.01) 20.23 (23.64) 121.42 (12.09) 18.65 (22.74) \n Median 124.20 29.14 120.80 18.74 122.55 16.93 \n Min - Max 94.06 - 162.22 -21.49 - 98.08 94.43 - 151.52 -34.95 - 92.43 79.39 - 157.27 -43.32 - 86.42\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADVS <- synthetic_cdisc_dataset(\"latest\", \"advs\")\n advs_label <- col_labels(ADVS)\n\n # post-baseline\n advs_pb <- ADVS %>%\n filter(\n ABLFL != \"Y\",\n ABLFL2 != \"Y\"\n )\n\n advs_pb_max <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(desc(AVAL)) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Maximum\")\n\n advs_pb_min <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(AVAL) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Minimum\")\n\n advs_pb_last <- advs_pb %>%\n group_by(PARAM, USUBJID) %>%\n arrange(desc(AVISITN)) %>%\n slice(1) %>%\n ungroup() %>%\n mutate(AVISIT = \"Post-Baseline Last\")\n\n ADVS <- rbind(\n ADVS,\n advs_pb_last,\n advs_pb_min,\n advs_pb_max\n ) %>%\n mutate(AVISIT = droplevels(AVISIT))\n\n col_labels(ADVS) <- advs_label\n})\ndatanames <- c(\"ADSL\", \"ADVS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADVS <- data[[\"ADVS\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Vital Sign Results and Change from Baseline by Visit\",\n dataname = \"ADVS\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADVS, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"AVISIT\", \"PARAM\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADVS, c(\"AVAL\", \"CHG\")),\n selected = c(\"AVAL\", \"CHG\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADVS, \"PARAMCD\", \"PARAM\"),\n selected = \"DIABP\"\n ),\n parallel_vars = TRUE\n )\n ),\n filter = teal_slices(teal_slice(\"ADVS\", \"AVAL\", selected = NULL))\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADVS-filter-ADVS_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:46:31 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(dplyr)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae) %>%\n var_relabel(\n AEBODSYS = \"MedDRA System Organ Class\",\n AEDECOD = \"MedDRA Preferred Term\"\n ) %>%\n filter(ANL01FL == \"Y\")\n\n\nFor illustrative purposes, we will create a new factor variable in ADAE, ASEV, with all intensity levels including \"LIFE THREATENING\".\n\nCodeadae <- adae %>% mutate(ASEV = as.character(AESEV))\nadae$ASEV[1:15] <- \"LIFE THREATENING\"\nadae <- adae %>% mutate(ASEV = factor(ASEV, levels = c(\"MILD\", \"MODERATE\", \"SEVERE\", \"LIFE THREATENING\")))\n\n\n\n\n\nCodegrade_groups <- list(\"- Any Intensity -\" = c(\"MILD\", \"MODERATE\", \"SEVERE\", \"LIFE THREATENING\"))\n\nsplit_fun <- trim_levels_in_group\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n count_occurrences_by_grade(\n var = \"ASEV\",\n grade_groups = grade_groups\n ) %>%\n split_rows_by(\n \"AEBODSYS\",\n child_labels = \"visible\",\n nested = TRUE,\n split_fun = split_fun(\"ASEV\"),\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEBODSYS)\n ) %>%\n summarize_occurrences_by_grade(\n var = \"ASEV\",\n grade_groups = grade_groups\n ) %>%\n split_rows_by(\n \"AEDECOD\",\n child_labels = \"visible\",\n nested = TRUE,\n indent_mod = -1L,\n split_fun = split_fun(\"ASEV\"),\n label_pos = \"topleft\",\n split_label = obj_label(adae$AEDECOD)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = \"unique\",\n .labels = c(\"- Any Intensity -\")\n ) %>%\n count_occurrences_by_grade(\n var = \"ASEV\",\n .indent_mods = -1L\n ) %>%\n append_varlabels(adae, \"AESEV\", indent = 2L)\n\nresult <- lyt %>%\n build_table(\n adae,\n alt_counts_df = adsl\n ) %>%\n sort_at_path(\n path = \"AEBODSYS\",\n scorefun = cont_n_allcols,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"AEBODSYS\", \"*\", \"AEDECOD\"),\n scorefun = cont_n_allcols,\n decreasing = TRUE\n )\n\nresult\n\nMedDRA System Organ Class \n MedDRA Preferred Term A: Drug X B: Placebo C: Combination\n Severity/Intensity (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————\n- Any Intensity - 100 (74.6%) 98 (73.1%) 103 (78.0%) \nMILD 5 (3.7%) 7 (5.2%) 4 (3.0%) \nMODERATE 17 (12.7%) 21 (15.7%) 20 (15.2%) \nSEVERE 77 (57.5%) 69 (51.5%) 77 (58.3%) \nLIFE THREATENING 1 (0.7%) 1 (0.7%) 2 (1.5%) \ncl A.1 \n - Any Intensity - 68 (50.7%) 58 (43.3%) 76 (57.6%) \n MILD 27 (20.1%) 19 (14.2%) 34 (25.8%) \n MODERATE 40 (29.9%) 39 (29.1%) 41 (31.1%) \n LIFE THREATENING 1 (0.7%) 0 1 (0.8%) \n dcd A.1.1.1.1 \n - Any Intensity - 45 (33.6%) 31 (23.1%) 52 (39.4%) \n MILD 45 (33.6%) 31 (23.1%) 51 (38.6%) \n LIFE THREATENING 0 0 1 (0.8%) \n dcd A.1.1.1.2 \n - Any Intensity - 41 (30.6%) 39 (29.1%) 42 (31.8%) \n MODERATE 40 (29.9%) 39 (29.1%) 41 (31.1%) \n LIFE THREATENING 1 (0.7%) 0 1 (0.8%) \ncl B.2 \n - Any Intensity - 62 (46.3%) 56 (41.8%) 74 (56.1%) \n MILD 23 (17.2%) 22 (16.4%) 28 (21.2%) \n MODERATE 38 (28.4%) 34 (25.4%) 45 (34.1%) \n LIFE THREATENING 1 (0.7%) 0 1 (0.8%) \n dcd B.2.2.3.1 \n - Any Intensity - 38 (28.4%) 40 (29.9%) 45 (34.1%) \n MILD 38 (28.4%) 40 (29.9%) 45 (34.1%) \n dcd B.2.1.2.1 \n - Any Intensity - 39 (29.1%) 34 (25.4%) 46 (34.8%) \n MODERATE 38 (28.4%) 34 (25.4%) 45 (34.1%) \n LIFE THREATENING 1 (0.7%) 0 1 (0.8%) \ncl D.1 \n - Any Intensity - 64 (47.8%) 54 (40.3%) 68 (51.5%) \n MODERATE 21 (15.7%) 22 (16.4%) 22 (16.7%) \n SEVERE 42 (31.3%) 32 (23.9%) 44 (33.3%) \n LIFE THREATENING 1 (0.7%) 0 2 (1.5%) \n dcd D.1.1.1.1 \n - Any Intensity - 42 (31.3%) 32 (23.9%) 46 (34.8%) \n SEVERE 42 (31.3%) 32 (23.9%) 45 (34.1%) \n LIFE THREATENING 0 0 1 (0.8%) \n dcd D.1.1.4.2 \n - Any Intensity - 38 (28.4%) 34 (25.4%) 40 (30.3%) \n MODERATE 37 (27.6%) 34 (25.4%) 39 (29.5%) \n LIFE THREATENING 1 (0.7%) 0 1 (0.8%) \ncl D.2 \n - Any Intensity - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n MILD 37 (27.6%) 46 (34.3%) 49 (37.1%) \n LIFE THREATENING 0 0 1 (0.8%) \n dcd D.2.1.5.3 \n - Any Intensity - 37 (27.6%) 46 (34.3%) 50 (37.9%) \n MILD 37 (27.6%) 46 (34.3%) 49 (37.1%) \n LIFE THREATENING 0 0 1 (0.8%) \ncl C.2 \n - Any Intensity - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n MODERATE 28 (20.9%) 36 (26.9%) 47 (35.6%) \n LIFE THREATENING 0 0 1 (0.8%) \n dcd C.2.1.2.1 \n - Any Intensity - 28 (20.9%) 36 (26.9%) 48 (36.4%) \n MODERATE 28 (20.9%) 36 (26.9%) 47 (35.6%) \n LIFE THREATENING 0 0 1 (0.8%) \ncl B.1 \n - Any Intensity - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n SEVERE 38 (28.4%) 36 (26.9%) 36 (27.3%) \n LIFE THREATENING 0 1 (0.7%) 0 \n dcd B.1.1.1.1 \n - Any Intensity - 38 (28.4%) 37 (27.6%) 36 (27.3%) \n SEVERE 38 (28.4%) 36 (26.9%) 36 (27.3%) \n LIFE THREATENING 0 1 (0.7%) 0 \ncl C.1 \n - Any Intensity - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n SEVERE 36 (26.9%) 34 (25.4%) 36 (27.3%) \n dcd C.1.1.1.3 \n - Any Intensity - 36 (26.9%) 34 (25.4%) 36 (27.3%) \n SEVERE 36 (26.9%) 34 (25.4%) 36 (27.3%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAE <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n})\ndatanames <- c(\"ADSL\", \"ADAE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADAE <- data[[\"ADAE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events_by_grade(\n label = \"Adverse Events by Grade Table\",\n dataname = \"ADAE\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADAE, c(\"AETERM\", \"AEDECOD\")),\n selected = c(\"AEDECOD\")\n ),\n hlt = choices_selected(\n choices = variable_choices(ADAE, c(\"AEBODSYS\", \"AESOC\")),\n selected = \"AEBODSYS\"\n ),\n grade = choices_selected(\n choices = variable_choices(ADAE, c(\"AETOXGR\", \"AESEV\")),\n selected = \"AESEV\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:45:39 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Vital Signs", - "VST01" + "Adverse Events", + "AET03" ] }, { @@ -1331,7 +1343,7 @@ "href": "tables/safety/enrollment01.html", "title": "ENTXX", "section": "", - "text": "Data Setup\nENT01 – Enrollment by Region, Country, and Investigator Number\nENT01A – Enrollment by Country and Investigator Number\nENT02 – Enrollment by Region, Country, and Investigator Number/Name\nENT02A – Enrollment by Country and Investigator Number/Name\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(forcats)\nlibrary(scda)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\nadsl <- adsl %>%\n mutate(\n REGION1 = droplevels(REGION1),\n COUNTRY = droplevels(COUNTRY),\n INVID_INVNAM = paste(INVID, INVNAM, sep = \" / \")\n ) %>%\n mutate(\n INVID = factor(INVID),\n SITEID = factor(SITEID),\n INVNAM = factor(INVNAM),\n INVID_INVNAM = factor(INVID_INVNAM)\n ) %>%\n var_relabel(\n INVID_INVNAM = \"Investigator Number/Name\",\n REGION1 = \"Geographic Region 1\",\n COUNTRY = \"Country\",\n INVID = \"Investigator Identifier\"\n ) %>%\n arrange(REGION1, COUNTRY, INVID)\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n split_rows_by(\"REGION1\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$REGION1)) %>%\n summarize_row_groups() %>%\n split_rows_by(\"COUNTRY\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$COUNTRY)) %>%\n summarize_row_groups() %>%\n analyze_vars(\"INVID\", .stats = \"count_fraction\") %>%\n append_varlabels(adsl, \"INVID\", 2L)\n\nresult <- build_table(lyt, adsl) %>%\n prune_table()\n\nresult\n\nGeographic Region 1 \n Country A: Drug X B: Placebo C: Combination All Patients\n Investigator Identifier (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————————————————————————\nAfrica 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n NGA 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n INV ID NGA-1 3 (37.5%) 3 (42.9%) 4 (36.4%) 10 (38.5%) \n INV ID NGA-11 1 (12.5%) 2 (28.6%) 3 (27.3%) 6 (23.1%) \n INV ID NGA-12 0 1 (14.3%) 1 (9.1%) 2 (7.7%) \n INV ID NGA-17 2 (25%) 0 0 2 (7.7%) \n INV ID NGA-2 1 (12.5%) 1 (14.3%) 0 2 (7.7%) \n INV ID NGA-4 1 (12.5%) 0 1 (9.1%) 2 (7.7%) \n INV ID NGA-5 0 0 1 (9.1%) 1 (3.8%) \n INV ID NGA-6 0 0 1 (9.1%) 1 (3.8%) \nAsia 91 (67.9%) 94 (70.1%) 83 (62.9%) 268 (67.0%) \n CHN 74 (55.2%) 81 (60.4%) 64 (48.5%) 219 (54.8%) \n INV ID CHN-1 21 (28.4%) 20 (24.7%) 16 (25%) 57 (26%) \n INV ID CHN-10 0 1 (1.2%) 0 1 (0.5%) \n INV ID CHN-11 12 (16.2%) 20 (24.7%) 16 (25%) 48 (21.9%) \n INV ID CHN-12 4 (5.4%) 3 (3.7%) 1 (1.6%) 8 (3.7%) \n INV ID CHN-13 2 (2.7%) 6 (7.4%) 0 8 (3.7%) \n INV ID CHN-14 4 (5.4%) 2 (2.5%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-15 2 (2.7%) 0 4 (6.2%) 6 (2.7%) \n INV ID CHN-16 0 3 (3.7%) 3 (4.7%) 6 (2.7%) \n INV ID CHN-17 4 (5.4%) 4 (4.9%) 3 (4.7%) 11 (5%) \n INV ID CHN-18 1 (1.4%) 0 2 (3.1%) 3 (1.4%) \n INV ID CHN-2 9 (12.2%) 4 (4.9%) 3 (4.7%) 16 (7.3%) \n INV ID CHN-3 5 (6.8%) 1 (1.2%) 5 (7.8%) 11 (5%) \n INV ID CHN-4 3 (4.1%) 3 (3.7%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-5 4 (5.4%) 3 (3.7%) 4 (6.2%) 11 (5%) \n INV ID CHN-6 1 (1.4%) 3 (3.7%) 0 4 (1.8%) \n INV ID CHN-7 0 5 (6.2%) 1 (1.6%) 6 (2.7%) \n INV ID CHN-8 1 (1.4%) 1 (1.2%) 0 2 (0.9%) \n INV ID CHN-9 1 (1.4%) 2 (2.5%) 0 3 (1.4%) \n PAK 12 (9.0%) 9 (6.7%) 10 (7.6%) 31 (7.8%) \n INV ID PAK-1 2 (16.7%) 4 (44.4%) 4 (40%) 10 (32.3%) \n INV ID PAK-11 4 (33.3%) 3 (33.3%) 2 (20%) 9 (29%) \n INV ID PAK-12 2 (16.7%) 0 0 2 (6.5%) \n INV ID PAK-13 1 (8.3%) 1 (11.1%) 0 2 (6.5%) \n INV ID PAK-14 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-15 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-2 1 (8.3%) 0 2 (20%) 3 (9.7%) \n INV ID PAK-4 0 1 (11.1%) 1 (10%) 2 (6.5%) \n INV ID PAK-5 0 0 1 (10%) 1 (3.2%) \n JPN 5 (3.7%) 4 (3.0%) 9 (6.8%) 18 (4.5%) \n INV ID JPN-1 2 (40%) 2 (50%) 1 (11.1%) 5 (27.8%) \n INV ID JPN-11 0 0 3 (33.3%) 3 (16.7%) \n INV ID JPN-12 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-14 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-17 0 0 2 (22.2%) 2 (11.1%) \n INV ID JPN-18 1 (20%) 0 0 1 (5.6%) \n INV ID JPN-2 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-3 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-5 1 (20%) 0 1 (11.1%) 2 (11.1%) \n INV ID JPN-6 1 (20%) 0 0 1 (5.6%) \nEurasia 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n RUS 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n INV ID RUS-1 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-11 0 2 (25%) 2 (33.3%) 4 (21.1%) \n INV ID RUS-12 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-13 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-14 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-16 1 (20%) 1 (12.5%) 0 2 (10.5%) \n INV ID RUS-18 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-2 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-3 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-4 0 2 (25%) 1 (16.7%) 3 (15.8%) \n INV ID RUS-5 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-6 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-7 0 0 1 (16.7%) 1 (5.3%) \nEurope 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n GBR 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n INV ID GBR-1 2 (50%) 0 1 (50%) 3 (33.3%) \n INV ID GBR-11 0 1 (33.3%) 1 (50%) 2 (22.2%) \n INV ID GBR-13 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-15 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-17 0 1 (33.3%) 0 1 (11.1%) \n INV ID GBR-6 0 1 (33.3%) 0 1 (11.1%) \nNorth America 13 (9.7%) 15 (11.2%) 20 (15.2%) 48 (12.0%) \n USA 10 (7.5%) 13 (9.7%) 17 (12.9%) 40 (10.0%) \n INV ID USA-1 1 (10%) 4 (30.8%) 5 (29.4%) 10 (25%) \n INV ID USA-11 4 (40%) 2 (15.4%) 3 (17.6%) 9 (22.5%) \n INV ID USA-12 1 (10%) 2 (15.4%) 3 (17.6%) 6 (15%) \n INV ID USA-14 1 (10%) 0 0 1 (2.5%) \n INV ID USA-15 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-17 1 (10%) 1 (7.7%) 0 2 (5%) \n INV ID USA-19 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-2 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-3 1 (10%) 0 1 (5.9%) 2 (5%) \n INV ID USA-4 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-5 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-6 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-8 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-9 1 (10%) 0 0 1 (2.5%) \n CAN 3 (2.2%) 2 (1.5%) 3 (2.3%) 8 (2.0%) \n INV ID CAN-1 1 (33.3%) 1 (50%) 0 2 (25%) \n INV ID CAN-11 1 (33.3%) 0 1 (33.3%) 2 (25%) \n INV ID CAN-14 1 (33.3%) 0 0 1 (12.5%) \n INV ID CAN-4 0 1 (50%) 1 (33.3%) 2 (25%) \n INV ID CAN-5 0 0 1 (33.3%) 1 (12.5%) \nSouth America 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n BRA 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n INV ID BRA-1 4 (30.8%) 2 (28.6%) 2 (20%) 8 (26.7%) \n INV ID BRA-11 4 (30.8%) 0 4 (40%) 8 (26.7%) \n INV ID BRA-12 0 1 (14.3%) 0 1 (3.3%) \n INV ID BRA-13 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-14 1 (7.7%) 0 1 (10%) 2 (6.7%) \n INV ID BRA-15 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-2 1 (7.7%) 1 (14.3%) 0 2 (6.7%) \n INV ID BRA-3 0 2 (28.6%) 0 2 (6.7%) \n INV ID BRA-4 0 1 (14.3%) 1 (10%) 2 (6.7%) \n INV ID BRA-5 0 0 1 (10%) 1 (3.3%) \n INV ID BRA-6 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-7 0 0 1 (10%) 1 (3.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n split_rows_by(\"COUNTRY\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$COUNTRY)) %>%\n summarize_row_groups() %>%\n analyze_vars(\"INVID\", .stats = \"count_fraction\") %>%\n append_varlabels(adsl, \"INVID\", 1L)\n\nresult <- build_table(lyt, adsl) %>%\n prune_table()\n\nresult\n\nCountry A: Drug X B: Placebo C: Combination All Patients\n Investigator Identifier (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————\nCHN 74 (55.2%) 81 (60.4%) 64 (48.5%) 219 (54.8%) \n INV ID CHN-1 21 (28.4%) 20 (24.7%) 16 (25%) 57 (26%) \n INV ID CHN-10 0 1 (1.2%) 0 1 (0.5%) \n INV ID CHN-11 12 (16.2%) 20 (24.7%) 16 (25%) 48 (21.9%) \n INV ID CHN-12 4 (5.4%) 3 (3.7%) 1 (1.6%) 8 (3.7%) \n INV ID CHN-13 2 (2.7%) 6 (7.4%) 0 8 (3.7%) \n INV ID CHN-14 4 (5.4%) 2 (2.5%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-15 2 (2.7%) 0 4 (6.2%) 6 (2.7%) \n INV ID CHN-16 0 3 (3.7%) 3 (4.7%) 6 (2.7%) \n INV ID CHN-17 4 (5.4%) 4 (4.9%) 3 (4.7%) 11 (5%) \n INV ID CHN-18 1 (1.4%) 0 2 (3.1%) 3 (1.4%) \n INV ID CHN-2 9 (12.2%) 4 (4.9%) 3 (4.7%) 16 (7.3%) \n INV ID CHN-3 5 (6.8%) 1 (1.2%) 5 (7.8%) 11 (5%) \n INV ID CHN-4 3 (4.1%) 3 (3.7%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-5 4 (5.4%) 3 (3.7%) 4 (6.2%) 11 (5%) \n INV ID CHN-6 1 (1.4%) 3 (3.7%) 0 4 (1.8%) \n INV ID CHN-7 0 5 (6.2%) 1 (1.6%) 6 (2.7%) \n INV ID CHN-8 1 (1.4%) 1 (1.2%) 0 2 (0.9%) \n INV ID CHN-9 1 (1.4%) 2 (2.5%) 0 3 (1.4%) \nUSA 10 (7.5%) 13 (9.7%) 17 (12.9%) 40 (10.0%) \n INV ID USA-1 1 (10%) 4 (30.8%) 5 (29.4%) 10 (25%) \n INV ID USA-11 4 (40%) 2 (15.4%) 3 (17.6%) 9 (22.5%) \n INV ID USA-12 1 (10%) 2 (15.4%) 3 (17.6%) 6 (15%) \n INV ID USA-14 1 (10%) 0 0 1 (2.5%) \n INV ID USA-15 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-17 1 (10%) 1 (7.7%) 0 2 (5%) \n INV ID USA-19 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-2 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-3 1 (10%) 0 1 (5.9%) 2 (5%) \n INV ID USA-4 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-5 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-6 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-8 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-9 1 (10%) 0 0 1 (2.5%) \nBRA 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n INV ID BRA-1 4 (30.8%) 2 (28.6%) 2 (20%) 8 (26.7%) \n INV ID BRA-11 4 (30.8%) 0 4 (40%) 8 (26.7%) \n INV ID BRA-12 0 1 (14.3%) 0 1 (3.3%) \n INV ID BRA-13 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-14 1 (7.7%) 0 1 (10%) 2 (6.7%) \n INV ID BRA-15 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-2 1 (7.7%) 1 (14.3%) 0 2 (6.7%) \n INV ID BRA-3 0 2 (28.6%) 0 2 (6.7%) \n INV ID BRA-4 0 1 (14.3%) 1 (10%) 2 (6.7%) \n INV ID BRA-5 0 0 1 (10%) 1 (3.3%) \n INV ID BRA-6 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-7 0 0 1 (10%) 1 (3.3%) \nPAK 12 (9.0%) 9 (6.7%) 10 (7.6%) 31 (7.8%) \n INV ID PAK-1 2 (16.7%) 4 (44.4%) 4 (40%) 10 (32.3%) \n INV ID PAK-11 4 (33.3%) 3 (33.3%) 2 (20%) 9 (29%) \n INV ID PAK-12 2 (16.7%) 0 0 2 (6.5%) \n INV ID PAK-13 1 (8.3%) 1 (11.1%) 0 2 (6.5%) \n INV ID PAK-14 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-15 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-2 1 (8.3%) 0 2 (20%) 3 (9.7%) \n INV ID PAK-4 0 1 (11.1%) 1 (10%) 2 (6.5%) \n INV ID PAK-5 0 0 1 (10%) 1 (3.2%) \nNGA 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n INV ID NGA-1 3 (37.5%) 3 (42.9%) 4 (36.4%) 10 (38.5%) \n INV ID NGA-11 1 (12.5%) 2 (28.6%) 3 (27.3%) 6 (23.1%) \n INV ID NGA-12 0 1 (14.3%) 1 (9.1%) 2 (7.7%) \n INV ID NGA-17 2 (25%) 0 0 2 (7.7%) \n INV ID NGA-2 1 (12.5%) 1 (14.3%) 0 2 (7.7%) \n INV ID NGA-4 1 (12.5%) 0 1 (9.1%) 2 (7.7%) \n INV ID NGA-5 0 0 1 (9.1%) 1 (3.8%) \n INV ID NGA-6 0 0 1 (9.1%) 1 (3.8%) \nRUS 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n INV ID RUS-1 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-11 0 2 (25%) 2 (33.3%) 4 (21.1%) \n INV ID RUS-12 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-13 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-14 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-16 1 (20%) 1 (12.5%) 0 2 (10.5%) \n INV ID RUS-18 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-2 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-3 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-4 0 2 (25%) 1 (16.7%) 3 (15.8%) \n INV ID RUS-5 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-6 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-7 0 0 1 (16.7%) 1 (5.3%) \nJPN 5 (3.7%) 4 (3.0%) 9 (6.8%) 18 (4.5%) \n INV ID JPN-1 2 (40%) 2 (50%) 1 (11.1%) 5 (27.8%) \n INV ID JPN-11 0 0 3 (33.3%) 3 (16.7%) \n INV ID JPN-12 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-14 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-17 0 0 2 (22.2%) 2 (11.1%) \n INV ID JPN-18 1 (20%) 0 0 1 (5.6%) \n INV ID JPN-2 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-3 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-5 1 (20%) 0 1 (11.1%) 2 (11.1%) \n INV ID JPN-6 1 (20%) 0 0 1 (5.6%) \nGBR 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n INV ID GBR-1 2 (50%) 0 1 (50%) 3 (33.3%) \n INV ID GBR-11 0 1 (33.3%) 1 (50%) 2 (22.2%) \n INV ID GBR-13 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-15 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-17 0 1 (33.3%) 0 1 (11.1%) \n INV ID GBR-6 0 1 (33.3%) 0 1 (11.1%) \nCAN 3 (2.2%) 2 (1.5%) 3 (2.3%) 8 (2.0%) \n INV ID CAN-1 1 (33.3%) 1 (50%) 0 2 (25%) \n INV ID CAN-11 1 (33.3%) 0 1 (33.3%) 2 (25%) \n INV ID CAN-14 1 (33.3%) 0 0 1 (12.5%) \n INV ID CAN-4 0 1 (50%) 1 (33.3%) 2 (25%) \n INV ID CAN-5 0 0 1 (33.3%) 1 (12.5%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n split_rows_by(\"REGION1\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$REGION1)) %>%\n summarize_row_groups() %>%\n split_rows_by(\"COUNTRY\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$COUNTRY)) %>%\n summarize_row_groups() %>%\n analyze_vars(\"INVID_INVNAM\", .stats = \"count_fraction\") %>%\n append_varlabels(adsl, \"INVID_INVNAM\", 2L)\n\nresult <- build_table(lyt, adsl) %>%\n prune_table()\n\nresult\n\nGeographic Region 1 \n Country A: Drug X B: Placebo C: Combination All Patients\n Investigator Number/Name (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————\nAfrica 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n NGA 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n INV ID NGA-1 / Dr. NGA-1 Doe 3 (37.5%) 3 (42.9%) 4 (36.4%) 10 (38.5%) \n INV ID NGA-11 / Dr. NGA-11 Doe 1 (12.5%) 2 (28.6%) 3 (27.3%) 6 (23.1%) \n INV ID NGA-12 / Dr. NGA-12 Doe 0 1 (14.3%) 1 (9.1%) 2 (7.7%) \n INV ID NGA-17 / Dr. NGA-17 Doe 2 (25%) 0 0 2 (7.7%) \n INV ID NGA-2 / Dr. NGA-2 Doe 1 (12.5%) 1 (14.3%) 0 2 (7.7%) \n INV ID NGA-4 / Dr. NGA-4 Doe 1 (12.5%) 0 1 (9.1%) 2 (7.7%) \n INV ID NGA-5 / Dr. NGA-5 Doe 0 0 1 (9.1%) 1 (3.8%) \n INV ID NGA-6 / Dr. NGA-6 Doe 0 0 1 (9.1%) 1 (3.8%) \nAsia 91 (67.9%) 94 (70.1%) 83 (62.9%) 268 (67.0%) \n CHN 74 (55.2%) 81 (60.4%) 64 (48.5%) 219 (54.8%) \n INV ID CHN-1 / Dr. CHN-1 Doe 21 (28.4%) 20 (24.7%) 16 (25%) 57 (26%) \n INV ID CHN-10 / Dr. CHN-10 Doe 0 1 (1.2%) 0 1 (0.5%) \n INV ID CHN-11 / Dr. CHN-11 Doe 12 (16.2%) 20 (24.7%) 16 (25%) 48 (21.9%) \n INV ID CHN-12 / Dr. CHN-12 Doe 4 (5.4%) 3 (3.7%) 1 (1.6%) 8 (3.7%) \n INV ID CHN-13 / Dr. CHN-13 Doe 2 (2.7%) 6 (7.4%) 0 8 (3.7%) \n INV ID CHN-14 / Dr. CHN-14 Doe 4 (5.4%) 2 (2.5%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-15 / Dr. CHN-15 Doe 2 (2.7%) 0 4 (6.2%) 6 (2.7%) \n INV ID CHN-16 / Dr. CHN-16 Doe 0 3 (3.7%) 3 (4.7%) 6 (2.7%) \n INV ID CHN-17 / Dr. CHN-17 Doe 4 (5.4%) 4 (4.9%) 3 (4.7%) 11 (5%) \n INV ID CHN-18 / Dr. CHN-18 Doe 1 (1.4%) 0 2 (3.1%) 3 (1.4%) \n INV ID CHN-2 / Dr. CHN-2 Doe 9 (12.2%) 4 (4.9%) 3 (4.7%) 16 (7.3%) \n INV ID CHN-3 / Dr. CHN-3 Doe 5 (6.8%) 1 (1.2%) 5 (7.8%) 11 (5%) \n INV ID CHN-4 / Dr. CHN-4 Doe 3 (4.1%) 3 (3.7%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-5 / Dr. CHN-5 Doe 4 (5.4%) 3 (3.7%) 4 (6.2%) 11 (5%) \n INV ID CHN-6 / Dr. CHN-6 Doe 1 (1.4%) 3 (3.7%) 0 4 (1.8%) \n INV ID CHN-7 / Dr. CHN-7 Doe 0 5 (6.2%) 1 (1.6%) 6 (2.7%) \n INV ID CHN-8 / Dr. CHN-8 Doe 1 (1.4%) 1 (1.2%) 0 2 (0.9%) \n INV ID CHN-9 / Dr. CHN-9 Doe 1 (1.4%) 2 (2.5%) 0 3 (1.4%) \n PAK 12 (9.0%) 9 (6.7%) 10 (7.6%) 31 (7.8%) \n INV ID PAK-1 / Dr. PAK-1 Doe 2 (16.7%) 4 (44.4%) 4 (40%) 10 (32.3%) \n INV ID PAK-11 / Dr. PAK-11 Doe 4 (33.3%) 3 (33.3%) 2 (20%) 9 (29%) \n INV ID PAK-12 / Dr. PAK-12 Doe 2 (16.7%) 0 0 2 (6.5%) \n INV ID PAK-13 / Dr. PAK-13 Doe 1 (8.3%) 1 (11.1%) 0 2 (6.5%) \n INV ID PAK-14 / Dr. PAK-14 Doe 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-15 / Dr. PAK-15 Doe 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-2 / Dr. PAK-2 Doe 1 (8.3%) 0 2 (20%) 3 (9.7%) \n INV ID PAK-4 / Dr. PAK-4 Doe 0 1 (11.1%) 1 (10%) 2 (6.5%) \n INV ID PAK-5 / Dr. PAK-5 Doe 0 0 1 (10%) 1 (3.2%) \n JPN 5 (3.7%) 4 (3.0%) 9 (6.8%) 18 (4.5%) \n INV ID JPN-1 / Dr. JPN-1 Doe 2 (40%) 2 (50%) 1 (11.1%) 5 (27.8%) \n INV ID JPN-11 / Dr. JPN-11 Doe 0 0 3 (33.3%) 3 (16.7%) \n INV ID JPN-12 / Dr. JPN-12 Doe 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-14 / Dr. JPN-14 Doe 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-17 / Dr. JPN-17 Doe 0 0 2 (22.2%) 2 (11.1%) \n INV ID JPN-18 / Dr. JPN-18 Doe 1 (20%) 0 0 1 (5.6%) \n INV ID JPN-2 / Dr. JPN-2 Doe 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-3 / Dr. JPN-3 Doe 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-5 / Dr. JPN-5 Doe 1 (20%) 0 1 (11.1%) 2 (11.1%) \n INV ID JPN-6 / Dr. JPN-6 Doe 1 (20%) 0 0 1 (5.6%) \nEurasia 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n RUS 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n INV ID RUS-1 / Dr. RUS-1 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-11 / Dr. RUS-11 Doe 0 2 (25%) 2 (33.3%) 4 (21.1%) \n INV ID RUS-12 / Dr. RUS-12 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-13 / Dr. RUS-13 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-14 / Dr. RUS-14 Doe 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-16 / Dr. RUS-16 Doe 1 (20%) 1 (12.5%) 0 2 (10.5%) \n INV ID RUS-18 / Dr. RUS-18 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-2 / Dr. RUS-2 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-3 / Dr. RUS-3 Doe 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-4 / Dr. RUS-4 Doe 0 2 (25%) 1 (16.7%) 3 (15.8%) \n INV ID RUS-5 / Dr. RUS-5 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-6 / Dr. RUS-6 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-7 / Dr. RUS-7 Doe 0 0 1 (16.7%) 1 (5.3%) \nEurope 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n GBR 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n INV ID GBR-1 / Dr. GBR-1 Doe 2 (50%) 0 1 (50%) 3 (33.3%) \n INV ID GBR-11 / Dr. GBR-11 Doe 0 1 (33.3%) 1 (50%) 2 (22.2%) \n INV ID GBR-13 / Dr. GBR-13 Doe 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-15 / Dr. GBR-15 Doe 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-17 / Dr. GBR-17 Doe 0 1 (33.3%) 0 1 (11.1%) \n INV ID GBR-6 / Dr. GBR-6 Doe 0 1 (33.3%) 0 1 (11.1%) \nNorth America 13 (9.7%) 15 (11.2%) 20 (15.2%) 48 (12.0%) \n USA 10 (7.5%) 13 (9.7%) 17 (12.9%) 40 (10.0%) \n INV ID USA-1 / Dr. USA-1 Doe 1 (10%) 4 (30.8%) 5 (29.4%) 10 (25%) \n INV ID USA-11 / Dr. USA-11 Doe 4 (40%) 2 (15.4%) 3 (17.6%) 9 (22.5%) \n INV ID USA-12 / Dr. USA-12 Doe 1 (10%) 2 (15.4%) 3 (17.6%) 6 (15%) \n INV ID USA-14 / Dr. USA-14 Doe 1 (10%) 0 0 1 (2.5%) \n INV ID USA-15 / Dr. USA-15 Doe 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-17 / Dr. USA-17 Doe 1 (10%) 1 (7.7%) 0 2 (5%) \n INV ID USA-19 / Dr. USA-19 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-2 / Dr. USA-2 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-3 / Dr. USA-3 Doe 1 (10%) 0 1 (5.9%) 2 (5%) \n INV ID USA-4 / Dr. USA-4 Doe 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-5 / Dr. USA-5 Doe 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-6 / Dr. USA-6 Doe 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-8 / Dr. USA-8 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-9 / Dr. USA-9 Doe 1 (10%) 0 0 1 (2.5%) \n CAN 3 (2.2%) 2 (1.5%) 3 (2.3%) 8 (2.0%) \n INV ID CAN-1 / Dr. CAN-1 Doe 1 (33.3%) 1 (50%) 0 2 (25%) \n INV ID CAN-11 / Dr. CAN-11 Doe 1 (33.3%) 0 1 (33.3%) 2 (25%) \n INV ID CAN-14 / Dr. CAN-14 Doe 1 (33.3%) 0 0 1 (12.5%) \n INV ID CAN-4 / Dr. CAN-4 Doe 0 1 (50%) 1 (33.3%) 2 (25%) \n INV ID CAN-5 / Dr. CAN-5 Doe 0 0 1 (33.3%) 1 (12.5%) \nSouth America 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n BRA 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n INV ID BRA-1 / Dr. BRA-1 Doe 4 (30.8%) 2 (28.6%) 2 (20%) 8 (26.7%) \n INV ID BRA-11 / Dr. BRA-11 Doe 4 (30.8%) 0 4 (40%) 8 (26.7%) \n INV ID BRA-12 / Dr. BRA-12 Doe 0 1 (14.3%) 0 1 (3.3%) \n INV ID BRA-13 / Dr. BRA-13 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-14 / Dr. BRA-14 Doe 1 (7.7%) 0 1 (10%) 2 (6.7%) \n INV ID BRA-15 / Dr. BRA-15 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-2 / Dr. BRA-2 Doe 1 (7.7%) 1 (14.3%) 0 2 (6.7%) \n INV ID BRA-3 / Dr. BRA-3 Doe 0 2 (28.6%) 0 2 (6.7%) \n INV ID BRA-4 / Dr. BRA-4 Doe 0 1 (14.3%) 1 (10%) 2 (6.7%) \n INV ID BRA-5 / Dr. BRA-5 Doe 0 0 1 (10%) 1 (3.3%) \n INV ID BRA-6 / Dr. BRA-6 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-7 / Dr. BRA-7 Doe 0 0 1 (10%) 1 (3.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n split_rows_by(\"COUNTRY\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$COUNTRY)) %>%\n summarize_row_groups() %>%\n analyze_vars(\"INVID_INVNAM\", .stats = \"count_fraction\") %>%\n append_varlabels(adsl, \"INVID_INVNAM\", 1L)\n\nresult <- build_table(lyt, adsl) %>%\n prune_table()\n\nresult\n\nCountry A: Drug X B: Placebo C: Combination All Patients\n Investigator Number/Name (N=134) (N=134) (N=132) (N=400) \n——————————————————————————————————————————————————————————————————————————————————————————\nCHN 74 (55.2%) 81 (60.4%) 64 (48.5%) 219 (54.8%) \n INV ID CHN-1 / Dr. CHN-1 Doe 21 (28.4%) 20 (24.7%) 16 (25%) 57 (26%) \n INV ID CHN-10 / Dr. CHN-10 Doe 0 1 (1.2%) 0 1 (0.5%) \n INV ID CHN-11 / Dr. CHN-11 Doe 12 (16.2%) 20 (24.7%) 16 (25%) 48 (21.9%) \n INV ID CHN-12 / Dr. CHN-12 Doe 4 (5.4%) 3 (3.7%) 1 (1.6%) 8 (3.7%) \n INV ID CHN-13 / Dr. CHN-13 Doe 2 (2.7%) 6 (7.4%) 0 8 (3.7%) \n INV ID CHN-14 / Dr. CHN-14 Doe 4 (5.4%) 2 (2.5%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-15 / Dr. CHN-15 Doe 2 (2.7%) 0 4 (6.2%) 6 (2.7%) \n INV ID CHN-16 / Dr. CHN-16 Doe 0 3 (3.7%) 3 (4.7%) 6 (2.7%) \n INV ID CHN-17 / Dr. CHN-17 Doe 4 (5.4%) 4 (4.9%) 3 (4.7%) 11 (5%) \n INV ID CHN-18 / Dr. CHN-18 Doe 1 (1.4%) 0 2 (3.1%) 3 (1.4%) \n INV ID CHN-2 / Dr. CHN-2 Doe 9 (12.2%) 4 (4.9%) 3 (4.7%) 16 (7.3%) \n INV ID CHN-3 / Dr. CHN-3 Doe 5 (6.8%) 1 (1.2%) 5 (7.8%) 11 (5%) \n INV ID CHN-4 / Dr. CHN-4 Doe 3 (4.1%) 3 (3.7%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-5 / Dr. CHN-5 Doe 4 (5.4%) 3 (3.7%) 4 (6.2%) 11 (5%) \n INV ID CHN-6 / Dr. CHN-6 Doe 1 (1.4%) 3 (3.7%) 0 4 (1.8%) \n INV ID CHN-7 / Dr. CHN-7 Doe 0 5 (6.2%) 1 (1.6%) 6 (2.7%) \n INV ID CHN-8 / Dr. CHN-8 Doe 1 (1.4%) 1 (1.2%) 0 2 (0.9%) \n INV ID CHN-9 / Dr. CHN-9 Doe 1 (1.4%) 2 (2.5%) 0 3 (1.4%) \nUSA 10 (7.5%) 13 (9.7%) 17 (12.9%) 40 (10.0%) \n INV ID USA-1 / Dr. USA-1 Doe 1 (10%) 4 (30.8%) 5 (29.4%) 10 (25%) \n INV ID USA-11 / Dr. USA-11 Doe 4 (40%) 2 (15.4%) 3 (17.6%) 9 (22.5%) \n INV ID USA-12 / Dr. USA-12 Doe 1 (10%) 2 (15.4%) 3 (17.6%) 6 (15%) \n INV ID USA-14 / Dr. USA-14 Doe 1 (10%) 0 0 1 (2.5%) \n INV ID USA-15 / Dr. USA-15 Doe 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-17 / Dr. USA-17 Doe 1 (10%) 1 (7.7%) 0 2 (5%) \n INV ID USA-19 / Dr. USA-19 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-2 / Dr. USA-2 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-3 / Dr. USA-3 Doe 1 (10%) 0 1 (5.9%) 2 (5%) \n INV ID USA-4 / Dr. USA-4 Doe 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-5 / Dr. USA-5 Doe 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-6 / Dr. USA-6 Doe 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-8 / Dr. USA-8 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-9 / Dr. USA-9 Doe 1 (10%) 0 0 1 (2.5%) \nBRA 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n INV ID BRA-1 / Dr. BRA-1 Doe 4 (30.8%) 2 (28.6%) 2 (20%) 8 (26.7%) \n INV ID BRA-11 / Dr. BRA-11 Doe 4 (30.8%) 0 4 (40%) 8 (26.7%) \n INV ID BRA-12 / Dr. BRA-12 Doe 0 1 (14.3%) 0 1 (3.3%) \n INV ID BRA-13 / Dr. BRA-13 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-14 / Dr. BRA-14 Doe 1 (7.7%) 0 1 (10%) 2 (6.7%) \n INV ID BRA-15 / Dr. BRA-15 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-2 / Dr. BRA-2 Doe 1 (7.7%) 1 (14.3%) 0 2 (6.7%) \n INV ID BRA-3 / Dr. BRA-3 Doe 0 2 (28.6%) 0 2 (6.7%) \n INV ID BRA-4 / Dr. BRA-4 Doe 0 1 (14.3%) 1 (10%) 2 (6.7%) \n INV ID BRA-5 / Dr. BRA-5 Doe 0 0 1 (10%) 1 (3.3%) \n INV ID BRA-6 / Dr. BRA-6 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-7 / Dr. BRA-7 Doe 0 0 1 (10%) 1 (3.3%) \nPAK 12 (9.0%) 9 (6.7%) 10 (7.6%) 31 (7.8%) \n INV ID PAK-1 / Dr. PAK-1 Doe 2 (16.7%) 4 (44.4%) 4 (40%) 10 (32.3%) \n INV ID PAK-11 / Dr. PAK-11 Doe 4 (33.3%) 3 (33.3%) 2 (20%) 9 (29%) \n INV ID PAK-12 / Dr. PAK-12 Doe 2 (16.7%) 0 0 2 (6.5%) \n INV ID PAK-13 / Dr. PAK-13 Doe 1 (8.3%) 1 (11.1%) 0 2 (6.5%) \n INV ID PAK-14 / Dr. PAK-14 Doe 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-15 / Dr. PAK-15 Doe 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-2 / Dr. PAK-2 Doe 1 (8.3%) 0 2 (20%) 3 (9.7%) \n INV ID PAK-4 / Dr. PAK-4 Doe 0 1 (11.1%) 1 (10%) 2 (6.5%) \n INV ID PAK-5 / Dr. PAK-5 Doe 0 0 1 (10%) 1 (3.2%) \nNGA 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n INV ID NGA-1 / Dr. NGA-1 Doe 3 (37.5%) 3 (42.9%) 4 (36.4%) 10 (38.5%) \n INV ID NGA-11 / Dr. NGA-11 Doe 1 (12.5%) 2 (28.6%) 3 (27.3%) 6 (23.1%) \n INV ID NGA-12 / Dr. NGA-12 Doe 0 1 (14.3%) 1 (9.1%) 2 (7.7%) \n INV ID NGA-17 / Dr. NGA-17 Doe 2 (25%) 0 0 2 (7.7%) \n INV ID NGA-2 / Dr. NGA-2 Doe 1 (12.5%) 1 (14.3%) 0 2 (7.7%) \n INV ID NGA-4 / Dr. NGA-4 Doe 1 (12.5%) 0 1 (9.1%) 2 (7.7%) \n INV ID NGA-5 / Dr. NGA-5 Doe 0 0 1 (9.1%) 1 (3.8%) \n INV ID NGA-6 / Dr. NGA-6 Doe 0 0 1 (9.1%) 1 (3.8%) \nRUS 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n INV ID RUS-1 / Dr. RUS-1 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-11 / Dr. RUS-11 Doe 0 2 (25%) 2 (33.3%) 4 (21.1%) \n INV ID RUS-12 / Dr. RUS-12 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-13 / Dr. RUS-13 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-14 / Dr. RUS-14 Doe 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-16 / Dr. RUS-16 Doe 1 (20%) 1 (12.5%) 0 2 (10.5%) \n INV ID RUS-18 / Dr. RUS-18 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-2 / Dr. RUS-2 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-3 / Dr. RUS-3 Doe 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-4 / Dr. RUS-4 Doe 0 2 (25%) 1 (16.7%) 3 (15.8%) \n INV ID RUS-5 / Dr. RUS-5 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-6 / Dr. RUS-6 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-7 / Dr. RUS-7 Doe 0 0 1 (16.7%) 1 (5.3%) \nJPN 5 (3.7%) 4 (3.0%) 9 (6.8%) 18 (4.5%) \n INV ID JPN-1 / Dr. JPN-1 Doe 2 (40%) 2 (50%) 1 (11.1%) 5 (27.8%) \n INV ID JPN-11 / Dr. JPN-11 Doe 0 0 3 (33.3%) 3 (16.7%) \n INV ID JPN-12 / Dr. JPN-12 Doe 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-14 / Dr. JPN-14 Doe 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-17 / Dr. JPN-17 Doe 0 0 2 (22.2%) 2 (11.1%) \n INV ID JPN-18 / Dr. JPN-18 Doe 1 (20%) 0 0 1 (5.6%) \n INV ID JPN-2 / Dr. JPN-2 Doe 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-3 / Dr. JPN-3 Doe 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-5 / Dr. JPN-5 Doe 1 (20%) 0 1 (11.1%) 2 (11.1%) \n INV ID JPN-6 / Dr. JPN-6 Doe 1 (20%) 0 0 1 (5.6%) \nGBR 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n INV ID GBR-1 / Dr. GBR-1 Doe 2 (50%) 0 1 (50%) 3 (33.3%) \n INV ID GBR-11 / Dr. GBR-11 Doe 0 1 (33.3%) 1 (50%) 2 (22.2%) \n INV ID GBR-13 / Dr. GBR-13 Doe 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-15 / Dr. GBR-15 Doe 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-17 / Dr. GBR-17 Doe 0 1 (33.3%) 0 1 (11.1%) \n INV ID GBR-6 / Dr. GBR-6 Doe 0 1 (33.3%) 0 1 (11.1%) \nCAN 3 (2.2%) 2 (1.5%) 3 (2.3%) 8 (2.0%) \n INV ID CAN-1 / Dr. CAN-1 Doe 1 (33.3%) 1 (50%) 0 2 (25%) \n INV ID CAN-11 / Dr. CAN-11 Doe 1 (33.3%) 0 1 (33.3%) 2 (25%) \n INV ID CAN-14 / Dr. CAN-14 Doe 1 (33.3%) 0 0 1 (12.5%) \n INV ID CAN-4 / Dr. CAN-4 Doe 0 1 (50%) 1 (33.3%) 2 (25%) \n INV ID CAN-5 / Dr. CAN-5 Doe 0 0 1 (33.3%) 1 (12.5%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nNote that for this module application, only the variables passed into by_vars are used when row_groups is selected. Variables passed into analyze_vars are additionally used when row_groups is deselected.\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(forcats)\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n\n adsl_labels <- col_labels(ADSL)\n\n ADSL <- ADSL %>%\n mutate(\n REGION1 = droplevels(REGION1),\n COUNTRY = droplevels(COUNTRY),\n INVID_INVNAM = paste(INVID, INVNAM, sep = \" / \")\n ) %>%\n arrange(REGION1, COUNTRY, INVID) %>%\n mutate(\n INVID = factor(INVID),\n SITEID = factor(SITEID),\n INVNAM = factor(INVNAM),\n INVID_INVNAM = factor(INVID_INVNAM)\n )\n\n col_labels(ADSL) <- c(adsl_labels, c(INVID_INVNAM = \"Investigator Number/Name\"))\n})\ndatanames <- \"ADSL\"\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Enrollment Table\",\n dataname = \"ADSL\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADSL, c(\"REGION1\", \"COUNTRY\", \"SITEID\", \"INVID\", \"INVNAM\", \"INVID_INVNAM\")),\n selected = c(\"REGION1\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADSL, c(\"REGION1\", \"COUNTRY\", \"SITEID\", \"INVID\", \"INVNAM\", \"INVID_INVNAM\")),\n selected = c(\"SITEID\")\n ),\n denominator = choices_selected(\n choices = c(\"n\", \"N\", \"omit\"),\n selected = \"N\",\n fixed = TRUE\n ),\n useNA = \"ifany\",\n row_groups = TRUE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:47:16 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 scda_0.1.6.9017 \n[13] forcats_1.0.0 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nENT01 – Enrollment by Region, Country, and Investigator Number\nENT01A – Enrollment by Country and Investigator Number\nENT02 – Enrollment by Region, Country, and Investigator Number/Name\nENT02A – Enrollment by Country and Investigator Number/Name\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(forcats)\nlibrary(scda)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\nadsl <- adsl %>%\n mutate(\n REGION1 = droplevels(REGION1),\n COUNTRY = droplevels(COUNTRY),\n INVID_INVNAM = paste(INVID, INVNAM, sep = \" / \")\n ) %>%\n mutate(\n INVID = factor(INVID),\n SITEID = factor(SITEID),\n INVNAM = factor(INVNAM),\n INVID_INVNAM = factor(INVID_INVNAM)\n ) %>%\n var_relabel(\n INVID_INVNAM = \"Investigator Number/Name\",\n REGION1 = \"Geographic Region 1\",\n COUNTRY = \"Country\",\n INVID = \"Investigator Identifier\"\n ) %>%\n arrange(REGION1, COUNTRY, INVID)\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n split_rows_by(\"REGION1\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$REGION1)) %>%\n summarize_row_groups() %>%\n split_rows_by(\"COUNTRY\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$COUNTRY)) %>%\n summarize_row_groups() %>%\n analyze_vars(\"INVID\", .stats = \"count_fraction\") %>%\n append_varlabels(adsl, \"INVID\", 2L)\n\nresult <- build_table(lyt, adsl) %>%\n prune_table()\n\nresult\n\nGeographic Region 1 \n Country A: Drug X B: Placebo C: Combination All Patients\n Investigator Identifier (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————————————————————————\nAfrica 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n NGA 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n INV ID NGA-1 3 (37.5%) 3 (42.9%) 4 (36.4%) 10 (38.5%) \n INV ID NGA-11 1 (12.5%) 2 (28.6%) 3 (27.3%) 6 (23.1%) \n INV ID NGA-12 0 1 (14.3%) 1 (9.1%) 2 (7.7%) \n INV ID NGA-17 2 (25%) 0 0 2 (7.7%) \n INV ID NGA-2 1 (12.5%) 1 (14.3%) 0 2 (7.7%) \n INV ID NGA-4 1 (12.5%) 0 1 (9.1%) 2 (7.7%) \n INV ID NGA-5 0 0 1 (9.1%) 1 (3.8%) \n INV ID NGA-6 0 0 1 (9.1%) 1 (3.8%) \nAsia 91 (67.9%) 94 (70.1%) 83 (62.9%) 268 (67.0%) \n CHN 74 (55.2%) 81 (60.4%) 64 (48.5%) 219 (54.8%) \n INV ID CHN-1 21 (28.4%) 20 (24.7%) 16 (25%) 57 (26%) \n INV ID CHN-10 0 1 (1.2%) 0 1 (0.5%) \n INV ID CHN-11 12 (16.2%) 20 (24.7%) 16 (25%) 48 (21.9%) \n INV ID CHN-12 4 (5.4%) 3 (3.7%) 1 (1.6%) 8 (3.7%) \n INV ID CHN-13 2 (2.7%) 6 (7.4%) 0 8 (3.7%) \n INV ID CHN-14 4 (5.4%) 2 (2.5%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-15 2 (2.7%) 0 4 (6.2%) 6 (2.7%) \n INV ID CHN-16 0 3 (3.7%) 3 (4.7%) 6 (2.7%) \n INV ID CHN-17 4 (5.4%) 4 (4.9%) 3 (4.7%) 11 (5%) \n INV ID CHN-18 1 (1.4%) 0 2 (3.1%) 3 (1.4%) \n INV ID CHN-2 9 (12.2%) 4 (4.9%) 3 (4.7%) 16 (7.3%) \n INV ID CHN-3 5 (6.8%) 1 (1.2%) 5 (7.8%) 11 (5%) \n INV ID CHN-4 3 (4.1%) 3 (3.7%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-5 4 (5.4%) 3 (3.7%) 4 (6.2%) 11 (5%) \n INV ID CHN-6 1 (1.4%) 3 (3.7%) 0 4 (1.8%) \n INV ID CHN-7 0 5 (6.2%) 1 (1.6%) 6 (2.7%) \n INV ID CHN-8 1 (1.4%) 1 (1.2%) 0 2 (0.9%) \n INV ID CHN-9 1 (1.4%) 2 (2.5%) 0 3 (1.4%) \n PAK 12 (9.0%) 9 (6.7%) 10 (7.6%) 31 (7.8%) \n INV ID PAK-1 2 (16.7%) 4 (44.4%) 4 (40%) 10 (32.3%) \n INV ID PAK-11 4 (33.3%) 3 (33.3%) 2 (20%) 9 (29%) \n INV ID PAK-12 2 (16.7%) 0 0 2 (6.5%) \n INV ID PAK-13 1 (8.3%) 1 (11.1%) 0 2 (6.5%) \n INV ID PAK-14 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-15 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-2 1 (8.3%) 0 2 (20%) 3 (9.7%) \n INV ID PAK-4 0 1 (11.1%) 1 (10%) 2 (6.5%) \n INV ID PAK-5 0 0 1 (10%) 1 (3.2%) \n JPN 5 (3.7%) 4 (3.0%) 9 (6.8%) 18 (4.5%) \n INV ID JPN-1 2 (40%) 2 (50%) 1 (11.1%) 5 (27.8%) \n INV ID JPN-11 0 0 3 (33.3%) 3 (16.7%) \n INV ID JPN-12 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-14 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-17 0 0 2 (22.2%) 2 (11.1%) \n INV ID JPN-18 1 (20%) 0 0 1 (5.6%) \n INV ID JPN-2 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-3 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-5 1 (20%) 0 1 (11.1%) 2 (11.1%) \n INV ID JPN-6 1 (20%) 0 0 1 (5.6%) \nEurasia 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n RUS 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n INV ID RUS-1 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-11 0 2 (25%) 2 (33.3%) 4 (21.1%) \n INV ID RUS-12 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-13 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-14 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-16 1 (20%) 1 (12.5%) 0 2 (10.5%) \n INV ID RUS-18 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-2 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-3 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-4 0 2 (25%) 1 (16.7%) 3 (15.8%) \n INV ID RUS-5 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-6 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-7 0 0 1 (16.7%) 1 (5.3%) \nEurope 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n GBR 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n INV ID GBR-1 2 (50%) 0 1 (50%) 3 (33.3%) \n INV ID GBR-11 0 1 (33.3%) 1 (50%) 2 (22.2%) \n INV ID GBR-13 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-15 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-17 0 1 (33.3%) 0 1 (11.1%) \n INV ID GBR-6 0 1 (33.3%) 0 1 (11.1%) \nNorth America 13 (9.7%) 15 (11.2%) 20 (15.2%) 48 (12.0%) \n USA 10 (7.5%) 13 (9.7%) 17 (12.9%) 40 (10.0%) \n INV ID USA-1 1 (10%) 4 (30.8%) 5 (29.4%) 10 (25%) \n INV ID USA-11 4 (40%) 2 (15.4%) 3 (17.6%) 9 (22.5%) \n INV ID USA-12 1 (10%) 2 (15.4%) 3 (17.6%) 6 (15%) \n INV ID USA-14 1 (10%) 0 0 1 (2.5%) \n INV ID USA-15 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-17 1 (10%) 1 (7.7%) 0 2 (5%) \n INV ID USA-19 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-2 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-3 1 (10%) 0 1 (5.9%) 2 (5%) \n INV ID USA-4 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-5 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-6 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-8 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-9 1 (10%) 0 0 1 (2.5%) \n CAN 3 (2.2%) 2 (1.5%) 3 (2.3%) 8 (2.0%) \n INV ID CAN-1 1 (33.3%) 1 (50%) 0 2 (25%) \n INV ID CAN-11 1 (33.3%) 0 1 (33.3%) 2 (25%) \n INV ID CAN-14 1 (33.3%) 0 0 1 (12.5%) \n INV ID CAN-4 0 1 (50%) 1 (33.3%) 2 (25%) \n INV ID CAN-5 0 0 1 (33.3%) 1 (12.5%) \nSouth America 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n BRA 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n INV ID BRA-1 4 (30.8%) 2 (28.6%) 2 (20%) 8 (26.7%) \n INV ID BRA-11 4 (30.8%) 0 4 (40%) 8 (26.7%) \n INV ID BRA-12 0 1 (14.3%) 0 1 (3.3%) \n INV ID BRA-13 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-14 1 (7.7%) 0 1 (10%) 2 (6.7%) \n INV ID BRA-15 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-2 1 (7.7%) 1 (14.3%) 0 2 (6.7%) \n INV ID BRA-3 0 2 (28.6%) 0 2 (6.7%) \n INV ID BRA-4 0 1 (14.3%) 1 (10%) 2 (6.7%) \n INV ID BRA-5 0 0 1 (10%) 1 (3.3%) \n INV ID BRA-6 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-7 0 0 1 (10%) 1 (3.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n split_rows_by(\"COUNTRY\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$COUNTRY)) %>%\n summarize_row_groups() %>%\n analyze_vars(\"INVID\", .stats = \"count_fraction\") %>%\n append_varlabels(adsl, \"INVID\", 1L)\n\nresult <- build_table(lyt, adsl) %>%\n prune_table()\n\nresult\n\nCountry A: Drug X B: Placebo C: Combination All Patients\n Investigator Identifier (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————\nCHN 74 (55.2%) 81 (60.4%) 64 (48.5%) 219 (54.8%) \n INV ID CHN-1 21 (28.4%) 20 (24.7%) 16 (25%) 57 (26%) \n INV ID CHN-10 0 1 (1.2%) 0 1 (0.5%) \n INV ID CHN-11 12 (16.2%) 20 (24.7%) 16 (25%) 48 (21.9%) \n INV ID CHN-12 4 (5.4%) 3 (3.7%) 1 (1.6%) 8 (3.7%) \n INV ID CHN-13 2 (2.7%) 6 (7.4%) 0 8 (3.7%) \n INV ID CHN-14 4 (5.4%) 2 (2.5%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-15 2 (2.7%) 0 4 (6.2%) 6 (2.7%) \n INV ID CHN-16 0 3 (3.7%) 3 (4.7%) 6 (2.7%) \n INV ID CHN-17 4 (5.4%) 4 (4.9%) 3 (4.7%) 11 (5%) \n INV ID CHN-18 1 (1.4%) 0 2 (3.1%) 3 (1.4%) \n INV ID CHN-2 9 (12.2%) 4 (4.9%) 3 (4.7%) 16 (7.3%) \n INV ID CHN-3 5 (6.8%) 1 (1.2%) 5 (7.8%) 11 (5%) \n INV ID CHN-4 3 (4.1%) 3 (3.7%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-5 4 (5.4%) 3 (3.7%) 4 (6.2%) 11 (5%) \n INV ID CHN-6 1 (1.4%) 3 (3.7%) 0 4 (1.8%) \n INV ID CHN-7 0 5 (6.2%) 1 (1.6%) 6 (2.7%) \n INV ID CHN-8 1 (1.4%) 1 (1.2%) 0 2 (0.9%) \n INV ID CHN-9 1 (1.4%) 2 (2.5%) 0 3 (1.4%) \nUSA 10 (7.5%) 13 (9.7%) 17 (12.9%) 40 (10.0%) \n INV ID USA-1 1 (10%) 4 (30.8%) 5 (29.4%) 10 (25%) \n INV ID USA-11 4 (40%) 2 (15.4%) 3 (17.6%) 9 (22.5%) \n INV ID USA-12 1 (10%) 2 (15.4%) 3 (17.6%) 6 (15%) \n INV ID USA-14 1 (10%) 0 0 1 (2.5%) \n INV ID USA-15 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-17 1 (10%) 1 (7.7%) 0 2 (5%) \n INV ID USA-19 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-2 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-3 1 (10%) 0 1 (5.9%) 2 (5%) \n INV ID USA-4 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-5 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-6 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-8 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-9 1 (10%) 0 0 1 (2.5%) \nBRA 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n INV ID BRA-1 4 (30.8%) 2 (28.6%) 2 (20%) 8 (26.7%) \n INV ID BRA-11 4 (30.8%) 0 4 (40%) 8 (26.7%) \n INV ID BRA-12 0 1 (14.3%) 0 1 (3.3%) \n INV ID BRA-13 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-14 1 (7.7%) 0 1 (10%) 2 (6.7%) \n INV ID BRA-15 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-2 1 (7.7%) 1 (14.3%) 0 2 (6.7%) \n INV ID BRA-3 0 2 (28.6%) 0 2 (6.7%) \n INV ID BRA-4 0 1 (14.3%) 1 (10%) 2 (6.7%) \n INV ID BRA-5 0 0 1 (10%) 1 (3.3%) \n INV ID BRA-6 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-7 0 0 1 (10%) 1 (3.3%) \nPAK 12 (9.0%) 9 (6.7%) 10 (7.6%) 31 (7.8%) \n INV ID PAK-1 2 (16.7%) 4 (44.4%) 4 (40%) 10 (32.3%) \n INV ID PAK-11 4 (33.3%) 3 (33.3%) 2 (20%) 9 (29%) \n INV ID PAK-12 2 (16.7%) 0 0 2 (6.5%) \n INV ID PAK-13 1 (8.3%) 1 (11.1%) 0 2 (6.5%) \n INV ID PAK-14 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-15 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-2 1 (8.3%) 0 2 (20%) 3 (9.7%) \n INV ID PAK-4 0 1 (11.1%) 1 (10%) 2 (6.5%) \n INV ID PAK-5 0 0 1 (10%) 1 (3.2%) \nNGA 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n INV ID NGA-1 3 (37.5%) 3 (42.9%) 4 (36.4%) 10 (38.5%) \n INV ID NGA-11 1 (12.5%) 2 (28.6%) 3 (27.3%) 6 (23.1%) \n INV ID NGA-12 0 1 (14.3%) 1 (9.1%) 2 (7.7%) \n INV ID NGA-17 2 (25%) 0 0 2 (7.7%) \n INV ID NGA-2 1 (12.5%) 1 (14.3%) 0 2 (7.7%) \n INV ID NGA-4 1 (12.5%) 0 1 (9.1%) 2 (7.7%) \n INV ID NGA-5 0 0 1 (9.1%) 1 (3.8%) \n INV ID NGA-6 0 0 1 (9.1%) 1 (3.8%) \nRUS 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n INV ID RUS-1 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-11 0 2 (25%) 2 (33.3%) 4 (21.1%) \n INV ID RUS-12 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-13 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-14 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-16 1 (20%) 1 (12.5%) 0 2 (10.5%) \n INV ID RUS-18 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-2 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-3 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-4 0 2 (25%) 1 (16.7%) 3 (15.8%) \n INV ID RUS-5 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-6 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-7 0 0 1 (16.7%) 1 (5.3%) \nJPN 5 (3.7%) 4 (3.0%) 9 (6.8%) 18 (4.5%) \n INV ID JPN-1 2 (40%) 2 (50%) 1 (11.1%) 5 (27.8%) \n INV ID JPN-11 0 0 3 (33.3%) 3 (16.7%) \n INV ID JPN-12 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-14 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-17 0 0 2 (22.2%) 2 (11.1%) \n INV ID JPN-18 1 (20%) 0 0 1 (5.6%) \n INV ID JPN-2 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-3 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-5 1 (20%) 0 1 (11.1%) 2 (11.1%) \n INV ID JPN-6 1 (20%) 0 0 1 (5.6%) \nGBR 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n INV ID GBR-1 2 (50%) 0 1 (50%) 3 (33.3%) \n INV ID GBR-11 0 1 (33.3%) 1 (50%) 2 (22.2%) \n INV ID GBR-13 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-15 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-17 0 1 (33.3%) 0 1 (11.1%) \n INV ID GBR-6 0 1 (33.3%) 0 1 (11.1%) \nCAN 3 (2.2%) 2 (1.5%) 3 (2.3%) 8 (2.0%) \n INV ID CAN-1 1 (33.3%) 1 (50%) 0 2 (25%) \n INV ID CAN-11 1 (33.3%) 0 1 (33.3%) 2 (25%) \n INV ID CAN-14 1 (33.3%) 0 0 1 (12.5%) \n INV ID CAN-4 0 1 (50%) 1 (33.3%) 2 (25%) \n INV ID CAN-5 0 0 1 (33.3%) 1 (12.5%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n split_rows_by(\"REGION1\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$REGION1)) %>%\n summarize_row_groups() %>%\n split_rows_by(\"COUNTRY\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$COUNTRY)) %>%\n summarize_row_groups() %>%\n analyze_vars(\"INVID_INVNAM\", .stats = \"count_fraction\") %>%\n append_varlabels(adsl, \"INVID_INVNAM\", 2L)\n\nresult <- build_table(lyt, adsl) %>%\n prune_table()\n\nresult\n\nGeographic Region 1 \n Country A: Drug X B: Placebo C: Combination All Patients\n Investigator Number/Name (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————\nAfrica 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n NGA 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n INV ID NGA-1 / Dr. NGA-1 Doe 3 (37.5%) 3 (42.9%) 4 (36.4%) 10 (38.5%) \n INV ID NGA-11 / Dr. NGA-11 Doe 1 (12.5%) 2 (28.6%) 3 (27.3%) 6 (23.1%) \n INV ID NGA-12 / Dr. NGA-12 Doe 0 1 (14.3%) 1 (9.1%) 2 (7.7%) \n INV ID NGA-17 / Dr. NGA-17 Doe 2 (25%) 0 0 2 (7.7%) \n INV ID NGA-2 / Dr. NGA-2 Doe 1 (12.5%) 1 (14.3%) 0 2 (7.7%) \n INV ID NGA-4 / Dr. NGA-4 Doe 1 (12.5%) 0 1 (9.1%) 2 (7.7%) \n INV ID NGA-5 / Dr. NGA-5 Doe 0 0 1 (9.1%) 1 (3.8%) \n INV ID NGA-6 / Dr. NGA-6 Doe 0 0 1 (9.1%) 1 (3.8%) \nAsia 91 (67.9%) 94 (70.1%) 83 (62.9%) 268 (67.0%) \n CHN 74 (55.2%) 81 (60.4%) 64 (48.5%) 219 (54.8%) \n INV ID CHN-1 / Dr. CHN-1 Doe 21 (28.4%) 20 (24.7%) 16 (25%) 57 (26%) \n INV ID CHN-10 / Dr. CHN-10 Doe 0 1 (1.2%) 0 1 (0.5%) \n INV ID CHN-11 / Dr. CHN-11 Doe 12 (16.2%) 20 (24.7%) 16 (25%) 48 (21.9%) \n INV ID CHN-12 / Dr. CHN-12 Doe 4 (5.4%) 3 (3.7%) 1 (1.6%) 8 (3.7%) \n INV ID CHN-13 / Dr. CHN-13 Doe 2 (2.7%) 6 (7.4%) 0 8 (3.7%) \n INV ID CHN-14 / Dr. CHN-14 Doe 4 (5.4%) 2 (2.5%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-15 / Dr. CHN-15 Doe 2 (2.7%) 0 4 (6.2%) 6 (2.7%) \n INV ID CHN-16 / Dr. CHN-16 Doe 0 3 (3.7%) 3 (4.7%) 6 (2.7%) \n INV ID CHN-17 / Dr. CHN-17 Doe 4 (5.4%) 4 (4.9%) 3 (4.7%) 11 (5%) \n INV ID CHN-18 / Dr. CHN-18 Doe 1 (1.4%) 0 2 (3.1%) 3 (1.4%) \n INV ID CHN-2 / Dr. CHN-2 Doe 9 (12.2%) 4 (4.9%) 3 (4.7%) 16 (7.3%) \n INV ID CHN-3 / Dr. CHN-3 Doe 5 (6.8%) 1 (1.2%) 5 (7.8%) 11 (5%) \n INV ID CHN-4 / Dr. CHN-4 Doe 3 (4.1%) 3 (3.7%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-5 / Dr. CHN-5 Doe 4 (5.4%) 3 (3.7%) 4 (6.2%) 11 (5%) \n INV ID CHN-6 / Dr. CHN-6 Doe 1 (1.4%) 3 (3.7%) 0 4 (1.8%) \n INV ID CHN-7 / Dr. CHN-7 Doe 0 5 (6.2%) 1 (1.6%) 6 (2.7%) \n INV ID CHN-8 / Dr. CHN-8 Doe 1 (1.4%) 1 (1.2%) 0 2 (0.9%) \n INV ID CHN-9 / Dr. CHN-9 Doe 1 (1.4%) 2 (2.5%) 0 3 (1.4%) \n PAK 12 (9.0%) 9 (6.7%) 10 (7.6%) 31 (7.8%) \n INV ID PAK-1 / Dr. PAK-1 Doe 2 (16.7%) 4 (44.4%) 4 (40%) 10 (32.3%) \n INV ID PAK-11 / Dr. PAK-11 Doe 4 (33.3%) 3 (33.3%) 2 (20%) 9 (29%) \n INV ID PAK-12 / Dr. PAK-12 Doe 2 (16.7%) 0 0 2 (6.5%) \n INV ID PAK-13 / Dr. PAK-13 Doe 1 (8.3%) 1 (11.1%) 0 2 (6.5%) \n INV ID PAK-14 / Dr. PAK-14 Doe 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-15 / Dr. PAK-15 Doe 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-2 / Dr. PAK-2 Doe 1 (8.3%) 0 2 (20%) 3 (9.7%) \n INV ID PAK-4 / Dr. PAK-4 Doe 0 1 (11.1%) 1 (10%) 2 (6.5%) \n INV ID PAK-5 / Dr. PAK-5 Doe 0 0 1 (10%) 1 (3.2%) \n JPN 5 (3.7%) 4 (3.0%) 9 (6.8%) 18 (4.5%) \n INV ID JPN-1 / Dr. JPN-1 Doe 2 (40%) 2 (50%) 1 (11.1%) 5 (27.8%) \n INV ID JPN-11 / Dr. JPN-11 Doe 0 0 3 (33.3%) 3 (16.7%) \n INV ID JPN-12 / Dr. JPN-12 Doe 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-14 / Dr. JPN-14 Doe 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-17 / Dr. JPN-17 Doe 0 0 2 (22.2%) 2 (11.1%) \n INV ID JPN-18 / Dr. JPN-18 Doe 1 (20%) 0 0 1 (5.6%) \n INV ID JPN-2 / Dr. JPN-2 Doe 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-3 / Dr. JPN-3 Doe 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-5 / Dr. JPN-5 Doe 1 (20%) 0 1 (11.1%) 2 (11.1%) \n INV ID JPN-6 / Dr. JPN-6 Doe 1 (20%) 0 0 1 (5.6%) \nEurasia 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n RUS 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n INV ID RUS-1 / Dr. RUS-1 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-11 / Dr. RUS-11 Doe 0 2 (25%) 2 (33.3%) 4 (21.1%) \n INV ID RUS-12 / Dr. RUS-12 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-13 / Dr. RUS-13 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-14 / Dr. RUS-14 Doe 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-16 / Dr. RUS-16 Doe 1 (20%) 1 (12.5%) 0 2 (10.5%) \n INV ID RUS-18 / Dr. RUS-18 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-2 / Dr. RUS-2 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-3 / Dr. RUS-3 Doe 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-4 / Dr. RUS-4 Doe 0 2 (25%) 1 (16.7%) 3 (15.8%) \n INV ID RUS-5 / Dr. RUS-5 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-6 / Dr. RUS-6 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-7 / Dr. RUS-7 Doe 0 0 1 (16.7%) 1 (5.3%) \nEurope 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n GBR 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n INV ID GBR-1 / Dr. GBR-1 Doe 2 (50%) 0 1 (50%) 3 (33.3%) \n INV ID GBR-11 / Dr. GBR-11 Doe 0 1 (33.3%) 1 (50%) 2 (22.2%) \n INV ID GBR-13 / Dr. GBR-13 Doe 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-15 / Dr. GBR-15 Doe 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-17 / Dr. GBR-17 Doe 0 1 (33.3%) 0 1 (11.1%) \n INV ID GBR-6 / Dr. GBR-6 Doe 0 1 (33.3%) 0 1 (11.1%) \nNorth America 13 (9.7%) 15 (11.2%) 20 (15.2%) 48 (12.0%) \n USA 10 (7.5%) 13 (9.7%) 17 (12.9%) 40 (10.0%) \n INV ID USA-1 / Dr. USA-1 Doe 1 (10%) 4 (30.8%) 5 (29.4%) 10 (25%) \n INV ID USA-11 / Dr. USA-11 Doe 4 (40%) 2 (15.4%) 3 (17.6%) 9 (22.5%) \n INV ID USA-12 / Dr. USA-12 Doe 1 (10%) 2 (15.4%) 3 (17.6%) 6 (15%) \n INV ID USA-14 / Dr. USA-14 Doe 1 (10%) 0 0 1 (2.5%) \n INV ID USA-15 / Dr. USA-15 Doe 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-17 / Dr. USA-17 Doe 1 (10%) 1 (7.7%) 0 2 (5%) \n INV ID USA-19 / Dr. USA-19 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-2 / Dr. USA-2 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-3 / Dr. USA-3 Doe 1 (10%) 0 1 (5.9%) 2 (5%) \n INV ID USA-4 / Dr. USA-4 Doe 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-5 / Dr. USA-5 Doe 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-6 / Dr. USA-6 Doe 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-8 / Dr. USA-8 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-9 / Dr. USA-9 Doe 1 (10%) 0 0 1 (2.5%) \n CAN 3 (2.2%) 2 (1.5%) 3 (2.3%) 8 (2.0%) \n INV ID CAN-1 / Dr. CAN-1 Doe 1 (33.3%) 1 (50%) 0 2 (25%) \n INV ID CAN-11 / Dr. CAN-11 Doe 1 (33.3%) 0 1 (33.3%) 2 (25%) \n INV ID CAN-14 / Dr. CAN-14 Doe 1 (33.3%) 0 0 1 (12.5%) \n INV ID CAN-4 / Dr. CAN-4 Doe 0 1 (50%) 1 (33.3%) 2 (25%) \n INV ID CAN-5 / Dr. CAN-5 Doe 0 0 1 (33.3%) 1 (12.5%) \nSouth America 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n BRA 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n INV ID BRA-1 / Dr. BRA-1 Doe 4 (30.8%) 2 (28.6%) 2 (20%) 8 (26.7%) \n INV ID BRA-11 / Dr. BRA-11 Doe 4 (30.8%) 0 4 (40%) 8 (26.7%) \n INV ID BRA-12 / Dr. BRA-12 Doe 0 1 (14.3%) 0 1 (3.3%) \n INV ID BRA-13 / Dr. BRA-13 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-14 / Dr. BRA-14 Doe 1 (7.7%) 0 1 (10%) 2 (6.7%) \n INV ID BRA-15 / Dr. BRA-15 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-2 / Dr. BRA-2 Doe 1 (7.7%) 1 (14.3%) 0 2 (6.7%) \n INV ID BRA-3 / Dr. BRA-3 Doe 0 2 (28.6%) 0 2 (6.7%) \n INV ID BRA-4 / Dr. BRA-4 Doe 0 1 (14.3%) 1 (10%) 2 (6.7%) \n INV ID BRA-5 / Dr. BRA-5 Doe 0 0 1 (10%) 1 (3.3%) \n INV ID BRA-6 / Dr. BRA-6 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-7 / Dr. BRA-7 Doe 0 0 1 (10%) 1 (3.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n split_rows_by(\"COUNTRY\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adsl$COUNTRY)) %>%\n summarize_row_groups() %>%\n analyze_vars(\"INVID_INVNAM\", .stats = \"count_fraction\") %>%\n append_varlabels(adsl, \"INVID_INVNAM\", 1L)\n\nresult <- build_table(lyt, adsl) %>%\n prune_table()\n\nresult\n\nCountry A: Drug X B: Placebo C: Combination All Patients\n Investigator Number/Name (N=134) (N=134) (N=132) (N=400) \n——————————————————————————————————————————————————————————————————————————————————————————\nCHN 74 (55.2%) 81 (60.4%) 64 (48.5%) 219 (54.8%) \n INV ID CHN-1 / Dr. CHN-1 Doe 21 (28.4%) 20 (24.7%) 16 (25%) 57 (26%) \n INV ID CHN-10 / Dr. CHN-10 Doe 0 1 (1.2%) 0 1 (0.5%) \n INV ID CHN-11 / Dr. CHN-11 Doe 12 (16.2%) 20 (24.7%) 16 (25%) 48 (21.9%) \n INV ID CHN-12 / Dr. CHN-12 Doe 4 (5.4%) 3 (3.7%) 1 (1.6%) 8 (3.7%) \n INV ID CHN-13 / Dr. CHN-13 Doe 2 (2.7%) 6 (7.4%) 0 8 (3.7%) \n INV ID CHN-14 / Dr. CHN-14 Doe 4 (5.4%) 2 (2.5%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-15 / Dr. CHN-15 Doe 2 (2.7%) 0 4 (6.2%) 6 (2.7%) \n INV ID CHN-16 / Dr. CHN-16 Doe 0 3 (3.7%) 3 (4.7%) 6 (2.7%) \n INV ID CHN-17 / Dr. CHN-17 Doe 4 (5.4%) 4 (4.9%) 3 (4.7%) 11 (5%) \n INV ID CHN-18 / Dr. CHN-18 Doe 1 (1.4%) 0 2 (3.1%) 3 (1.4%) \n INV ID CHN-2 / Dr. CHN-2 Doe 9 (12.2%) 4 (4.9%) 3 (4.7%) 16 (7.3%) \n INV ID CHN-3 / Dr. CHN-3 Doe 5 (6.8%) 1 (1.2%) 5 (7.8%) 11 (5%) \n INV ID CHN-4 / Dr. CHN-4 Doe 3 (4.1%) 3 (3.7%) 3 (4.7%) 9 (4.1%) \n INV ID CHN-5 / Dr. CHN-5 Doe 4 (5.4%) 3 (3.7%) 4 (6.2%) 11 (5%) \n INV ID CHN-6 / Dr. CHN-6 Doe 1 (1.4%) 3 (3.7%) 0 4 (1.8%) \n INV ID CHN-7 / Dr. CHN-7 Doe 0 5 (6.2%) 1 (1.6%) 6 (2.7%) \n INV ID CHN-8 / Dr. CHN-8 Doe 1 (1.4%) 1 (1.2%) 0 2 (0.9%) \n INV ID CHN-9 / Dr. CHN-9 Doe 1 (1.4%) 2 (2.5%) 0 3 (1.4%) \nUSA 10 (7.5%) 13 (9.7%) 17 (12.9%) 40 (10.0%) \n INV ID USA-1 / Dr. USA-1 Doe 1 (10%) 4 (30.8%) 5 (29.4%) 10 (25%) \n INV ID USA-11 / Dr. USA-11 Doe 4 (40%) 2 (15.4%) 3 (17.6%) 9 (22.5%) \n INV ID USA-12 / Dr. USA-12 Doe 1 (10%) 2 (15.4%) 3 (17.6%) 6 (15%) \n INV ID USA-14 / Dr. USA-14 Doe 1 (10%) 0 0 1 (2.5%) \n INV ID USA-15 / Dr. USA-15 Doe 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-17 / Dr. USA-17 Doe 1 (10%) 1 (7.7%) 0 2 (5%) \n INV ID USA-19 / Dr. USA-19 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-2 / Dr. USA-2 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-3 / Dr. USA-3 Doe 1 (10%) 0 1 (5.9%) 2 (5%) \n INV ID USA-4 / Dr. USA-4 Doe 0 1 (7.7%) 1 (5.9%) 2 (5%) \n INV ID USA-5 / Dr. USA-5 Doe 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-6 / Dr. USA-6 Doe 0 1 (7.7%) 0 1 (2.5%) \n INV ID USA-8 / Dr. USA-8 Doe 0 0 1 (5.9%) 1 (2.5%) \n INV ID USA-9 / Dr. USA-9 Doe 1 (10%) 0 0 1 (2.5%) \nBRA 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \n INV ID BRA-1 / Dr. BRA-1 Doe 4 (30.8%) 2 (28.6%) 2 (20%) 8 (26.7%) \n INV ID BRA-11 / Dr. BRA-11 Doe 4 (30.8%) 0 4 (40%) 8 (26.7%) \n INV ID BRA-12 / Dr. BRA-12 Doe 0 1 (14.3%) 0 1 (3.3%) \n INV ID BRA-13 / Dr. BRA-13 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-14 / Dr. BRA-14 Doe 1 (7.7%) 0 1 (10%) 2 (6.7%) \n INV ID BRA-15 / Dr. BRA-15 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-2 / Dr. BRA-2 Doe 1 (7.7%) 1 (14.3%) 0 2 (6.7%) \n INV ID BRA-3 / Dr. BRA-3 Doe 0 2 (28.6%) 0 2 (6.7%) \n INV ID BRA-4 / Dr. BRA-4 Doe 0 1 (14.3%) 1 (10%) 2 (6.7%) \n INV ID BRA-5 / Dr. BRA-5 Doe 0 0 1 (10%) 1 (3.3%) \n INV ID BRA-6 / Dr. BRA-6 Doe 1 (7.7%) 0 0 1 (3.3%) \n INV ID BRA-7 / Dr. BRA-7 Doe 0 0 1 (10%) 1 (3.3%) \nPAK 12 (9.0%) 9 (6.7%) 10 (7.6%) 31 (7.8%) \n INV ID PAK-1 / Dr. PAK-1 Doe 2 (16.7%) 4 (44.4%) 4 (40%) 10 (32.3%) \n INV ID PAK-11 / Dr. PAK-11 Doe 4 (33.3%) 3 (33.3%) 2 (20%) 9 (29%) \n INV ID PAK-12 / Dr. PAK-12 Doe 2 (16.7%) 0 0 2 (6.5%) \n INV ID PAK-13 / Dr. PAK-13 Doe 1 (8.3%) 1 (11.1%) 0 2 (6.5%) \n INV ID PAK-14 / Dr. PAK-14 Doe 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-15 / Dr. PAK-15 Doe 1 (8.3%) 0 0 1 (3.2%) \n INV ID PAK-2 / Dr. PAK-2 Doe 1 (8.3%) 0 2 (20%) 3 (9.7%) \n INV ID PAK-4 / Dr. PAK-4 Doe 0 1 (11.1%) 1 (10%) 2 (6.5%) \n INV ID PAK-5 / Dr. PAK-5 Doe 0 0 1 (10%) 1 (3.2%) \nNGA 8 (6.0%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \n INV ID NGA-1 / Dr. NGA-1 Doe 3 (37.5%) 3 (42.9%) 4 (36.4%) 10 (38.5%) \n INV ID NGA-11 / Dr. NGA-11 Doe 1 (12.5%) 2 (28.6%) 3 (27.3%) 6 (23.1%) \n INV ID NGA-12 / Dr. NGA-12 Doe 0 1 (14.3%) 1 (9.1%) 2 (7.7%) \n INV ID NGA-17 / Dr. NGA-17 Doe 2 (25%) 0 0 2 (7.7%) \n INV ID NGA-2 / Dr. NGA-2 Doe 1 (12.5%) 1 (14.3%) 0 2 (7.7%) \n INV ID NGA-4 / Dr. NGA-4 Doe 1 (12.5%) 0 1 (9.1%) 2 (7.7%) \n INV ID NGA-5 / Dr. NGA-5 Doe 0 0 1 (9.1%) 1 (3.8%) \n INV ID NGA-6 / Dr. NGA-6 Doe 0 0 1 (9.1%) 1 (3.8%) \nRUS 5 (3.7%) 8 (6.0%) 6 (4.5%) 19 (4.8%) \n INV ID RUS-1 / Dr. RUS-1 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-11 / Dr. RUS-11 Doe 0 2 (25%) 2 (33.3%) 4 (21.1%) \n INV ID RUS-12 / Dr. RUS-12 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-13 / Dr. RUS-13 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-14 / Dr. RUS-14 Doe 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-16 / Dr. RUS-16 Doe 1 (20%) 1 (12.5%) 0 2 (10.5%) \n INV ID RUS-18 / Dr. RUS-18 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-2 / Dr. RUS-2 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-3 / Dr. RUS-3 Doe 0 0 1 (16.7%) 1 (5.3%) \n INV ID RUS-4 / Dr. RUS-4 Doe 0 2 (25%) 1 (16.7%) 3 (15.8%) \n INV ID RUS-5 / Dr. RUS-5 Doe 0 1 (12.5%) 0 1 (5.3%) \n INV ID RUS-6 / Dr. RUS-6 Doe 1 (20%) 0 0 1 (5.3%) \n INV ID RUS-7 / Dr. RUS-7 Doe 0 0 1 (16.7%) 1 (5.3%) \nJPN 5 (3.7%) 4 (3.0%) 9 (6.8%) 18 (4.5%) \n INV ID JPN-1 / Dr. JPN-1 Doe 2 (40%) 2 (50%) 1 (11.1%) 5 (27.8%) \n INV ID JPN-11 / Dr. JPN-11 Doe 0 0 3 (33.3%) 3 (16.7%) \n INV ID JPN-12 / Dr. JPN-12 Doe 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-14 / Dr. JPN-14 Doe 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-17 / Dr. JPN-17 Doe 0 0 2 (22.2%) 2 (11.1%) \n INV ID JPN-18 / Dr. JPN-18 Doe 1 (20%) 0 0 1 (5.6%) \n INV ID JPN-2 / Dr. JPN-2 Doe 0 0 1 (11.1%) 1 (5.6%) \n INV ID JPN-3 / Dr. JPN-3 Doe 0 1 (25%) 0 1 (5.6%) \n INV ID JPN-5 / Dr. JPN-5 Doe 1 (20%) 0 1 (11.1%) 2 (11.1%) \n INV ID JPN-6 / Dr. JPN-6 Doe 1 (20%) 0 0 1 (5.6%) \nGBR 4 (3.0%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \n INV ID GBR-1 / Dr. GBR-1 Doe 2 (50%) 0 1 (50%) 3 (33.3%) \n INV ID GBR-11 / Dr. GBR-11 Doe 0 1 (33.3%) 1 (50%) 2 (22.2%) \n INV ID GBR-13 / Dr. GBR-13 Doe 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-15 / Dr. GBR-15 Doe 1 (25%) 0 0 1 (11.1%) \n INV ID GBR-17 / Dr. GBR-17 Doe 0 1 (33.3%) 0 1 (11.1%) \n INV ID GBR-6 / Dr. GBR-6 Doe 0 1 (33.3%) 0 1 (11.1%) \nCAN 3 (2.2%) 2 (1.5%) 3 (2.3%) 8 (2.0%) \n INV ID CAN-1 / Dr. CAN-1 Doe 1 (33.3%) 1 (50%) 0 2 (25%) \n INV ID CAN-11 / Dr. CAN-11 Doe 1 (33.3%) 0 1 (33.3%) 2 (25%) \n INV ID CAN-14 / Dr. CAN-14 Doe 1 (33.3%) 0 0 1 (12.5%) \n INV ID CAN-4 / Dr. CAN-4 Doe 0 1 (50%) 1 (33.3%) 2 (25%) \n INV ID CAN-5 / Dr. CAN-5 Doe 0 0 1 (33.3%) 1 (12.5%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nNote that for this module application, only the variables passed into by_vars are used when row_groups is selected. Variables passed into analyze_vars are additionally used when row_groups is deselected.\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(forcats)\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n\n adsl_labels <- col_labels(ADSL)\n\n ADSL <- ADSL %>%\n mutate(\n REGION1 = droplevels(REGION1),\n COUNTRY = droplevels(COUNTRY),\n INVID_INVNAM = paste(INVID, INVNAM, sep = \" / \")\n ) %>%\n arrange(REGION1, COUNTRY, INVID) %>%\n mutate(\n INVID = factor(INVID),\n SITEID = factor(SITEID),\n INVNAM = factor(INVNAM),\n INVID_INVNAM = factor(INVID_INVNAM)\n )\n\n col_labels(ADSL) <- c(adsl_labels, c(INVID_INVNAM = \"Investigator Number/Name\"))\n})\ndatanames <- \"ADSL\"\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Enrollment Table\",\n dataname = \"ADSL\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADSL, c(\"REGION1\", \"COUNTRY\", \"SITEID\", \"INVID\", \"INVNAM\", \"INVID_INVNAM\")),\n selected = c(\"REGION1\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADSL, c(\"REGION1\", \"COUNTRY\", \"SITEID\", \"INVID\", \"INVNAM\", \"INVID_INVNAM\")),\n selected = c(\"SITEID\")\n ),\n denominator = choices_selected(\n choices = c(\"n\", \"N\", \"omit\"),\n selected = \"N\",\n fixed = TRUE\n ),\n useNA = \"ifany\",\n row_groups = TRUE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:46:26 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 scda_0.1.6.9017 \n[13] forcats_1.0.0 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Safety", @@ -1339,135 +1351,123 @@ ] }, { - "objectID": "tables/lab-results/lbt13.html", - "href": "tables/lab-results/lbt13.html", - "title": "LBT13", + "objectID": "tables/disposition/dst01.html", + "href": "tables/disposition/dst01.html", + "title": "DST01", "section": "", - "text": "Data Setup\nStandard Table (Low)\nStandard Table (High)\nTable Without Patients with Missing Baseline (Low)\nTable with Missing Baseline Considered as Grade 0 (High)\nTable with Fill-In of Grades (High)\nteal App\nReproducibility\n\n\n\nPlease note that for each variant, the adlb dataset needs to be filtered on correct flags like WGRLOVFL, WGRHIVFL, et al., otherwise the layout function will not return the correct counts. There is an option to create a record for a lab test where no record is found at that visit. If you specified add_derived_type = \"PHANTOM\" & dtype_phantom_cond, you don’t have to use the h_adsl_adlb_merge_using_worst_flag function to preprocess your adlb dataset. Otherwise please follow the pre-processing steps below before applying the layout functions.\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\n# Please note that in real clinical data, population flag like SAFFL, and parameter category like PARCAT2 needs to be\n# selected properly.\nadsl_f <- adsl %>% filter(SAFFL == \"Y\")\nadlb <- adlb %>% filter(PARAMCD == \"CRP\" & SAFFL == \"Y\")\n\n\n\n\nNote that the worst laboratory flag (below WGRLOVFL) must be selected appropriately to match the direction of abnormality (here Low). New grouping variables ATOXGR_GP and BTOXGR_GP are created to display the correct output.\n\nCodeadlb_f <- adlb %>% filter(WGRLOVFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- adsl_f %>%\n h_adsl_adlb_merge_using_worst_flag(\n adlb_f,\n worst_flag = c(\"WGRLOVFL\" = \"Y\"),\n by_visit = TRUE,\n no_fillin_visits = c(\"SCREENING\", \"BASELINE\", \"UNSCHEDULED\")\n )\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = case_when(\n ATOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n ATOXGR == -1 ~ \"1\",\n ATOXGR == -2 ~ \"2\",\n ATOXGR == -3 ~ \"3\",\n ATOXGR == -4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n )\n ) %>%\n mutate(\n BTOXGR_GP = case_when(\n BTOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n BTOXGR == -1 ~ \"1\",\n BTOXGR == -2 ~ \"2\",\n BTOXGR == -3 ~ \"3\",\n BTOXGR == -4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n )\n )\n\nadlb_out <- adlb_out %>% mutate(\n AVISIT = forcats::fct_reorder(AVISIT, AVISITN),\n ATOXGR_GP = factor(ATOXGR_GP, levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n BTOXGR_GP = factor(BTOXGR_GP, levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n)\n\nadlb_out <- adlb_out %>%\n var_relabel(\n PARAMCD = \"Parameter Code\",\n AVISIT = \"Visit\",\n ATOXGR_GP = \"NCI CTCAE Grade at Visit\",\n BTOXGR_GP = \"Baseline NCI CTCAE Grade\"\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAMCD\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$PARAMCD)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$AVISIT)\n ) %>%\n split_rows_by(\n \"ATOXGR_GP\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$ATOXGR_GP)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\")) %>%\n count_occurrences(\"BTOXGR_GP\", denom = \"n\", drop = TRUE) %>%\n append_varlabels(adlb_out, \"BTOXGR_GP\", indent = 3L) %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter Code \n Visit \n NCI CTCAE Grade at Visit A: Drug X B: Placebo C: Combination\n Baseline NCI CTCAE Grade (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nCRP \n WEEK 1 DAY 8 \n Not Low (n) 116 110 101 \n Not Low 103 (88.8%) 91 (82.7%) 88 (87.1%) \n 1 3 (2.6%) 5 (4.5%) 6 (5.9%) \n 2 4 (3.4%) 9 (8.2%) 2 (2.0%) \n 3 3 (2.6%) 4 (3.6%) 4 (4.0%) \n 4 3 (2.6%) 1 (0.9%) 1 (1.0%) \n 1 (n) 4 7 5 \n Not Low 3 (75.0%) 7 (100%) 4 (80.0%) \n 3 1 (25.0%) 0 1 (20.0%) \n 2 (n) 5 6 11 \n Not Low 5 (100%) 5 (83.3%) 8 (72.7%) \n 1 0 0 1 (9.1%) \n 3 0 0 2 (18.2%) \n 4 0 1 (16.7%) 0 \n 3 (n) 6 8 5 \n Not Low 6 (100%) 7 (87.5%) 5 (100%) \n 3 0 1 (12.5%) 0 \n 4 (n) 3 3 10 \n Not Low 2 (66.7%) 3 (100%) 7 (70.0%) \n 1 0 0 2 (20.0%) \n 2 1 (33.3%) 0 0 \n 4 0 0 1 (10.0%) \n WEEK 2 DAY 15 \n Not Low (n) 106 111 116 \n Not Low 93 (87.7%) 93 (83.8%) 100 (86.2%) \n 1 3 (2.8%) 4 (3.6%) 8 (6.9%) \n 2 5 (4.7%) 7 (6.3%) 2 (1.7%) \n 3 2 (1.9%) 5 (4.5%) 6 (5.2%) \n 4 3 (2.8%) 2 (1.8%) 0 \n 1 (n) 15 9 2 \n Not Low 13 (86.7%) 8 (88.9%) 1 (50.0%) \n 2 0 1 (11.1%) 0 \n 3 2 (13.3%) 0 0 \n 4 0 0 1 (50.0%) \n 2 (n) 3 3 6 \n Not Low 3 (100%) 3 (100%) 4 (66.7%) \n 1 0 0 1 (16.7%) \n 3 0 0 1 (16.7%) \n 3 (n) 7 7 6 \n Not Low 7 (100%) 6 (85.7%) 5 (83.3%) \n 2 0 1 (14.3%) 0 \n 4 0 0 1 (16.7%) \n 4 (n) 3 4 2 \n Not Low 3 (100%) 3 (75.0%) 2 (100%) \n 1 0 1 (25.0%) 0 \n WEEK 3 DAY 22 \n Not Low (n) 119 110 114 \n Not Low 104 (87.4%) 92 (83.6%) 94 (82.5%) \n 1 3 (2.5%) 4 (3.6%) 9 (7.9%) \n 2 5 (4.2%) 7 (6.4%) 2 (1.8%) \n 3 4 (3.4%) 5 (4.5%) 7 (6.1%) \n 4 3 (2.5%) 2 (1.8%) 2 (1.8%) \n 1 (n) 9 9 6 \n Not Low 9 (100%) 7 (77.8%) 6 (100%) \n 2 0 2 (22.2%) 0 \n 2 (n) 1 7 3 \n Not Low 1 (100%) 6 (85.7%) 3 (100%) \n 1 0 1 (14.3%) 0 \n 3 (n) 4 5 4 \n Not Low 4 (100%) 5 (100%) 4 (100%) \n 4 (n) 1 3 5 \n Not Low 1 (100%) 3 (100%) 5 (100%) \n WEEK 4 DAY 29 \n Not Low (n) 101 119 111 \n Not Low 89 (88.1%) 100 (84.0%) 96 (86.5%) \n 1 3 (3.0%) 4 (3.4%) 6 (5.4%) \n 2 4 (4.0%) 8 (6.7%) 1 (0.9%) \n 3 2 (2.0%) 5 (4.2%) 6 (5.4%) \n 4 3 (3.0%) 2 (1.7%) 2 (1.8%) \n 1 (n) 10 5 6 \n Not Low 9 (90.0%) 5 (100%) 5 (83.3%) \n 1 0 0 1 (16.7%) \n 2 1 (10.0%) 0 0 \n 2 (n) 13 4 6 \n Not Low 13 (100%) 3 (75.0%) 5 (83.3%) \n 1 0 0 1 (16.7%) \n 2 0 1 (25.0%) 0 \n 3 (n) 8 2 6 \n Not Low 6 (75.0%) 1 (50.0%) 5 (83.3%) \n 1 0 1 (50.0%) 0 \n 2 0 0 1 (16.7%) \n 3 2 (25.0%) 0 0 \n 4 (n) 2 4 3 \n Not Low 2 (100%) 4 (100%) 1 (33.3%) \n 1 0 0 1 (33.3%) \n 3 0 0 1 (33.3%) \n WEEK 5 DAY 36 \n Not Low (n) 115 112 111 \n Not Low 102 (88.7%) 94 (83.9%) 96 (86.5%) \n 1 2 (1.7%) 4 (3.6%) 6 (5.4%) \n 2 5 (4.3%) 7 (6.2%) 2 (1.8%) \n 3 3 (2.6%) 5 (4.5%) 5 (4.5%) \n 4 3 (2.6%) 2 (1.8%) 2 (1.8%) \n 1 (n) 5 7 6 \n Not Low 5 (100%) 4 (57.1%) 5 (83.3%) \n 1 0 1 (14.3%) 1 (16.7%) \n 2 0 2 (28.6%) 0 \n 2 (n) 5 11 6 \n Not Low 5 (100%) 11 (100%) 6 (100%) \n 3 (n) 8 2 7 \n Not Low 6 (75.0%) 2 (100%) 4 (57.1%) \n 1 1 (12.5%) 0 1 (14.3%) \n 3 1 (12.5%) 0 2 (28.6%) \n 4 (n) 1 2 2 \n Not Low 1 (100%) 2 (100%) 1 (50.0%) \n 1 0 0 1 (50.0%) \n\n\n\n\nNote that the worst laboratory flag (below WGRHIVFL) must be selected appropriately to match the direction of abnormality (here High). New grouping variables ATOXGR_GP and BTOXGR_GP are created to display the correct output.\n\nCodeadlb_f <- adlb %>% filter(WGRHIVFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- adsl_f %>%\n h_adsl_adlb_merge_using_worst_flag(\n adlb_f,\n worst_flag = c(\"WGRHIVFL\" = \"Y\"),\n by_visit = TRUE,\n no_fillin_visits = c(\"SCREENING\", \"BASELINE\", \"UNSCHEDULED\")\n )\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n )\n ) %>%\n mutate(\n BTOXGR_GP = case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n )\n )\n\nadlb_out <- adlb_out %>% mutate(\n AVISIT = forcats::fct_reorder(AVISIT, AVISITN),\n ATOXGR_GP = factor(ATOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n BTOXGR_GP = factor(BTOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n)\n\nadlb_out <- adlb_out %>%\n var_relabel(\n PARAMCD = \"Parameter Code\",\n AVISIT = \"Visit\",\n ATOXGR_GP = \"NCI CTCAE Grade at Visit\",\n BTOXGR_GP = \"Baseline NCI CTCAE Grade\"\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAMCD\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$PARAMCD)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$AVISIT)\n ) %>%\n split_rows_by(\n \"ATOXGR_GP\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$ATOXGR_GP)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\")) %>%\n count_occurrences(\"BTOXGR_GP\", denom = \"n\", drop = TRUE) %>%\n append_varlabels(adlb_out, \"BTOXGR_GP\", indent = 3L) %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter Code \n Visit \n NCI CTCAE Grade at Visit A: Drug X B: Placebo C: Combination\n Baseline NCI CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————\nCRP \n WEEK 1 DAY 8 \n Not High (n) 111 110 112 \n Not High 93 (83.8%) 92 (83.6%) 98 (87.5%) \n 1 8 (7.2%) 7 (6.4%) 5 (4.5%) \n 2 2 (1.8%) 6 (5.5%) 7 (6.2%) \n 3 6 (5.4%) 3 (2.7%) 2 (1.8%) \n 4 2 (1.8%) 2 (1.8%) 0 \n 1 (n) 8 11 6 \n Not High 7 (87.5%) 11 (100%) 5 (83.3%) \n 3 1 (12.5%) 0 1 (16.7%) \n 2 (n) 6 4 5 \n Not High 6 (100%) 1 (25.0%) 4 (80.0%) \n 1 0 3 (75.0%) 1 (20.0%) \n 3 (n) 8 3 4 \n Not High 7 (87.5%) 3 (100%) 4 (100%) \n 4 1 (12.5%) 0 0 \n 4 (n) 1 6 5 \n Not High 1 (100%) 5 (83.3%) 4 (80.0%) \n 1 0 0 1 (20.0%) \n 3 0 1 (16.7%) 0 \n WEEK 2 DAY 15 \n Not High (n) 117 113 113 \n Not High 99 (84.6%) 95 (84.1%) 100 (88.5%) \n 1 7 (6.0%) 6 (5.3%) 4 (3.5%) \n 2 2 (1.7%) 6 (5.3%) 6 (5.3%) \n 3 6 (5.1%) 4 (3.5%) 3 (2.7%) \n 4 3 (2.6%) 2 (1.8%) 0 \n 1 (n) 6 9 7 \n Not High 5 (83.3%) 8 (88.9%) 6 (85.7%) \n 1 0 1 (11.1%) 0 \n 2 0 0 1 (14.3%) \n 3 1 (16.7%) 0 0 \n 2 (n) 4 4 6 \n Not High 4 (100%) 4 (100%) 3 (50.0%) \n 1 0 0 3 (50.0%) \n 3 (n) 5 3 5 \n Not High 4 (80.0%) 2 (66.7%) 5 (100%) \n 1 1 (20.0%) 1 (33.3%) 0 \n 4 (n) 2 5 1 \n Not High 2 (100%) 3 (60.0%) 1 (100%) \n 1 0 2 (40.0%) 0 \n WEEK 3 DAY 22 \n Not High (n) 110 111 114 \n Not High 92 (83.6%) 94 (84.7%) 98 (86.0%) \n 1 8 (7.3%) 9 (8.1%) 7 (6.1%) \n 2 2 (1.8%) 5 (4.5%) 6 (5.3%) \n 3 5 (4.5%) 2 (1.8%) 3 (2.6%) \n 4 3 (2.7%) 1 (0.9%) 0 \n 1 (n) 7 8 7 \n Not High 7 (100%) 5 (62.5%) 6 (85.7%) \n 1 0 1 (12.5%) 0 \n 2 0 1 (12.5%) 1 (14.3%) \n 3 0 1 (12.5%) 0 \n 2 (n) 9 7 5 \n Not High 9 (100%) 6 (85.7%) 5 (100%) \n 3 0 1 (14.3%) 0 \n 3 (n) 6 3 4 \n Not High 5 (83.3%) 2 (66.7%) 4 (100%) \n 3 1 (16.7%) 0 0 \n 4 0 1 (33.3%) 0 \n 4 (n) 2 5 2 \n Not High 1 (50.0%) 5 (100%) 2 (100%) \n 3 1 (50.0%) 0 0 \n WEEK 4 DAY 29 \n Not High (n) 115 117 113 \n Not High 97 (84.3%) 101 (86.3%) 99 (87.6%) \n 1 8 (7.0%) 7 (6.0%) 6 (5.3%) \n 2 2 (1.7%) 6 (5.1%) 5 (4.4%) \n 3 7 (6.1%) 3 (2.6%) 3 (2.7%) \n 4 1 (0.9%) 0 0 \n 1 (n) 4 3 11 \n Not High 4 (100%) 2 (66.7%) 10 (90.9%) \n 2 0 0 1 (9.1%) \n 4 0 1 (33.3%) 0 \n 2 (n) 6 4 2 \n Not High 6 (100%) 3 (75.0%) 2 (100%) \n 1 0 1 (25.0%) 0 \n 3 (n) 6 7 4 \n Not High 5 (83.3%) 4 (57.1%) 4 (100%) \n 1 0 1 (14.3%) 0 \n 3 0 1 (14.3%) 0 \n 4 1 (16.7%) 1 (14.3%) 0 \n 4 (n) 3 3 2 \n Not High 2 (66.7%) 2 (66.7%) 0 \n 1 0 1 (33.3%) 1 (50.0%) \n 2 0 0 1 (50.0%) \n 4 1 (33.3%) 0 0 \n WEEK 5 DAY 36 \n Not High (n) 111 111 119 \n Not High 95 (85.6%) 95 (85.6%) 104 (87.4%) \n 1 6 (5.4%) 8 (7.2%) 6 (5.0%) \n 2 1 (0.9%) 5 (4.5%) 6 (5.0%) \n 3 6 (5.4%) 2 (1.8%) 3 (2.5%) \n 4 3 (2.7%) 1 (0.9%) 0 \n 1 (n) 8 11 5 \n Not High 7 (87.5%) 9 (81.8%) 4 (80.0%) \n 1 0 1 (9.1%) 0 \n 2 0 0 1 (20.0%) \n 3 1 (12.5%) 1 (9.1%) 0 \n 2 (n) 7 6 3 \n Not High 5 (71.4%) 3 (50.0%) 2 (66.7%) \n 1 1 (14.3%) 1 (16.7%) 1 (33.3%) \n 2 1 (14.3%) 1 (16.7%) 0 \n 4 0 1 (16.7%) 0 \n 3 (n) 3 3 4 \n Not High 3 (100%) 3 (100%) 4 (100%) \n 4 (n) 5 3 1 \n Not High 4 (80.0%) 2 (66.7%) 1 (100%) \n 1 1 (20.0%) 0 0 \n 3 0 1 (33.3%) 0 \n\n\n\n\nNote that missing baseline values are filtered out in the pre-processing step.\n\nCodeadlb_f <- adlb %>% filter(WGRLOVFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- adsl_f %>%\n h_adsl_adlb_merge_using_worst_flag(\n adlb_f,\n worst_flag = c(\"WGRLOVFL\" = \"Y\"),\n by_visit = TRUE,\n no_fillin_visits = c(\"SCREENING\", \"BASELINE\", \"UNSCHEDULED\")\n )\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n filter(BTOXGR != \"<Missing>\") %>% # filter out missing baseline grade\n mutate(\n ATOXGR_GP = case_when(\n ATOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n ATOXGR == -1 ~ \"1\",\n ATOXGR == -2 ~ \"2\",\n ATOXGR == -3 ~ \"3\",\n ATOXGR == -4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n )\n ) %>%\n mutate(\n BTOXGR_GP = case_when(\n BTOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n BTOXGR == -1 ~ \"1\",\n BTOXGR == -2 ~ \"2\",\n BTOXGR == -3 ~ \"3\",\n BTOXGR == -4 ~ \"4\"\n )\n )\n\nadlb_out <- adlb_out %>% mutate(\n AVISIT = forcats::fct_reorder(AVISIT, AVISITN),\n ATOXGR_GP = factor(ATOXGR_GP, levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n BTOXGR_GP = factor(BTOXGR_GP, levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\"))\n)\n\nadlb_out <- adlb_out %>%\n var_relabel(\n PARAMCD = \"Parameter Code\",\n AVISIT = \"Visit\",\n ATOXGR_GP = \"NCI CTCAE Grade at Visit\",\n BTOXGR_GP = \"Baseline NCI CTCAE Grade\"\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAMCD\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$PARAMCD)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$AVISIT)\n ) %>%\n split_rows_by(\n \"ATOXGR_GP\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$ATOXGR_GP)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\")) %>%\n count_occurrences(\"BTOXGR_GP\", denom = \"n\", drop = TRUE) %>%\n append_varlabels(adlb_out, \"BTOXGR_GP\", indent = 3L) %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter Code \n Visit \n NCI CTCAE Grade at Visit A: Drug X B: Placebo C: Combination\n Baseline NCI CTCAE Grade (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nCRP \n WEEK 1 DAY 8 \n Not Low (n) 116 110 101 \n Not Low 103 (88.8%) 91 (82.7%) 88 (87.1%) \n 1 3 (2.6%) 5 (4.5%) 6 (5.9%) \n 2 4 (3.4%) 9 (8.2%) 2 (2.0%) \n 3 3 (2.6%) 4 (3.6%) 4 (4.0%) \n 4 3 (2.6%) 1 (0.9%) 1 (1.0%) \n 1 (n) 4 7 5 \n Not Low 3 (75.0%) 7 (100%) 4 (80.0%) \n 3 1 (25.0%) 0 1 (20.0%) \n 2 (n) 5 6 11 \n Not Low 5 (100%) 5 (83.3%) 8 (72.7%) \n 1 0 0 1 (9.1%) \n 3 0 0 2 (18.2%) \n 4 0 1 (16.7%) 0 \n 3 (n) 6 8 5 \n Not Low 6 (100%) 7 (87.5%) 5 (100%) \n 3 0 1 (12.5%) 0 \n 4 (n) 3 3 10 \n Not Low 2 (66.7%) 3 (100%) 7 (70.0%) \n 1 0 0 2 (20.0%) \n 2 1 (33.3%) 0 0 \n 4 0 0 1 (10.0%) \n WEEK 2 DAY 15 \n Not Low (n) 106 111 116 \n Not Low 93 (87.7%) 93 (83.8%) 100 (86.2%) \n 1 3 (2.8%) 4 (3.6%) 8 (6.9%) \n 2 5 (4.7%) 7 (6.3%) 2 (1.7%) \n 3 2 (1.9%) 5 (4.5%) 6 (5.2%) \n 4 3 (2.8%) 2 (1.8%) 0 \n 1 (n) 15 9 2 \n Not Low 13 (86.7%) 8 (88.9%) 1 (50.0%) \n 2 0 1 (11.1%) 0 \n 3 2 (13.3%) 0 0 \n 4 0 0 1 (50.0%) \n 2 (n) 3 3 6 \n Not Low 3 (100%) 3 (100%) 4 (66.7%) \n 1 0 0 1 (16.7%) \n 3 0 0 1 (16.7%) \n 3 (n) 7 7 6 \n Not Low 7 (100%) 6 (85.7%) 5 (83.3%) \n 2 0 1 (14.3%) 0 \n 4 0 0 1 (16.7%) \n 4 (n) 3 4 2 \n Not Low 3 (100%) 3 (75.0%) 2 (100%) \n 1 0 1 (25.0%) 0 \n WEEK 3 DAY 22 \n Not Low (n) 119 110 114 \n Not Low 104 (87.4%) 92 (83.6%) 94 (82.5%) \n 1 3 (2.5%) 4 (3.6%) 9 (7.9%) \n 2 5 (4.2%) 7 (6.4%) 2 (1.8%) \n 3 4 (3.4%) 5 (4.5%) 7 (6.1%) \n 4 3 (2.5%) 2 (1.8%) 2 (1.8%) \n 1 (n) 9 9 6 \n Not Low 9 (100%) 7 (77.8%) 6 (100%) \n 2 0 2 (22.2%) 0 \n 2 (n) 1 7 3 \n Not Low 1 (100%) 6 (85.7%) 3 (100%) \n 1 0 1 (14.3%) 0 \n 3 (n) 4 5 4 \n Not Low 4 (100%) 5 (100%) 4 (100%) \n 4 (n) 1 3 5 \n Not Low 1 (100%) 3 (100%) 5 (100%) \n WEEK 4 DAY 29 \n Not Low (n) 101 119 111 \n Not Low 89 (88.1%) 100 (84.0%) 96 (86.5%) \n 1 3 (3.0%) 4 (3.4%) 6 (5.4%) \n 2 4 (4.0%) 8 (6.7%) 1 (0.9%) \n 3 2 (2.0%) 5 (4.2%) 6 (5.4%) \n 4 3 (3.0%) 2 (1.7%) 2 (1.8%) \n 1 (n) 10 5 6 \n Not Low 9 (90.0%) 5 (100%) 5 (83.3%) \n 1 0 0 1 (16.7%) \n 2 1 (10.0%) 0 0 \n 2 (n) 13 4 6 \n Not Low 13 (100%) 3 (75.0%) 5 (83.3%) \n 1 0 0 1 (16.7%) \n 2 0 1 (25.0%) 0 \n 3 (n) 8 2 6 \n Not Low 6 (75.0%) 1 (50.0%) 5 (83.3%) \n 1 0 1 (50.0%) 0 \n 2 0 0 1 (16.7%) \n 3 2 (25.0%) 0 0 \n 4 (n) 2 4 3 \n Not Low 2 (100%) 4 (100%) 1 (33.3%) \n 1 0 0 1 (33.3%) \n 3 0 0 1 (33.3%) \n WEEK 5 DAY 36 \n Not Low (n) 115 112 111 \n Not Low 102 (88.7%) 94 (83.9%) 96 (86.5%) \n 1 2 (1.7%) 4 (3.6%) 6 (5.4%) \n 2 5 (4.3%) 7 (6.2%) 2 (1.8%) \n 3 3 (2.6%) 5 (4.5%) 5 (4.5%) \n 4 3 (2.6%) 2 (1.8%) 2 (1.8%) \n 1 (n) 5 7 6 \n Not Low 5 (100%) 4 (57.1%) 5 (83.3%) \n 1 0 1 (14.3%) 1 (16.7%) \n 2 0 2 (28.6%) 0 \n 2 (n) 5 11 6 \n Not Low 5 (100%) 11 (100%) 6 (100%) \n 3 (n) 8 2 7 \n Not Low 6 (75.0%) 2 (100%) 4 (57.1%) \n 1 1 (12.5%) 0 1 (14.3%) \n 3 1 (12.5%) 0 2 (28.6%) \n 4 (n) 1 2 2 \n Not Low 1 (100%) 2 (100%) 1 (50.0%) \n 1 0 0 1 (50.0%) \n\n\n\n\nNote that when BTOXGR is missing, the grouping variable BTOXGR_GP is now \"Not High\" instead of \"Missing\" compared to Standard Table (High).\n\nCodeadlb_f <- adlb %>% filter(WGRHIVFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- adsl_f %>%\n h_adsl_adlb_merge_using_worst_flag(\n adlb_f,\n worst_flag = c(\"WGRHIVFL\" = \"Y\"),\n by_visit = TRUE,\n no_fillin_visits = c(\"SCREENING\", \"BASELINE\", \"UNSCHEDULED\")\n )\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n )\n ) %>%\n mutate(\n BTOXGR_GP = case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4, \"<Missing>\") ~ \"Not High\", # Missing BTOXGR now grouped to \"Not High\"\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\"\n )\n )\n\nadlb_out <- adlb_out %>% mutate(\n AVISIT = forcats::fct_reorder(AVISIT, AVISITN),\n ATOXGR_GP = factor(ATOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n BTOXGR_GP = factor(BTOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n)\n\nadlb_out <- adlb_out %>%\n var_relabel(\n PARAMCD = \"Parameter Code\",\n AVISIT = \"Visit\",\n ATOXGR_GP = \"NCI CTCAE Grade at Visit\",\n BTOXGR_GP = \"Baseline NCI CTCAE Grade\"\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAMCD\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$PARAMCD)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$AVISIT)\n ) %>%\n split_rows_by(\n \"ATOXGR_GP\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$ATOXGR_GP)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\")) %>%\n count_occurrences(\"BTOXGR_GP\", denom = \"n\", drop = TRUE) %>%\n append_varlabels(adlb_out, \"BTOXGR_GP\", indent = 3L) %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter Code \n Visit \n NCI CTCAE Grade at Visit A: Drug X B: Placebo C: Combination\n Baseline NCI CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————\nCRP \n WEEK 1 DAY 8 \n Not High (n) 111 110 112 \n Not High 93 (83.8%) 92 (83.6%) 98 (87.5%) \n 1 8 (7.2%) 7 (6.4%) 5 (4.5%) \n 2 2 (1.8%) 6 (5.5%) 7 (6.2%) \n 3 6 (5.4%) 3 (2.7%) 2 (1.8%) \n 4 2 (1.8%) 2 (1.8%) 0 \n 1 (n) 8 11 6 \n Not High 7 (87.5%) 11 (100%) 5 (83.3%) \n 3 1 (12.5%) 0 1 (16.7%) \n 2 (n) 6 4 5 \n Not High 6 (100%) 1 (25.0%) 4 (80.0%) \n 1 0 3 (75.0%) 1 (20.0%) \n 3 (n) 8 3 4 \n Not High 7 (87.5%) 3 (100%) 4 (100%) \n 4 1 (12.5%) 0 0 \n 4 (n) 1 6 5 \n Not High 1 (100%) 5 (83.3%) 4 (80.0%) \n 1 0 0 1 (20.0%) \n 3 0 1 (16.7%) 0 \n WEEK 2 DAY 15 \n Not High (n) 117 113 113 \n Not High 99 (84.6%) 95 (84.1%) 100 (88.5%) \n 1 7 (6.0%) 6 (5.3%) 4 (3.5%) \n 2 2 (1.7%) 6 (5.3%) 6 (5.3%) \n 3 6 (5.1%) 4 (3.5%) 3 (2.7%) \n 4 3 (2.6%) 2 (1.8%) 0 \n 1 (n) 6 9 7 \n Not High 5 (83.3%) 8 (88.9%) 6 (85.7%) \n 1 0 1 (11.1%) 0 \n 2 0 0 1 (14.3%) \n 3 1 (16.7%) 0 0 \n 2 (n) 4 4 6 \n Not High 4 (100%) 4 (100%) 3 (50.0%) \n 1 0 0 3 (50.0%) \n 3 (n) 5 3 5 \n Not High 4 (80.0%) 2 (66.7%) 5 (100%) \n 1 1 (20.0%) 1 (33.3%) 0 \n 4 (n) 2 5 1 \n Not High 2 (100%) 3 (60.0%) 1 (100%) \n 1 0 2 (40.0%) 0 \n WEEK 3 DAY 22 \n Not High (n) 110 111 114 \n Not High 92 (83.6%) 94 (84.7%) 98 (86.0%) \n 1 8 (7.3%) 9 (8.1%) 7 (6.1%) \n 2 2 (1.8%) 5 (4.5%) 6 (5.3%) \n 3 5 (4.5%) 2 (1.8%) 3 (2.6%) \n 4 3 (2.7%) 1 (0.9%) 0 \n 1 (n) 7 8 7 \n Not High 7 (100%) 5 (62.5%) 6 (85.7%) \n 1 0 1 (12.5%) 0 \n 2 0 1 (12.5%) 1 (14.3%) \n 3 0 1 (12.5%) 0 \n 2 (n) 9 7 5 \n Not High 9 (100%) 6 (85.7%) 5 (100%) \n 3 0 1 (14.3%) 0 \n 3 (n) 6 3 4 \n Not High 5 (83.3%) 2 (66.7%) 4 (100%) \n 3 1 (16.7%) 0 0 \n 4 0 1 (33.3%) 0 \n 4 (n) 2 5 2 \n Not High 1 (50.0%) 5 (100%) 2 (100%) \n 3 1 (50.0%) 0 0 \n WEEK 4 DAY 29 \n Not High (n) 115 117 113 \n Not High 97 (84.3%) 101 (86.3%) 99 (87.6%) \n 1 8 (7.0%) 7 (6.0%) 6 (5.3%) \n 2 2 (1.7%) 6 (5.1%) 5 (4.4%) \n 3 7 (6.1%) 3 (2.6%) 3 (2.7%) \n 4 1 (0.9%) 0 0 \n 1 (n) 4 3 11 \n Not High 4 (100%) 2 (66.7%) 10 (90.9%) \n 2 0 0 1 (9.1%) \n 4 0 1 (33.3%) 0 \n 2 (n) 6 4 2 \n Not High 6 (100%) 3 (75.0%) 2 (100%) \n 1 0 1 (25.0%) 0 \n 3 (n) 6 7 4 \n Not High 5 (83.3%) 4 (57.1%) 4 (100%) \n 1 0 1 (14.3%) 0 \n 3 0 1 (14.3%) 0 \n 4 1 (16.7%) 1 (14.3%) 0 \n 4 (n) 3 3 2 \n Not High 2 (66.7%) 2 (66.7%) 0 \n 1 0 1 (33.3%) 1 (50.0%) \n 2 0 0 1 (50.0%) \n 4 1 (33.3%) 0 0 \n WEEK 5 DAY 36 \n Not High (n) 111 111 119 \n Not High 95 (85.6%) 95 (85.6%) 104 (87.4%) \n 1 6 (5.4%) 8 (7.2%) 6 (5.0%) \n 2 1 (0.9%) 5 (4.5%) 6 (5.0%) \n 3 6 (5.4%) 2 (1.8%) 3 (2.5%) \n 4 3 (2.7%) 1 (0.9%) 0 \n 1 (n) 8 11 5 \n Not High 7 (87.5%) 9 (81.8%) 4 (80.0%) \n 1 0 1 (9.1%) 0 \n 2 0 0 1 (20.0%) \n 3 1 (12.5%) 1 (9.1%) 0 \n 2 (n) 7 6 3 \n Not High 5 (71.4%) 3 (50.0%) 2 (66.7%) \n 1 1 (14.3%) 1 (16.7%) 1 (33.3%) \n 2 1 (14.3%) 1 (16.7%) 0 \n 4 0 1 (16.7%) 0 \n 3 (n) 3 3 4 \n Not High 3 (100%) 3 (100%) 4 (100%) \n 4 (n) 5 3 1 \n Not High 4 (80.0%) 2 (66.7%) 1 (100%) \n 1 1 (20.0%) 0 0 \n 3 0 1 (33.3%) 0 \n\n\n\n\nPre-processing is the same as for Standard Table (High), but in order to keep all levels, the drop argument in count_occurrences is set to FALSE.\n\nCodeadlb_f <- adlb %>% filter(WGRHIVFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- adsl_f %>%\n h_adsl_adlb_merge_using_worst_flag(\n adlb_f,\n worst_flag = c(\"WGRHIVFL\" = \"Y\"),\n by_visit = TRUE,\n no_fillin_visits = c(\"SCREENING\", \"BASELINE\", \"UNSCHEDULED\")\n )\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n )\n ) %>%\n mutate(\n BTOXGR_GP = case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n )\n )\n\nadlb_out <- adlb_out %>% mutate(\n AVISIT = forcats::fct_reorder(AVISIT, AVISITN),\n ATOXGR_GP = factor(ATOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n BTOXGR_GP = factor(BTOXGR_GP, levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n)\n\nadlb_out <- adlb_out %>%\n var_relabel(\n PARAMCD = \"Parameter Code\",\n AVISIT = \"Visit\",\n ATOXGR_GP = \"NCI CTCAE Grade at Visit\",\n BTOXGR_GP = \"Baseline NCI CTCAE Grade\"\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAMCD\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$PARAMCD)\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_fun = drop_split_levels, label_pos = \"topleft\", split_label = obj_label(adlb_out$AVISIT)\n ) %>%\n split_rows_by(\n \"ATOXGR_GP\",\n split_fun = keep_split_levels(c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\")),\n label_pos = \"topleft\",\n split_label = obj_label(adlb_out$ATOXGR_GP)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\")) %>%\n count_occurrences(\"BTOXGR_GP\", denom = \"n\", drop = FALSE) %>%\n append_varlabels(adlb_out, \"BTOXGR_GP\", indent = 3L) %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter Code \n Visit \n NCI CTCAE Grade at Visit A: Drug X B: Placebo C: Combination\n Baseline NCI CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————\nCRP \n WEEK 1 DAY 8 \n Not High (n) 111 110 112 \n Not High 93 (83.8%) 92 (83.6%) 98 (87.5%) \n 1 8 (7.2%) 7 (6.4%) 5 (4.5%) \n 2 2 (1.8%) 6 (5.5%) 7 (6.2%) \n 3 6 (5.4%) 3 (2.7%) 2 (1.8%) \n 4 2 (1.8%) 2 (1.8%) 0 \n Missing 0 0 0 \n 1 (n) 8 11 6 \n Not High 7 (87.5%) 11 (100%) 5 (83.3%) \n 1 0 0 0 \n 2 0 0 0 \n 3 1 (12.5%) 0 1 (16.7%) \n 4 0 0 0 \n Missing 0 0 0 \n 2 (n) 6 4 5 \n Not High 6 (100%) 1 (25.0%) 4 (80.0%) \n 1 0 3 (75.0%) 1 (20.0%) \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 3 (n) 8 3 4 \n Not High 7 (87.5%) 3 (100%) 4 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 1 (12.5%) 0 0 \n Missing 0 0 0 \n 4 (n) 1 6 5 \n Not High 1 (100%) 5 (83.3%) 4 (80.0%) \n 1 0 0 1 (20.0%) \n 2 0 0 0 \n 3 0 1 (16.7%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n Missing (n) 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n WEEK 2 DAY 15 \n Not High (n) 117 113 113 \n Not High 99 (84.6%) 95 (84.1%) 100 (88.5%) \n 1 7 (6.0%) 6 (5.3%) 4 (3.5%) \n 2 2 (1.7%) 6 (5.3%) 6 (5.3%) \n 3 6 (5.1%) 4 (3.5%) 3 (2.7%) \n 4 3 (2.6%) 2 (1.8%) 0 \n Missing 0 0 0 \n 1 (n) 6 9 7 \n Not High 5 (83.3%) 8 (88.9%) 6 (85.7%) \n 1 0 1 (11.1%) 0 \n 2 0 0 1 (14.3%) \n 3 1 (16.7%) 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 2 (n) 4 4 6 \n Not High 4 (100%) 4 (100%) 3 (50.0%) \n 1 0 0 3 (50.0%) \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 3 (n) 5 3 5 \n Not High 4 (80.0%) 2 (66.7%) 5 (100%) \n 1 1 (20.0%) 1 (33.3%) 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 4 (n) 2 5 1 \n Not High 2 (100%) 3 (60.0%) 1 (100%) \n 1 0 2 (40.0%) 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n Missing (n) 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n WEEK 3 DAY 22 \n Not High (n) 110 111 114 \n Not High 92 (83.6%) 94 (84.7%) 98 (86.0%) \n 1 8 (7.3%) 9 (8.1%) 7 (6.1%) \n 2 2 (1.8%) 5 (4.5%) 6 (5.3%) \n 3 5 (4.5%) 2 (1.8%) 3 (2.6%) \n 4 3 (2.7%) 1 (0.9%) 0 \n Missing 0 0 0 \n 1 (n) 7 8 7 \n Not High 7 (100%) 5 (62.5%) 6 (85.7%) \n 1 0 1 (12.5%) 0 \n 2 0 1 (12.5%) 1 (14.3%) \n 3 0 1 (12.5%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n 2 (n) 9 7 5 \n Not High 9 (100%) 6 (85.7%) 5 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 0 1 (14.3%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n 3 (n) 6 3 4 \n Not High 5 (83.3%) 2 (66.7%) 4 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 1 (16.7%) 0 0 \n 4 0 1 (33.3%) 0 \n Missing 0 0 0 \n 4 (n) 2 5 2 \n Not High 1 (50.0%) 5 (100%) 2 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 1 (50.0%) 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n Missing (n) 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n WEEK 4 DAY 29 \n Not High (n) 115 117 113 \n Not High 97 (84.3%) 101 (86.3%) 99 (87.6%) \n 1 8 (7.0%) 7 (6.0%) 6 (5.3%) \n 2 2 (1.7%) 6 (5.1%) 5 (4.4%) \n 3 7 (6.1%) 3 (2.6%) 3 (2.7%) \n 4 1 (0.9%) 0 0 \n Missing 0 0 0 \n 1 (n) 4 3 11 \n Not High 4 (100%) 2 (66.7%) 10 (90.9%) \n 1 0 0 0 \n 2 0 0 1 (9.1%) \n 3 0 0 0 \n 4 0 1 (33.3%) 0 \n Missing 0 0 0 \n 2 (n) 6 4 2 \n Not High 6 (100%) 3 (75.0%) 2 (100%) \n 1 0 1 (25.0%) 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 3 (n) 6 7 4 \n Not High 5 (83.3%) 4 (57.1%) 4 (100%) \n 1 0 1 (14.3%) 0 \n 2 0 0 0 \n 3 0 1 (14.3%) 0 \n 4 1 (16.7%) 1 (14.3%) 0 \n Missing 0 0 0 \n 4 (n) 3 3 2 \n Not High 2 (66.7%) 2 (66.7%) 0 \n 1 0 1 (33.3%) 1 (50.0%) \n 2 0 0 1 (50.0%) \n 3 0 0 0 \n 4 1 (33.3%) 0 0 \n Missing 0 0 0 \n Missing (n) 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n WEEK 5 DAY 36 \n Not High (n) 111 111 119 \n Not High 95 (85.6%) 95 (85.6%) 104 (87.4%) \n 1 6 (5.4%) 8 (7.2%) 6 (5.0%) \n 2 1 (0.9%) 5 (4.5%) 6 (5.0%) \n 3 6 (5.4%) 2 (1.8%) 3 (2.5%) \n 4 3 (2.7%) 1 (0.9%) 0 \n Missing 0 0 0 \n 1 (n) 8 11 5 \n Not High 7 (87.5%) 9 (81.8%) 4 (80.0%) \n 1 0 1 (9.1%) 0 \n 2 0 0 1 (20.0%) \n 3 1 (12.5%) 1 (9.1%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n 2 (n) 7 6 3 \n Not High 5 (71.4%) 3 (50.0%) 2 (66.7%) \n 1 1 (14.3%) 1 (16.7%) 1 (33.3%) \n 2 1 (14.3%) 1 (16.7%) 0 \n 3 0 0 0 \n 4 0 1 (16.7%) 0 \n Missing 0 0 0 \n 3 (n) 3 3 4 \n Not High 3 (100%) 3 (100%) 4 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 4 (n) 5 3 1 \n Not High 4 (80.0%) 2 (66.7%) 1 (100%) \n 1 1 (20.0%) 0 0 \n 2 0 0 0 \n 3 0 1 (33.3%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n Missing (n) 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_shift_by_grade(\n label = \"Grade Laboratory Abnormality Table\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = \"ALT\"\n ),\n worst_flag_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"WGRLOVFL\", \"WGRLOFL\", \"WGRHIVFL\", \"WGRHIFL\")),\n selected = c(\"WGRLOVFL\")\n ),\n worst_flag_indicator = choices_selected(\n value_choices(ADLB, \"WGRLOVFL\"),\n selected = \"Y\", fixed = TRUE\n ),\n anl_toxgrade_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"ATOXGR\")),\n selected = c(\"ATOXGR\"),\n fixed = TRUE\n ),\n base_toxgrade_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"BTOXGR\")),\n selected = c(\"BTOXGR\"),\n fixed = TRUE\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:47:59 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable with Grouping of Reasons\nTable Adding Optional Rows\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nset.seed(1, kind = \"Mersenne-Twister\")\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# reorder EOSSTT factor levels so DISCONTINUED is the last level\nadsl <- df_explicit_na(adsl) %>%\n mutate(EOSSTT = factor(EOSSTT, levels = c(\"COMPLETED\", \"ONGOING\", \"DISCONTINUED\")))\n\nadsl_gp_added <- adsl %>%\n mutate(DCSREASGP = case_when(\n DCSREAS %in% c(\"ADVERSE EVENT\", \"DEATH\") ~ \"Safety\",\n (DCSREAS != \"<Missing>\" & !DCSREAS %in% c(\"ADVERSE EVENT\", \"DEATH\")) ~ \"Non-Safety\",\n DCSREAS == \"<Missing>\" ~ \"<Missing>\"\n ) %>% factor(levels = c(\"Safety\", \"Non-Safety\", \"<Missing>\")))\n\nadsl_eotstt_added <- adsl_gp_added %>%\n mutate(\n EOTSTT = sample(\n c(\"ONGOING\", \"COMPLETED\", \"DISCONTINUED\"),\n size = nrow(adsl),\n replace = TRUE\n ) %>% factor(levels = c(\"COMPLETED\", \"ONGOING\", \"DISCONTINUED\"))\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_occurrences(\n \"EOSSTT\",\n show_labels = \"hidden\"\n ) %>%\n analyze_vars(\n \"DCSREAS\",\n .stats = \"count_fraction\",\n denom = \"N_col\",\n show_labels = \"hidden\",\n .indent_mods = c(count_fraction = 1L)\n )\n\nresult1 <- build_table(lyt = lyt, df = adsl)\nresult1\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————————————————————————————\nCOMPLETED 68 (50.7%) 66 (49.3%) 73 (55.3%) 207 (51.7%) \nONGOING 24 (17.9%) 28 (20.9%) 21 (15.9%) 73 (18.2%) \nDISCONTINUED 42 (31.3%) 40 (29.9%) 38 (28.8%) 120 (30.0%) \n ADVERSE EVENT 3 (2.2%) 6 (4.5%) 5 (3.8%) 14 (3.5%) \n DEATH 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \n LACK OF EFFICACY 2 (1.5%) 2 (1.5%) 3 (2.3%) 7 (1.8%) \n PHYSICIAN DECISION 2 (1.5%) 3 (2.2%) 2 (1.5%) 7 (1.8%) \n PROTOCOL VIOLATION 5 (3.7%) 3 (2.2%) 4 (3%) 12 (3%) \n WITHDRAWAL BY PARENT/GUARDIAN 4 (3%) 2 (1.5%) 1 (0.8%) 7 (1.8%) \n WITHDRAWAL BY SUBJECT 1 (0.7%) 1 (0.7%) 1 (0.8%) 3 (0.8%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_occurrences(\n \"EOSSTT\",\n show_labels = \"hidden\"\n ) %>%\n split_rows_by(\"DCSREASGP\", indent_mod = 1L) %>%\n analyze_vars(\n \"DCSREAS\",\n .stats = \"count_fraction\",\n denom = \"N_col\",\n show_labels = \"hidden\"\n )\n\ntbl <- build_table(lyt = lyt, df = adsl_gp_added)\nresult2 <- prune_table(tbl) # remove rows containing all zeros\n\nresult2\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————\nCOMPLETED 68 (50.7%) 66 (49.3%) 73 (55.3%) 207 (51.7%) \nONGOING 24 (17.9%) 28 (20.9%) 21 (15.9%) 73 (18.2%) \nDISCONTINUED 42 (31.3%) 40 (29.9%) 38 (28.8%) 120 (30.0%) \n Safety \n ADVERSE EVENT 3 (2.2%) 6 (4.5%) 5 (3.8%) 14 (3.5%) \n DEATH 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \n Non-Safety \n LACK OF EFFICACY 2 (1.5%) 2 (1.5%) 3 (2.3%) 7 (1.8%) \n PHYSICIAN DECISION 2 (1.5%) 3 (2.2%) 2 (1.5%) 7 (1.8%) \n PROTOCOL VIOLATION 5 (3.7%) 3 (2.2%) 4 (3%) 12 (3%) \n WITHDRAWAL BY PARENT/GUARDIAN 4 (3%) 2 (1.5%) 1 (0.8%) 7 (1.8%) \n WITHDRAWAL BY SUBJECT 1 (0.7%) 1 (0.7%) 1 (0.8%) 3 (0.8%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ACTARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_occurrences(\n \"EOTSTT\",\n show_labels = \"hidden\"\n )\n\ntbl <- build_table(lyt = lyt, df = adsl_eotstt_added)\ntbl <- prune_table(tbl) # remove rows containing all zeros\n\n# Combine tables\ncol_info(result2) <- col_info(tbl)\nresult3 <- rbind(result2, tbl)\n\nresult3\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————\nCOMPLETED 68 (50.7%) 66 (49.3%) 73 (55.3%) 207 (51.7%) \nONGOING 24 (17.9%) 28 (20.9%) 21 (15.9%) 73 (18.2%) \nDISCONTINUED 42 (31.3%) 40 (29.9%) 38 (28.8%) 120 (30.0%) \n Safety \n ADVERSE EVENT 3 (2.2%) 6 (4.5%) 5 (3.8%) 14 (3.5%) \n DEATH 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \n Non-Safety \n LACK OF EFFICACY 2 (1.5%) 2 (1.5%) 3 (2.3%) 7 (1.8%) \n PHYSICIAN DECISION 2 (1.5%) 3 (2.2%) 2 (1.5%) 7 (1.8%) \n PROTOCOL VIOLATION 5 (3.7%) 3 (2.2%) 4 (3%) 12 (3%) \n WITHDRAWAL BY PARENT/GUARDIAN 4 (3%) 2 (1.5%) 1 (0.8%) 7 (1.8%) \n WITHDRAWAL BY SUBJECT 1 (0.7%) 1 (0.7%) 1 (0.8%) 3 (0.8%) \nCOMPLETED 46 (34.3%) 38 (28.4%) 41 (31.1%) 125 (31.2%) \nONGOING 50 (37.3%) 51 (38.1%) 46 (34.8%) 147 (36.8%) \nDISCONTINUED 38 (28.4%) 45 (33.6%) 45 (34.1%) 128 (32.0%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n set.seed(1, kind = \"Mersenne-Twister\")\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADSL <- df_explicit_na(ADSL)\n ADSL <- ADSL %>%\n mutate(\n DCSREASGP = case_when(\n DCSREAS %in% c(\"ADVERSE EVENT\", \"DEATH\") ~ \"Safety\",\n (DCSREAS != \"<Missing>\" & !DCSREAS %in% c(\"ADVERSE EVENT\", \"DEATH\")) ~ \"Non-Safety\",\n DCSREAS == \"<Missing>\" ~ \"<Missing>\"\n ) %>% as.factor(),\n EOTSTT = sample(\n c(\"ONGOING\", \"COMPLETED\", \"DISCONTINUED\"),\n size = nrow(ADSL),\n replace = TRUE\n ) %>% as.factor()\n ) %>%\n col_relabel(\n EOTSTT = \"End Of Treatment Status\"\n )\n\n date_vars_asl <- names(ADSL)[vapply(ADSL, function(x) inherits(x, c(\"Date\", \"POSIXct\", \"POSIXlt\")), logical(1))]\n demog_vars_asl <- names(ADSL)[!(names(ADSL) %in% c(\"USUBJID\", \"STUDYID\", date_vars_asl))]\n})\ndatanames <- \"ADSL\"\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\ndemog_vars_asl <- data[[\"demog_vars_asl\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary(\n label = \"Disposition Table\",\n dataname = \"ADSL\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n summarize_vars = choices_selected(\n variable_choices(ADSL, demog_vars_asl),\n c(\"EOSSTT\", \"DCSREAS\", \"EOTSTT\")\n ),\n useNA = \"ifany\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:46:48 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT13" + "Disposition", + "DST01" ] }, { - "objectID": "tables/lab-results/lbt12.html", - "href": "tables/lab-results/lbt12.html", - "title": "LBT12", + "objectID": "tables/disclosures/disclosurest01.html", + "href": "tables/disclosures/disclosurest01.html", + "title": "DISCLOSUREST01", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadhy <- synthetic_cdisc_dataset(\"latest\", \"adhy\")\n\nanl <- adhy\nanl$APERIODC <- as.factor(anl$APERIODC) # to ensure the table is built even if there is no patients after filtering\nanl$ACTARM <- as.factor(anl$ACTARM) # to ensure the table is built even if there is no patients after filtering\n\nanl <- anl %>%\n filter(\n SAFFL == \"Y\",\n PARAMCD %in% c(\"ASTPULN\", \"ALTPULN\", \"ALTASTPU\") & AVISIT == \"POST-BASELINE\"\n ) %>%\n mutate(\n ARM_AVALC = factor(\n case_when(\n AVALC == \"Y\" ~ as.character(ACTARM),\n TRUE ~ \"Criteria not met\"\n ),\n levels = c(levels(anl$ACTARM), \"Criteria not met\")\n ),\n PARAM = factor(\n case_when(\n PARAMCD == \"ASTPULN\" ~ \"AST >3x ULN\",\n PARAMCD == \"ALTPULN\" ~ \"ALT >3x ULN\",\n PARAMCD == \"ALTASTPU\" ~ \"AST >3x ULN or ALT >x3 ULN\"\n ),\n levels = c(\"AST >3x ULN\", \"ALT >3x ULN\", \"AST >3x ULN or ALT >x3 ULN\")\n ),\n TITLE = factor(\"First Elevated Result Occurring During\")\n )\n\nanl <- df_explicit_na(anl)\n\n\n\n\n\nCoderesult <- basic_table() %>%\n split_cols_by(\"TITLE\") %>%\n split_cols_by(\"APERIODC\") %>%\n split_rows_by(\"PARAM\") %>%\n split_rows_by(\"ACTARM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\"ARM_AVALC\", .stats = \"fraction\", denom = \"n\", drop = TRUE) %>%\n build_table(anl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n dplyr::if_else(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- result %>% trim_rows(criteria = criteria_fun)\nresult\n\n First Elevated Result Occurring During \n PERIOD 1 PERIOD 2 \n——————————————————————————————————————————————————————————————————————\nAST >3x ULN \n A: Drug X 11/134 (8.2%) 21/134 (15.7%) \n B: Placebo 17/134 (12.7%) 16/134 (11.9%) \n C: Combination 10/132 (7.6%) 8/132 (6.1%) \nALT >3x ULN \n A: Drug X 14/134 (10.4%) 8/134 (6.0%) \n B: Placebo 24/134 (17.9%) 18/134 (13.4%) \n C: Combination 16/132 (12.1%) 10/132 (7.6%) \nAST >3x ULN or ALT >x3 ULN \n A: Drug X 14/134 (10.4%) 15/134 (11.2%) \n B: Placebo 8/134 (6.0%) 13/134 (9.7%) \n C: Combination 11/132 (8.3%) 12/132 (9.1%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:48:22 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Patient Disposition Table (CTgov & EudraCT)\nDemographic Table (CTgov & EudraCT)\nEnrollment by Country Table (EudraCT only)\nNon-Serious Adverse Events Reported in \\(\\geq\\) 5% of Patients in Any Treatment Group (CTgov & EudraCT)\nSerious Adverse Events, Fatal SAEs and SAEs Related to Study Medication, by Treatment Group (CTgov & EudraCT)\nDeath Table (EudraCT only)\nReproducibility\n\n\n\nData Setup\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\nset.seed(1, kind = \"Mersenne-Twister\")\n\n# Add additional disposition variables to adsl.\nadsl0 <- adsl %>%\n mutate(\n STSTFL = case_when(\n is.na(RANDDT) ~ \"N\",\n TRUE ~ \"Y\"\n ) %>% as.factor(),\n COMPSTUD = sample(\n c(\"Y\", \"N\"),\n size = nrow(adsl),\n replace = TRUE\n ) %>% as.factor(),\n STUDONS = sample(\n c(\"Alive: On Treatment\", \"Alive: In Follow-up\", NA),\n size = nrow(adsl),\n replace = TRUE\n ) %>% as.factor(),\n STDDRS = sample(\n c(\n \"Death\", \"Lost To Follow-Up\",\n \"Protocol Violation\", \"Withdrawal By Subject\",\n \"Other\"\n ),\n size = nrow(adsl),\n replace = TRUE\n ) %>% as.factor(),\n GOTTRT = ifelse(!is.na(ACTARMCD), \"Y\", \"N\") %>%\n as.factor(),\n DISTRTFL = sample(\n c(\"Y\", \"N\"),\n size = nrow(adsl),\n replace = TRUE\n ) %>% as.factor(),\n TRTDRS = sample(\n c(\n \"ADVERSE EVENT\", \"PROGRESSIVE DISEASE\",\n \"PHYSICIAN DECISION\", \"LACK OF EFFICACY\",\n \"OTHER\"\n ),\n size = nrow(adsl),\n replace = TRUE\n ) %>% as.factor(),\n STUDONS = case_when(COMPSTUD == \"N\" ~ STUDONS),\n STDDRS = case_when(COMPSTUD == \"N\" & is.na(STUDONS) ~ STDDRS),\n DISSTDFL = case_when(!is.na(STDDRS) ~ \"Y\"),\n DISTRTFL = case_when(GOTTRT == \"Y\" ~ DISTRTFL),\n TRTDRS = case_when(DISTRTFL == \"Y\" ~ TRTDRS),\n DRSCAT = case_when(\n TRTDRS %in% c(\"ADVERSE EVENT\", \"PHYSICIAN DECISION\") ~ \"Safety\",\n !is.na(TRTDRS) ~ \"Other\"\n )\n ) %>%\n var_relabel(\n STSTFL = \"Started Study\",\n COMPSTUD = \"Complete Study\",\n STUDONS = \"On-study Status\",\n DISSTDFL = \"Discontinued Study\",\n STDDRS = \"Reason for Study Discontinuation\",\n GOTTRT = \"Received Treatment\",\n DISTRTFL = \"Discontinued Treatment\",\n TRTDRS = \"Reason for Treatment Discontinuation\",\n DRSCAT = \"Subcategory for Treatment Discontinuation\"\n )\n\n\nPatient Disposition Table\n\nCode# Define the split function\nsplit_fun <- keep_split_levels(\"Y\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\n \"ARM\",\n split_fun = add_overall_level(\"All Patients\", first = FALSE)\n ) %>%\n count_values(\"STSTFL\",\n values = \"Y\",\n .labels = c(count_fraction = \"Started Study\")\n ) %>%\n count_values(\"COMPSTUD\",\n values = \"Y\",\n .labels = c(count_fraction = \"Completed Study\")\n ) %>%\n split_rows_by(\n \"DISSTDFL\",\n split_fun = split_fun\n ) %>%\n summarize_row_groups(label_fstr = \"Discontinued Study\") %>%\n analyze_vars(\n \"STDDRS\",\n .stats = \"count_fraction\"\n ) %>%\n append_topleft(\"Status\")\n\nresult <- build_table(lyt = lyt, df = adsl0)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients \nStatus (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————\nStarted Study 134 (100.00%) 134 (100.00%) 132 (100.00%) 400 (100.00%)\nCompleted Study 65 (48.51%) 67 (50.00%) 69 (52.27%) 201 (50.25%) \nDiscontinued Study 15 (11.2%) 28 (20.9%) 24 (18.2%) 67 (16.8%) \n Death 6 (40%) 5 (17.9%) 4 (16.7%) 15 (22.4%) \n Lost To Follow-Up 1 (6.7%) 3 (10.7%) 8 (33.3%) 12 (17.9%) \n Other 2 (13.3%) 6 (21.4%) 5 (20.8%) 13 (19.4%) \n Protocol Violation 4 (26.7%) 4 (14.3%) 4 (16.7%) 12 (17.9%) \n Withdrawal By Subject 2 (13.3%) 10 (35.7%) 3 (12.5%) 15 (22.4%) \n\n\n\n\n\nData Setup\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\n# Change description in variable SEX.\nadsl <- adsl %>%\n mutate(\n SEX = factor(case_when(\n SEX == \"M\" ~ \"Male\",\n SEX == \"F\" ~ \"Female\",\n SEX == \"U\" ~ \"Unknown\",\n SEX == \"UNDIFFERENTIATED\" ~ \"Undifferentiated\"\n )),\n AGEGRP = factor(\n case_when(\n between(AGE, 18, 40) ~ \"18-40\",\n between(AGE, 41, 64) ~ \"41-64\",\n AGE > 64 ~ \">=65\"\n ),\n levels = c(\"18-40\", \"41-64\", \">=65\")\n )\n )\n\n\nDemographic Table\n\nCodevars <- c(\"AGE\", \"AGEGRP\", \"SEX\", \"RACE\", \"ETHNIC\")\nvar_labels <- c(\"Age (yr)\", \"Age group\", \"Sex\", \"Race\", \"Ethnicity\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n add_overall_col(\"All Patients\") %>%\n analyze_vars(\n vars = vars,\n var_labels = var_labels\n )\n\nresult <- build_table(lyt = lyt, df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————————————————\nAge (yr) \n n 134 134 132 400 \n Mean (SD) 33.8 (6.6) 35.4 (7.9) 35.4 (7.7) 34.9 (7.4) \n Median 33.0 35.0 35.0 34.0 \n Min - Max 21.0 - 50.0 21.0 - 62.0 20.0 - 69.0 20.0 - 69.0 \nAge group \n n 134 134 132 400 \n 18-40 113 (84.3%) 103 (76.9%) 106 (80.3%) 322 (80.5%) \n 41-64 21 (15.7%) 31 (23.1%) 25 (18.9%) 77 (19.2%) \n >=65 0 0 1 (0.8%) 1 (0.2%) \nSex \n n 134 134 132 400 \n Female 79 (59%) 82 (61.2%) 70 (53%) 231 (57.8%) \n Male 55 (41%) 52 (38.8%) 62 (47%) 169 (42.2%) \nRace \n n 134 134 132 400 \n ASIAN 68 (50.7%) 67 (50%) 73 (55.3%) 208 (52%) \n BLACK OR AFRICAN AMERICAN 31 (23.1%) 28 (20.9%) 32 (24.2%) 91 (22.8%) \n WHITE 27 (20.1%) 26 (19.4%) 21 (15.9%) 74 (18.5%) \n AMERICAN INDIAN OR ALASKA NATIVE 8 (6%) 11 (8.2%) 6 (4.5%) 25 (6.2%) \n MULTIPLE 0 1 (0.7%) 0 1 (0.2%) \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 0 1 (0.7%) 0 1 (0.2%) \n OTHER 0 0 0 0 \n UNKNOWN 0 0 0 0 \nEthnicity \n n 134 134 132 400 \n HISPANIC OR LATINO 15 (11.2%) 18 (13.4%) 15 (11.4%) 48 (12%) \n NOT HISPANIC OR LATINO 104 (77.6%) 103 (76.9%) 101 (76.5%) 308 (77%) \n NOT REPORTED 6 (4.5%) 10 (7.5%) 11 (8.3%) 27 (6.8%) \n UNKNOWN 9 (6.7%) 3 (2.2%) 5 (3.8%) 17 (4.2%) \n\n\n\n\n\nData Setup\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadsl_labels <- var_labels(adsl)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\n\nadsl <- adsl %>%\n mutate(COUNTRY = droplevels(COUNTRY)) %>%\n arrange(REGION1, COUNTRY)\n\nvar_labels(adsl) <- c(adsl_labels)\n\n\nEnrollment by Country Table\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(label = \"All Patients\") %>%\n analyze_vars(\"COUNTRY\") %>%\n append_varlabels(adsl, \"COUNTRY\")\n\nresult <- build_table(lyt, adsl)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\nCountry (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————\nn 134 134 132 400 \nCHN 74 (55.2%) 81 (60.4%) 64 (48.5%) 219 (54.8%) \nUSA 10 (7.5%) 13 (9.7%) 17 (12.9%) 40 (10%) \nBRA 13 (9.7%) 7 (5.2%) 10 (7.6%) 30 (7.5%) \nPAK 12 (9%) 9 (6.7%) 10 (7.6%) 31 (7.8%) \nNGA 8 (6%) 7 (5.2%) 11 (8.3%) 26 (6.5%) \nRUS 5 (3.7%) 8 (6%) 6 (4.5%) 19 (4.8%) \nJPN 5 (3.7%) 4 (3%) 9 (6.8%) 18 (4.5%) \nGBR 4 (3%) 3 (2.2%) 2 (1.5%) 9 (2.2%) \nCAN 3 (2.2%) 2 (1.5%) 3 (2.3%) 8 (2%) \n\n\n\n\n\nData Setup\nTrimming function get_adae_trimmed is defined to filter AEs with greater than 5% incidence rate.\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nadae_nonser <- adae %>% filter(AESER != \"Y\", SAFFL == \"Y\")\n\nget_adae_trimmed <- function(adsl, adae, cutoff_rate) {\n n_per_arm <- adsl %>%\n dplyr::count(ARM)\n\n anl_terms <- adae %>%\n dplyr::group_by(ARM, AEBODSYS, AEDECOD) %>%\n dplyr::count(\n unique_terms = n_distinct(USUBJID)\n ) %>%\n dplyr::select(-n) %>%\n dplyr::ungroup()\n\n anl_terms <- dplyr::left_join(\n anl_terms,\n n_per_arm,\n by = \"ARM\"\n ) %>%\n dplyr::mutate(\n ae_rate = unique_terms / n\n ) %>%\n dplyr::filter(ae_rate >= cutoff_rate) %>%\n dplyr::select(AEDECOD) %>%\n unique()\n\n anl <- dplyr::left_join(\n anl_terms,\n adae,\n by = \"AEDECOD\"\n )\n anl\n}\n\nadae_trim <- get_adae_trimmed(adsl, adae_nonser, cutoff_rate = 0.05)\n\n\nNon-Serious Adverse Events Report in \\(\\geq\\) 5% of Patients in Any Treatment Group\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n split_cols_by(\"ARM\") %>%\n summarize_patients_events_in_cols(\n custom_label = \"Total number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5%\" \n ) %>%\n split_rows_by(\"AEBODSYS\",\n nested = FALSE,\n split_fun = split_fun,\n indent_mod = -1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae_trim$AEBODSYS)\n ) %>%\n split_rows_by(\"AEDECOD\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adae_trim$AEDECOD)) %>%\n summarize_patients_events_in_cols(\n col_split = FALSE\n )\n\nresult <- build_table(lyt, adae_trim)\nresult\n\nBody System or Organ Class A: Drug X B: Placebo C: Combination \n Dictionary-Derived Term Patients (All) Events (All) Patients (All) Events (All) Patients (All) Events (All)\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5% 106 360 112 367 112 421 \ncl A.1 \n dcd A.1.1.1.1 50 64 45 62 63 88 \ncl B.2 \n dcd B.2.1.2.1 49 65 44 62 52 66 \ncl C.1 \n dcd C.1.1.1.3 43 55 46 63 43 64 \ncl C.2 \n dcd C.2.1.2.1 35 48 48 53 55 65 \ncl D.1 \n dcd D.1.1.4.2 48 66 42 55 50 64 \ncl D.2 \n dcd D.2.1.5.3 47 62 58 72 57 74 \n\n\n\n\n\nFor illustrative purposes, the adae data is filtered by arm “A: Drug X” here.\nData Setup\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadae <- df_explicit_na(adae)\n\nadae_serious <- adae %>% filter(AESER == \"Y\", SAFFL == \"Y\")\nadae_serious_arm <- adae_serious %>% filter(ARM == \"A: Drug X\")\n\nfilters_list <- list(\n related = with_label(c(AEREL = \"Y\"), \"Events (Related)\"),\n fatal = with_label(c(AESDTH = \"Y\"), \"Events (Fatal)\"),\n fatal_related = with_label(c(AEREL = \"Y\", AESDTH = \"Y\"), \"Events (Fatal & Related)\")\n)\n\n\nSerious Adverse Events, Fatal SAEs and SAEs Related to Study Medication, by Treatment Group\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n summarize_patients_events_in_cols(\n filters_list = filters_list,\n empty_stats = c(\"all\", \"related\", \"fatal\", \"fatal_related\"),\n custom_label = \"Total number of patients with at least one serious adverse event\"\n ) %>%\n split_rows_by(\"AEBODSYS\",\n nested = FALSE,\n split_fun = split_fun,\n indent_mod = -1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae_trim$AEBODSYS)\n ) %>%\n split_rows_by(\"AEDECOD\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adae_serious_arm$AEDECOD)\n ) %>%\n summarize_patients_events_in_cols(\n filters_list = filters_list,\n col_split = FALSE\n )\n\nresult <- build_table(lyt, adae_serious_arm)\nresult\n\nBody System or Organ Class \n Dictionary-Derived Term Patients (All) Events (All) Events (Related) Events (Fatal) Events (Fatal & Related)\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one serious adverse event 104 \ncl A.1 \n dcd A.1.1.1.2 48 68 0 0 0 \ncl B.1 \n dcd B.1.1.1.1 47 56 56 56 56 \ncl B.2 \n dcd B.2.2.3.1 48 64 0 0 0 \ncl D.1 \n dcd D.1.1.1.1 50 61 61 61 61 \n\n\n\n\n\nData Setup\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n\nDeath Table\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n add_overall_col(\"All Patients\") %>%\n count_patients_with_event(\n \"USUBJID\",\n filters = c(\"AESDTH\" = \"Y\"),\n .labels = c(count_fraction = \"Total Number of Deaths\"),\n .formats = c(count_fraction = \"xx (xx.xx%)\")\n )\nresult <- build_table(lyt, adae, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n——————————————————————————————————————————————————————————————————————————————————\nTotal Number of Deaths 76 (62.30%) 70 (56.91%) 75 (62.50%) 221 (60.55%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:47:10 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 withr_3.0.0 \n[33] Rdpack_2.6 digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 \n[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT12" + "Disclosures", + "DISCLOSUREST01" ] }, { - "objectID": "tables/lab-results/lbt11_bl.html", - "href": "tables/lab-results/lbt11_bl.html", - "title": "LBT11_BL", + "objectID": "tables/disclosures/eudrat01.html", + "href": "tables/disclosures/eudrat01.html", + "title": "EUDRAT01", "section": "", - "text": "Data Setup\nTime-To-Event Summary\nTime-To-Event Summary Selecting Sections to Display\nTime-To-Event Summary with Stratified Analysis\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadaette <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadaette <- df_explicit_na(adaette)\n\nadsl_safl <- dplyr::filter(adsl, .data$SAFFL == \"Y\")\n\nanl <- adaette %>%\n dplyr::filter(\n SAFFL == \"Y\",\n PARAMCD == \"HYSTTEBL\"\n ) %>%\n dplyr::mutate(\n AVAL = .data$AVAL * dplyr::case_when( # convert to days, if possible\n .data$AVALU == \"WEEKS\" ~ 7,\n .data$AVALU == \"MONTHS\" ~ 30.4375,\n .data$AVALU == \"YEARS\" ~ 365,\n TRUE ~ 1\n ),\n AVALU = factor(dplyr::case_when(\n .data$AVALU %in% c(\"WEEKS\", \"MONTHS\", \"YEARS\") ~ factor(\"DAYS\"),\n TRUE ~ .data$AVALU\n ), levels = \"DAYS\"),\n is_event = CNSR == 0, # this will be a LLT event\n event_grp = factor(\n dplyr::case_when(\n CNSR == 0 ~ \"Patients with LLT event (%)\",\n CNSR == 1 ~ \"Patients without LLT event (%)\"\n ),\n levels = c(\n \"Patients with LLT event (%)\",\n \"Patients without LLT event (%)\"\n )\n )\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Unstratified Analysis\",\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 14 (10.4%) 18 (13.4%) 15 (11.4%) \nPatients without LLT event (%) 120 (89.6%) 116 (86.6%) 117 (88.6%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 721.0 \n 95% CI NA (681.0, NA) (691.0, NA) \n 25% and 75%-ile 608.0, NA 558.0, NA 644.0, NA \n Range 1.0 to 728.0 {1} 1.0 to 726.0 {1} 1.0 to 724.0 {1}\nUnstratified Analysis \n p-value (log-rank) 0.5013 0.6413 \n Hazard Ratio 1.27 0.84 \n 95% CI (0.63, 2.56) (0.40, 1.75) \n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 14 (10.4%) 18 (13.4%) 15 (11.4%) \nPatients without LLT event (%) 120 (89.6%) 116 (86.6%) 117 (88.6%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 721.0 \n 95% CI NA (681.0, NA) (691.0, NA) \n 25% and 75%-ile 608.0, NA 558.0, NA 644.0, NA \n Range 1.0 to 728.0 {1} 1.0 to 726.0 {1} 1.0 to 724.0 {1}\n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodestrata <- c(\"RACE\", \"SEX\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Unstratified Analysis\",\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = paste0(\"Stratified By: \", paste(strata, collapse = \", \")),\n strata = strata,\n table_names = \"coxph_stratified\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 14 (10.4%) 18 (13.4%) 15 (11.4%) \nPatients without LLT event (%) 120 (89.6%) 116 (86.6%) 117 (88.6%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 721.0 \n 95% CI NA (681.0, NA) (691.0, NA) \n 25% and 75%-ile 608.0, NA 558.0, NA 644.0, NA \n Range 1.0 to 728.0 {1} 1.0 to 726.0 {1} 1.0 to 724.0 {1}\nUnstratified Analysis \n p-value (log-rank) 0.5013 0.6413 \n Hazard Ratio 1.27 0.84 \n 95% CI (0.63, 2.56) (0.40, 1.75) \nStratified By: RACE, SEX \n p-value (log-rank) 0.3886 0.7970 \n Hazard Ratio 1.39 0.91 \n 95% CI (0.65, 2.97) (0.43, 1.93) \n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAETTE <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAETTE <- df_explicit_na(ADAETTE)\n\n ADSL <- filter(ADSL, .data$SAFFL == \"Y\")\n ADAETTE <- filter(ADAETTE, .data$SAFFL == \"Y\")\n})\ndatanames <- c(\"ADSL\", \"ADAETTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAETTE <- data[[\"ADAETTE\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_tte(\n label = \"Time To LLT Event Table\",\n dataname = \"ADAETTE\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADAETTE, \"PARAMCD\", \"PARAM\"),\n \"HYSTTEBL\"\n ),\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"RACE\", \"SEX\")),\n c(\"RACE\", \"SEX\")\n ),\n time_points = choices_selected(0, NULL),\n event_desc_var = choices_selected(\"EVNTDESC\", \"EVNTDESC\", fixed = TRUE)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:48:52 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\nDefine a trimming function get_adae_trimmed to filter for AEs of greater than 5% incidence rate.\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadae <- df_explicit_na(adae)\n\nadae_nonser <- adae %>% filter(AESER != \"Y\", SAFFL == \"Y\")\n\nget_adae_trimmed <- function(adsl, adae, cutoff_rate) {\n n_per_arm <- adsl %>%\n dplyr::count(ARM)\n\n anl_terms <- adae %>%\n dplyr::group_by(ARM, AEBODSYS, AEDECOD) %>%\n dplyr::count(\n unique_terms = n_distinct(USUBJID)\n ) %>%\n dplyr::select(-n) %>%\n dplyr::ungroup()\n\n anl_terms <- dplyr::left_join(\n anl_terms,\n n_per_arm,\n by = \"ARM\"\n ) %>%\n dplyr::mutate(\n ae_rate = unique_terms / n\n ) %>%\n dplyr::filter(ae_rate >= cutoff_rate) %>%\n dplyr::select(AEDECOD) %>%\n unique()\n\n anl <- dplyr::left_join(\n anl_terms,\n adae,\n by = \"AEDECOD\"\n )\n anl\n}\n\nadae_trim <- get_adae_trimmed(adsl, adae_nonser, cutoff_rate = 0.05)\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table() %>%\n split_cols_by(\"ARM\") %>%\n summarize_patients_events_in_cols(\n custom_label = \"Total number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5% and number of events\" \n ) %>%\n split_rows_by(\"AEBODSYS\",\n nested = FALSE,\n split_fun = split_fun,\n indent_mod = -1L,\n label_pos = \"topleft\",\n split_label = obj_label(adae_trim$AEBODSYS)\n ) %>%\n split_rows_by(\"AEDECOD\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adae_trim$AEDECOD)) %>%\n summarize_patients_events_in_cols(\n col_split = FALSE\n )\n\nresult <- build_table(lyt, adae_trim)\nresult\n\nBody System or Organ Class A: Drug X B: Placebo C: Combination \n Dictionary-Derived Term Patients (All) Events (All) Patients (All) Events (All) Patients (All) Events (All)\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5% and number of events 106 360 112 367 112 421 \ncl A.1 \n dcd A.1.1.1.1 50 64 45 62 63 88 \ncl B.2 \n dcd B.2.1.2.1 49 65 44 62 52 66 \ncl C.1 \n dcd C.1.1.1.3 43 55 46 63 43 64 \ncl C.2 \n dcd C.2.1.2.1 35 48 48 53 55 65 \ncl D.1 \n dcd D.1.1.4.2 48 66 42 55 50 64 \ncl D.2 \n dcd D.2.1.5.3 47 62 58 72 57 74 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:47:23 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 withr_3.0.0 \n[33] Rdpack_2.6 digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 \n[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT11_BL" + "Disclosures", + "EUDRAT01" ] }, { - "objectID": "tables/lab-results/lbt11.html", - "href": "tables/lab-results/lbt11.html", - "title": "LBT11", + "objectID": "tables/pharmacokinetic/pkpt05.html", + "href": "tables/pharmacokinetic/pkpt05.html", + "title": "PKPT05", "section": "", - "text": "Data Setup\nTime-To-Event Summary\nTime-To-Event Summary Selecting Sections to Display\nTime-To-Event Summary with Stratified Analysis\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadaette <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadaette <- df_explicit_na(adaette)\n\nadsl_safl <- dplyr::filter(adsl, .data$SAFFL == \"Y\")\n\nanl <- adaette %>%\n dplyr::filter(\n SAFFL == \"Y\",\n PARAMCD == \"HYSTTEUL\"\n ) %>%\n dplyr::mutate(\n AVAL = .data$AVAL * dplyr::case_when( # convert to days, if possible\n .data$AVALU == \"WEEKS\" ~ 7,\n .data$AVALU == \"MONTHS\" ~ 30.4375,\n .data$AVALU == \"YEARS\" ~ 365,\n TRUE ~ 1\n ),\n AVALU = factor(dplyr::case_when(\n .data$AVALU %in% c(\"WEEKS\", \"MONTHS\", \"YEARS\") ~ factor(\"DAYS\"),\n TRUE ~ .data$AVALU\n ), levels = \"DAYS\"),\n is_event = CNSR == 0, # this will be a LLT event\n event_grp = factor(\n dplyr::case_when(\n CNSR == 0 ~ \"Patients with LLT event (%)\",\n CNSR == 1 ~ \"Patients without LLT event (%)\"\n ),\n levels = c(\n \"Patients with LLT event (%)\",\n \"Patients without LLT event (%)\"\n )\n )\n )\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Unstratified Analysis\",\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 20 (14.9%) 9 (6.7%) 9 (6.8%) \nPatients without LLT event (%) 114 (85.1%) 125 (93.3%) 123 (93.2%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 728.0 \n 95% CI NA (724.0, NA) NA \n 25% and 75%-ile 618.0, NA 724.0, NA 728.0, 728.0 \n Range 1.0 to 731.0 {1} 1.0 to 728.0 {1} 1.0 to 728.0 {2}\nUnstratified Analysis \n p-value (log-rank) 0.0295 0.1687 \n Hazard Ratio 0.43 0.58 \n 95% CI (0.19, 0.94) (0.26, 1.27) \n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n{2} - Censored observation: range minimum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 20 (14.9%) 9 (6.7%) 9 (6.8%) \nPatients without LLT event (%) 114 (85.1%) 125 (93.3%) 123 (93.2%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 728.0 \n 95% CI NA (724.0, NA) NA \n 25% and 75%-ile 618.0, NA 724.0, NA 728.0, 728.0 \n Range 1.0 to 731.0 {1} 1.0 to 728.0 {1} 1.0 to 728.0 {2}\n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n{2} - Censored observation: range minimum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\n\n\nCodestrata <- c(\"RACE\", \"SEX\")\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARMCD\", ref_group = \"ARM A\") %>%\n count_occurrences(vars = \"event_grp\") %>%\n surv_time(\n vars = \"AVAL\",\n var_labels = paste0(\"Time to 1st LLT Event (\", levels(anl$AVALU), \")\"),\n is_event = \"is_event\",\n table_names = \"time_to_event\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = \"Unstratified Analysis\",\n control = control_coxph(pval_method = \"log-rank\"),\n table_names = \"coxph_unstratified\"\n ) %>%\n coxph_pairwise(\n vars = \"AVAL\",\n is_event = \"is_event\",\n var_labels = paste0(\"Stratified By: \", paste(strata, collapse = \", \")),\n strata = strata,\n table_names = \"coxph_stratified\"\n )\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nPatients with LLT event (%) 20 (14.9%) 9 (6.7%) 9 (6.8%) \nPatients without LLT event (%) 114 (85.1%) 125 (93.3%) 123 (93.2%) \nTime to 1st LLT Event (DAYS) \n Median NA NA 728.0 \n 95% CI NA (724.0, NA) NA \n 25% and 75%-ile 618.0, NA 724.0, NA 728.0, 728.0 \n Range 1.0 to 731.0 {1} 1.0 to 728.0 {1} 1.0 to 728.0 {2}\nUnstratified Analysis \n p-value (log-rank) 0.0295 0.1687 \n Hazard Ratio 0.43 0.58 \n 95% CI (0.19, 0.94) (0.26, 1.27) \nStratified By: RACE, SEX \n p-value (log-rank) 0.0858 0.1605 \n Hazard Ratio 0.51 0.57 \n 95% CI (0.23, 1.12) (0.26, 1.26) \n———————————————————————————————————————————————————————————————————————————————————————\n\n{1} - Censored observations: range minimum & maximum\n{2} - Censored observation: range minimum\n———————————————————————————————————————————————————————————————————————————————————————\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADAETTE <- synthetic_cdisc_dataset(\"latest\", \"adaette\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADAETTE <- df_explicit_na(ADAETTE)\n\n ADSL <- filter(ADSL, .data$SAFFL == \"Y\")\n ADAETTE <- filter(ADAETTE, .data$SAFFL == \"Y\")\n})\ndatanames <- c(\"ADSL\", \"ADAETTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADAETTE <- data[[\"ADAETTE\"]]\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_tte(\n label = \"Time To LLT Event Table\",\n dataname = \"ADAETTE\",\n arm_var = choices_selected(\n variable_choices(data[[\"ADSL\"]], c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(data[[\"ADAETTE\"]], \"PARAMCD\", \"PARAM\"),\n \"HYSTTEUL\"\n ),\n strata_var = choices_selected(\n variable_choices(data[[\"ADSL\"]], c(\"RACE\", \"SEX\")),\n c(\"RACE\", \"SEX\")\n ),\n time_points = choices_selected(0, NULL),\n event_desc_var = choices_selected(\"EVNTDESC\", \"EVNTDESC\", fixed = TRUE)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:49:24 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>% filter(PPSPEC == \"Urine\", AVISIT == \"CYCLE 1 DAY 1\")\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_rows_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ARMCD\"),\n label_pos = \"topleft\",\n split_label = \"Treatment Arm\"\n ) %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\",\n child_labels = \"hidden\"\n ) %>%\n analyze_vars_in_cols(\n vars = \"AVAL\",\n .stats = c(\n \"n\", \"mean\", \"sd\", \"cv\",\n \"geom_mean\", \"geom_cv\", \"median\",\n \"min\", \"max\"\n ),\n .labels = c(\n n = \"n\",\n mean = \"Mean\",\n sd = \"SD\",\n cv = \"CV (%)\",\n geom_mean = \"Geometric Mean\",\n geom_cv = \"CV % Geometric Mean\",\n median = \"Median\",\n min = \"Minimum\",\n max = \"Maximum\"\n ),\n .formats = c(\n n = \"xx.\",\n mean = format_sigfig(3),\n sd = format_sigfig(3),\n cv = \"xx.x\",\n median = format_sigfig(3),\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n min = format_sigfig(3),\n max = format_sigfig(3)\n )\n )\n\n\nPlasma Drug X\n\n\nCodeadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\"Summary of\", unique(adpp0$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM A \n Ae (mg) 268 1.55 0.338 21.8 1.51 23.0 1.55 0.702 2.46 \n Fe (%) 268 15.7 3.35 21.3 15.3 22.2 15.8 8.15 24.5 \n CLR (L/hr) 134 0.0492 0.00961 19.5 0.0482 21.0 0.0491 0.0249 0.0751 \n RENALCLD (L/hr/mg) 134 0.00487 0.000965 19.8 0.00477 21.2 0.00497 0.00238 0.00726\nARM C \n Ae (mg) 264 1.54 0.298 19.4 1.51 20.3 1.55 0.850 2.21 \n Fe (%) 264 16.1 3.10 19.3 15.8 20.2 16.0 8.50 24.4 \n CLR (L/hr) 132 0.0502 0.0105 20.9 0.0491 21.9 0.0498 0.0251 0.0856 \n RENALCLD (L/hr/mg) 132 0.00511 0.000934 18.3 0.00502 19.7 0.00515 0.00236 0.00741\n\n\nPlasma Drug Y\n\n\nCodeadpp1 <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp1)\nmain_title(result) <- paste(\"Summary of\", unique(adpp1$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp1$PPCAT), \"\\nVisit:\", unique(adpp1$AVISIT))\nresult\n\nSummary of Urine PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y \nVisit: CYCLE 1 DAY 1\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Arm \n PK Parameter n Mean SD CV (%) Geometric Mean CV % Geometric Mean Median Minimum Maximum\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nARM C \n Ae (mg) 264 1.60 0.315 19.7 1.56 21.4 1.60 0.857 2.26 \n Fe (%) 264 15.8 3.08 19.4 15.5 20.2 15.7 8.31 23.8 \n CLR (L/hr) 132 0.0497 0.0101 20.3 0.0486 22.0 0.0491 0.0184 0.0776 \n RENALCLD (L/hr/mg) 132 0.00509 0.00103 20.3 0.00499 21.4 0.00502 0.00236 0.00794\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:47:35 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT11" + "Pharmacokinetic", + "PKPT05" ] }, { - "objectID": "tables/lab-results/lbt06.html", - "href": "tables/lab-results/lbt06.html", - "title": "LBT06", + "objectID": "tables/pharmacokinetic/pkpt02.html", + "href": "tables/pharmacokinetic/pkpt02.html", + "title": "PKPT02", "section": "", - "text": "Data Setup\nStandard Table for Single Lab Test\nStandard Table for Multiple Lab Tests\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n# Please note that df_explict_na has a na_level argument defaulting to \"<Missing>\",\n# Please don't change the na_level to anything other than NA, empty string or the default \"<Missing>\".\n\nadlb_f <- adlb %>%\n dplyr::filter(ABLFL != \"Y\") %>%\n dplyr::filter(!(AVISIT %in% c(\"SCREENING\", \"BASELINE\"))) %>%\n dplyr::mutate(AVISIT = droplevels(AVISIT)) %>%\n var_relabel(AVISIT = \"Visit\")\n\nadlb_f_crp <- adlb_f %>% dplyr::filter(PARAMCD == \"CRP\")\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f_crp$AVISIT)) %>%\n count_abnormal_by_baseline(\n \"ANRIND\",\n abnormal = c(Low = \"LOW\", High = \"HIGH\"),\n .indent_mods = 4L\n ) %>%\n append_varlabels(adlb_f_crp, \"ANRIND\", indent = 1L) %>%\n append_topleft(\" Baseline Status\")\n\nresult <- build_table(\n lyt = lyt,\n df = adlb_f_crp,\n alt_counts_df = adsl\n) %>%\n trim_rows()\n\nresult\n\nVisit \n Analysis Reference Range Indicator A: Drug X B: Placebo C: Combination\n Baseline Status (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nWEEK 1 DAY 8 \n Low \n Not low 16/119 (13.4%) 22/113 (19.5%) 24/112 (21.4%)\n Low 2/15 (13.3%) 2/21 (9.5%) 7/20 (35%) \n Total 18/134 (13.4%) 24/134 (17.9%) 31/132 (23.5%)\n High \n Not high 21/114 (18.4%) 20/112 (17.9%) 17/115 (14.8%)\n High 2/20 (10%) 4/22 (18.2%) 3/17 (17.6%) \n Total 23/134 (17.2%) 24/134 (17.9%) 20/132 (15.2%)\nWEEK 2 DAY 15 \n Low \n Not low 26/119 (21.8%) 20/113 (17.7%) 12/112 (10.7%)\n Low 2/15 (13.3%) 3/21 (14.3%) 4/20 (20%) \n Total 28/134 (20.9%) 23/134 (17.2%) 16/132 (12.1%)\n High \n Not high 15/114 (13.2%) 17/112 (15.2%) 15/115 (13%) \n High 2/20 (10%) 4/22 (18.2%) 4/17 (23.5%) \n Total 17/134 (12.7%) 21/134 (15.7%) 19/132 (14.4%)\nWEEK 3 DAY 22 \n Low \n Not low 15/119 (12.6%) 21/113 (18.6%) 18/112 (16.1%)\n Low 0/15 3/21 (14.3%) 0/20 \n Total 15/134 (11.2%) 24/134 (17.9%) 18/132 (13.6%)\n High \n Not high 22/114 (19.3%) 18/112 (16.1%) 17/115 (14.8%)\n High 2/20 (10%) 5/22 (22.7%) 1/17 (5.9%) \n Total 24/134 (17.9%) 23/134 (17.2%) 18/132 (13.6%)\nWEEK 4 DAY 29 \n Low \n Not low 30/119 (25.2%) 13/113 (11.5%) 16/112 (14.3%)\n Low 3/15 (20%) 2/21 (9.5%) 5/20 (25%) \n Total 33/134 (24.6%) 15/134 (11.2%) 21/132 (15.9%)\n High \n Not high 17/114 (14.9%) 11/112 (9.8%) 16/115 (13.9%)\n High 2/20 (10%) 6/22 (27.3%) 3/17 (17.6%) \n Total 19/134 (14.2%) 17/134 (12.7%) 19/132 (14.4%)\nWEEK 5 DAY 36 \n Low \n Not low 17/119 (14.3%) 19/113 (16.8%) 16/112 (14.3%)\n Low 2/15 (13.3%) 3/21 (14.3%) 5/20 (25%) \n Total 19/134 (14.2%) 22/134 (16.4%) 21/132 (15.9%)\n High \n Not high 19/114 (16.7%) 17/112 (15.2%) 11/115 (9.6%) \n High 4/20 (20%) 6/22 (27.3%) 2/17 (11.8%) \n Total 23/134 (17.2%) 23/134 (17.2%) 13/132 (9.8%) \n\n\n\n\n\nCode# The following code generates one large table for multiple lab tests.\n# If separate tables are needed for each lab test per GDSR standard, use the code for \"single lab test\".\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f$PARAM)) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f$AVISIT)) %>%\n count_abnormal_by_baseline(\n \"ANRIND\",\n abnormal = c(Low = \"LOW\", High = \"HIGH\"),\n .indent_mods = 4L\n ) %>%\n append_varlabels(adlb_f, \"ANRIND\", indent = 2L) %>%\n append_topleft(\" Baseline Status\")\n\nresult <- build_table(\n lyt = lyt,\n df = adlb_f,\n alt_counts_df = adsl\n) %>%\n trim_rows()\n\nresult\n\nParameter \n Visit \n Analysis Reference Range Indicator A: Drug X B: Placebo C: Combination\n Baseline Status (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n WEEK 1 DAY 8 \n Low \n Not low 19/113 (16.8%) 13/117 (11.1%) 14/123 (11.4%)\n Low 2/21 (9.5%) 1/17 (5.9%) 1/9 (11.1%) \n Total 21/134 (15.7%) 14/134 (10.4%) 15/132 (11.4%)\n High \n Not high 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n WEEK 2 DAY 15 \n Low \n Not low 17/113 (15%) 13/117 (11.1%) 13/123 (10.6%)\n Low 2/21 (9.5%) 2/17 (11.8%) 4/9 (44.4%) \n Total 19/134 (14.2%) 15/134 (11.2%) 17/132 (12.9%)\n High \n Not high 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n WEEK 3 DAY 22 \n Low \n Not low 10/113 (8.8%) 20/117 (17.1%) 21/123 (17.1%)\n Low 4/21 (19%) 4/17 (23.5%) 2/9 (22.2%) \n Total 14/134 (10.4%) 24/134 (17.9%) 23/132 (17.4%)\n High \n Not high 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n WEEK 4 DAY 29 \n Low \n Not low 15/113 (13.3%) 19/117 (16.2%) 18/123 (14.6%)\n Low 2/21 (9.5%) 3/17 (17.6%) 1/9 (11.1%) \n Total 17/134 (12.7%) 22/134 (16.4%) 19/132 (14.4%)\n High \n Not high 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n WEEK 5 DAY 36 \n Low \n Not low 17/113 (15%) 23/117 (19.7%) 18/123 (14.6%)\n Low 0/21 1/17 (5.9%) 1/9 (11.1%) \n Total 17/134 (12.7%) 24/134 (17.9%) 19/132 (14.4%)\n High \n Not high 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \nC-Reactive Protein Measurement \n WEEK 1 DAY 8 \n Low \n Not low 16/119 (13.4%) 22/113 (19.5%) 24/112 (21.4%)\n Low 2/15 (13.3%) 2/21 (9.5%) 7/20 (35%) \n Total 18/134 (13.4%) 24/134 (17.9%) 31/132 (23.5%)\n High \n Not high 21/114 (18.4%) 20/112 (17.9%) 17/115 (14.8%)\n High 2/20 (10%) 4/22 (18.2%) 3/17 (17.6%) \n Total 23/134 (17.2%) 24/134 (17.9%) 20/132 (15.2%)\n WEEK 2 DAY 15 \n Low \n Not low 26/119 (21.8%) 20/113 (17.7%) 12/112 (10.7%)\n Low 2/15 (13.3%) 3/21 (14.3%) 4/20 (20%) \n Total 28/134 (20.9%) 23/134 (17.2%) 16/132 (12.1%)\n High \n Not high 15/114 (13.2%) 17/112 (15.2%) 15/115 (13%) \n High 2/20 (10%) 4/22 (18.2%) 4/17 (23.5%) \n Total 17/134 (12.7%) 21/134 (15.7%) 19/132 (14.4%)\n WEEK 3 DAY 22 \n Low \n Not low 15/119 (12.6%) 21/113 (18.6%) 18/112 (16.1%)\n Low 0/15 3/21 (14.3%) 0/20 \n Total 15/134 (11.2%) 24/134 (17.9%) 18/132 (13.6%)\n High \n Not high 22/114 (19.3%) 18/112 (16.1%) 17/115 (14.8%)\n High 2/20 (10%) 5/22 (22.7%) 1/17 (5.9%) \n Total 24/134 (17.9%) 23/134 (17.2%) 18/132 (13.6%)\n WEEK 4 DAY 29 \n Low \n Not low 30/119 (25.2%) 13/113 (11.5%) 16/112 (14.3%)\n Low 3/15 (20%) 2/21 (9.5%) 5/20 (25%) \n Total 33/134 (24.6%) 15/134 (11.2%) 21/132 (15.9%)\n High \n Not high 17/114 (14.9%) 11/112 (9.8%) 16/115 (13.9%)\n High 2/20 (10%) 6/22 (27.3%) 3/17 (17.6%) \n Total 19/134 (14.2%) 17/134 (12.7%) 19/132 (14.4%)\n WEEK 5 DAY 36 \n Low \n Not low 17/119 (14.3%) 19/113 (16.8%) 16/112 (14.3%)\n Low 2/15 (13.3%) 3/21 (14.3%) 5/20 (25%) \n Total 19/134 (14.2%) 22/134 (16.4%) 21/132 (15.9%)\n High \n Not high 19/114 (16.7%) 17/112 (15.2%) 11/115 (9.6%) \n High 4/20 (20%) 6/22 (27.3%) 2/17 (11.8%) \n Total 23/134 (17.2%) 23/134 (17.2%) 13/132 (9.8%) \nImmunoglobulin A Measurement \n WEEK 1 DAY 8 \n Low \n Not low 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n High \n Not high 18/119 (15.1%) 20/116 (17.2%) 14/113 (12.4%)\n High 1/15 (6.7%) 5/18 (27.8%) 4/19 (21.1%) \n Total 19/134 (14.2%) 25/134 (18.7%) 18/132 (13.6%)\n WEEK 2 DAY 15 \n Low \n Not low 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n High \n Not high 16/119 (13.4%) 13/116 (11.2%) 12/113 (10.6%)\n High 1/15 (6.7%) 1/18 (5.6%) 2/19 (10.5%) \n Total 17/134 (12.7%) 14/134 (10.4%) 14/132 (10.6%)\n WEEK 3 DAY 22 \n Low \n Not low 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n High \n Not high 17/119 (14.3%) 15/116 (12.9%) 21/113 (18.6%)\n High 0/15 1/18 (5.6%) 1/19 (5.3%) \n Total 17/134 (12.7%) 16/134 (11.9%) 22/132 (16.7%)\n WEEK 4 DAY 29 \n Low \n Not low 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n High \n Not high 19/119 (16%) 16/116 (13.8%) 19/113 (16.8%)\n High 4/15 (26.7%) 5/18 (27.8%) 3/19 (15.8%) \n Total 23/134 (17.2%) 21/134 (15.7%) 22/132 (16.7%)\n WEEK 5 DAY 36 \n Low \n Not low 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n High \n Not high 16/119 (13.4%) 21/116 (18.1%) 20/113 (17.7%)\n High 1/15 (6.7%) 3/18 (16.7%) 0/19 \n Total 17/134 (12.7%) 24/134 (17.9%) 20/132 (15.2%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:49:39 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9016 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table – Plasma\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp <- adpp %>% filter(PPSPEC == \"Plasma\", AVISIT == \"CYCLE 1 DAY 1\")\n\n\n\n\n\nCode# lyt creation\nlyt <- basic_table() %>%\n split_cols_by(\n var = \"ARMCD\",\n split_fun = trim_levels_in_group(\"ARMCD\"),\n split_label = \"Treatment Arm\"\n ) %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_label = \"PK Parameter\"\n ) %>%\n tern::analyze_vars(\n vars = \"AVAL\",\n .stats = c(\"n\", \"mean_sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"range\"),\n .formats = c(\n n = \"xx.\",\n mean_sd = format_sigfig(3, \"xx (xx)\"),\n cv = \"xx.x\",\n geom_mean = format_sigfig(3),\n geom_cv = \"xx.x\",\n median = format_sigfig(3),\n range = format_sigfig(3, \"xx - xx\")\n )\n )\n\n\nPlasma Drug X\n\n\nCodeadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp0)\nmain_title(result) <- paste(\"Summary of\", unique(adpp0$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT), \"\\nVisit:\", unique(adpp0$AVISIT))\nresult\n\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug X \nVisit: CYCLE 1 DAY 1\n\n———————————————————————————————————————————————————\nPK Parameter ARM A ARM C \n———————————————————————————————————————————————————\nCmax (ug/mL) \n n 134 132 \n Mean (SD) 30.2 (6.24) 30.0 (5.46) \n CV (%) 20.6 18.2 \n Geometric Mean 29.6 29.5 \n CV % Geometric Mean 21.0 18.9 \n Median 29.9 29.8 \n Min - Max 17.5 - 48.7 15.9 - 47.6 \nAUCinf obs (day*ug/mL) \n n 134 132 \n Mean (SD) 203 (37.7) 195 (37.8) \n CV (%) 18.6 19.4 \n Geometric Mean 199 192 \n CV % Geometric Mean 18.7 20.1 \n Median 197 196 \n Min - Max 125 - 311 103 - 315 \nCL obs (ml/day/kg) \n n 134 132 \n Mean (SD) 5.04 (1.04) 5.01 (0.985)\n CV (%) 20.6 19.7 \n Geometric Mean 4.93 4.91 \n CV % Geometric Mean 22.4 21.1 \n Median 5.08 4.97 \n Min - Max 2.25 - 7.39 2.10 - 7.49 \n\n\nPlasma Drug Y\n\n\nCodeadpp1 <- adpp %>%\n filter(PPCAT == \"Plasma Drug Y\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n mutate(PKPARAM = reorder(PKPARAM, TLG_ORDER))\n\nresult <- build_table(lyt, df = adpp1)\nmain_title(result) <- paste(\"Summary of\", unique(adpp1$PPSPEC), \"PK Parameter by Treatment Arm, PK Population\")\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp1$PPCAT), \"\\nVisit:\", unique(adpp1$AVISIT))\nresult\n\nSummary of Plasma PK Parameter by Treatment Arm, PK Population\nAnalyte: Plasma Drug Y \nVisit: CYCLE 1 DAY 1\n\n—————————————————————————————————————\nPK Parameter ARM C \n—————————————————————————————————————\nCmax (ug/mL) \n n 132 \n Mean (SD) 29.9 (5.55) \n CV (%) 18.6 \n Geometric Mean 29.4 \n CV % Geometric Mean 20.1 \n Median 29.7 \n Min - Max 14.1 - 43.4 \nAUCinf obs (day*ug/mL) \n n 132 \n Mean (SD) 199 (37.9) \n CV (%) 19.1 \n Geometric Mean 195 \n CV % Geometric Mean 18.9 \n Median 195 \n Min - Max 126 - 318 \nCL obs (ml/day/kg) \n n 132 \n Mean (SD) 4.96 (0.895)\n CV (%) 18.1 \n Geometric Mean 4.87 \n CV % Geometric Mean 18.7 \n Median 4.94 \n Min - Max 2.99 - 7.21 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:47:54 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT06" - ] - }, - { - "objectID": "tables/lab-results/lbt08.html", - "href": "tables/lab-results/lbt08.html", - "title": "LBT08", - "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb <- adlb %>%\n mutate(\n GRADDR = case_when(\n PARAMCD == \"ALT\" ~ \"L\",\n PARAMCD == \"CRP\" ~ \"B\",\n PARAMCD == \"IGA\" ~ \"H\"\n )\n ) %>%\n filter(SAFFL == \"Y\" & ONTRTFL == \"Y\" & GRADDR != \"\")\n\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\ndf <- h_adlb_worsen(\n adlb,\n worst_flag_low = c(\"WGRLOFL\" = \"Y\"),\n worst_flag_high = c(\"WGRHIFL\" = \"Y\"),\n direction_var = \"GRADDR\"\n)\n\nattributes(df$GRADDR) <- list(\"label\" = \"Direction of Abnormality\")\n\n\n\n\nNote: The direction of the shift table for each lab test is based on metadata and NCI CTCAE specifications. In addition, the worst laboratory flags must be selected appropriately to match the direction of abnormality. For example, if any lab requires a shift table for both directions, then both worst_flag_low and worst_flag_high must be specified in h_adlb_worsen. If all labs requires a shift table for only one direction, then the matching worst lab flag variable must be selected in h_adlb_worsen.\n\nCoderesult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\") %>%\n split_rows_by(\"PARAMCD\", label_pos = \"topleft\", split_label = obj_label(df$PARAMCD)) %>%\n split_rows_by(\"GRADDR\", label_pos = \"topleft\", split_label = obj_label(df$GRADDR)) %>%\n count_abnormal_lab_worsen_by_baseline(\n var = \"ATOXGR\",\n variables = list(\n id = \"USUBJID\",\n baseline_var = \"BTOXGR\",\n direction_var = \"GRADDR\"\n )\n ) %>%\n append_topleft(\" Highest NCI CTCAE Grade\") %>%\n build_table(df = df, alt_counts_df = adsl)\n\nresult\n\nParameter Code \n Direction of Abnormality ARM A ARM B ARM C \n Highest NCI CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————\nALT \n Low \n 1 11/113 (9.7%) 9/117 (7.7%) 15/123 (12.2%)\n 2 15/119 (12.6%) 23/123 (18.7%) 16/127 (12.6%)\n 3 15/127 (11.8%) 22/128 (17.2%) 14/128 (10.9%)\n 4 17/130 (13.1%) 10/131 (7.6%) 18/130 (13.8%)\n Any 58/130 (44.6%) 64/131 (48.9%) 63/130 (48.5%)\nCRP \n High \n 1 18/114 (15.8%) 18/112 (16.1%) 19/115 (16.5%)\n 2 20/122 (16.4%) 13/122 (10.7%) 14/122 (11.5%)\n 3 23/124 (18.5%) 14/128 (10.9%) 20/129 (15.5%)\n 4 12/131 (9.2%) 20/132 (15.2%) 11/132 (8.3%) \n Any 73/131 (55.7%) 65/132 (49.2%) 64/132 (48.5%)\n Low \n 1 20/119 (16.8%) 18/113 (15.9%) 11/112 (9.8%) \n 2 24/122 (19.7%) 21/118 (17.8%) 17/121 (14%) \n 3 26/127 (20.5%) 20/127 (15.7%) 22/123 (17.9%)\n 4 10/131 (7.6%) 16/132 (12.1%) 21/130 (16.2%)\n Any 80/131 (61.1%) 75/132 (56.8%) 71/130 (54.6%)\nIGA \n High \n 1 18/119 (15.1%) 11/116 (9.5%) 15/113 (13.3%)\n 2 15/124 (12.1%) 23/120 (19.2%) 19/115 (16.5%)\n 3 21/128 (16.4%) 21/124 (16.9%) 20/120 (16.7%)\n 4 12/132 (9.1%) 12/129 (9.3%) 9/131 (6.9%) \n Any 66/132 (50%) 67/129 (51.9%) 63/131 (48.1%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:49:59 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", - "crumbs": [ - "Tables", - "Lab Results", - "LBT08" + "Pharmacokinetic", + "PKPT02" ] }, { - "objectID": "tables/lab-results/lbt14.html", - "href": "tables/lab-results/lbt14.html", - "title": "LBT14", + "objectID": "tables/pharmacokinetic/pkct01.html", + "href": "tables/pharmacokinetic/pkct01.html", + "title": "PKCT01", "section": "", - "text": "Data Setup\nStandard Table (High)\nStandard Table (Low)\nTable Without Patients with Missing Baseline (High)\nTable with Missing Baseline Considered as Grade 0 (Low)\nTable with Fill-In of Grades\nteal App\nReproducibility\n\n\n\nPlease note that for each variant, the adlb dataset needs to be filtered on correct flags like WGRLOFL, WGRHIFL, et al., otherwise the layout function will not return the correct counts. There is an option to create a record for a lab test where no record is found at that visit. If you specified add_derived_type = \"PHANTOM\" & dtype_phantom_cond, you don’t have to use the h_adsl_adlb_merge_using_worst_flag function to preprocess your adlb dataset. Otherwise please follow the pre-processing steps below before applying the layout functions.\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\n# Please note that in real clinical data, population flag like SAFFL, and parameter category like PARCAT2 needs to be\n# selected properly.\nadsl_f <- adsl %>% filter(SAFFL == \"Y\")\nadlb <- adlb %>% filter(SAFFL == \"Y\")\n\n\n\n\nNote that the worst laboratory flag (below WGRHIFL) must be selected appropriately in the pre-processing step. New grouping variables ATOXGR_GP (post-baseline) and BTOXGR_GP (baseline) are created to display the correct output.\n\nCodeadlb_f <- adlb %>% filter(WGRHIFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c(\"WGRHIFL\" = \"Y\"))\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = factor(case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n ) %>%\n mutate(\n BTOXGR_GP = factor(case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = \"Parameter\"\n ) %>%\n split_rows_by(\n \"BTOXGR_GP\",\n label_pos = \"topleft\",\n split_label = \" Baseline NCI-CTCAE Grade\",\n indent_mod = 2L\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\"), unique_count_suffix = FALSE) %>%\n count_occurrences_by_grade(\"ATOXGR_GP\", denom = \"n\", drop = FALSE, .indent_mods = 3L) %>%\n append_topleft(\" Post-baseline NCI-CTCAE Grade\") %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nParameter \n Baseline NCI-CTCAE Grade A: Drug X B: Placebo C: Combination\n Post-baseline NCI-CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Not High 134 134 132 \n Not High 134 (100%) 134 (100%) 132 (100%) \nC-Reactive Protein Measurement \n Not High 114 112 115 \n Not High 45 (33.6%) 55 (41.0%) 57 (43.2%) \n 1 18 (13.4%) 18 (13.4%) 19 (14.4%) \n 2 19 (14.2%) 10 (7.5%) 11 (8.3%) \n 3 22 (16.4%) 13 (9.7%) 20 (15.2%) \n 4 10 (7.5%) 16 (11.9%) 8 (6.1%) \n 1 8 10 7 \n Not High 5 (3.7%) 2 (1.5%) 2 (1.5%) \n 1 0 1 (0.7%) 0 \n 2 1 (0.7%) 3 (2.2%) 3 (2.3%) \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 3 (2.2%) 2 (1.5%) \n 2 2 6 7 \n Not High 1 (0.7%) 4 (3.0%) 4 (3.0%) \n 1 0 1 (0.7%) 2 (1.5%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 4 0 0 1 (0.8%) \n 3 7 4 3 \n Not High 3 (2.2%) 0 2 (1.5%) \n 1 2 (1.5%) 1 (0.7%) 1 (0.8%) \n 2 0 1 (0.7%) 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n 4 3 2 0 \n Not High 1 (0.7%) 0 0 \n 1 0 1 (0.7%) 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 0 0 \nImmunoglobulin A Measurement \n Not High 119 116 113 \n Not High 55 (41.0%) 54 (40.3%) 51 (38.6%) \n 1 18 (13.4%) 11 (8.2%) 15 (11.4%) \n 2 14 (10.4%) 22 (16.4%) 19 (14.4%) \n 3 20 (14.9%) 19 (14.2%) 20 (15.2%) \n 4 12 (9.0%) 10 (7.5%) 8 (6.1%) \n 1 5 4 2 \n Not High 4 (3.0%) 1 (0.7%) 2 (1.5%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 3 0 2 (1.5%) 0 \n 2 4 4 5 \n Not High 2 (1.5%) 3 (2.2%) 3 (2.3%) \n 1 1 (0.7%) 0 2 (1.5%) \n 3 1 (0.7%) 0 0 \n 4 0 1 (0.7%) 0 \n 3 4 5 11 \n Not High 3 (2.2%) 1 (0.7%) 6 (4.5%) \n 1 0 1 (0.7%) 1 (0.8%) \n 2 1 (0.7%) 0 0 \n 3 0 2 (1.5%) 3 (2.3%) \n 4 0 1 (0.7%) 1 (0.8%) \n 4 2 5 1 \n Not High 0 3 (2.2%) 1 (0.8%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n\n\n\n\nNote that the worst laboratory flag (below WGRLOFL) must be selected appropriately in the pre-processing step. New grouping variables ATOXGR_GP (post-baseline) and BTOXGR_GP (baseline) are created to display the correct output.\n\nCodeadlb_f <- adlb %>% filter(WGRLOFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c(\"WGRLOFL\" = \"Y\"))\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = factor(case_when(\n ATOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n ATOXGR == -1 ~ \"1\",\n ATOXGR == -2 ~ \"2\",\n ATOXGR == -3 ~ \"3\",\n ATOXGR == -4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n ) %>%\n mutate(\n BTOXGR_GP = factor(case_when(\n BTOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n BTOXGR == -1 ~ \"1\",\n BTOXGR == -2 ~ \"2\",\n BTOXGR == -3 ~ \"3\",\n BTOXGR == -4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = \"Parameter\"\n ) %>%\n split_rows_by(\n \"BTOXGR_GP\",\n label_pos = \"topleft\",\n split_label = \" Baseline NCI-CTCAE Grade\",\n indent_mod = 2L\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\"), unique_count_suffix = FALSE) %>%\n count_occurrences_by_grade(\"ATOXGR_GP\", denom = \"n\", drop = FALSE, .indent_mods = 3L) %>%\n append_topleft(\" Post-baseline NCI-CTCAE Grade\") %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nParameter \n Baseline NCI-CTCAE Grade A: Drug X B: Placebo C: Combination\n Post-baseline NCI-CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Not Low 113 117 123 \n Not Low 56 (41.8%) 55 (41.0%) 62 (47.0%) \n 1 11 (8.2%) 9 (6.7%) 15 (11.4%) \n 2 15 (11.2%) 23 (17.2%) 16 (12.1%) \n 3 15 (11.2%) 21 (15.7%) 13 (9.8%) \n 4 16 (11.9%) 9 (6.7%) 17 (12.9%) \n 1 6 6 4 \n Not Low 3 (2.2%) 5 (3.7%) 3 (2.3%) \n 1 3 (2.2%) 0 0 \n 4 0 1 (0.7%) 1 (0.8%) \n 2 8 5 1 \n Not Low 5 (3.7%) 3 (2.2%) 0 \n 1 0 1 (0.7%) 0 \n 2 2 (1.5%) 0 0 \n 3 0 1 (0.7%) 1 (0.8%) \n 4 1 (0.7%) 0 0 \n 3 3 3 2 \n Not Low 0 1 (0.7%) 0 \n 1 1 (0.7%) 0 0 \n 2 1 (0.7%) 0 1 (0.8%) \n 3 1 (0.7%) 2 (1.5%) 1 (0.8%) \n 4 4 3 2 \n Not Low 4 (3.0%) 1 (0.7%) 1 (0.8%) \n 1 0 1 (0.7%) 0 \n 2 0 1 (0.7%) 0 \n 3 0 0 1 (0.8%) \nC-Reactive Protein Measurement \n Not Low 119 113 112 \n Not Low 41 (30.6%) 42 (31.3%) 50 (37.9%) \n 1 20 (14.9%) 18 (13.4%) 11 (8.3%) \n 2 24 (17.9%) 20 (14.9%) 14 (10.6%) \n 3 25 (18.7%) 18 (13.4%) 21 (15.9%) \n 4 9 (6.7%) 15 (11.2%) 16 (12.1%) \n 1 3 5 9 \n Not Low 2 (1.5%) 2 (1.5%) 2 (1.5%) \n 2 0 1 (0.7%) 3 (2.3%) \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 0 1 (0.7%) 4 (3.0%) \n 2 5 9 2 \n Not Low 3 (2.2%) 4 (3.0%) 1 (0.8%) \n 1 1 (0.7%) 4 (3.0%) 0 \n 3 0 1 (0.7%) 1 (0.8%) \n 4 1 (0.7%) 0 0 \n 3 4 5 7 \n Not Low 1 (0.7%) 4 (3.0%) 2 (1.5%) \n 1 0 0 1 (0.8%) \n 2 0 0 1 (0.8%) \n 3 3 (2.2%) 1 (0.7%) 2 (1.5%) \n 4 0 0 1 (0.8%) \n 4 3 2 2 \n Not Low 3 (2.2%) 1 (0.7%) 0 \n 2 0 1 (0.7%) 0 \n 3 0 0 1 (0.8%) \n 4 0 0 1 (0.8%) \nImmunoglobulin A Measurement \n Not Low 134 134 132 \n Not Low 134 (100%) 134 (100%) 132 (100%) \n\n\n\n\nNote that missing baseline values are filtered out in the pre-processing step.\n\nCodeadlb_f <- adlb %>% filter(WGRHIFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c(\"WGRHIFL\" = \"Y\"))\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n filter(BTOXGR != \"<Missing>\") %>%\n mutate(\n ATOXGR_GP = factor(case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n ) %>%\n mutate(\n BTOXGR_GP = factor(case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\"))\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = \"Parameter\"\n ) %>%\n split_rows_by(\n \"BTOXGR_GP\",\n label_pos = \"topleft\",\n split_label = \" Baseline NCI-CTCAE Grade\",\n indent_mod = 2L\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\"), unique_count_suffix = FALSE) %>%\n count_occurrences_by_grade(\"ATOXGR_GP\", denom = \"n\", drop = FALSE, .indent_mods = 3L) %>%\n append_topleft(\" Post-baseline NCI-CTCAE Grade\") %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nParameter \n Baseline NCI-CTCAE Grade A: Drug X B: Placebo C: Combination\n Post-baseline NCI-CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Not High 134 134 132 \n Not High 134 (100%) 134 (100%) 132 (100%) \nC-Reactive Protein Measurement \n Not High 114 112 115 \n Not High 45 (33.6%) 55 (41.0%) 57 (43.2%) \n 1 18 (13.4%) 18 (13.4%) 19 (14.4%) \n 2 19 (14.2%) 10 (7.5%) 11 (8.3%) \n 3 22 (16.4%) 13 (9.7%) 20 (15.2%) \n 4 10 (7.5%) 16 (11.9%) 8 (6.1%) \n 1 8 10 7 \n Not High 5 (3.7%) 2 (1.5%) 2 (1.5%) \n 1 0 1 (0.7%) 0 \n 2 1 (0.7%) 3 (2.2%) 3 (2.3%) \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 3 (2.2%) 2 (1.5%) \n 2 2 6 7 \n Not High 1 (0.7%) 4 (3.0%) 4 (3.0%) \n 1 0 1 (0.7%) 2 (1.5%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 4 0 0 1 (0.8%) \n 3 7 4 3 \n Not High 3 (2.2%) 0 2 (1.5%) \n 1 2 (1.5%) 1 (0.7%) 1 (0.8%) \n 2 0 1 (0.7%) 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n 4 3 2 0 \n Not High 1 (0.7%) 0 0 \n 1 0 1 (0.7%) 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 0 0 \nImmunoglobulin A Measurement \n Not High 119 116 113 \n Not High 55 (41.0%) 54 (40.3%) 51 (38.6%) \n 1 18 (13.4%) 11 (8.2%) 15 (11.4%) \n 2 14 (10.4%) 22 (16.4%) 19 (14.4%) \n 3 20 (14.9%) 19 (14.2%) 20 (15.2%) \n 4 12 (9.0%) 10 (7.5%) 8 (6.1%) \n 1 5 4 2 \n Not High 4 (3.0%) 1 (0.7%) 2 (1.5%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 3 0 2 (1.5%) 0 \n 2 4 4 5 \n Not High 2 (1.5%) 3 (2.2%) 3 (2.3%) \n 1 1 (0.7%) 0 2 (1.5%) \n 3 1 (0.7%) 0 0 \n 4 0 1 (0.7%) 0 \n 3 4 5 11 \n Not High 3 (2.2%) 1 (0.7%) 6 (4.5%) \n 1 0 1 (0.7%) 1 (0.8%) \n 2 1 (0.7%) 0 0 \n 3 0 2 (1.5%) 3 (2.3%) \n 4 0 1 (0.7%) 1 (0.8%) \n 4 2 5 1 \n Not High 0 3 (2.2%) 1 (0.8%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n\n\n\n\nNote that when BTOXGR is missing, the grouping variable BTOXGR_GP now is \"Not Low\" instead of \"Missing\" compared to Standard Table (Low).\n\nCodeadlb_f <- adlb %>% filter(WGRLOFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c(\"WGRLOFL\" = \"Y\"))\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = factor(case_when(\n ATOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n ATOXGR == -1 ~ \"1\",\n ATOXGR == -2 ~ \"2\",\n ATOXGR == -3 ~ \"3\",\n ATOXGR == -4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\"))\n ) %>%\n mutate(\n BTOXGR_GP = factor(case_when(\n BTOXGR %in% c(0, 1, 2, 3, 4, \"<Missing>\") ~ \"Not Low\",\n BTOXGR == -1 ~ \"1\",\n BTOXGR == -2 ~ \"2\",\n BTOXGR == -3 ~ \"3\",\n BTOXGR == -4 ~ \"4\"\n ), levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = \"Parameter\"\n ) %>%\n split_rows_by(\n \"BTOXGR_GP\",\n label_pos = \"topleft\",\n split_label = \" Baseline NCI-CTCAE Grade\",\n indent_mod = 2L\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\"), unique_count_suffix = FALSE) %>%\n count_occurrences_by_grade(\"ATOXGR_GP\", denom = \"n\", drop = FALSE, .indent_mods = 3L) %>%\n append_topleft(\" Post-baseline NCI-CTCAE Grade\") %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nParameter \n Baseline NCI-CTCAE Grade A: Drug X B: Placebo C: Combination\n Post-baseline NCI-CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Not Low 113 117 123 \n Not Low 56 (41.8%) 55 (41.0%) 62 (47.0%) \n 1 11 (8.2%) 9 (6.7%) 15 (11.4%) \n 2 15 (11.2%) 23 (17.2%) 16 (12.1%) \n 3 15 (11.2%) 21 (15.7%) 13 (9.8%) \n 4 16 (11.9%) 9 (6.7%) 17 (12.9%) \n 1 6 6 4 \n Not Low 3 (2.2%) 5 (3.7%) 3 (2.3%) \n 1 3 (2.2%) 0 0 \n 4 0 1 (0.7%) 1 (0.8%) \n 2 8 5 1 \n Not Low 5 (3.7%) 3 (2.2%) 0 \n 1 0 1 (0.7%) 0 \n 2 2 (1.5%) 0 0 \n 3 0 1 (0.7%) 1 (0.8%) \n 4 1 (0.7%) 0 0 \n 3 3 3 2 \n Not Low 0 1 (0.7%) 0 \n 1 1 (0.7%) 0 0 \n 2 1 (0.7%) 0 1 (0.8%) \n 3 1 (0.7%) 2 (1.5%) 1 (0.8%) \n 4 4 3 2 \n Not Low 4 (3.0%) 1 (0.7%) 1 (0.8%) \n 1 0 1 (0.7%) 0 \n 2 0 1 (0.7%) 0 \n 3 0 0 1 (0.8%) \nC-Reactive Protein Measurement \n Not Low 119 113 112 \n Not Low 41 (30.6%) 42 (31.3%) 50 (37.9%) \n 1 20 (14.9%) 18 (13.4%) 11 (8.3%) \n 2 24 (17.9%) 20 (14.9%) 14 (10.6%) \n 3 25 (18.7%) 18 (13.4%) 21 (15.9%) \n 4 9 (6.7%) 15 (11.2%) 16 (12.1%) \n 1 3 5 9 \n Not Low 2 (1.5%) 2 (1.5%) 2 (1.5%) \n 2 0 1 (0.7%) 3 (2.3%) \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 0 1 (0.7%) 4 (3.0%) \n 2 5 9 2 \n Not Low 3 (2.2%) 4 (3.0%) 1 (0.8%) \n 1 1 (0.7%) 4 (3.0%) 0 \n 3 0 1 (0.7%) 1 (0.8%) \n 4 1 (0.7%) 0 0 \n 3 4 5 7 \n Not Low 1 (0.7%) 4 (3.0%) 2 (1.5%) \n 1 0 0 1 (0.8%) \n 2 0 0 1 (0.8%) \n 3 3 (2.2%) 1 (0.7%) 2 (1.5%) \n 4 0 0 1 (0.8%) \n 4 3 2 2 \n Not Low 3 (2.2%) 1 (0.7%) 0 \n 2 0 1 (0.7%) 0 \n 3 0 0 1 (0.8%) \n 4 0 0 1 (0.8%) \nImmunoglobulin A Measurement \n Not Low 134 134 132 \n Not Low 134 (100%) 134 (100%) 132 (100%) \n\n\n\n\nPre-processing is the same as Standard Table (High), but in order to keep all levels, prune_table() is not applied.\n\nCodeadlb_f <- adlb %>% filter(WGRHIFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c(\"WGRHIFL\" = \"Y\"))\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = factor(case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n ) %>%\n mutate(\n BTOXGR_GP = factor(case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = \"Parameter\"\n ) %>%\n split_rows_by(\n \"BTOXGR_GP\",\n label_pos = \"topleft\",\n split_label = \" Baseline NCI-CTCAE Grade\",\n indent_mod = 2L\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\"), unique_count_suffix = FALSE) %>%\n count_occurrences_by_grade(\"ATOXGR_GP\", denom = \"n\", drop = FALSE, .indent_mods = 3L) %>%\n append_topleft(\" Post-baseline NCI-CTCAE Grade\") %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter \n Baseline NCI-CTCAE Grade A: Drug X B: Placebo C: Combination\n Post-baseline NCI-CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Not High 134 134 132 \n Not High 134 (100%) 134 (100%) 132 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 1 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 2 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 3 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 4 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n Missing 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \nC-Reactive Protein Measurement \n Not High 114 112 115 \n Not High 45 (33.6%) 55 (41.0%) 57 (43.2%) \n 1 18 (13.4%) 18 (13.4%) 19 (14.4%) \n 2 19 (14.2%) 10 (7.5%) 11 (8.3%) \n 3 22 (16.4%) 13 (9.7%) 20 (15.2%) \n 4 10 (7.5%) 16 (11.9%) 8 (6.1%) \n Missing 0 0 0 \n 1 8 10 7 \n Not High 5 (3.7%) 2 (1.5%) 2 (1.5%) \n 1 0 1 (0.7%) 0 \n 2 1 (0.7%) 3 (2.2%) 3 (2.3%) \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 3 (2.2%) 2 (1.5%) \n Missing 0 0 0 \n 2 2 6 7 \n Not High 1 (0.7%) 4 (3.0%) 4 (3.0%) \n 1 0 1 (0.7%) 2 (1.5%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 3 0 0 0 \n 4 0 0 1 (0.8%) \n Missing 0 0 0 \n 3 7 4 3 \n Not High 3 (2.2%) 0 2 (1.5%) \n 1 2 (1.5%) 1 (0.7%) 1 (0.8%) \n 2 0 1 (0.7%) 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n Missing 0 0 0 \n 4 3 2 0 \n Not High 1 (0.7%) 0 0 \n 1 0 1 (0.7%) 0 \n 2 0 0 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 0 0 \n Missing 0 0 0 \n Missing 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \nImmunoglobulin A Measurement \n Not High 119 116 113 \n Not High 55 (41.0%) 54 (40.3%) 51 (38.6%) \n 1 18 (13.4%) 11 (8.2%) 15 (11.4%) \n 2 14 (10.4%) 22 (16.4%) 19 (14.4%) \n 3 20 (14.9%) 19 (14.2%) 20 (15.2%) \n 4 12 (9.0%) 10 (7.5%) 8 (6.1%) \n Missing 0 0 0 \n 1 5 4 2 \n Not High 4 (3.0%) 1 (0.7%) 2 (1.5%) \n 1 0 0 0 \n 2 1 (0.7%) 1 (0.7%) 0 \n 3 0 2 (1.5%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n 2 4 4 5 \n Not High 2 (1.5%) 3 (2.2%) 3 (2.3%) \n 1 1 (0.7%) 0 2 (1.5%) \n 2 0 0 0 \n 3 1 (0.7%) 0 0 \n 4 0 1 (0.7%) 0 \n Missing 0 0 0 \n 3 4 5 11 \n Not High 3 (2.2%) 1 (0.7%) 6 (4.5%) \n 1 0 1 (0.7%) 1 (0.8%) \n 2 1 (0.7%) 0 0 \n 3 0 2 (1.5%) 3 (2.3%) \n 4 0 1 (0.7%) 1 (0.8%) \n Missing 0 0 0 \n 4 2 5 1 \n Not High 0 3 (2.2%) 1 (0.8%) \n 1 0 0 0 \n 2 1 (0.7%) 1 (0.7%) 0 \n 3 0 0 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n Missing 0 0 0 \n Missing 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_shift_by_grade(\n label = \"Grade Laboratory Abnormality Table\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = \"ALT\"\n ),\n worst_flag_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"WGRLOVFL\", \"WGRLOFL\", \"WGRHIVFL\", \"WGRHIFL\")),\n selected = c(\"WGRHIFL\")\n ),\n worst_flag_indicator = choices_selected(\n value_choices(ADLB, \"WGRLOVFL\"),\n selected = \"Y\", fixed = TRUE\n ),\n anl_toxgrade_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"ATOXGR\")),\n selected = c(\"ATOXGR\"),\n fixed = TRUE\n ),\n base_toxgrade_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"BTOXGR\")),\n selected = c(\"BTOXGR\"),\n fixed = TRUE\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:50:37 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9016 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table (Stats in Columns)\nTable Implementing 1/3 Imputation Rule\nTable Implementing 1/2 Imputation Rule\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>%\n filter(ACTARM == \"A: Drug X\")\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\") %>%\n filter(ACTARM == \"A: Drug X\", PARAM == \"Plasma Drug X\")\n\n# Setting up the data\nadpc_1 <- adpc %>%\n mutate(\n NFRLT = as.factor(NFRLT),\n AVALCAT1 = as.factor(AVALCAT1),\n NOMTPT = as.factor(paste(NFRLT, \"/\", PCTPT))\n ) %>%\n select(NOMTPT, ACTARM, VISIT, AVAL, PARAM, AVALCAT1)\n\nadpc_1$NOMTPT <- factor(\n adpc_1$NOMTPT,\n levels = levels(adpc_1$NOMTPT)[order(as.numeric(gsub(\".*?([0-9\\\\.]+).*\", \"\\\\1\", levels(adpc_1$NOMTPT))))]\n)\n\n# Row structure\nlyt_rows <- basic_table() %>%\n split_rows_by(\n var = \"ACTARM\",\n split_fun = drop_split_levels,\n split_label = \"Treatment Group\",\n label_pos = \"topleft\"\n ) %>%\n add_rowcounts(alt_counts = TRUE) %>%\n split_rows_by(\n var = \"VISIT\",\n split_fun = drop_split_levels,\n split_label = \"Visit\",\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n var = \"NOMTPT\",\n split_fun = drop_split_levels,\n split_label = \"Nominal Time (hr) / Timepoint\",\n label_pos = \"topleft\",\n child_labels = \"hidden\"\n )\n\n\n\n\n\nCodelyt <- lyt_rows %>%\n analyze_vars_in_cols(\n vars = c(\"AVAL\", \"AVALCAT1\", rep(\"AVAL\", 8)),\n .stats = c(\"n\", \"n_blq\", \"mean\", \"sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"min\", \"max\"),\n .formats = c(\n n = \"xx.\", n_blq = \"xx.\", mean = format_sigfig(3), sd = format_sigfig(3), cv = \"xx.x\", median = format_sigfig(3),\n geom_mean = format_sigfig(3), geom_cv = \"xx.x\", min = format_sigfig(3), max = format_sigfig(3)\n ),\n .labels = c(\n n = \"n\", n_blq = \"Number\\nof\\nLTRs/BLQs\", mean = \"Mean\", sd = \"SD\", cv = \"CV (%) Mean\",\n geom_mean = \"Geometric Mean\", geom_cv = \"CV % Geometric Mean\", median = \"Median\", min = \"Minimum\", max = \"Maximum\"\n ),\n na_str = \"NE\",\n .aligns = \"decimal\"\n )\n\nresult <- build_table(lyt, df = adpc_1, alt_counts_df = adsl) %>% prune_table()\n\n# Decorating\nmain_title(result) <- \"Summary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\"\nsubtitles(result) <- c(\n \"Protocol: xxxxx\",\n paste(\"Analyte: \", unique(adpc_1$PARAM)),\n paste(\"Treatment:\", unique(adpc_1$ACTARM))\n)\nmain_footer(result) <- \"NE: Not Estimable\"\n\nresult\n\nSummary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\nProtocol: xxxxx\nAnalyte: Plasma Drug X\nTreatment: A: Drug X\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Group Number \n Visit of \n Nominal Time (hr) / Timepoint n LTRs/BLQs Mean SD CV (%) Mean Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X (N=134) \n Day 1 \n 0 / Predose 134 134 0 0 NE NE NE 0 0 0 \n 0.5 / 0.5H 134 0 12.6 1.51 12.0 12.5 12.2 12.6 9.72 15.6 \n 1 / 1H 134 0 16.2 1.63 10.0 16.1 10.1 16.2 12.6 19.9 \n 1.5 / 1.5H 134 0 15.6 1.46 9.3 15.6 9.3 15.5 12.3 19.0 \n 2 / 2H 134 0 13.4 1.35 10.1 13.4 10.0 13.3 10.8 16.5 \n 3 / 3H 134 0 8.47 1.25 14.7 8.38 15.0 8.40 5.88 10.9 \n 4 / 4H 134 0 4.79 1.02 21.2 4.69 22.0 4.79 2.70 7.09 \n 8 / 8H 134 0 0.348 0.180 51.7 0.303 58.4 0.318 0.0760 0.866 \n 12 / 12H 134 0 0.0224 0.0189 84.6 0.0156 111.6 0.0170 0.00200 0.0830\n Day 2 \n 24 / 24H 134 134 0 0 NE NE NE 0 0 0 \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNE: Not Estimable\n\n\n\n\n\nCodelyt <- lyt_rows %>%\n analyze_vars_in_cols(\n vars = c(\"AVAL\", \"AVALCAT1\", rep(\"AVAL\", 8)),\n .stats = c(\"n\", \"n_blq\", \"mean\", \"sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"min\", \"max\"),\n .formats = c(\n n = \"xx.\", n_blq = \"xx.\", mean = format_sigfig(3), sd = format_sigfig(3), cv = \"xx.x\", median = format_sigfig(3),\n geom_mean = format_sigfig(3), geom_cv = \"xx.x\", min = format_sigfig(3), max = format_sigfig(3)\n ),\n .labels = c(\n n = \"n\", n_blq = \"Number\\nof\\nLTRs/BLQs\", mean = \"Mean\", sd = \"SD\", cv = \"CV (%) Mean\",\n geom_mean = \"Geometric Mean\", geom_cv = \"CV % Geometric Mean\", median = \"Median\", min = \"Minimum\", max = \"Maximum\"\n ),\n imp_rule = \"1/3\",\n .aligns = \"decimal\"\n )\n\nresult <- build_table(lyt, df = adpc_1, alt_counts_df = adsl) %>% prune_table()\n\n# Decorating\nmain_title(result) <- \"Summary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\"\nsubtitles(result) <- c(\n \"Protocol: xxxxx\",\n paste(\"Analyte: \", unique(adpc_1$PARAM)),\n paste(\"Treatment:\", unique(adpc_1$ACTARM))\n)\nmain_footer(result) <- c(\"NE: Not Estimable\", \"ND: Not Derived\")\n\nresult\n\nSummary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\nProtocol: xxxxx\nAnalyte: Plasma Drug X\nTreatment: A: Drug X\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Group Number \n Visit of \n Nominal Time (hr) / Timepoint n LTRs/BLQs Mean SD CV (%) Mean Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X (N=134) \n Day 1 \n 0 / Predose 134 134 ND ND ND NE ND 0 ND 0 \n 0.5 / 0.5H 134 0 12.6 1.51 12.0 12.5 12.2 12.6 9.72 15.6 \n 1 / 1H 134 0 16.2 1.63 10.0 16.1 10.1 16.2 12.6 19.9 \n 1.5 / 1.5H 134 0 15.6 1.46 9.3 15.6 9.3 15.5 12.3 19.0 \n 2 / 2H 134 0 13.4 1.35 10.1 13.4 10.0 13.3 10.8 16.5 \n 3 / 3H 134 0 8.47 1.25 14.7 8.38 15.0 8.40 5.88 10.9 \n 4 / 4H 134 0 4.79 1.02 21.2 4.69 22.0 4.79 2.70 7.09 \n 8 / 8H 134 0 0.348 0.180 51.7 0.303 58.4 0.318 0.0760 0.866 \n 12 / 12H 134 0 0.0224 0.0189 84.6 0.0156 111.6 0.0170 0.00200 0.0830\n Day 2 \n 24 / 24H 134 134 ND ND ND NE ND 0 ND 0 \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNE: Not Estimable\nND: Not Derived\n\n\n\n\n\nCodelyt <- lyt_rows %>%\n analyze_vars_in_cols(\n vars = c(\"AVAL\", \"AVALCAT1\", rep(\"AVAL\", 8)),\n .stats = c(\"n\", \"n_blq\", \"mean\", \"sd\", \"cv\", \"geom_mean\", \"geom_cv\", \"median\", \"min\", \"max\"),\n .formats = c(\n n = \"xx.\", n_blq = \"xx.\", mean = format_sigfig(3), sd = format_sigfig(3), cv = \"xx.x\", median = format_sigfig(3),\n geom_mean = format_sigfig(3), geom_cv = \"xx.x\", min = format_sigfig(3), max = format_sigfig(3)\n ),\n .labels = c(\n n = \"n\", n_blq = \"Number\\nof\\nLTRs/BLQs\", mean = \"Mean\", sd = \"SD\", cv = \"CV (%) Mean\",\n geom_mean = \"Geometric Mean\", geom_cv = \"CV % Geometric Mean\", median = \"Median\", min = \"Minimum\", max = \"Maximum\"\n ),\n imp_rule = \"1/2\",\n .aligns = \"decimal\"\n )\n\nresult <- build_table(lyt, df = adpc_1, alt_counts_df = adsl) %>% prune_table()\n\n# Decorate table\nmain_title(result) <- \"Summary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\"\nsubtitles(result) <- c(\n \"Protocol: xxxxx\",\n paste(\"Analyte: \", unique(adpc_1$PARAM)),\n paste(\"Treatment:\", unique(adpc_1$ACTARM))\n)\nmain_footer(result) <- \"ND: Not Derived\"\n\nresult\n\nSummary of PK Concentrations by Nominal Time and Treatment: PK Evaluable\nProtocol: xxxxx\nAnalyte: Plasma Drug X\nTreatment: A: Drug X\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Group Number \n Visit of \n Nominal Time (hr) / Timepoint n LTRs/BLQs Mean SD CV (%) Mean Geometric Mean CV % Geometric Mean Median Minimum Maximum\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X (N=134) \n Day 1 \n 0 / Predose 134 134 ND ND ND ND ND ND ND 0 \n 0.5 / 0.5H 134 0 12.6 1.51 12.0 12.5 12.2 12.6 9.72 15.6 \n 1 / 1H 134 0 16.2 1.63 10.0 16.1 10.1 16.2 12.6 19.9 \n 1.5 / 1.5H 134 0 15.6 1.46 9.3 15.6 9.3 15.5 12.3 19.0 \n 2 / 2H 134 0 13.4 1.35 10.1 13.4 10.0 13.3 10.8 16.5 \n 3 / 3H 134 0 8.47 1.25 14.7 8.38 15.0 8.40 5.88 10.9 \n 4 / 4H 134 0 4.79 1.02 21.2 4.69 22.0 4.79 2.70 7.09 \n 8 / 8H 134 0 0.348 0.180 51.7 0.303 58.4 0.318 0.0760 0.866 \n 12 / 12H 134 0 0.0224 0.0189 84.6 0.0156 111.6 0.0170 0.00200 0.0830\n Day 2 \n 24 / 24H 134 134 ND ND ND ND ND ND ND 0 \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nND: Not Derived\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:48:08 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT14" + "Pharmacokinetic", + "PKCT01" ] }, { - "objectID": "tables/lab-results/lbt05.html", - "href": "tables/lab-results/lbt05.html", - "title": "LBT05", + "objectID": "tables/pharmacokinetic/pkpt11.html", + "href": "tables/pharmacokinetic/pkpt11.html", + "title": "PKPT11", "section": "", - "text": "Data Setup\nStandard Table\nTable Showing All Categories\nTable with Study-Specific MLAs\nTable of Lab Abnormalities Showing All Categories But Only for Parameter Codes with At Least One Abnormality\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\nqntls <- adlb %>%\n group_by(PARAMCD) %>%\n summarise(as_tibble(t(quantile(AVAL, probs = c(0.1, 0.9)))), .groups = \"drop_last\") %>%\n rename(q1 = 2, q2 = 3)\n\nadlb <- adlb %>%\n left_join(qntls, by = \"PARAMCD\")\n\nset.seed(1)\n\n# Modify ANRIND and create AVALCAT1/PARCAT2\n# PARCAT2 is just used for filtering, but in order to be the\n# filtering as realistic as possible, will create the variable.\nadlb <- adlb %>%\n mutate(\n ANRIND = factor(\n case_when(\n ANRIND == \"LOW\" & AVAL <= q1 ~ \"LOW LOW\",\n ANRIND == \"HIGH\" & AVAL >= q2 ~ \"HIGH HIGH\",\n TRUE ~ as.character(ANRIND)\n ),\n levels = c(\"\", \"HIGH\", \"HIGH HIGH\", \"LOW\", \"LOW LOW\", \"NORMAL\")\n ),\n AVALCAT1 = factor(\n case_when(\n ANRIND %in% c(\"HIGH HIGH\", \"LOW LOW\") ~\n sample(x = c(\"LAST\", \"REPLICATED\", \"SINGLE\"), size = n(), replace = TRUE, prob = c(0.3, 0.6, 0.1)),\n TRUE ~ \"\"\n ),\n levels = c(\"\", c(\"LAST\", \"REPLICATED\", \"SINGLE\"))\n ),\n PARCAT2 = factor(ifelse(ANRIND %in% c(\"HIGH HIGH\", \"LOW LOW\"), \"LS\",\n sample(c(\"SI\", \"CV\", \"LS\"), size = n(), replace = TRUE)\n ))\n ) %>%\n select(-q1, -q2)\n\n# Pre-processing steps\nadlb_f <- adlb %>%\n filter(ONTRTFL == \"Y\" & PARCAT2 == \"LS\" & SAFFL == \"Y\" & !is.na(AVAL)) %>%\n mutate(abn_dir = factor(case_when(\n ANRIND == \"LOW LOW\" ~ \"Low\",\n ANRIND == \"HIGH HIGH\" ~ \"High\",\n TRUE ~ \"\"\n ), levels = c(\"Low\", \"High\", \"\"))) %>%\n df_explicit_na()\n\n# Construct analysis map\nmap <- expand.grid(\n PARAM = levels(adlb$PARAM),\n abn_dir = c(\"Low\", \"High\"),\n stringsAsFactors = FALSE\n) %>%\n arrange(PARAM, desc(abn_dir))\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n label_pos = \"topleft\",\n split_label = \"Laboratory Test\"\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = \"unique_count\") %>%\n split_rows_by(\"abn_dir\", split_fun = trim_levels_to_map(map)) %>%\n count_abnormal_by_marked(\n var = \"AVALCAT1\",\n variables = list(id = \"USUBJID\", param = \"PARAM\", direction = \"abn_dir\")\n ) %>%\n append_topleft(\" Direction of Abnormality\")\n\nresult <- build_table(lyt, df = adlb_f, alt_counts_df = adsl)\n\nhas_lbl <- function(lbl) CombinationFunction(function(tr) obj_label(tr) == lbl || sum(unlist(row_values(tr))) != 0)\nresult <- prune_table(result, keep_rows(has_lbl(\"Any Abnormality\")))\n\nresult\n\nLaboratory Test A: Drug X B: Placebo C: Combination\n Direction of Abnormality (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement (n) 125 120 125 \n Low \n Single, not last 3 (2.4%) 5 (4.2%) 5 (4%) \n Last or replicated 52 (41.6%) 59 (49.2%) 44 (35.2%) \n Any Abnormality 55 (44%) 64 (53.3%) 49 (39.2%) \n High \n Any Abnormality 0 0 0 \nC-Reactive Protein Measurement (n) 129 130 121 \n Low \n Single, not last 3 (2.3%) 7 (5.4%) 6 (5%) \n Last or replicated 59 (45.7%) 50 (38.5%) 49 (40.5%) \n Any Abnormality 62 (48.1%) 57 (43.8%) 55 (45.5%) \n High \n Single, not last 5 (3.9%) 4 (3.1%) 2 (1.7%) \n Last or replicated 49 (38%) 54 (41.5%) 45 (37.2%) \n Any Abnormality 54 (41.9%) 58 (44.6%) 47 (38.8%) \nImmunoglobulin A Measurement (n) 129 122 121 \n Low \n Any Abnormality 0 0 0 \n High \n Single, not last 4 (3.1%) 6 (4.9%) 3 (2.5%) \n Last or replicated 48 (37.2%) 47 (38.5%) 55 (45.5%) \n Any Abnormality 52 (40.3%) 53 (43.4%) 58 (47.9%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n label_pos = \"topleft\",\n split_label = \"Laboratory Test\"\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = \"unique_count\") %>%\n split_rows_by(\"abn_dir\", split_fun = trim_levels_to_map(map)) %>%\n count_abnormal_by_marked(\n var = \"AVALCAT1\",\n variables = list(id = \"USUBJID\", param = \"PARAM\", direction = \"abn_dir\")\n ) %>%\n append_topleft(\" Direction of Abnormality\")\n\nresult <- build_table(lyt, df = adlb_f, alt_counts_df = adsl)\n\nresult\n\nLaboratory Test A: Drug X B: Placebo C: Combination\n Direction of Abnormality (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement (n) 125 120 125 \n Low \n Single, not last 3 (2.4%) 5 (4.2%) 5 (4%) \n Last or replicated 52 (41.6%) 59 (49.2%) 44 (35.2%) \n Any Abnormality 55 (44%) 64 (53.3%) 49 (39.2%) \n High \n Single, not last 0 0 0 \n Last or replicated 0 0 0 \n Any Abnormality 0 0 0 \nC-Reactive Protein Measurement (n) 129 130 121 \n Low \n Single, not last 3 (2.3%) 7 (5.4%) 6 (5%) \n Last or replicated 59 (45.7%) 50 (38.5%) 49 (40.5%) \n Any Abnormality 62 (48.1%) 57 (43.8%) 55 (45.5%) \n High \n Single, not last 5 (3.9%) 4 (3.1%) 2 (1.7%) \n Last or replicated 49 (38%) 54 (41.5%) 45 (37.2%) \n Any Abnormality 54 (41.9%) 58 (44.6%) 47 (38.8%) \nImmunoglobulin A Measurement (n) 129 122 121 \n Low \n Single, not last 0 0 0 \n Last or replicated 0 0 0 \n Any Abnormality 0 0 0 \n High \n Single, not last 4 (3.1%) 6 (4.9%) 3 (2.5%) \n Last or replicated 48 (37.2%) 47 (38.5%) 55 (45.5%) \n Any Abnormality 52 (40.3%) 53 (43.4%) 58 (47.9%) \n\n\n\n\n\nCode# This variant reflects user modifications made to the laboratory analysis data set related to\n# Safety Lab Standardization metadata.\n# There is no unique layout level variation.\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n label_pos = \"topleft\",\n split_label = \"Laboratory Test\",\n split_fun = trim_levels_in_group(\"abn_dir\", drop_outlevs = TRUE)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = \"unique_count\") %>%\n split_rows_by(\"abn_dir\") %>%\n count_abnormal_by_marked(\n var = \"AVALCAT1\",\n variables = list(id = \"USUBJID\", param = \"PARAM\", direction = \"abn_dir\")\n ) %>%\n append_topleft(\" Direction of Abnormality\")\n\nresult <- build_table(lyt, df = adlb_f, alt_counts_df = adsl)\n\nresult <- result %>% prune_table()\nresult\n\nLaboratory Test A: Drug X B: Placebo C: Combination\n Direction of Abnormality (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement (n) 125 120 125 \n Low \n Single, not last 3 (2.4%) 5 (4.2%) 5 (4%) \n Last or replicated 52 (41.6%) 59 (49.2%) 44 (35.2%) \n Any Abnormality 55 (44%) 64 (53.3%) 49 (39.2%) \nC-Reactive Protein Measurement (n) 129 130 121 \n Low \n Single, not last 3 (2.3%) 7 (5.4%) 6 (5%) \n Last or replicated 59 (45.7%) 50 (38.5%) 49 (40.5%) \n Any Abnormality 62 (48.1%) 57 (43.8%) 55 (45.5%) \n High \n Single, not last 5 (3.9%) 4 (3.1%) 2 (1.7%) \n Last or replicated 49 (38%) 54 (41.5%) 45 (37.2%) \n Any Abnormality 54 (41.9%) 58 (44.6%) 47 (38.8%) \nImmunoglobulin A Measurement (n) 129 122 121 \n High \n Single, not last 4 (3.1%) 6 (4.9%) 3 (2.5%) \n Last or replicated 48 (37.2%) 47 (38.5%) 55 (45.5%) \n Any Abnormality 52 (40.3%) 53 (43.4%) 58 (47.9%) \n\nCode# Another approach would be to create an empirical map by removing the ALT records\n# and use it in `trim_levels_to_map`.\n# this is an a posteriori approach, though.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:50:52 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 withr_3.0.0 \n[33] Rdpack_2.6 digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 \n[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table – Plasma\nteal App\nReproducibility\n\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\n# Comparator Dose - A: Drug X\narm_var <- \"TRT01A\"\ncomp_dose <- \"A: Drug X\"\nother_doses <- as.character(unique(adpp[[arm_var]])[unique(adpp[[arm_var]]) != comp_dose])\n\nadpp <- adpp %>%\n filter(AVISIT == \"CYCLE 1 DAY 1\") %>%\n mutate(\n COMP = paste0(TRT01A, \"/\", comp_dose),\n COMP_AVAL = ifelse(TRT01A == comp_dose, paste0(AVAL, comp_dose), AVAL)\n )\n\nfor (dose in other_doses) {\n temp_df <- adpp[adpp[[arm_var]] == comp_dose, ]\n temp_df$COMP <- paste0(dose, \"/\", comp_dose)\n adpp <- rbind(adpp, temp_df)\n}\n\n# Plasma Drug X\nadpp0 <- adpp %>%\n filter(PPCAT == \"Plasma Drug X\") %>%\n h_pkparam_sort() %>%\n mutate(PKPARAM = factor(paste0(TLG_DISPLAY, \" (\", AVALU, \")\"))) %>%\n var_relabel(COMP = \"Comparison\")\n\n# statistics function\ns_gmr <- function(df,\n compare_dose = comp_dose, # comparator, defaults to comp_dose defined above (string)\n denom = TRUE, # whether to use comparator as denominator, defaults to TRUE (logical)\n arm_var = arm_var) { # arm variable, defaults to arm_var defined above (string)\n which_num <- !grepl(compare_dose, df[[arm_var]])\n\n x_num <- as.numeric(df[which_num, ][[\"AVAL\"]])\n x_num <- x_num[!is.na(x_num)]\n x_num_no_negative_vals <- x_num\n x_num_no_negative_vals[x_num_no_negative_vals <= 0] <- NA\n\n x_denom <- as.numeric(gsub(compare_dose, \"\", df[!which_num, ][[\"AVAL\"]]))\n x_denom <- x_denom[!is.na(x_denom)]\n x_denom_no_negative_vals <- x_denom\n x_denom_no_negative_vals[x_denom_no_negative_vals <= 0] <- NA\n\n x_num_log <- log(x_num_no_negative_vals)\n x_denom_log <- log(x_denom_no_negative_vals)\n\n if (denom) {\n geom_mean_ratio <- exp(mean(x_num_log, na.rm = FALSE)) / exp(mean(x_denom_log, na.rm = FALSE))\n geom_mean_ci <- t.test(x_num_log, x_denom_log, conf.level = 0.90)$conf.int\n } else {\n geom_mean_ratio <- exp(mean(x_denom_log, na.rm = FALSE)) / exp(mean(x_num_log, na.rm = FALSE))\n geom_mean_ci <- t.test(x_denom_log, x_num_log, conf.level = 0.90)$conf.int\n }\n\n list(\n n = nrow(df),\n geom_mean_ratio = geom_mean_ratio,\n gmr_ci_lwr = exp(geom_mean_ci[1]),\n gmr_ci_upr = exp(geom_mean_ci[2])\n )\n}\n\nafun_pk_gmr <- function(\n .formats = list(\n n = \"xx.\",\n geom_mean_ratio = format_sigfig(3),\n gmr_ci_lwr = format_sigfig(3),\n gmr_ci_upr = format_sigfig(3)\n ),\n compare_dose = comp_dose,\n denom = TRUE) {\n checkmate::assert_list(.formats)\n checkmate::assert_subset(names(.formats), c(\"n\", \"geom_mean_ratio\", \"gmr_ci_lwr\", \"gmr_ci_upr\"))\n\n afun_lst <- Map(\n function(stat, fmt, compare_dose, denom, arm_var) {\n function(df, .spl_context) {\n x_stat <- s_gmr(df, compare_dose = compare_dose, denom = denom, arm_var = arm_var)[[stat]]\n rcell(x_stat, format = fmt, label = tail(.spl_context$value, 1))\n }\n },\n stat = names(.formats),\n fmt = .formats,\n compare_dose = compare_dose,\n denom = denom,\n arm_var = arm_var\n )\n\n afun_lst\n}\n\n\n\n\n\nCode# create layout\nlyt <- basic_table() %>%\n split_rows_by(\n var = \"PKPARAM\",\n label_pos = \"topleft\",\n split_fun = keep_split_levels(c(\"AUCinf obs (day*ug/mL)\", \"Cmax (ug/mL)\")),\n split_label = \"PK Parameter\"\n ) %>%\n split_rows_by(\n var = \"COMP\",\n split_fun = remove_split_levels(paste0(comp_dose, \"/\", comp_dose)),\n indent_mod = 11L,\n child_labels = \"hidden\"\n ) %>%\n split_cols_by_multivar(\n vars = rep(\"AVAL\", 4),\n varlabels = c(\n \"n\",\n \"Geometric Mean Ratio\",\n \"90% CI Lower Bound\",\n \"90% CI Upper Bound\"\n )\n ) %>%\n analyze_colvars(\n afun = afun_pk_gmr(),\n extra_args = list(\n compare_dose = comp_dose,\n denom = TRUE,\n arm_var = arm_var\n )\n ) %>%\n append_varlabels(adpp0, \"COMP\", 12L)\n\nresult <- build_table(lyt, df = adpp0)\n\nmain_title(result) <- paste0(\n \"Estimated Ratios of Geometric Means and 90% Confidence Intervals for AUC and CMAX Following \",\n unique(adpp0$REGIMEN), \"\\nof \", comp_dose, \" in Comparison with \",\n paste(other_doses, collapse = \" & \"), \", PK Population\"\n)\nsubtitles(result) <- paste(\"Analyte:\", unique(adpp0$PPCAT))\n\nresult\n\nEstimated Ratios of Geometric Means and 90% Confidence Intervals for AUC and CMAX Following BID\nof A: Drug X in Comparison with C: Combination, PK Population\nAnalyte: Plasma Drug X\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nPK Parameter \n Comparison n Geometric Mean Ratio 90% CI Lower Bound 90% CI Upper Bound\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nAUCinf obs (day*ug/mL) \n C: Combination/A: Drug X 266 0.962 0.925 1.00 \nCmax (ug/mL) \n C: Combination/A: Drug X 266 0.997 0.958 1.04 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:48:20 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT05" + "Pharmacokinetic", + "PKPT11" ] }, { - "objectID": "tables/lab-results/lbt12_bl.html", - "href": "tables/lab-results/lbt12_bl.html", - "title": "LBT12_BL", + "objectID": "tables/ECG/egt05_qtcat.html", + "href": "tables/ECG/egt05_qtcat.html", + "title": "EGT05_QTCAT", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadhy <- synthetic_cdisc_dataset(\"latest\", \"adhy\")\n\nanl <- adhy\nanl$APERIODC <- as.factor(anl$APERIODC) # to ensure the table is built even if there is no patients after filtering\nanl$ACTARM <- as.factor(anl$ACTARM) # to ensure the table is built even if there is no patients after filtering\n\nanl <- anl %>%\n filter(\n SAFFL == \"Y\",\n PARAMCD %in% c(\"ASTPBASE\", \"ALTPBASE\", \"ALTASTPB\") & AVISIT == \"POST-BASELINE\"\n ) %>%\n mutate(\n ARM_AVALC = factor(\n case_when(\n AVALC == \"Y\" ~ as.character(ACTARM),\n TRUE ~ \"Criteria not met\"\n ),\n levels = c(levels(anl$ACTARM), \"Criteria not met\")\n ),\n PARAM = factor(\n case_when(\n PARAMCD == \"ASTPBASE\" ~ \"AST>3x Baseline\",\n PARAMCD == \"ALTPBASE\" ~ \"ALT>3x Baseline\",\n PARAMCD == \"ALTASTPB\" ~ \"AST>3x Baseline or ALT>3x Baseline\"\n ),\n levels = c(\"AST>3x Baseline\", \"ALT>3x Baseline\", \"AST>3x Baseline or ALT>3x Baseline\")\n ),\n TITLE = factor(\"First Elevated Result Occurring During\")\n )\n\nanl <- df_explicit_na(anl)\n\n\n\n\n\nCoderesult <- basic_table() %>%\n split_cols_by(\"TITLE\") %>%\n split_cols_by(\"APERIODC\") %>%\n split_rows_by(\"PARAM\") %>%\n split_rows_by(\"ACTARM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\"ARM_AVALC\", .stats = \"fraction\", denom = \"n\", drop = TRUE) %>%\n build_table(anl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n dplyr::if_else(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- result %>% trim_rows(criteria = criteria_fun)\nresult\n\n First Elevated Result Occurring During \n PERIOD 1 PERIOD 2 \n——————————————————————————————————————————————————————————————————————————————\nAST>3x Baseline \n A: Drug X 14/134 (10.4%) 8/134 (6.0%) \n B: Placebo 11/134 (8.2%) 11/134 (8.2%) \n C: Combination 15/132 (11.4%) 14/132 (10.6%) \nALT>3x Baseline \n A: Drug X 7/134 (5.2%) 20/134 (14.9%) \n B: Placebo 10/134 (7.5%) 9/134 (6.7%) \n C: Combination 12/132 (9.1%) 8/132 (6.1%) \nAST>3x Baseline or ALT>3x Baseline \n A: Drug X 8/134 (6.0%) 22/134 (16.4%) \n B: Placebo 19/134 (14.2%) 15/134 (11.2%) \n C: Combination 14/132 (10.6%) 13/132 (9.8%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:51:13 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadeg <- df_explicit_na(adeg)\n\nadeg_labels <- var_labels(adeg)\nadeg_f <- adeg %>%\n filter(\n PARAMCD == \"QT\",\n ANL01FL == \"Y\"\n ) %>%\n mutate(\n AVALCAT1 = case_when(\n AVAL <= 450 ~ \"<=450 msec\",\n AVAL <= 480 ~ \">450 to <=480 msec\",\n AVAL <= 500 ~ \">480 to <= 500 msec\",\n AVAL > 500 ~ \">500 msec\",\n is.na(AVAL) ~ \"<Missing>\"\n ),\n CHGCAT1 = case_when(\n CHG <= 30 ~ \"<=30 msec\",\n CHG <= 60 ~ \">30 to <=60 msec\",\n CHG > 60 ~ \">60 msec\",\n is.na(CHG) ~ \"<Missing>\"\n )\n ) %>%\n mutate(\n AVALCAT1 = factor(\n AVALCAT1,\n levels = c(\n \"<=450 msec\",\n \">450 to <=480 msec\",\n \">480 to <= 500 msec\",\n \">500 msec\",\n \"<Missing>\"\n )\n ),\n CHGCAT1 = factor(\n CHGCAT1,\n levels = c(\n \"<=30 msec\",\n \">30 to <=60 msec\",\n \">60 msec\",\n \"<Missing>\"\n )\n )\n ) %>%\n var_relabel(\n AVALCAT1 = \"Value at Visit\",\n CHGCAT1 = \"Change from Baseline\"\n )\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_label = obj_label(adeg_f$PARAM),\n split_fun = split_fun,\n label_pos = \"topleft\"\n ) %>%\n split_rows_by(\n \"AVISIT\",\n split_label = obj_label(adeg_f$AVISIT),\n split_fun = split_fun,\n label_pos = \"topleft\"\n ) %>%\n analyze_vars(\n vars = c(\"AVALCAT1\", \"CHGCAT1\"),\n var_labels = c(\"Value at Visit\", \"Change from Baseline\")\n ) %>%\n append_topleft(\" Category\")\n\nresult <- build_table(lyt = lyt, df = adeg_f, alt_counts_df = adsl) %>%\n prune_table()\n\nresult\n\nParameter \n Analysis Visit A: Drug X B: Placebo C: Combination\n Category (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————\nQT Duration \n BASELINE \n Value at Visit \n n 134 134 132 \n <=450 msec 115 (85.8%) 117 (87.3%) 104 (78.8%) \n >450 to <=480 msec 6 (4.5%) 10 (7.5%) 9 (6.8%) \n >480 to <= 500 msec 4 (3%) 3 (2.2%) 6 (4.5%) \n >500 msec 9 (6.7%) 4 (3%) 13 (9.8%) \n WEEK 1 DAY 8 \n Value at Visit \n n 134 134 132 \n <=450 msec 113 (84.3%) 106 (79.1%) 106 (80.3%) \n >450 to <=480 msec 10 (7.5%) 10 (7.5%) 11 (8.3%) \n >480 to <= 500 msec 4 (3%) 4 (3%) 3 (2.3%) \n >500 msec 7 (5.2%) 14 (10.4%) 12 (9.1%) \n Change from Baseline \n n 134 134 132 \n <=30 msec 76 (56.7%) 75 (56%) 75 (56.8%) \n >30 to <=60 msec 7 (5.2%) 13 (9.7%) 11 (8.3%) \n >60 msec 51 (38.1%) 46 (34.3%) 46 (34.8%) \n WEEK 2 DAY 15 \n Value at Visit \n n 134 134 132 \n <=450 msec 111 (82.8%) 114 (85.1%) 112 (84.8%) \n >450 to <=480 msec 10 (7.5%) 9 (6.7%) 9 (6.8%) \n >480 to <= 500 msec 7 (5.2%) 2 (1.5%) 5 (3.8%) \n >500 msec 6 (4.5%) 9 (6.7%) 6 (4.5%) \n Change from Baseline \n n 134 134 132 \n <=30 msec 71 (53%) 87 (64.9%) 89 (67.4%) \n >30 to <=60 msec 11 (8.2%) 9 (6.7%) 9 (6.8%) \n >60 msec 52 (38.8%) 38 (28.4%) 34 (25.8%) \n WEEK 3 DAY 22 \n Value at Visit \n n 134 134 132 \n <=450 msec 106 (79.1%) 112 (83.6%) 118 (89.4%) \n >450 to <=480 msec 13 (9.7%) 7 (5.2%) 3 (2.3%) \n >480 to <= 500 msec 4 (3%) 5 (3.7%) 2 (1.5%) \n >500 msec 11 (8.2%) 10 (7.5%) 9 (6.8%) \n Change from Baseline \n n 134 134 132 \n <=30 msec 63 (47%) 80 (59.7%) 81 (61.4%) \n >30 to <=60 msec 14 (10.4%) 8 (6%) 11 (8.3%) \n >60 msec 57 (42.5%) 46 (34.3%) 40 (30.3%) \n WEEK 4 DAY 29 \n Value at Visit \n n 134 134 132 \n <=450 msec 117 (87.3%) 103 (76.9%) 114 (86.4%) \n >450 to <=480 msec 7 (5.2%) 14 (10.4%) 6 (4.5%) \n >480 to <= 500 msec 4 (3%) 7 (5.2%) 3 (2.3%) \n >500 msec 6 (4.5%) 10 (7.5%) 9 (6.8%) \n Change from Baseline \n n 134 134 132 \n <=30 msec 79 (59%) 80 (59.7%) 79 (59.8%) \n >30 to <=60 msec 11 (8.2%) 7 (5.2%) 10 (7.6%) \n >60 msec 44 (32.8%) 47 (35.1%) 43 (32.6%) \n WEEK 5 DAY 36 \n Value at Visit \n n 134 134 132 \n <=450 msec 107 (79.9%) 117 (87.3%) 112 (84.8%) \n >450 to <=480 msec 16 (11.9%) 5 (3.7%) 13 (9.8%) \n >480 to <= 500 msec 5 (3.7%) 9 (6.7%) 3 (2.3%) \n >500 msec 6 (4.5%) 3 (2.2%) 4 (3%) \n Change from Baseline \n n 134 134 132 \n <=30 msec 72 (53.7%) 82 (61.2%) 73 (55.3%) \n >30 to <=60 msec 10 (7.5%) 11 (8.2%) 11 (8.3%) \n >60 msec 52 (38.8%) 41 (30.6%) 48 (36.4%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEG <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADEG <- df_explicit_na(ADEG)\n adeg_labels <- col_labels(ADEG)\n\n ADEG <- ADEG %>%\n filter(\n ANL01FL == \"Y\" # no need to filter for PARAMCD here\n ) %>%\n mutate(\n AVALCAT1 = case_when(\n AVAL <= 450 ~ \"<=450 msec\",\n AVAL <= 480 ~ \">450 to <=480 msec\",\n AVAL <= 500 ~ \">480 to <= 500 msec\",\n AVAL > 500 ~ \">500 msec\",\n is.na(AVAL) ~ \"<Missing>\"\n ),\n CHGCAT1 = case_when(\n CHG <= 30 ~ \"<=30 msec\",\n CHG <= 60 ~ \">30 to <=60 msec\",\n CHG > 60 ~ \">60 msec\",\n is.na(CHG) ~ \"<Missing>\"\n )\n ) %>%\n mutate(\n AVALCAT1 = factor(\n AVALCAT1,\n levels = c(\n \"<=450 msec\",\n \">450 to <=480 msec\",\n \">480 to <= 500 msec\",\n \">500 msec\",\n \"<Missing>\"\n )\n ),\n CHGCAT1 = factor(\n CHGCAT1,\n levels = c(\n \"<=30 msec\",\n \">30 to <=60 msec\",\n \">60 msec\",\n \"<Missing>\"\n )\n )\n )\n col_labels(ADEG) <- c(\n adeg_labels,\n \"AVALCAT1\" = \"Value at Visit\",\n \"CHGCAT1\" = \"Change from Baseline\"\n )\n})\ndatanames <- c(\"ADSL\", \"ADEG\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADEG <- data[[\"ADEG\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"ECG Actual Values and Changes from Baseline by Visit\",\n dataname = \"ADEG\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADEG, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"AVISIT\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADEG, c(\"AVALCAT1\", \"CHGCAT1\")),\n selected = c(\"AVALCAT1\", \"CHGCAT1\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADEG, \"PARAMCD\", \"PARAM\"),\n selected = \"QT\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:48:40 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Lab Results", - "LBT12_BL" + "ECG", + "EGT05_QTCAT" ] }, { - "objectID": "tables/risk-management-plan/rmpt03.html", - "href": "tables/risk-management-plan/rmpt03.html", - "title": "RMPT03", + "objectID": "tables/ECG/egt01.html", + "href": "tables/ECG/egt01.html", + "title": "EGT01", "section": "", - "text": "Data Setup\nStandard Table\nTable Excluding Empty Age Groups\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadex <- df_explicit_na(adex)\n\n# Simulate ADEX records with PARAMCD == \"TDURD\" as they are not in sample scda dataset.\nset.seed(1, kind = \"Mersenne-Twister\")\nadex2 <- adex %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE)\n ) %>%\n bind_rows(adex)\n\n# Now pre-processing steps are carried out.\nanl <- adex2 %>%\n filter(\n PARAMCD == \"TDURD\",\n PARCAT2 == \"Drug A\",\n SAFFL == \"Y\"\n ) %>%\n mutate(\n AGEGR1 = factor(ifelse(AGE < 65, \"<65\", \">=65\")),\n AGEGR2 = factor(case_when(\n AGE < 18 ~ \"< 18\",\n AGE >= 18 & AGE <= 40 ~ \"18 - 40\",\n AGE > 40 & AGE <= 64 ~ \"41 - 64\",\n TRUE ~ \">=65\"\n ), levels = c(\"< 18\", \"18 - 40\", \"41 - 64\", \">=65\")),\n SEX = factor(case_when(\n SEX == \"F\" ~ \"Female\",\n SEX == \"M\" ~ \"Male\"\n ))\n )\n\nadsl_f <- adsl %>%\n filter(adsl$SAFFL == \"Y\") %>%\n mutate(SEX = factor(case_when(\n SEX == \"F\" ~ \"Female\",\n SEX == \"M\" ~ \"Male\"\n )))\n\n\n\n\n\nCodelyt <- basic_table(\n title = \"Extent of Exposure by Age Group and Gender: Safety-Evaluable Patients\",\n main_footer = \"* Patient Time is the sum of exposure across all patients in days.\"\n) %>%\n split_cols_by(\"SEX\", split_fun = add_overall_level(\"Total\", first = FALSE)) %>%\n summarize_patients_exposure_in_cols(\n var = \"AVAL\", col_split = TRUE,\n .labels = c(n_patients = \"Number of Patients\", sum_exposure = \"Patient Time*\"),\n custom_label = \"Total Number of Patients and Patient Time\"\n ) %>%\n analyze_patients_exposure_in_cols(\n var = \"AGEGR1\",\n col_split = FALSE\n ) %>%\n append_topleft(c(\"\", \"Age group (years)\"))\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_f)\nresult\n\nExtent of Exposure by Age Group and Gender: Safety-Evaluable Patients\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Female Male Total \nAge group (years) Number of Patients Patient Time* Number of Patients Patient Time* Number of Patients Patient Time*\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal Number of Patients and Patient Time 134 (58.0%) 12591 83 (49.1%) 8050 217 (54.2%) 20641 \n <65 134 (58.0%) 12591 82 (48.5%) 7970 216 (54.0%) 20561 \n >=65 0 (0.0%) 0 1 (0.6%) 80 1 (0.2%) 80 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n* Patient Time is the sum of exposure across all patients in days.\n\n\n\n\n\nCodelyt <- basic_table(\n title = \"Duration of Exposure: Safety-Evaluable Patients\",\n main_footer = \"* Patient Time is the sum of exposure across all patients in days.\"\n) %>%\n split_cols_by(\"SEX\", split_fun = add_overall_level(\"Total\", first = FALSE)) %>%\n summarize_patients_exposure_in_cols(\n var = \"AVAL\", col_split = TRUE,\n .labels = c(n_patients = \"Number of Patients\", sum_exposure = \"Patient Time*\"),\n custom_label = \"Total Number of Patients and Patient Time\"\n ) %>%\n analyze_patients_exposure_in_cols(\n var = \"AGEGR2\",\n col_split = FALSE\n ) %>%\n append_topleft(c(\"\", \"Age group (years)\"))\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_f) %>%\n prune_table()\nresult\n\nDuration of Exposure: Safety-Evaluable Patients\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Female Male Total \nAge group (years) Number of Patients Patient Time* Number of Patients Patient Time* Number of Patients Patient Time*\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal Number of Patients and Patient Time 134 (58.0%) 12591 83 (49.1%) 8050 217 (54.2%) 20641 \n 18 - 40 118 (51.1%) 11203 60 (35.5%) 5787 178 (44.5%) 16990 \n 41 - 64 16 (6.9%) 1388 22 (13.0%) 2183 38 (9.5%) 3571 \n >=65 0 (0.0%) 0 1 (0.6%) 80 1 (0.2%) 80 \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n* Patient Time is the sum of exposure across all patients in days.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEX <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n labels <- col_labels(ADEX)\n set.seed(1, kind = \"Mersenne-Twister\")\n\n labels <- col_labels(ADEX)\n ADEX <- ADEX %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE),\n AVALU = \"Days\",\n SEX = factor(case_when(\n SEX == \"F\" ~ \"Female\",\n SEX == \"M\" ~ \"Male\"\n ))\n ) %>%\n bind_rows(ADEX)\n\n col_labels(ADEX) <- labels\n\n ADEX <- ADEX %>%\n mutate(\n AGEGR1 = factor(ifelse(AGE < 65, \"<65\", \">=65\")) %>% with_label(\"Age group (years)\"),\n AGEGR2 = factor(case_when(\n AGE < 18 ~ \"< 18\",\n AGE >= 18 & AGE <= 40 ~ \"18 - 40\",\n AGE > 40 & AGE <= 64 ~ \"41 - 64\",\n TRUE ~ \">=65\"\n ), levels = c(\"< 18\", \"18 - 40\", \"41 - 64\", \">=65\")) %>% with_label(\"Age group (years)\")\n )\n\n ADSL <- ADSL %>%\n mutate(SEX = factor(case_when(\n SEX == \"F\" ~ \"Female\",\n SEX == \"M\" ~ \"Male\"\n )) %>% with_label(\"Sex\"))\n})\ndatanames <- c(\"ADSL\", \"ADEX\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADEX <- data[[\"ADEX\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_exposure(\n label = \"Duration of Exposure Table\",\n dataname = \"ADEX\",\n paramcd = choices_selected(\n choices = value_choices(ADEX, \"PARAMCD\", \"PARAM\"),\n selected = \"TDURD\"\n ),\n col_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"ARM\")),\n selected = \"ARM\"\n ),\n row_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"AGEGR1\", \"AGEGR2\")),\n selected = \"AGEGR1\"\n ),\n parcat = choices_selected(\n choices = value_choices(ADEX, \"PARCAT2\"),\n selected = \"Drug A\"\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:51:33 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\n# Data should be filtered for the studied Parameter (`PARAM`) and the\n# Analysis Visit (`AVISIT`). According to the GDSR template, the values for\n# the `AVISIT` reported in the EGT01 standard may be:\n# 'POST-BASELINE MAXIMUM', 'POST-BASELINE MINIMUM', 'POST-BASELINE LAST'.\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadeg <- df_explicit_na(adeg)\n\nadeg_f <- adeg %>%\n filter(ANL01FL == \"Y\") %>%\n filter(PARAM %in% c(\"Heart Rate\", \"QT Duration\", \"RR Duration\"))\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nafun <- function(x, .var, .spl_context, ...) {\n n_fun <- sum(!is.na(x), na.rm = TRUE)\n if (n_fun == 0) {\n mean_sd_fun <- c(NA, NA)\n median_fun <- NA\n min_max_fun <- c(NA, NA)\n } else {\n mean_sd_fun <- c(mean(x, na.rm = TRUE), sd(x, na.rm = TRUE))\n median_fun <- median(x, na.rm = TRUE)\n min_max_fun <- c(min(x), max(x))\n }\n is_chg <- .var == \"CHG\"\n is_baseline <- .spl_context$value[which(.spl_context$split == \"AVISIT\")] == \"BASELINE\"\n if (is_baseline && is_chg) n_fun <- mean_sd_fun <- median_fun <- min_max_fun <- NULL\n\n in_rows(\n \"n\" = n_fun,\n \"Mean (SD)\" = mean_sd_fun,\n \"Median\" = median_fun,\n \"Min - Max\" = min_max_fun,\n .formats = list(\"n\" = \"xx\", \"Mean (SD)\" = \"xx.xx (xx.xx)\", \"Median\" = \"xx.xx\", \"Min - Max\" = \"xx.xx - xx.xx\"),\n .format_na_strs = list(\"n\" = \"NE\", \"Mean (SD)\" = \"NE (NE)\", \"Median\" = \"NE\", \"Min - Max\" = \"NE - NE\")\n )\n}\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adeg_f$PARAM)) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adeg_f$AVISIT)) %>%\n split_cols_by_multivar(\n vars = c(\"AVAL\", \"CHG\"),\n varlabels = c(\"Value at Visit\", \"Change from\\nBaseline\")\n ) %>%\n analyze_colvars(afun = afun)\n\nresult <- build_table(lyt, adeg_f, alt_counts_df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination \n Change from Change from Change from \nParameter Value at Visit Baseline Value at Visit Baseline Value at Visit Baseline \n Analysis Visit (N=134) (N=134) (N=134) (N=134) (N=132) (N=132) \n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nHeart Rate \n BASELINE \n n 134 134 132 \n Mean (SD) 71.45 (17.93) 69.83 (20.72) 69.34 (20.95) \n Median 72.70 73.35 71.96 \n Min - Max 9.09 - 106.91 13.49 - 115.52 11.63 - 115.49 \n WEEK 1 DAY 8 \n n 134 134 134 134 132 132 \n Mean (SD) 70.19 (20.27) -1.26 (25.97) 69.43 (20.80) -0.40 (29.73) 68.65 (18.06) -0.69 (27.81) \n Median 70.70 -2.20 70.46 -0.52 68.57 -0.76 \n Min - Max 8.53 - 127.50 -50.97 - 89.16 16.85 - 129.14 -68.18 - 88.38 16.87 - 115.60 -68.25 - 67.20 \n WEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 70.32 (19.56) -1.13 (26.26) 71.11 (20.56) 1.28 (31.35) 69.19 (18.06) -0.15 (28.61) \n Median 70.88 -1.10 72.52 -0.31 69.30 -1.55 \n Min - Max 17.14 - 116.32 -85.03 - 67.52 9.22 - 120.54 -73.07 - 81.44 29.62 - 120.50 -67.75 - 66.29 \n WEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 68.25 (20.17) -3.20 (28.66) 68.95 (20.56) -0.88 (30.14) 70.88 (20.28) 1.54 (27.28) \n Median 68.79 -2.17 67.80 1.19 70.12 0.14 \n Min - Max 13.33 - 131.73 -81.20 - 72.57 23.98 - 130.41 -73.03 - 103.31 20.91 - 116.79 -64.51 - 72.52 \n WEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 70.06 (18.41) -1.38 (26.59) 71.60 (20.34) 1.77 (30.26) 71.02 (20.59) 1.68 (29.60) \n Median 69.33 -4.54 72.21 -0.88 70.52 3.81 \n Min - Max 22.30 - 116.51 -58.07 - 77.32 17.53 - 129.06 -64.32 - 85.34 10.35 - 117.30 -65.91 - 105.67 \n WEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 66.41 (19.74) -5.04 (27.11) 71.25 (18.92) 1.42 (27.08) 71.26 (18.56) 1.92 (29.59) \n Median 65.40 -6.83 70.86 0.64 73.29 1.74 \n Min - Max 23.89 - 110.38 -73.26 - 57.24 25.86 - 125.73 -71.15 - 67.37 23.89 - 117.19 -58.23 - 68.86 \nQT Duration \n BASELINE \n n 134 134 132 \n Mean (SD) 336.83 (117.96) 351.00 (98.44) 352.60 (105.11) \n Median 344.41 351.48 347.96 \n Min - Max 86.98 - 665.40 98.90 - 641.92 105.68 - 628.14 \n WEEK 1 DAY 8 \n n 134 134 134 134 132 132 \n Mean (SD) 342.57 (101.09) 5.74 (159.94) 363.95 (102.34) 12.94 (140.73) 359.42 (105.16) 6.83 (147.13) \n Median 347.26 -1.78 356.54 13.73 363.84 8.69 \n Min - Max 91.63 - 591.42 -346.44 - 452.75 114.92 - 656.45 -317.53 - 416.35 51.91 - 611.88 -473.19 - 358.00 \n WEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 353.24 (93.93) 16.41 (162.10) 345.93 (96.78) -5.08 (152.51) 335.69 (98.61) -16.91 (138.45) \n Median 351.10 16.72 346.83 -9.68 320.96 -22.27 \n Min - Max 138.01 - 587.30 -414.07 - 389.16 146.42 - 556.07 -440.28 - 364.76 104.91 - 562.34 -326.55 - 325.27 \n WEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 370.12 (101.57) 33.28 (152.78) 343.41 (102.58) -7.59 (138.80) 346.95 (94.96) -5.65 (144.65) \n Median 378.21 39.59 335.12 -15.89 352.15 9.11 \n Min - Max 118.14 - 615.18 -391.72 - 520.09 63.37 - 566.51 -311.28 - 293.76 126.09 - 580.81 -412.11 - 410.01 \n WEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 345.77 (95.97) 8.94 (145.65) 354.38 (108.29) 3.37 (142.39) 341.36 (106.75) -11.24 (145.65) \n Median 340.13 5.58 346.70 -17.13 352.30 -11.87 \n Min - Max 110.12 - 616.58 -393.34 - 456.04 80.82 - 687.69 -439.90 - 364.80 4.95 - 570.61 -480.94 - 330.67 \n WEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 358.90 (97.69) 22.07 (155.68) 338.65 (99.26) -12.36 (130.46) 349.30 (95.77) -3.30 (136.00) \n Median 351.96 5.89 344.17 0.40 350.32 12.68 \n Min - Max 88.38 - 661.12 -353.30 - 539.84 31.25 - 563.90 -338.85 - 352.75 119.02 - 581.83 -311.45 - 295.53 \nRR Duration \n BASELINE \n n 134 134 132 \n Mean (SD) 1028.42 (286.38) 1027.48 (324.00) 1074.62 (277.33) \n Median 1041.86 1047.27 1080.87 \n Min - Max 34.33 - 1783.71 5.29 - 1877.19 289.60 - 1617.06 \n WEEK 1 DAY 8 \n n 134 134 134 134 132 132 \n Mean (SD) 990.15 (318.74) -38.26 (446.40) 1061.59 (269.14) 34.10 (401.76) 1039.64 (284.39) -34.98 (406.04) \n Median 963.88 -86.50 1061.50 66.91 1014.78 -97.83 \n Min - Max 110.82 - 2014.56 -1014.82 - 1389.40 276.83 - 1711.99 -942.16 - 993.82 498.21 - 1937.47 -958.61 - 908.90 \n WEEK 2 DAY 15 \n n 134 134 134 134 132 132 \n Mean (SD) 1013.37 (304.13) -15.05 (425.81) 1109.40 (318.23) 81.92 (453.11) 1045.21 (277.51) -29.41 (380.84) \n Median 1040.69 40.49 1117.76 69.27 1034.64 -15.33 \n Min - Max 164.19 - 1677.10 -1216.10 - 1053.15 160.73 - 2048.73 -1127.10 - 1148.61 252.84 - 1722.33 -859.27 - 871.54 \n WEEK 3 DAY 22 \n n 134 134 134 134 132 132 \n Mean (SD) 1013.99 (304.99) -14.43 (406.53) 1118.35 (296.53) 90.86 (409.57) 1036.59 (268.52) -38.03 (421.48) \n Median 1027.23 -50.54 1134.60 52.03 1030.72 -60.72 \n Min - Max 357.04 - 1798.65 -882.94 - 1080.26 97.14 - 1825.43 -887.06 - 1166.15 446.02 - 1713.38 -984.79 - 902.37 \n WEEK 4 DAY 29 \n n 134 134 134 134 132 132 \n Mean (SD) 1033.31 (313.92) 4.89 (483.15) 1079.76 (298.94) 52.28 (429.25) 1027.55 (295.86) -47.07 (378.23) \n Median 1050.40 5.60 1051.61 69.55 1023.36 -49.52 \n Min - Max 54.33 - 1979.43 -1345.93 - 1195.41 347.94 - 1762.04 -826.43 - 1191.83 341.62 - 2144.86 -1002.03 - 1048.66\n WEEK 5 DAY 36 \n n 134 134 134 134 132 132 \n Mean (SD) 1072.33 (282.90) 43.92 (379.05) 1058.45 (271.01) 30.97 (436.03) 1029.04 (271.21) -45.58 (405.53) \n Median 1067.33 55.87 1068.95 33.61 1065.26 -34.40 \n Min - Max 352.97 - 2000.56 -1028.79 - 1418.57 208.83 - 1794.73 -978.97 - 1365.13 436.28 - 1794.07 -962.18 - 1329.88 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEG <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADEG <- df_explicit_na(ADEG)\n})\ndatanames <- c(\"ADSL\", \"ADEG\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADEG <- data[[\"ADEG\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"ECG Results and Change from Baseline by Visit\",\n dataname = \"ADEG\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADEG, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"AVISIT\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADEG, c(\"AVAL\", \"CHG\")),\n selected = c(\"AVAL\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADEG, \"PARAMCD\", \"PARAM\"),\n selected = \"HR\"\n ),\n parallel_vars = TRUE\n )\n ),\n filter = teal_slices(teal_slice(\"ADEG\", \"AVAL\", selected = NULL))\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADEG-filter-ADEG_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:49:03 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Risk Management Plan", - "RMPT03" + "ECG", + "EGT01" ] }, { - "objectID": "tables/risk-management-plan/rmpt05.html", - "href": "tables/risk-management-plan/rmpt05.html", - "title": "RMPT05", + "objectID": "tables/ECG/egt02.html", + "href": "tables/ECG/egt02.html", + "title": "EGT02", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadex <- df_explicit_na(adex)\n\n# Simulate ADEX records with PARAMCD == \"TDURD\" as they are not in the sample dataset.\nset.seed(1)\nadex2 <- adex %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE)\n ) %>%\n bind_rows(adex)\n\n# Now pre-processing steps are carried out.\nanl <- adex2 %>%\n filter(\n PARAMCD == \"TDURD\",\n PARCAT2 == \"Drug A\",\n SAFFL == \"Y\"\n ) %>%\n mutate()\n\nadsl_f <- adsl %>% filter(adsl$SAFFL == \"Y\")\n\n\n\n\n\nCodelyt <- basic_table(\n title = \"Extent of Exposure by Race: Safety-Evaluable Patients\",\n main_footer = \"* Person time is the sum of exposure across all patients in unit: days.\",\n show_colcounts = TRUE\n) %>%\n summarize_patients_exposure_in_cols(\n var = \"AVAL\", col_split = TRUE,\n .labels = c(n_patients = \"Patients\", sum_exposure = \"Person time*\")\n ) %>%\n analyze_patients_exposure_in_cols(\n var = \"RACE\",\n col_split = FALSE\n ) %>%\n append_topleft(c(\"\", obj_label(adex$RACE)))\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_f)\nresult\n\nExtent of Exposure by Race: Safety-Evaluable Patients\n\n————————————————————————————————————————————————————————————————————————\n Patients Person time*\nRace (N=400) (N=400) \n————————————————————————————————————————————————————————————————————————\nTotal patients numbers/person time 217 (54.2%) 20641 \n ASIAN 113 (28.2%) 10239 \n BLACK OR AFRICAN AMERICAN 48 (12.0%) 4481 \n WHITE 40 (10.0%) 4237 \n AMERICAN INDIAN OR ALASKA NATIVE 14 (3.5%) 1566 \n MULTIPLE 1 (0.2%) 58 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 1 (0.2%) 60 \n OTHER 0 (0.0%) 0 \n UNKNOWN 0 (0.0%) 0 \n————————————————————————————————————————————————————————————————————————\n\n* Person time is the sum of exposure across all patients in unit: days.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEX <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n labels <- col_labels(ADEX)\n set.seed(1, kind = \"Mersenne-Twister\")\n\n labels <- col_labels(ADEX)\n ADEX <- ADEX %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE),\n AVALU = \"Days\"\n ) %>%\n bind_rows(ADEX)\n\n col_labels(ADEX) <- labels\n})\ndatanames <- c(\"ADSL\", \"ADEX\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADEX <- data[[\"ADEX\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_exposure(\n label = \"Duration of Exposure Table\",\n dataname = \"ADEX\",\n paramcd = choices_selected(\n choices = value_choices(ADEX, \"PARAMCD\", \"PARAM\"),\n selected = \"TDURD\"\n ),\n col_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"ARM\")),\n selected = \"ARM\"\n ),\n row_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"RACE\", \"STRATA1\", \"SEX\")),\n selected = \"RACE\"\n ),\n parcat = choices_selected(\n choices = value_choices(ADEX, \"PARCAT2\"),\n selected = \"Drug A\"\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:03 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nECG Abnormalities Regardless of Abnormality at Baseline\nECG Abnormalities Among Subjects Without Abnormality at Baseline\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadeg <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadeg <- df_explicit_na(adeg)\n\n# Note: We keep only post-baseline for analysis.\nadeg_f <- adeg %>%\n filter(ONTRTFL == \"Y\") %>%\n filter(PARAM %in% c(\"Heart Rate\", \"QT Duration\", \"RR Duration\")) %>%\n filter(ANRIND != \"<Missing>\") %>%\n var_relabel(\n PARAM = \"Assessment\",\n ANRIND = \"Abnormality\"\n )\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adeg_f$PARAM)\n ) %>%\n count_abnormal(\"ANRIND\", abnormal = list(Low = \"LOW\", High = \"HIGH\"), exclude_base_abn = FALSE) %>%\n append_varlabels(adeg_f, \"ANRIND\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adeg_f, alt_counts_df = adsl)\nresult\n\nAssessment A: Drug X B: Placebo C: Combination\n Abnormality (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————\nHeart Rate \n Low 40/134 (29.9%) 43/134 (32.1%) 37/132 (28%) \n High 39/134 (29.1%) 45/134 (33.6%) 36/132 (27.3%)\nQT Duration \n Low 33/134 (24.6%) 44/134 (32.8%) 47/132 (35.6%)\n High 30/134 (22.4%) 42/134 (31.3%) 34/132 (25.8%)\nRR Duration \n Low 45/134 (33.6%) 26/134 (19.4%) 38/132 (28.8%)\n High 29/134 (21.6%) 49/134 (36.6%) 27/132 (20.5%)\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adeg_f$PARAM)\n ) %>%\n count_abnormal(\"ANRIND\", abnormal = list(Low = \"LOW\", High = \"HIGH\"), exclude_base_abn = TRUE) %>%\n append_varlabels(adeg_f, \"ANRIND\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adeg_f, alt_counts_df = adsl)\nresult\n\nAssessment A: Drug X B: Placebo C: Combination\n Abnormality (N=134) (N=134) (N=132) \n————————————————————————————————————————————————————————————————\nHeart Rate \n Low 39/128 (30.5%) 42/124 (33.9%) 33/117 (28.2%)\n High 37/127 (29.1%) 43/129 (33.3%) 31/122 (25.4%)\nQT Duration \n Low 29/113 (25.7%) 42/126 (33.3%) 43/124 (34.7%)\n High 30/125 (24%) 40/130 (30.8%) 30/119 (25.2%)\nRR Duration \n Low 45/129 (34.9%) 26/123 (21.1%) 37/126 (29.4%)\n High 27/127 (21.3%) 43/122 (35.2%) 25/125 (20%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEG <- synthetic_cdisc_dataset(\"latest\", \"adeg\")\n})\ndatanames <- c(\"ADSL\", \"ADEG\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADEG <- data[[\"ADEG\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_abnormality(\n label = \"Abnormality Table\",\n dataname = \"ADEG\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADEG, subset = c(\"EGCAT\", \"PARAM\", \"AVISIT\")),\n selected = c(\"PARAM\"),\n keep_order = TRUE\n ),\n grade = choices_selected(\n choices = variable_choices(ADEG, subset = \"ANRIND\"),\n selected = \"ANRIND\",\n fixed = TRUE\n ),\n abnormal = list(Low = \"LOW\", High = \"HIGH\"),\n exclude_base_abn = FALSE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:49:40 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 scda_0.1.6.9017 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", - "Risk Management Plan", - "RMPT05" + "ECG", + "EGT02" ] }, { @@ -1475,7 +1475,7 @@ "href": "tables/risk-management-plan/rmpt04.html", "title": "RMPT04", "section": "", - "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadex <- df_explicit_na(adex)\n\n# Simulate ADEX records with PARAMCD == \"TDURD\" as they are not in sample scda dataset.\nset.seed(1, kind = \"Mersenne-Twister\")\nadex2 <- adex %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE)\n ) %>%\n bind_rows(adex)\n\n\n# Now pre-processing steps are carried out.\nanl <- adex2 %>%\n filter(\n PARAMCD == \"TDURD\",\n PARCAT2 == \"Drug A\",\n SAFFL == \"Y\"\n )\n\nadsl_f <- adsl %>% filter(adsl$SAFFL == \"Y\")\n\n\n\n\n\nCodelyt <- basic_table(\n title = \"Extent of Exposure by Ethnic Origin: Safety-Evaluable Patients\",\n main_footer = \"* Patient Time is the sum of exposure across all patients in days.\",\n show_colcounts = TRUE\n) %>%\n analyze_patients_exposure_in_cols(\n var = \"ETHNIC\",\n col_split = TRUE,\n add_total_level = TRUE,\n custom_label = \"Total\"\n ) %>%\n append_topleft(c(\"\", \"Ethnicity\"))\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_f)\nresult\n\nExtent of Exposure by Ethnic Origin: Safety-Evaluable Patients\n\n——————————————————————————————————————————————————\n Patients Person time\nEthnicity (N=400) (N=400) \n——————————————————————————————————————————————————\nHISPANIC OR LATINO 28 (7.0%) 2423 \nNOT HISPANIC OR LATINO 165 (41.2%) 15570 \nNOT REPORTED 18 (4.5%) 2085 \nUNKNOWN 6 (1.5%) 563 \nTotal 217 (54.2%) 20641 \n——————————————————————————————————————————————————\n\n* Patient Time is the sum of exposure across all patients in days.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEX <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n labels <- col_labels(ADEX)\n set.seed(1, kind = \"Mersenne-Twister\")\n\n labels <- col_labels(ADEX)\n ADEX <- ADEX %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE),\n AVALU = \"Days\"\n ) %>%\n bind_rows(ADEX)\n\n col_labels(ADEX) <- labels\n})\ndatanames <- c(\"ADSL\", \"ADEX\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADEX <- data[[\"ADEX\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_exposure(\n label = \"Duration of Exposure Table\",\n dataname = \"ADEX\",\n paramcd = choices_selected(\n choices = value_choices(ADEX, \"PARAMCD\", \"PARAM\"),\n selected = \"TDURD\"\n ),\n col_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"ARM\")),\n selected = \"ARM\"\n ),\n row_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"ETHNIC\", \"SEX\")),\n selected = \"ETHNIC\"\n ),\n parcat = choices_selected(\n choices = value_choices(ADEX, \"PARCAT2\"),\n selected = \"Drug A\"\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:25 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadex <- df_explicit_na(adex)\n\n# Simulate ADEX records with PARAMCD == \"TDURD\" as they are not in sample scda dataset.\nset.seed(1, kind = \"Mersenne-Twister\")\nadex2 <- adex %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE)\n ) %>%\n bind_rows(adex)\n\n\n# Now pre-processing steps are carried out.\nanl <- adex2 %>%\n filter(\n PARAMCD == \"TDURD\",\n PARCAT2 == \"Drug A\",\n SAFFL == \"Y\"\n )\n\nadsl_f <- adsl %>% filter(adsl$SAFFL == \"Y\")\n\n\n\n\n\nCodelyt <- basic_table(\n title = \"Extent of Exposure by Ethnic Origin: Safety-Evaluable Patients\",\n main_footer = \"* Patient Time is the sum of exposure across all patients in days.\",\n show_colcounts = TRUE\n) %>%\n analyze_patients_exposure_in_cols(\n var = \"ETHNIC\",\n col_split = TRUE,\n add_total_level = TRUE,\n custom_label = \"Total\"\n ) %>%\n append_topleft(c(\"\", \"Ethnicity\"))\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_f)\nresult\n\nExtent of Exposure by Ethnic Origin: Safety-Evaluable Patients\n\n——————————————————————————————————————————————————\n Patients Person time\nEthnicity (N=400) (N=400) \n——————————————————————————————————————————————————\nHISPANIC OR LATINO 28 (7.0%) 2423 \nNOT HISPANIC OR LATINO 165 (41.2%) 15570 \nNOT REPORTED 18 (4.5%) 2085 \nUNKNOWN 6 (1.5%) 563 \nTotal 217 (54.2%) 20641 \n——————————————————————————————————————————————————\n\n* Patient Time is the sum of exposure across all patients in days.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEX <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n labels <- col_labels(ADEX)\n set.seed(1, kind = \"Mersenne-Twister\")\n\n labels <- col_labels(ADEX)\n ADEX <- ADEX %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE),\n AVALU = \"Days\"\n ) %>%\n bind_rows(ADEX)\n\n col_labels(ADEX) <- labels\n})\ndatanames <- c(\"ADSL\", \"ADEX\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADEX <- data[[\"ADEX\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_exposure(\n label = \"Duration of Exposure Table\",\n dataname = \"ADEX\",\n paramcd = choices_selected(\n choices = value_choices(ADEX, \"PARAMCD\", \"PARAM\"),\n selected = \"TDURD\"\n ),\n col_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"ARM\")),\n selected = \"ARM\"\n ),\n row_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"ETHNIC\", \"SEX\")),\n selected = \"ETHNIC\"\n ),\n parcat = choices_selected(\n choices = value_choices(ADEX, \"PARCAT2\"),\n selected = \"Drug A\"\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:50:02 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Tables", "Risk Management Plan", @@ -1483,231 +1483,278 @@ ] }, { - "objectID": "listings/pharmacokinetic/pkpl01.html", - "href": "listings/pharmacokinetic/pkpl01.html", - "title": "PKPL01", + "objectID": "tables/risk-management-plan/rmpt05.html", + "href": "tables/risk-management-plan/rmpt05.html", + "title": "RMPT05", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(rlistings)\nlibrary(scda)\n\ndrug_a <- \"Plasma Drug X\"\nspec <- \"Plasma\"\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\nadpp_x <- adpp %>% filter(\n PPCAT == drug_a,\n PPSPEC == spec\n)\n\nout <- adpp_x %>%\n mutate(PARAM = paste0(PARAM, \" (\", AVALU, \")\")) %>%\n select(TRT01A, USUBJID, AVISIT, PARAM, AVAL) %>%\n tidyr::pivot_wider(\n id_cols = c(TRT01A, USUBJID, AVISIT),\n names_from = PARAM,\n values_from = AVAL\n )\n\nvar_labels(out) <- names(out)\nout <- out %>% var_relabel(\n TRT01A = \"Treatment Group\",\n USUBJID = \"Subject ID\",\n AVISIT = \"Visit\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"USUBJID\", \"AVISIT\"),\n disp_cols = names(out),\n main_title = paste(\"Listing of\", drug_a, spec, \"PK Parameters, PK Population\\nProtocol: xxnnnnn\"),\n subtitles = paste(\"Analyte:\", drug_a)\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Plasma Drug X Plasma PK Parameters, PK Population\nProtocol: xxnnnnn\nAnalyte: Plasma Drug X\n\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTreatment Group Subject ID Visit AUC Infinity Obs (day*ug/mL) Max Conc (ug/mL) Total CL Obs (ml/day/kg)\n————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X AB12345-BRA-1-id-105 SCREENING 145.191684898102 35.5067335878638 5.1567601025515 \n CYCLE 1 DAY 1 246.349321001289 31.2264481880236 4.41386730113941 \n CYCLE 1 DAY 2 225.443483077171 43.4987268488453 4.81490455551286 \n AB12345-BRA-1-id-134 SCREENING 157.461703380688 32.1171292884992 6.0374125711965 \n CYCLE 1 DAY 1 248.519038520728 21.7795763901966 4.561839813278 \n CYCLE 1 DAY 2 230.794839837734 21.0627132276049 6.95200595313275 \n AB12345-BRA-1-id-42 SCREENING 194.224015921831 20.4565798423567 6.33709739029277 \n CYCLE 1 DAY 1 210.528307366678 26.7845825535397 3.50776680376268 \n CYCLE 1 DAY 2 167.592869235882 34.8276545020143 4.11969088323673 \n AB12345-BRA-1-id-93 SCREENING 186.75868084484 27.3983170052516 3.40495133575408 \n CYCLE 1 DAY 1 160.406798051843 17.5296885232566 3.8508725098954 \n CYCLE 1 DAY 2 252.04512291352 32.4903879259459 6.21586252565961 \n AB12345-BRA-11-id-217 SCREENING 215.367414313054 20.8879942219526 6.55883385955605 \n CYCLE 1 DAY 1 272.094354596647 34.2812274648873 5.04441608634882 \n CYCLE 1 DAY 2 174.183265394136 23.04243406023 4.07416508597243 \n AB12345-BRA-11-id-345 SCREENING 235.746948097021 26.5740342881269 5.52059967823211 \n CYCLE 1 DAY 1 228.51025073098 39.7523164840323 6.32996327499752 \n CYCLE 1 DAY 2 120.712762389698 24.37143486359 5.02620823564574 \n AB12345-BRA-11-id-397 SCREENING 165.925716319045 21.8770819414152 6.3713157196375 \n CYCLE 1 DAY 1 201.536920713046 36.5841424116449 4.32440907316618 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:34 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 rlistings_0.2.7.9011 tibble_3.2.1 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadex <- df_explicit_na(adex)\n\n# Simulate ADEX records with PARAMCD == \"TDURD\" as they are not in the sample dataset.\nset.seed(1)\nadex2 <- adex %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE)\n ) %>%\n bind_rows(adex)\n\n# Now pre-processing steps are carried out.\nanl <- adex2 %>%\n filter(\n PARAMCD == \"TDURD\",\n PARCAT2 == \"Drug A\",\n SAFFL == \"Y\"\n ) %>%\n mutate()\n\nadsl_f <- adsl %>% filter(adsl$SAFFL == \"Y\")\n\n\n\n\n\nCodelyt <- basic_table(\n title = \"Extent of Exposure by Race: Safety-Evaluable Patients\",\n main_footer = \"* Person time is the sum of exposure across all patients in unit: days.\",\n show_colcounts = TRUE\n) %>%\n summarize_patients_exposure_in_cols(\n var = \"AVAL\", col_split = TRUE,\n .labels = c(n_patients = \"Patients\", sum_exposure = \"Person time*\")\n ) %>%\n analyze_patients_exposure_in_cols(\n var = \"RACE\",\n col_split = FALSE\n ) %>%\n append_topleft(c(\"\", obj_label(adex$RACE)))\n\nresult <- build_table(lyt, df = anl, alt_counts_df = adsl_f)\nresult\n\nExtent of Exposure by Race: Safety-Evaluable Patients\n\n————————————————————————————————————————————————————————————————————————\n Patients Person time*\nRace (N=400) (N=400) \n————————————————————————————————————————————————————————————————————————\nTotal patients numbers/person time 217 (54.2%) 20641 \n ASIAN 113 (28.2%) 10239 \n BLACK OR AFRICAN AMERICAN 48 (12.0%) 4481 \n WHITE 40 (10.0%) 4237 \n AMERICAN INDIAN OR ALASKA NATIVE 14 (3.5%) 1566 \n MULTIPLE 1 (0.2%) 58 \n NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 1 (0.2%) 60 \n OTHER 0 (0.0%) 0 \n UNKNOWN 0 (0.0%) 0 \n————————————————————————————————————————————————————————————————————————\n\n* Person time is the sum of exposure across all patients in unit: days.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADEX <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\n labels <- col_labels(ADEX)\n set.seed(1, kind = \"Mersenne-Twister\")\n\n labels <- col_labels(ADEX)\n ADEX <- ADEX %>%\n distinct(USUBJID, .keep_all = TRUE) %>%\n mutate(\n PARAMCD = \"TDURD\",\n PARAM = \"Overall duration (days)\",\n AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE),\n AVALU = \"Days\"\n ) %>%\n bind_rows(ADEX)\n\n col_labels(ADEX) <- labels\n})\ndatanames <- c(\"ADSL\", \"ADEX\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADEX <- data[[\"ADEX\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_exposure(\n label = \"Duration of Exposure Table\",\n dataname = \"ADEX\",\n paramcd = choices_selected(\n choices = value_choices(ADEX, \"PARAMCD\", \"PARAM\"),\n selected = \"TDURD\"\n ),\n col_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"ARM\")),\n selected = \"ARM\"\n ),\n row_by_var = choices_selected(\n choices = variable_choices(ADEX, subset = c(\"RACE\", \"STRATA1\", \"SEX\")),\n selected = \"RACE\"\n ),\n parcat = choices_selected(\n choices = value_choices(ADEX, \"PARCAT2\"),\n selected = \"Drug A\"\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:50:32 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 dplyr_1.1.4 \n [9] scda_0.1.6.9017 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Pharmacokinetic", - "PKPL01" + "Tables", + "Risk Management Plan", + "RMPT05" ] }, { - "objectID": "listings/pharmacokinetic/pkcl01.html", - "href": "listings/pharmacokinetic/pkcl01.html", - "title": "PKCL01", + "objectID": "tables/concomitant-medications/cmt01.html", + "href": "tables/concomitant-medications/cmt01.html", + "title": "CMT01", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(rlistings)\nlibrary(scda)\nlibrary(dplyr)\n\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\")\n\nanalyte <- \"Plasma Drug X\"\n\nout <- adpc %>%\n filter(PARAM == analyte) %>%\n select(ARM, USUBJID, VISIT, NFRLT, AFRLT, AVAL)\n\nvar_labels(out) <- c(\n ARM = \"Treatment Group\",\n USUBJID = \"Subject ID\",\n VISIT = \"Visit\",\n NFRLT = paste0(\"Nominal Sampling\\nTime (\", adpc$RELTMU[1], \")\"),\n AFRLT = paste0(\"Actual Time\\nFrom First\\nDose (\", adpc$RELTMU[1], \")\"),\n AVAL = paste0(\"Concentration\\n(\", adpc$AVALU[1], \")\")\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"ARM\", \"USUBJID\", \"VISIT\"),\n disp_cols = names(out),\n main_title = paste(\n \"Listing of\",\n analyte,\n \"Concentration by Treatment Group, Subject and Nominal Time, PK Population\\nProtocol: xxnnnnn\"\n ),\n subtitles = paste(\"Analyte:\", analyte)\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Plasma Drug X Concentration by Treatment Group, Subject and Nominal Time, PK Population\nProtocol: xxnnnnn\nAnalyte: Plasma Drug X\n\n———————————————————————————————————————————————————————————————————————————————————————————————\n Actual Time \n Nominal Sampling From First Concentration\nTreatment Group Subject ID Visit Time (hr) Dose (hr) (ug/mL) \n———————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X AB12345-BRA-1-id-105 Day 1 0 0 0 \n 0.5 0.5 10.404 \n 1 1 13.987 \n 1.5 1.5 14.142 \n 2 2 12.744 \n 3 3 8.803 \n 4 4 5.461 \n 8 8 0.562 \n 12 12 0.049 \n Day 2 24 24 0 \n AB12345-BRA-1-id-134 Day 1 0 0 0 \n 0.5 0.5 14.405 \n 1 1 17.863 \n 1.5 1.5 16.613 \n 2 2 13.735 \n 3 3 7.923 \n 4 4 4.064 \n 8 8 0.178 \n 12 12 0.006 \n Day 2 24 24 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:41 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 scda_0.1.6.9017 rlistings_0.2.7.9011 \n[4] tibble_3.2.1 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Showing Medications Prior to the Start of the Study\nTable Sorted by Total Column Showing Additional “All Patients” Column\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\n# The following tables require ADCM data structure that follows the legacy concomitant medication coding.\n# WHO coding is not used.\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\n# Below step is to set up example data based on legacy standard.\nadcm <- adcm %>%\n select(-starts_with(\"ATC\")) %>%\n unique()\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadcm <- df_explicit_na(adcm)\n\nadcm_con <- adcm %>%\n filter(ATIREL == \"CONCOMITANT\")\n\nadcm_prior <- adcm %>%\n filter(ATIREL == \"PRIOR\")\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\"CMCLAS\",\n split_fun = split_fun,\n child_labels = \"visible\",\n nested = FALSE,\n indent_mod = 1L,\n label_pos = \"topleft\",\n split_label = obj_label(adcm_con$CMCLAS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm_con, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adcm_con,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"CMCLAS\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedication Class A: Drug X B: Placebo C: Combination\n Standardized Medication Name (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \n medcl A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \n medcl B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \n medcl C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\"CMCLAS\",\n split_fun = split_fun,\n child_labels = \"visible\",\n nested = FALSE,\n label_pos = \"topleft\",\n split_label = obj_label(adcm_con$CMCLAS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm_prior, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adcm_prior,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"CMCLAS\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedication Class A: Drug X B: Placebo C: Combination\n Standardized Medication Name (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 89 (66.4%) 95 (70.9%) 106 (80.3%) \nTotal number of treatments 194 208 243 \nmedcl A \n Total number of patients with at least one treatment 54 (40.3%) 49 (36.6%) 69 (52.3%) \n Total number of treatments 71 70 99 \n medname A_1/3 54 (40.3%) 49 (36.6%) 69 (52.3%) \nmedcl B \n Total number of patients with at least one treatment 76 (56.7%) 80 (59.7%) 81 (61.4%) \n Total number of treatments 123 138 144 \n medname B_2/4 52 (38.8%) 55 (41.0%) 56 (42.4%) \n medname B_3/4 47 (35.1%) 47 (35.1%) 52 (39.4%) \n\n\nTable with Subtotal Per Medication Class Suppressed\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\"CMCLAS\",\n split_fun = split_fun, child_labels = \"visible\",\n nested = FALSE,\n label_pos = \"topleft\",\n split_label = obj_label(adcm_con$CMCLAS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .labels = c(unique = \"Total number of patients with at least one treatment\"),\n .stats = \"unique\"\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm_con, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adcm_con,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"CMCLAS\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nMedication Class A: Drug X B: Placebo C: Combination\n Standardized Medication Name (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nmedcl A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nmedcl B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nmedcl C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n add_overall_col(\"All Patients\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n \"Total number of patients with at least one treatment (%)\",\n \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"CMCLAS\",\n split_fun = split_fun,\n child_labels = \"visible\",\n nested = FALSE,\n label_pos = \"topleft\",\n split_label = obj_label(adcm_con$CMCLAS)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n \"Total number of patients with at least one treatment (%)\",\n \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm_con, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(\n lyt = lyt,\n df = adcm_con,\n alt_counts_df = adsl\n) %>%\n prune_table() %>%\n sort_at_path(\n path = c(\"CMCLAS\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences,\n decreasing = TRUE\n ) %>%\n sort_at_path(\n path = c(\"CMCLAS\"),\n scorefun = cont_n_allcols,\n decreasing = TRUE\n )\n\nresult\n\nMedication Class A: Drug X B: Placebo C: Combination All Patients\n Standardized Medication Name (N=134) (N=134) (N=132) (N=400) \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment (%) 117 (87.3%) 116 (86.6%) 116 (87.9%) 349 (87.2%) \nTotal number of treatments 415 414 460 1289 \nmedcl C \n Total number of patients with at least one treatment (%) 82 (61.2%) 84 (62.7%) 89 (67.4%) 255 (63.7%) \n Total number of treatments 140 140 155 435 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) 170 (42.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) 157 (39.2%) \nmedcl B \n Total number of patients with at least one treatment (%) 83 (61.9%) 74 (55.2%) 88 (66.7%) 245 (61.3%) \n Total number of treatments 141 137 162 440 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) 168 (42.0%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) 150 (37.5%) \nmedcl A \n Total number of patients with at least one treatment (%) 75 (56.0%) 79 (59.0%) 81 (61.4%) 235 (58.8%) \n Total number of treatments 134 137 143 414 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) 159 (39.8%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) 147 (36.8%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nHere, adcm is processed to keep only one path per treatment.\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADCM <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADCM <- df_explicit_na(ADCM)\n\n ADCM <- ADCM %>%\n group_by(STUDYID, USUBJID, CMDECOD) %>%\n slice(1) %>%\n ungroup()\n})\ndatanames <- c(\"ADSL\", \"ADCM\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADCM <- data[[\"ADCM\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_events(\n label = \"Concomitant Medication Table\",\n dataname = \"ADCM\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n llt = choices_selected(\n choices = variable_choices(ADCM, \"CMDECOD\"),\n selected = \"CMDECOD\"\n ),\n hlt = choices_selected(\n choices = variable_choices(ADCM, \"CMCLAS\"),\n selected = c(\"CMCLAS\")\n ),\n add_total = TRUE,\n event_type = \"treatment\"\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:51:05 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Pharmacokinetic", - "PKCL01" + "Tables", + "Concomitant Medications", + "CMT01" ] }, { - "objectID": "listings/exposure/exl01.html", - "href": "listings/exposure/exl01.html", - "title": "EXL01", + "objectID": "tables/concomitant-medications/cmt01a.html", + "href": "tables/concomitant-medications/cmt01a.html", + "title": "CMT01A", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadex <- synthetic_cdisc_dataset(\"latest\", \"adex\")\n\nout <- adex %>%\n filter(PARAMCD == \"DOSE\" & !is.na(AVAL) & SAFFL == \"Y\") %>%\n mutate(\n CRTNPT = paste(SITEID, SUBJID, sep = \"/\")\n ) %>%\n arrange(CRTNPT, AVISIT) %>%\n select(CRTNPT, AVISIT, EXSTDY, EXENDY, TRT01A, AVAL, AVALU, EXDOSFRQ, EXROUTE)\n\nvar_labels(out) <- c(\n CRTNPT = \"Center/Subject ID\",\n AVISIT = \"Visit\",\n EXSTDY = \"Study Day\\nFrom\",\n EXENDY = \"Study Day\\nTo\",\n TRT01A = \"Treatment\",\n AVAL = \"Dose\",\n AVALU = \"Unit\",\n EXDOSFRQ = \"Frequency\",\n EXROUTE = \"Route\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CRTNPT\", \"AVISIT\"),\n disp_cols = names(out),\n main_title = \"Listing of Exposure to Study Drug\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Exposure to Study Drug\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Study Day Study Day \nTreatment Center/Subject ID Visit From To Dose Unit Frequency Route \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-105 SCREENING -1 -1 960 mg ONCE INTRAVENOUS \n BASELINE 1 1 960 mg ONCE INTRAVENOUS \n WEEK 1 DAY 8 8 8 720 mg ONCE SUBCUTANEOUS\n WEEK 2 DAY 15 15 15 480 mg ONCE INTRAVENOUS \n WEEK 3 DAY 22 22 22 480 mg ONCE INTRAVENOUS \n WEEK 4 DAY 29 29 29 720 mg ONCE INTRAVENOUS \n WEEK 5 DAY 36 36 36 720 mg ONCE INTRAVENOUS \n BRA-1/id-134 SCREENING -1 -1 960 mg ONCE INTRAVENOUS \n BASELINE 1 1 720 mg ONCE INTRAVENOUS \n WEEK 1 DAY 8 8 8 720 mg ONCE INTRAVENOUS \n WEEK 2 DAY 15 15 15 960 mg ONCE INTRAVENOUS \n WEEK 3 DAY 22 22 22 720 mg ONCE INTRAVENOUS \n WEEK 4 DAY 29 29 29 960 mg ONCE INTRAVENOUS \n WEEK 5 DAY 36 36 36 960 mg ONCE INTRAVENOUS \n BRA-1/id-42 SCREENING -1 -1 960 mg ONCE INTRAVENOUS \n BASELINE 1 1 960 mg ONCE INTRAVENOUS \n WEEK 1 DAY 8 8 8 720 mg ONCE SUBCUTANEOUS\n WEEK 2 DAY 15 15 15 720 mg ONCE INTRAVENOUS \n WEEK 3 DAY 22 22 22 720 mg ONCE INTRAVENOUS \n WEEK 4 DAY 29 29 29 480 mg ONCE INTRAVENOUS \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:48 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table, Safety-Evaluable Patients\nTable Changing ATC Class Level\nTable with Classes Sorted by Frequency\nTable with Total Number of Treatments per Medication Class Suppressed\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nadcm$CMSEQ <- as.factor(adcm$CMSEQ)\n\nadsl <- df_explicit_na(adsl)\nadcm <- df_explicit_na(adcm)\n\n# Keep only safety-evaluable patients and concomitant medications\nadsl <- adsl %>%\n filter(SAFFL == \"Y\")\n\nadcm <- adcm %>%\n filter(SAFFL == \"Y\" & ATIREL == \"CONCOMITANT\") %>%\n var_relabel(CMDECOD = \"Other Treatment\")\n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC2\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 2 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS2 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS2 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS2 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS2 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC1\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC1)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC1\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 1 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS1 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS1 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS1 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS1 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS1 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%\n prune_table() %>%\n sort_at_path(path = c(\"ATC2\"), scorefun = cont_n_allcols) %>%\n sort_at_path(path = c(\"ATC2\", \"*\", \"CMDECOD\"), scorefun = score_occurrences)\n\nresult\n\nATC Level 2 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS2 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n Total number of treatments 140 140 155 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n Total number of treatments 141 137 162 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS2 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n Total number of treatments 134 137 143 \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS2 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n Total number of treatments 69 73 80 \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \nATCCLAS2 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n Total number of treatments 75 82 83 \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n Total number of treatments 58 66 64 \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \n\n\n\n\n\nCodesplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n analyze_num_patients(\n vars = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\", \"nonunique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\",\n nonunique = \"Total number of treatments\"\n )\n ) %>%\n split_rows_by(\n \"ATC2\",\n child_labels = \"visible\",\n nested = FALSE,\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adcm$ATC2)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n count_by = \"CMSEQ\",\n .stats = c(\"unique\"),\n .labels = c(\n unique = \"Total number of patients with at least one treatment\"\n )\n ) %>%\n count_occurrences(vars = \"CMDECOD\", .indent_mods = -1L) %>%\n append_varlabels(adcm, \"CMDECOD\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%\n prune_table() %>%\n # Sort lowest level terms by descending frequency.\n sort_at_path(\n path = c(\"ATC2\", \"*\", \"CMDECOD\"),\n scorefun = score_occurrences\n )\n\nresult\n\nATC Level 2 Text A: Drug X B: Placebo C: Combination\n Other Treatment (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of patients with at least one treatment 117 (87.3%) 116 (86.6%) 116 (87.9%) \nTotal number of treatments 415 414 460 \nATCCLAS2 A \n Total number of patients with at least one treatment 75 (56.0%) 79 (59.0%) 81 (61.4%) \n medname A_2/3 53 (39.6%) 50 (37.3%) 56 (42.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS2 A p2 \n Total number of patients with at least one treatment 45 (33.6%) 54 (40.3%) 48 (36.4%) \n medname A_3/3 45 (33.6%) 54 (40.3%) 48 (36.4%) \nATCCLAS2 B \n Total number of patients with at least one treatment 83 (61.9%) 74 (55.2%) 88 (66.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_4/4 50 (37.3%) 45 (33.6%) 55 (41.7%) \nATCCLAS2 B p2 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 B p3 \n Total number of patients with at least one treatment 52 (38.8%) 57 (42.5%) 59 (44.7%) \n medname B_1/4 52 (38.8%) 57 (42.5%) 59 (44.7%) \nATCCLAS2 C \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 C p2 \n Total number of patients with at least one treatment 82 (61.2%) 84 (62.7%) 89 (67.4%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_1/2 51 (38.1%) 50 (37.3%) 56 (42.4%) \nATCCLAS2 C p3 \n Total number of patients with at least one treatment 52 (38.8%) 58 (43.3%) 60 (45.5%) \n medname C_2/2 52 (38.8%) 58 (43.3%) 60 (45.5%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\nadcm_keys <- c(\"STUDYID\", \"USUBJID\", \"ASTDTM\", \"CMSEQ\", \"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(dplyr)\n library(scda)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADCM <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n ADCM$CMSEQ <- as.integer(ADCM$CMSEQ)\n\n ADSL <- df_explicit_na(ADSL)\n ADCM <- df_explicit_na(ADCM)\n})\ndatanames <- c(\"ADSL\", \"ADCM\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\njoin_keys(data)[\"ADCM\", \"ADCM\"] <- adcm_keys\n\n## Reusable Configuration For Modules\nADCM <- data[[\"ADCM\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_mult_events(\n label = \"Concomitant Medications by Medication Class and Preferred Name\",\n dataname = \"ADCM\",\n arm_var = choices_selected(c(\"ARM\", \"ARMCD\"), \"ARM\"),\n seq_var = choices_selected(\"CMSEQ\", selected = \"CMSEQ\", fixed = TRUE),\n hlt = choices_selected(\n choices = variable_choices(ADCM, c(\"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\")),\n selected = c(\"ATC2\")\n ),\n llt = choices_selected(\n choices = variable_choices(ADCM, c(\"CMDECOD\")),\n selected = c(\"CMDECOD\")\n ),\n add_total = FALSE,\n event_type = \"treatment\"\n )\n ),\n filter = teal_slices(\n teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"),\n teal_slice(\"ADCM\", \"ATIREL\", selected = \"CONCOMITANT\")\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:51:38 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 scda_0.1.6.9017 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Exposure", - "EXL01" + "Tables", + "Concomitant Medications", + "CMT01A" ] }, { - "objectID": "listings/concomitant-medications/cml01.html", - "href": "listings/concomitant-medications/cml01.html", - "title": "CML01", + "objectID": "tables/vital-signs/vst02.html", + "href": "tables/vital-signs/vst02.html", + "title": "VST02", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nout <- adcm %>%\n filter(!is.na(CMDECOD)) %>%\n mutate(\n ID = paste(SITEID, SUBJID, sep = \"/\"),\n AGSXRC = paste(AGE, SEX, RACE, sep = \"/\"),\n TRTSD = toupper(format(as.Date(TRTSDTM), \"%d%b%Y\")),\n CMASTD = toupper(format(as.Date(ASTDTM), \"%d%b%Y\")),\n CMSTRFL = ifelse(ASTDY < 0, \"Yes\", \"No\"),\n CMENRFL = ifelse(CMENRTPT == \"ONGOING\", \"Yes\", \"No\")\n ) %>%\n select(\n ID, AGSXRC, TRT01A, CMDECOD, TRTSD, CMASTD, ASTDY, ADURN,\n CMSTRFL, CMENRFL, CMDOSE, CMDOSU, CMDOSFRQ, CMROUTE\n )\n\nvar_labels(out) <- c(\n ID = \"Center/Patient ID\",\n AGSXRC = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n CMDECOD = \"Medication Name\",\n TRTSD = \"Date of First\\nStudy Drug\\nAdministration\",\n CMASTD = \"Medication\\nStart Date\",\n ASTDY = \"Study Day\",\n ADURN = \"Duration\\n(days)\",\n CMSTRFL = \"Previous?\",\n CMENRFL = \"Ongoing\\nat Final\\nContact?\",\n CMDOSE = \"Dose\",\n CMDOSU = \"Dose Unit\",\n CMDOSFRQ = \"Frequency\",\n CMROUTE = \"Route\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"ID\", \"AGSXRC\", \"CMDECOD\"),\n disp_cols = names(out),\n main_title = \"Listing of Previous and Concomitant Medications\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Previous and Concomitant Medications\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of First Ongoing \n Study Drug Medication Duration at Final \nTreatment Center/Patient ID Age/Sex/Race Medication Name Administration Start Date Study Day (days) Previous? Contact? Dose Dose Unit Frequency Route \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE medname A_2/3 04NOV2020 21SEP2021 321 -148 No No 30 mg/breath Q4H INTRAMUSCULAR\n 04NOV2020 02DEC2021 393 -42 No No 41 umol/L TWICE UNKNOWN \n medname B_1/4 04NOV2020 15APR2021 162 -172 No No 25 ug/kg/day Q4H INTRAVENOUS \n 04NOV2020 15APR2021 162 -172 No No 25 ug/kg/day Q4H INTRAVENOUS \n 04NOV2020 15APR2021 162 -172 No No 25 ug/kg/day Q4H INTRAVENOUS \n medname C_1/2 04NOV2020 19MAY2021 196 -165 No No 22 ug/mL TID INHALED \n 04NOV2020 19MAY2021 196 -165 No No 22 ug/mL TID INHALED \n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN medname A_2/3 01JAN2020 09JUN2020 160 -258 No Yes 48 DROP QD INTRAVENOUS \n 01JAN2020 04APR2021 459 -194 No Yes 57 ug/kg/day Q4W NASAL \n 01JAN2020 15APR2021 470 -130 No Yes 83 ug/kg/day Q4H UNKNOWN \n 01JAN2020 20APR2021 475 -112 No Yes 17 ug/kg/day Q4H SUBCUTANEOUS \n medname A_3/3 01JAN2020 03OCT2021 641 -14 No Yes 68 % 4 TIMES PER MONTH UNKNOWN \n 01JAN2020 03OCT2021 641 -14 No Yes 68 % 4 TIMES PER MONTH UNKNOWN \n medname B_1/4 01JAN2020 19OCT2020 292 -49 No Yes 5 ug/mL TWICE UNKNOWN \n 01JAN2020 19OCT2020 292 -49 No Yes 5 ug/mL TWICE UNKNOWN \n 01JAN2020 19OCT2020 292 -49 No Yes 5 ug/mL TWICE UNKNOWN \n medname B_2/4 01JAN2020 11MAY2021 496 -161 No Yes 83 ug/mL TWICE RECTAL \n 01JAN2020 11MAY2021 496 -161 No Yes 83 ug/mL TWICE RECTAL \n 01JAN2020 11MAY2021 496 -161 No Yes 83 ug/mL TWICE RECTAL \n medname B_3/4 01JAN2020 09FEB2020 39 -505 No Yes 85 ug QD SUBCUTANEOUS \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:52:55 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nVST02_1 – Table of Abnormalities Regardless of Abnormality at Baseline\nVST02_2 – Table of Abnormalities Among Subjects Without Abnormality at Baseline\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadvs <- synthetic_cdisc_dataset(\"latest\", \"advs\")\n\n# Ensure character variables are converted to factors and empty strings\n# and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadvs <- df_explicit_na(advs)\n\n# Note: We keep only post-baseline for analysis.\nadvs_f <- advs %>%\n filter(ONTRTFL == \"Y\", ANRIND != \"<Missing>\") %>%\n var_relabel(\n PARAM = \"Assessment\",\n ANRIND = \"Abnormality\"\n )\n\nsplit_fun <- drop_split_levels\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n add_overall_col(\"All Patients\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(advs_f$PARAM)) %>%\n count_abnormal(\n \"ANRIND\",\n abnormal = list(Low = c(\"LOW\", \"LOW LOW\"), High = c(\"HIGH\", \"HIGH HIGH\")),\n exclude_base_abn = FALSE\n ) %>%\n append_varlabels(advs_f, \"ANRIND\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = advs_f, alt_counts_df = adsl)\n\nresult\n\nAssessment A: Drug X B: Placebo C: Combination All Patients \n Abnormality (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————————\nDiastolic Blood Pressure \n Low 66/134 (49.3%) 86/134 (64.2%) 78/132 (59.1%) 230/400 (57.5%)\n High 88/134 (65.7%) 70/134 (52.2%) 76/132 (57.6%) 234/400 (58.5%)\nPulse Rate \n Low 58/134 (43.3%) 32/134 (23.9%) 48/132 (36.4%) 138/400 (34.5%)\n High 53/134 (39.6%) 49/134 (36.6%) 44/132 (33.3%) 146/400 (36.5%)\nRespiratory Rate \n Low 97/134 (72.4%) 84/134 (62.7%) 98/132 (74.2%) 279/400 (69.8%)\n High 96/134 (71.6%) 98/134 (73.1%) 98/132 (74.2%) 292/400 (73%) \nSystolic Blood Pressure \n Low 71/134 (53%) 77/134 (57.5%) 73/132 (55.3%) 221/400 (55.2%)\n High 78/134 (58.2%) 74/134 (55.2%) 73/132 (55.3%) 225/400 (56.2%)\nTemperature \n Low 108/134 (80.6%) 110/134 (82.1%) 108/132 (81.8%) 326/400 (81.5%)\n High 112/134 (83.6%) 106/134 (79.1%) 107/132 (81.1%) 325/400 (81.2%)\nWeight \n Low 43/134 (32.1%) 39/134 (29.1%) 39/132 (29.5%) 121/400 (30.2%)\n High 46/134 (34.3%) 43/134 (32.1%) 44/132 (33.3%) 133/400 (33.2%)\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ACTARM\") %>%\n add_overall_col(\"All Patients\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(advs_f$PARAM)) %>%\n count_abnormal(\n \"ANRIND\",\n abnormal = list(Low = c(\"LOW\", \"LOW LOW\"), High = c(\"HIGH\", \"HIGH HIGH\")),\n exclude_base_abn = TRUE\n ) %>%\n append_varlabels(advs_f, \"ANRIND\", indent = 1L)\n\nresult <- build_table(lyt = lyt, df = advs_f, alt_counts_df = adsl)\n\nresult\n\nAssessment A: Drug X B: Placebo C: Combination All Patients \n Abnormality (N=134) (N=134) (N=132) (N=400) \n—————————————————————————————————————————————————————————————————————————————————————————————\nDiastolic Blood Pressure \n Low 54/108 (50%) 76/116 (65.5%) 68/114 (59.6%) 198/338 (58.6%)\n High 74/114 (64.9%) 56/109 (51.4%) 62/106 (58.5%) 192/329 (58.4%)\nPulse Rate \n Low 53/121 (43.8%) 30/125 (24%) 42/119 (35.3%) 125/365 (34.2%)\n High 48/123 (39%) 45/116 (38.8%) 39/120 (32.5%) 132/359 (36.8%)\nRespiratory Rate \n Low 72/100 (72%) 72/110 (65.5%) 79/102 (77.5%) 223/312 (71.5%)\n High 77/107 (72%) 78/108 (72.2%) 79/109 (72.5%) 234/324 (72.2%)\nSystolic Blood Pressure \n Low 62/117 (53%) 63/114 (55.3%) 57/103 (55.3%) 182/334 (54.5%)\n High 64/110 (58.2%) 67/120 (55.8%) 68/115 (59.1%) 199/345 (57.7%)\nTemperature \n Low 77/96 (80.2%) 78/94 (83%) 74/90 (82.2%) 229/280 (81.8%)\n High 78/93 (83.9%) 73/92 (79.3%) 81/100 (81%) 232/285 (81.4%)\nWeight \n Low 42/129 (32.6%) 37/125 (29.6%) 37/123 (30.1%) 116/377 (30.8%)\n High 41/126 (32.5%) 41/124 (33.1%) 42/121 (34.7%) 124/371 (33.4%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADVS <- synthetic_cdisc_dataset(\"latest\", \"advs\") %>%\n mutate(ONTRTFL = ifelse(AVISIT %in% c(\"SCREENING\", \"BASELINE\"), \"\", \"Y\")) %>%\n col_relabel(ONTRTFL = \"On Treatment Record Flag\")\n})\ndatanames <- c(\"ADSL\", \"ADVS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADVS <- data[[\"ADVS\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_abnormality(\n label = \"Abnormality Table\",\n dataname = \"ADVS\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n choices = variable_choices(ADVS, subset = c(\"VSCAT\", \"PARAM\", \"AVISIT\")),\n selected = c(\"PARAM\"),\n keep_order = TRUE\n ),\n grade = choices_selected(\n choices = variable_choices(ADVS, subset = \"ANRIND\"),\n selected = \"ANRIND\",\n fixed = TRUE\n ),\n abnormal = list(Low = c(\"LOW\", \"LOW LOW\"), High = c(\"HIGH\", \"HIGH HIGH\")),\n exclude_base_abn = FALSE\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:52:13 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] codetools_0.2-19 ps_1.7.6 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Concomitant Medications", - "CML01" + "Tables", + "Vital Signs", + "VST02" ] }, { - "objectID": "listings/concomitant-medications/cml02b_gl.html", - "href": "listings/concomitant-medications/cml02b_gl.html", - "title": "CML02B_GL", + "objectID": "tables/deaths/dtht01.html", + "href": "tables/deaths/dtht01.html", + "title": "DTHT01", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadcm <- synthetic_cdisc_dataset(\"latest\", \"adcm\")\n\nout <- adcm %>%\n select(ATC1, ATC2, ATC3, ATC4, CMDECOD, CMTRT) %>%\n unique()\n\nvar_labels(out) <- c(\n ATC1 = \"ATC Class Level 1\",\n ATC2 = \"ATC Class Level 2\",\n ATC3 = \"ATC Class Level 3\",\n ATC4 = \"ATC Class Level 4\",\n CMDECOD = \"WHODrug Preferred Name\",\n CMTRT = \"Investigator-Specified\\nTreatment Term\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"ATC1\", \"ATC2\", \"ATC3\", \"ATC4\"),\n disp_cols = names(out),\n main_title = \"Listing of Concomitant Medication Class, Preferred Name, and Investigator-Specified Terms\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Concomitant Medication Class, Preferred Name, and Investigator-Specified Terms\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Investigator-Specified\nATC Class Level 1 ATC Class Level 2 ATC Class Level 3 ATC Class Level 4 WHODrug Preferred Name Treatment Term \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n ATCCLAS1 A ATCCLAS2 A ATCCLAS3 A ATCCLAS4 A medname A_2/3 A_2/3 \n medname A_3/3 A_3/3 \n medname A_1/3 A_1/3 \n ATCCLAS1 A p2 ATCCLAS2 A p2 ATCCLAS3 A p2 ATCCLAS4 A p2 medname A_3/3 A_3/3 \n ATCCLAS1 B ATCCLAS2 B ATCCLAS3 B ATCCLAS4 B medname B_1/4 B_1/4 \n medname B_4/4 B_4/4 \n medname B_2/4 B_2/4 \n medname B_3/4 B_3/4 \n ATCCLAS1 B p2 ATCCLAS2 B p2 ATCCLAS3 B p2 ATCCLAS4 B p2 medname B_1/4 B_1/4 \n medname B_2/4 B_2/4 \n ATCCLAS1 B p3 ATCCLAS2 B p3 ATCCLAS3 B p3 ATCCLAS4 B p3 medname B_1/4 B_1/4 \n medname B_2/4 B_2/4 \n ATCCLAS1 C ATCCLAS2 C ATCCLAS3 C ATCCLAS4 C medname C_1/2 C_1/2 \n medname C_2/2 C_2/2 \n ATCCLAS1 C p2 ATCCLAS2 C p2 ATCCLAS3 C p2 ATCCLAS4 C p2 medname C_1/2 C_1/2 \n medname C_2/2 C_2/2 \n ATCCLAS1 C p3 ATCCLAS2 C p3 ATCCLAS3 C p3 ATCCLAS4 C p3 medname C_2/2 C_2/2 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:02 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Selecting Sections to Display\nTable for Studies Collecting Death Information from Public Records\nTable Adding Details for “All other causes” Category for Studies Collecting Death Information from Public Records\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl) %>% filter(SAFFL == \"Y\")\n\n# Reorder the levels in \"DTHCAT\" to put Other category at the end.\nadsl$DTHCAT <- factor(adsl$DTHCAT, levels = c(\"ADVERSE EVENT\", \"PROGRESSIVE DISEASE\", \"OTHER\", \"<Missing>\"))\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", split_fun = add_overall_level(\"All Patients\", first = FALSE)) %>%\n count_values(\n \"DTHFL\",\n values = \"Y\",\n .labels = c(count_fraction = \"Total number of deaths\"),\n .formats = c(count_fraction = \"xx (xx.x%)\")\n ) %>%\n analyze_vars(vars = c(\"DTHCAT\"), var_labels = c(\"Primary Cause of Death\"))\n\nresult <- build_table(lyt, df = adsl)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————\nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \nPrimary Cause of Death \n n 25 23 22 70 \n ADVERSE EVENT 9 (36%) 7 (30.4%) 10 (45.5%) 26 (37.1%) \n PROGRESSIVE DISEASE 8 (32%) 6 (26.1%) 6 (27.3%) 20 (28.6%) \n OTHER 8 (32%) 10 (43.5%) 6 (27.3%) 24 (34.3%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", split_fun = add_overall_level(\"All Patients\", first = FALSE)) %>%\n count_values(\n \"DTHFL\",\n values = \"Y\",\n .labels = c(count_fraction = \"Total number of deaths\"),\n .formats = c(count_fraction = \"xx (xx.x%)\")\n ) %>%\n analyze_vars(vars = c(\"DTHCAT\"), var_labels = c(\"Primary Cause of Death\")) %>%\n split_rows_by(\"DTHCAT\", split_fun = keep_split_levels(\"OTHER\"), child_labels = \"hidden\") %>%\n analyze_vars(\n \"DTHCAUS\",\n .stats = \"count_fraction\",\n .indent_mods = c(\"count_fraction\" = 2L),\n show_labels = \"hidden\"\n ) %>%\n analyze_vars(\n vars = \"LDDTHGR1\",\n nested = FALSE,\n var_labels = \"Days from last drug administration\",\n show_labels = \"visible\"\n ) %>%\n split_rows_by(\n \"LDDTHGR1\",\n split_fun = remove_split_levels(\"<Missing>\"),\n split_label = \"Primary cause by days from last study drug administration\",\n label_pos = \"visible\"\n ) %>%\n analyze_vars(\"DTHCAT\")\n\nresult <- build_table(lyt, df = adsl) %>% prune_table()\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \nPrimary Cause of Death \n n 25 23 22 70 \n ADVERSE EVENT 9 (36%) 7 (30.4%) 10 (45.5%) 26 (37.1%) \n PROGRESSIVE DISEASE 8 (32%) 6 (26.1%) 6 (27.3%) 20 (28.6%) \n OTHER 8 (32%) 10 (43.5%) 6 (27.3%) 24 (34.3%) \n LOST TO FOLLOW UP 2 (25%) 2 (20%) 2 (33.3%) 6 (25%) \n MISSING 2 (25%) 3 (30%) 2 (33.3%) 7 (29.2%) \n Post-study reporting of death 1 (12.5%) 2 (20%) 1 (16.7%) 4 (16.7%) \n SUICIDE 2 (25%) 2 (20%) 1 (16.7%) 5 (20.8%) \n UNKNOWN 1 (12.5%) 1 (10%) 0 2 (8.3%) \nDays from last drug administration \n n 25 23 22 70 \n <=30 14 (56%) 11 (47.8%) 14 (63.6%) 39 (55.7%) \n >30 11 (44%) 12 (52.2%) 8 (36.4%) 31 (44.3%) \nPrimary cause by days from last study drug administration \n <=30 \n n 14 11 14 39 \n ADVERSE EVENT 4 (28.6%) 2 (18.2%) 6 (42.9%) 12 (30.8%) \n PROGRESSIVE DISEASE 6 (42.9%) 3 (27.3%) 4 (28.6%) 13 (33.3%) \n OTHER 4 (28.6%) 6 (54.5%) 4 (28.6%) 14 (35.9%) \n >30 \n n 11 12 8 31 \n ADVERSE EVENT 5 (45.5%) 5 (41.7%) 4 (50%) 14 (45.2%) \n PROGRESSIVE DISEASE 2 (18.2%) 3 (25%) 2 (25%) 7 (22.6%) \n OTHER 4 (36.4%) 4 (33.3%) 2 (25%) 10 (32.3%) \n\n\n\n\n\nCodedthcaus_levels <- levels(adsl[adsl$DTHCAT == \"OTHER\", ]$DTHCAUS)\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", split_fun = add_overall_level(\"All Patients\", first = FALSE)) %>%\n count_values(\n \"DTHFL\",\n values = \"Y\",\n .labels = c(count_fraction = \"Total number of deaths\"),\n .formats = c(count_fraction = \"xx (xx.x%)\")\n ) %>%\n analyze_vars(\n vars = c(\"DTHCAT\"),\n var_labels = c(\"Primary Cause of Death\"),\n table_names = \"primary_cause\"\n ) %>%\n split_rows_by(\n \"DTHCAT\",\n split_fun = keep_split_levels(\"OTHER\"),\n child_labels = \"hidden\"\n ) %>%\n count_values(\n \"DTHCAUS\",\n values = dthcaus_levels[5],\n .labels = c(count_fraction = \"Post-study reportings of death\"),\n .formats = c(count_fraction = \"xx (xx.x%)\"),\n .indent_mods = c(count_fraction = 2L),\n table_names = \"post_study_deaths\"\n ) %>%\n count_values(\n \"DTHCAUS\",\n values = dthcaus_levels[-5],\n .labels = c(count_fraction = \"All other causes\"),\n .formats = c(count_fraction = \"xx (xx.x%)\"),\n .indent_mods = c(count_fraction = 2L),\n table_names = \"all_other_causes\"\n )\n\nresult <- build_table(lyt, df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \nPrimary Cause of Death \n n 25 23 22 70 \n ADVERSE EVENT 9 (36%) 7 (30.4%) 10 (45.5%) 26 (37.1%) \n PROGRESSIVE DISEASE 8 (32%) 6 (26.1%) 6 (27.3%) 20 (28.6%) \n OTHER 8 (32%) 10 (43.5%) 6 (27.3%) 24 (34.3%) \n Post-study reportings of death 1 (12.5%) 2 (20.0%) 1 (16.7%) 4 (16.7%) \n All other causes 7 (87.5%) 8 (80.0%) 5 (83.3%) 20 (83.3%) \n\n\n\n\n\nCodedthcaus_levels <- levels(adsl[adsl$DTHCAT == \"OTHER\", ]$DTHCAUS)\n\n# create a helper variable DTHCAUS_other\nadsl <- adsl %>%\n mutate(\n DTHCAUS_other = factor(ifelse(\n DTHCAT == \"OTHER\" & DTHCAUS != \"Post-study reporting of death\", as.character(DTHCAUS), NA\n ), levels = c(\"LOST TO FOLLOW UP\", \"SUICIDE\", \"UNKNOWN\", \"MISSING\")) %>% explicit_na()\n )\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\", split_fun = add_overall_level(\"All Patients\", first = FALSE)) %>%\n count_values(\n \"DTHFL\",\n values = \"Y\",\n .labels = c(count_fraction = \"Total number of deaths\"),\n .formats = c(count_fraction = \"xx (xx.x%)\")\n ) %>%\n analyze_vars(\n vars = c(\"DTHCAT\"),\n var_labels = c(\"Primary Cause of Death\"),\n table_names = \"primary_cause\"\n ) %>%\n split_rows_by(\"DTHCAT\", split_fun = keep_split_levels(\"OTHER\"), child_labels = \"hidden\") %>%\n count_values(\n \"DTHCAUS\",\n values = dthcaus_levels[5],\n .labels = c(count_fraction = \"Post-study reportings of death\"),\n .formats = c(count_fraction = \"xx (xx.x%)\"),\n .indent_mods = c(count_fraction = 2L),\n table_names = \"post_study_deaths\"\n ) %>%\n count_values(\n \"DTHCAUS\",\n values = dthcaus_levels[-5],\n .labels = c(count_fraction = \"All other causes\"),\n .formats = c(count_fraction = \"xx (xx.x%)\"),\n .indent_mods = c(count_fraction = 2L),\n table_names = \"all_other_causes\"\n ) %>%\n analyze_vars(\n \"DTHCAUS_other\",\n .stats = \"count_fraction\",\n .indent_mods = c(\"count_fraction\" = 3L),\n show_labels = \"hidden\"\n )\n\nresult <- build_table(lyt, df = adsl)\n\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\n (N=134) (N=134) (N=132) (N=400) \n————————————————————————————————————————————————————————————————————————————————————————————\nTotal number of deaths 25 (18.7%) 23 (17.2%) 22 (16.7%) 70 (17.5%) \nPrimary Cause of Death \n n 25 23 22 70 \n ADVERSE EVENT 9 (36%) 7 (30.4%) 10 (45.5%) 26 (37.1%) \n PROGRESSIVE DISEASE 8 (32%) 6 (26.1%) 6 (27.3%) 20 (28.6%) \n OTHER 8 (32%) 10 (43.5%) 6 (27.3%) 24 (34.3%) \n Post-study reportings of death 1 (12.5%) 2 (20.0%) 1 (16.7%) 4 (16.7%) \n All other causes 7 (87.5%) 8 (80.0%) 5 (83.3%) 20 (83.3%) \n LOST TO FOLLOW UP 2 (28.6%) 2 (25%) 2 (40%) 6 (30%) \n SUICIDE 2 (28.6%) 2 (25%) 1 (20%) 5 (25%) \n UNKNOWN 1 (14.3%) 1 (12.5%) 0 2 (10%) \n MISSING 2 (28.6%) 3 (37.5%) 2 (40%) 7 (35%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:52:38 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Concomitant Medications", - "CML02B_GL" + "Tables", + "Deaths", + "DTHT01" ] }, { - "objectID": "listings/ADA/adal02.html", - "href": "listings/ADA/adal02.html", - "title": "ADAL02", + "objectID": "tables/lab-results/lbt07.html", + "href": "tables/lab-results/lbt07.html", + "title": "LBT07", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(rlistings)\nlibrary(scda)\n\nadab <- synthetic_cdisc_dataset(\"latest\", \"adab\") %>%\n filter(NFRLT %% 1 == 0 & NFRLT > 0)\n\ntrt <- \"A: Drug X\"\ndrug_a <- \"A: Drug X Antibody\"\ndrugcd <- unique(adab$PARAMCD[adab$PARAM == \"Antibody titer units\"])[1]\nmin_titer <- 1.10\n\nadab_x <- adab %>%\n filter(\n ARM == trt,\n PARCAT1 == drug_a,\n ADPBLPFL == \"Y\"\n ) %>%\n select(-PARAMCD, -AVALC, -AVALU, -ARRLT, -NRRLT) %>%\n unique() %>%\n tidyr::pivot_wider(\n names_from = PARAM,\n values_from = AVAL\n ) %>%\n filter(if_any(matches(\"Treatment Emergent - Positive\"), ~ .x == 1)) %>%\n # filter(`Treatment Emergent - Positive` == 1) %>%\n mutate(\n VISN = factor(paste0(\n VISIT, \"\\n(Day \",\n ifelse(\n NFRLT %% 1 == 0,\n NFRLT,\n as.character(format(round(NFRLT, 2), nsmall = 2))\n ),\n \")\"\n )),\n PTES = ifelse(\n ifelse(\"Treatment induced ADA\" %in% names(.), `Treatment induced ADA` == 1, FALSE),\n ifelse(\n \"Transient ADA\" %in% names(.) & `Transient ADA` == 1,\n \"Induced (Transient)\",\n \"Induced (Persistent)\"\n ),\n \"Enhanced\"\n )\n ) %>%\n mutate(\n AVAL = paste0(\n ifelse(\n ifelse(\"ADA interpreted per sample result\" %in% names(.), `ADA interpreted per sample result` == 0, FALSE),\n \"NEGATIVE\",\n ifelse(\n ifelse(\"Antibody titer units\" %in% names(.), !is.na(`Antibody titer units`), FALSE),\n ifelse(\n `Antibody titer units` < min_titer,\n paste0(\"<\", format(min_titer, nsmall = 2)),\n as.character(format(round(`Antibody titer units`, 2), nsmall = 2))\n ),\n \"---\"\n )\n ),\n ifelse(\n ifelse(\"NAB interpreted per sample result\" %in% names(.), `NAB interpreted per sample result` == 1, FALSE),\n \"*\",\n \"\"\n )\n )\n )\n\nout <- adab_x %>%\n select(USUBJID, VISN, AVAL, PTES) %>%\n tidyr::pivot_wider(\n names_from = VISN,\n values_from = AVAL\n ) %>%\n select(USUBJID, unique(adab_x$VISN[order(adab_x$NFRLT)]), PTES)\n\nvar_labels(out) <- names(out)\n\nout <- out %>%\n var_relabel(\n USUBJID = \"Subject ID\",\n PTES = \"Patient Treatment\\nEmergent ADA Status\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = \"USUBJID\",\n disp_cols = names(out),\n main_title = paste0(\n \"Listing of Anti-\", drugcd, \" Antibody Data for Treatment Emergent ADA Positive Patients, PK Population\",\n \"\\nProtocol: \", unique(adab$PARCAT1)[1]\n ),\n subtitles = paste(\"\\nTreatment Group:\", trt),\n \n main_footer = \"Minimum reportable titer = 1.10 (example only)\n--- = No sample evaluated\nADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies)\nNumber of patients positive for Treatment Emergent ADA = the number of post-baseline evaluable patients determined to have treatment-induced ADA or treatment-enhanced ADA during the study period.\nTreatment-induced ADA = a patient with negative or missing baseline ADA result(s) and at least one positive post-baseline ADA result.\nTreatment-enhanced ADA = a patient with positive ADA result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\nTransient ADA = ADA positive result detected (a) at only one post-baseline sampling timepoint (excluding last timepoint) OR (b) at 2 or more timepoints during treatment where the first and last ADA positive samples are separated by a period of < 16 weeks, irrespective of any negative samples in between.\nPersistent ADA = ADA positive result detected (a) at the last post-baseline sampling timepoint, OR (b) at 2 or more time points during treatment where the first and last ADA positive samples are separated by a period ≥ 16 weeks, irrespective of any negative samples in between.\nAsterisk denotes sample that tested positive for Neutralizing Antibodies.\"\n \n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Anti-R1800000 Antibody Data for Treatment Emergent ADA Positive Patients, PK Population\nProtocol: A: Drug X Antibody\n\nTreatment Group: A: Drug X\n\n—————————————————————————————————————————————————————\n Day 2 Patient Treatment \n Subject ID (Day 1) Emergent ADA Status\n—————————————————————————————————————————————————————\nAB12345-BRA-1-id-105 --- Enhanced \nAB12345-BRA-1-id-134 --- Enhanced \n AB12345-BRA-1-id-42 --- Enhanced \n AB12345-BRA-1-id-93 --- Enhanced \nAB12345-BRA-11-id-217 --- Enhanced \nAB12345-BRA-11-id-345 --- Enhanced \nAB12345-BRA-11-id-397 --- Enhanced \nAB12345-BRA-11-id-50 --- Enhanced \nAB12345-BRA-13-id-177 --- Enhanced \nAB12345-BRA-14-id-23 --- Enhanced \nAB12345-BRA-15-id-36 --- Enhanced \nAB12345-BRA-2-id-296 --- Enhanced \nAB12345-BRA-6-id-369 --- Enhanced \n AB12345-CAN-1-id-18 --- Enhanced \nAB12345-CAN-11-id-139 --- Enhanced \nAB12345-CAN-14-id-104 --- Enhanced \nAB12345-CHN-1-id-119 --- Enhanced \nAB12345-CHN-1-id-123 --- Enhanced \nAB12345-CHN-1-id-133 --- Enhanced \nAB12345-CHN-1-id-199 --- Enhanced \n—————————————————————————————————————————————————————\n\nMinimum reportable titer = 1.10 (example only)\n--- = No sample evaluated\nADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies)\nNumber of patients positive for Treatment Emergent ADA = the number of post-baseline evaluable patients determined to have treatment-induced ADA or treatment-enhanced ADA during the study period.\nTreatment-induced ADA = a patient with negative or missing baseline ADA result(s) and at least one positive post-baseline ADA result.\nTreatment-enhanced ADA = a patient with positive ADA result at baseline who has one or more post-baseline titer results that are at least 0.60 t.u. greater than the baseline titer result.\nTransient ADA = ADA positive result detected (a) at only one post-baseline sampling timepoint (excluding last timepoint) OR (b) at 2 or more timepoints during treatment where the first and last ADA positive samples are separated by a period of < 16 weeks, irrespective of any negative samples in between.\nPersistent ADA = ADA positive result detected (a) at the last post-baseline sampling timepoint, OR (b) at 2 or more time points during treatment where the first and last ADA positive samples are separated by a period ≥ 16 weeks, irrespective of any negative samples in between.\nAsterisk denotes sample that tested positive for Neutralizing Antibodies.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:09 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] scda_0.1.6.9017 rlistings_0.2.7.9011 tibble_3.2.1 \n[4] formatters_0.5.5.9016 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\nlibrary(forcats)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_labels <- var_labels(adlb)\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\n# Select worst post-baseline records.\nadlb_f <- adlb %>%\n filter(ATOXGR != \"<Missing>\") %>%\n filter(ONTRTFL == \"Y\") %>%\n filter(WGRLOFL == \"Y\" | WGRHIFL == \"Y\")\n\nvar_labels(adlb_f) <- adlb_labels\n\n# Derive GRADE_DIR and GRADE_ANL to use in layout from ATOXGR\nadlb_f <- adlb_f %>%\n mutate(\n GRADE_DIR = factor(\n case_when(\n ATOXGR %in% c(\"-1\", \"-2\", \"-3\", \"-4\") & .data$WGRLOFL == \"Y\" ~ \"LOW\",\n ATOXGR == \"0\" ~ \"ZERO\",\n ATOXGR %in% c(\"1\", \"2\", \"3\", \"4\") & .data$WGRHIFL == \"Y\" ~ \"HIGH\",\n TRUE ~ \"NONE\"\n ),\n levels = c(\"LOW\", \"ZERO\", \"HIGH\", \"NONE\")\n ),\n GRADE_ANL = forcats::fct_relevel(\n forcats::fct_recode(ATOXGR,\n `1` = \"-1\", `2` = \"-2\", `3` = \"-3\", `4` = \"-4\"\n ),\n c(\"0\", \"1\", \"2\", \"3\", \"4\")\n )\n ) %>%\n var_relabel(\n GRADE_DIR = \"Direction of Abnormality\",\n GRADE_ANL = \"Analysis Grade\"\n )\n\n# Construct analysis map\nmap <- expand.grid(\n PARAM = levels(adlb$PARAM),\n GRADE_DIR = c(\"LOW\", \"HIGH\"),\n GRADE_ANL = as.character(1:4),\n stringsAsFactors = FALSE\n) %>%\n arrange(PARAM, desc(GRADE_DIR), GRADE_ANL)\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n label_pos = \"topleft\",\n split_label = obj_label(adlb_f$PARAM)\n ) %>%\n summarize_num_patients(\n var = \"USUBJID\",\n required = \"ATOXGR\",\n .stats = \"unique_count\"\n ) %>%\n split_rows_by(\n \"GRADE_DIR\",\n label_pos = \"topleft\",\n split_label = obj_label(adlb_f$GRADE_DIR),\n split_fun = trim_levels_to_map(map)\n ) %>%\n count_abnormal_by_worst_grade(\n var = \"GRADE_ANL\",\n variables = list(id = \"USUBJID\", param = \"PARAM\", grade_dir = \"GRADE_DIR\"),\n .indent_mods = 4L\n ) %>%\n append_topleft(\" Highest NCI CTCAE Grade\")\n\nresult <- build_table(lyt = lyt, df = adlb_f, alt_counts_df = adsl)\nresult <- result %>% prune_table()\n\nresult\n\nParameter \n Direction of Abnormality A: Drug X B: Placebo C: Combination\n Highest NCI CTCAE Grade (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement (n) 134 134 132 \n LOW \n 1 15 (11.2%) 11 (8.2%) 15 (11.4%) \n 2 18 (13.4%) 24 (17.9%) 17 (12.9%) \n 3 16 (11.9%) 24 (17.9%) 16 (12.1%) \n 4 17 (12.7%) 10 (7.5%) 18 (13.6%) \n Any 66 (49.3%) 69 (51.5%) 66 (50%) \nC-Reactive Protein Measurement (n) 134 134 132 \n LOW \n 1 21 (15.7%) 22 (16.4%) 12 (9.1%) \n 2 24 (17.9%) 22 (16.4%) 18 (13.6%) \n 3 29 (21.6%) 21 (15.7%) 25 (18.9%) \n 4 10 (7.5%) 16 (11.9%) 22 (16.7%) \n Any 84 (62.7%) 81 (60.4%) 77 (58.3%) \n HIGH \n 1 20 (14.9%) 22 (16.4%) 22 (16.7%) \n 2 21 (15.7%) 15 (11.2%) 14 (10.6%) \n 3 25 (18.7%) 16 (11.9%) 20 (15.2%) \n 4 13 (9.7%) 20 (14.9%) 11 (8.3%) \n Any 79 (59%) 73 (54.5%) 67 (50.8%) \nImmunoglobulin A Measurement (n) 134 134 132 \n HIGH \n 1 19 (14.2%) 12 (9%) 18 (13.6%) \n 2 17 (12.7%) 24 (17.9%) 19 (14.4%) \n 3 21 (15.7%) 23 (17.2%) 23 (17.4%) \n 4 13 (9.7%) 13 (9.7%) 9 (6.8%) \n Any 70 (52.2%) 72 (53.7%) 69 (52.3%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n filter(!AVISIT %in% c(\"SCREENING\", \"BASELINE\"))\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_abnormality_by_worst_grade(\n label = \"Laboratory Test Results with Highest Grade Post-Baseline\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = c(\"ALT\", \"CRP\", \"IGA\")\n ),\n add_total = FALSE\n )\n ),\n filter = (\n teal_slices(\n teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"),\n teal_slice(\"ADLB\", \"ONTRTFL\", selected = \"Y\")\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:53:10 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 forcats_1.0.0 \n [9] dplyr_1.1.4 tern_0.9.3.9028 \n[11] rtables_0.6.6.9011 magrittr_2.0.3 \n[13] formatters_0.5.5.9018 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "ADA", - "ADAL02" + "Tables", + "Lab Results", + "LBT07" ] }, { - "objectID": "listings/disposition/dsl02.html", - "href": "listings/disposition/dsl02.html", - "title": "DSL02", + "objectID": "tables/lab-results/lbt12.html", + "href": "tables/lab-results/lbt12.html", + "title": "LBT12", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\nout <- adsl %>%\n filter(AEWITHFL == \"Y\") %>%\n mutate(\n ID = paste(SITEID, SUBJID, sep = \"/\"),\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n DISCONT = ifelse(!is.na(DCSREAS) & EOSSTT != \"COMPLETED\", \"Yes\", \"No\"),\n SSADTM = as.POSIXct(\n strftime(TRTSDTM, format = \"%Y-%m-%d %H:%M:%S\"),\n format = \"%Y-%m-%d\",\n tz = \"UTC\"\n ),\n SSAEDY = as.numeric(ceiling(difftime(EOSDT, SSADTM, units = \"days\"))),\n RANDEDY = as.numeric(ceiling(difftime(EOSDT, RANDDT, units = \"days\"))),\n ) %>%\n filter(DISCONT == \"Yes\") %>%\n select(ID, ASR, TRT01A, SSADTM, EOSDY, SSAEDY, RANDEDY, DCSREAS)\n\nvar_labels(out) <- c(\n ID = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n SSADTM = \"Date of First\\nStudy Drug\\nAdministration\",\n EOSDY = \"Day of Last\\nStudy Drug\\nAdministration\",\n SSAEDY = \"Day of Study\\nDiscontinuation\\nRelative to First\\nStudy Drug\\nAdministration\",\n RANDEDY = \"Day of Study\\nDiscontinuation\\nRelative to\\nRandomization\",\n DCSREAS = \"Reason for\\nDiscontinuation\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = \"TRT01A\",\n disp_cols = names(out),\n main_title = \"Listing of Patients Who Discontinued Early from Study\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Patients Who Discontinued Early from Study\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Day of Study \n Discontinuation Day of Study \n Date of First Day of Last Relative to First Discontinuation \n Study Drug Study Drug Study Drug Relative to Reason for \n Treatment Center/Patient ID Age/Sex/Race Administration Administration Administration Randomization Discontinuation \n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n A: Drug X CHN-1/id-62 36/F/WHITE 2020-11-22 455 454 455 DEATH \n B: Placebo CHN-9/id-11 28/F/NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER 2021-01-27 388 387 388 DEATH \nC: Combination USA-11/id-136 38/F/ASIAN 2019-10-02 865 864 868 DEATH \n USA-11/id-100 40/F/ASIAN 2020-03-10 705 705 707 LACK OF EFFICACY\n CHN-11/id-91 44/M/BLACK OR AFRICAN AMERICAN 2020-05-29 625 625 626 DEATH \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:16 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadhy <- synthetic_cdisc_dataset(\"latest\", \"adhy\")\n\nanl <- adhy\nanl$APERIODC <- as.factor(anl$APERIODC) # to ensure the table is built even if there is no patients after filtering\nanl$ACTARM <- as.factor(anl$ACTARM) # to ensure the table is built even if there is no patients after filtering\n\nanl <- anl %>%\n filter(\n SAFFL == \"Y\",\n PARAMCD %in% c(\"ASTPULN\", \"ALTPULN\", \"ALTASTPU\") & AVISIT == \"POST-BASELINE\"\n ) %>%\n mutate(\n ARM_AVALC = factor(\n case_when(\n AVALC == \"Y\" ~ as.character(ACTARM),\n TRUE ~ \"Criteria not met\"\n ),\n levels = c(levels(anl$ACTARM), \"Criteria not met\")\n ),\n PARAM = factor(\n case_when(\n PARAMCD == \"ASTPULN\" ~ \"AST >3x ULN\",\n PARAMCD == \"ALTPULN\" ~ \"ALT >3x ULN\",\n PARAMCD == \"ALTASTPU\" ~ \"AST >3x ULN or ALT >x3 ULN\"\n ),\n levels = c(\"AST >3x ULN\", \"ALT >3x ULN\", \"AST >3x ULN or ALT >x3 ULN\")\n ),\n TITLE = factor(\"First Elevated Result Occurring During\")\n )\n\nanl <- df_explicit_na(anl)\n\n\n\n\n\nCoderesult <- basic_table() %>%\n split_cols_by(\"TITLE\") %>%\n split_cols_by(\"APERIODC\") %>%\n split_rows_by(\"PARAM\") %>%\n split_rows_by(\"ACTARM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\"ARM_AVALC\", .stats = \"fraction\", denom = \"n\", drop = TRUE) %>%\n build_table(anl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n dplyr::if_else(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- result %>% trim_rows(criteria = criteria_fun)\nresult\n\n First Elevated Result Occurring During \n PERIOD 1 PERIOD 2 \n——————————————————————————————————————————————————————————————————————\nAST >3x ULN \n A: Drug X 11/134 (8.2%) 21/134 (15.7%) \n B: Placebo 17/134 (12.7%) 16/134 (11.9%) \n C: Combination 10/132 (7.6%) 8/132 (6.1%) \nALT >3x ULN \n A: Drug X 14/134 (10.4%) 8/134 (6.0%) \n B: Placebo 24/134 (17.9%) 18/134 (13.4%) \n C: Combination 16/132 (12.1%) 10/132 (7.6%) \nAST >3x ULN or ALT >x3 ULN \n A: Drug X 14/134 (10.4%) 15/134 (11.2%) \n B: Placebo 8/134 (6.0%) 13/134 (9.7%) \n C: Combination 11/132 (8.3%) 12/132 (9.1%) \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:53:23 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Disposition", - "DSL02" + "Tables", + "Lab Results", + "LBT12" ] }, { - "objectID": "listings/adverse-events/ael04.html", - "href": "listings/adverse-events/ael04.html", - "title": "AEL04", + "objectID": "tables/lab-results/lbt08.html", + "href": "tables/lab-results/lbt08.html", + "title": "LBT08", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\nout <- adsl %>%\n filter(!is.na(DTHADY)) %>%\n mutate(\n ID = paste(SITEID, SUBJID, sep = \"/\"),\n AGSXRC = paste(AGE, SEX, RACE, sep = \"/\"),\n TRTSD = toupper(format(as.Date(TRTSDTM), \"%d%b%Y\"))\n ) %>%\n arrange(SUBJID) %>%\n select(ID, AGSXRC, TRT01A, TRTSD, EOSDY, DTHADY, DTHCAUS, ADTHAUT)\n\nvar_labels(out) <- c(\n ID = \"Center/Patient ID\",\n AGSXRC = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n TRTSD = \"Date of First\\nStudy Drug\\nAdministration\",\n EOSDY = \"Day of Last\\nStudy Drug\\nAdministration\",\n DTHADY = \"Day of\\nDeath\",\n DTHCAUS = \"Cause of Death\",\n ADTHAUT = \"Autopsy\\nPerformed?\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"ID\"),\n disp_cols = names(out),\n main_title = \"Listing of Patient Deaths\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Patient Deaths\n\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of First Day of Last \n Study Drug Study Drug Day of Autopsy \nTreatment Center/Patient ID Age/Sex/Race Administration Administration Death Cause of Death Performed?\n——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE 04NOV2020 473 496 ADVERSE EVENT Yes \n BRA-1/id-93 34/F/ASIAN 20JUN2020 610 657 ADVERSE EVENT Yes \n BRA-11/id-217 43/M/ASIAN 28SEP2019 871 893 ADVERSE EVENT Yes \n BRA-15/id-36 38/F/ASIAN 08JAN2020 767 812 DISEASE PROGRESSION Yes \n CAN-11/id-139 31/M/ASIAN 15SEP2020 519 563 ADVERSE EVENT Yes \n CHN-1/id-123 27/F/ASIAN 28JAN2020 750 750 DISEASE PROGRESSION Yes \n CHN-1/id-199 27/M/BLACK OR AFRICAN AMERICAN 08JAN2020 773 779 DISEASE PROGRESSION Yes \n CHN-1/id-235 39/M/ASIAN 13JUL2019 950 968 ADVERSE EVENT Yes \n CHN-1/id-62 36/F/WHITE 22NOV2020 455 497 ADVERSE EVENT Yes \n CHN-12/id-258 45/M/WHITE 01MAR2020 721 756 SUICIDE No \n CHN-15/id-14 38/F/BLACK OR AFRICAN AMERICAN 29SEP2019 871 919 DISEASE PROGRESSION Yes \n CHN-17/id-182 37/M/BLACK OR AFRICAN AMERICAN 18SEP2019 879 902 LOST TO FOLLOW UP NA \n CHN-17/id-92 29/M/ASIAN 01MAR2020 720 721 LOST TO FOLLOW UP NA \n CHN-2/id-22 29/M/ASIAN 15JAN2021 393 409 MISSING NA \n CHN-2/id-223 29/F/ASIAN 18NOV2020 453 468 DISEASE PROGRESSION Yes \n CHN-2/id-272 41/F/ASIAN 11JAN2020 768 773 DISEASE PROGRESSION Yes \n CHN-2/id-274 40/F/ASIAN 14OCT2019 860 890 SUICIDE No \n CHN-3/id-128 32/M/ASIAN 24FEB2019 1084 1105 ADVERSE EVENT Yes \n CHN-5/id-108 28/F/BLACK OR AFRICAN AMERICAN 11SEP2019 886 935 MISSING NA \n CHN-6/id-30 29/M/ASIAN 24AUG2020 539 578 Post-study reporting of death No \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:23 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb <- adlb %>%\n mutate(\n GRADDR = case_when(\n PARAMCD == \"ALT\" ~ \"L\",\n PARAMCD == \"CRP\" ~ \"B\",\n PARAMCD == \"IGA\" ~ \"H\"\n )\n ) %>%\n filter(SAFFL == \"Y\" & ONTRTFL == \"Y\" & GRADDR != \"\")\n\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\ndf <- h_adlb_worsen(\n adlb,\n worst_flag_low = c(\"WGRLOFL\" = \"Y\"),\n worst_flag_high = c(\"WGRHIFL\" = \"Y\"),\n direction_var = \"GRADDR\"\n)\n\nattributes(df$GRADDR) <- list(\"label\" = \"Direction of Abnormality\")\n\n\n\n\nNote: The direction of the shift table for each lab test is based on metadata and NCI CTCAE specifications. In addition, the worst laboratory flags must be selected appropriately to match the direction of abnormality. For example, if any lab requires a shift table for both directions, then both worst_flag_low and worst_flag_high must be specified in h_adlb_worsen. If all labs requires a shift table for only one direction, then the matching worst lab flag variable must be selected in h_adlb_worsen.\n\nCoderesult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARMCD\") %>%\n split_rows_by(\"PARAMCD\", label_pos = \"topleft\", split_label = obj_label(df$PARAMCD)) %>%\n split_rows_by(\"GRADDR\", label_pos = \"topleft\", split_label = obj_label(df$GRADDR)) %>%\n count_abnormal_lab_worsen_by_baseline(\n var = \"ATOXGR\",\n variables = list(\n id = \"USUBJID\",\n baseline_var = \"BTOXGR\",\n direction_var = \"GRADDR\"\n )\n ) %>%\n append_topleft(\" Highest NCI CTCAE Grade\") %>%\n build_table(df = df, alt_counts_df = adsl)\n\nresult\n\nParameter Code \n Direction of Abnormality ARM A ARM B ARM C \n Highest NCI CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————\nALT \n Low \n 1 11/113 (9.7%) 9/117 (7.7%) 15/123 (12.2%)\n 2 15/119 (12.6%) 23/123 (18.7%) 16/127 (12.6%)\n 3 15/127 (11.8%) 22/128 (17.2%) 14/128 (10.9%)\n 4 17/130 (13.1%) 10/131 (7.6%) 18/130 (13.8%)\n Any 58/130 (44.6%) 64/131 (48.9%) 63/130 (48.5%)\nCRP \n High \n 1 18/114 (15.8%) 18/112 (16.1%) 19/115 (16.5%)\n 2 20/122 (16.4%) 13/122 (10.7%) 14/122 (11.5%)\n 3 23/124 (18.5%) 14/128 (10.9%) 20/129 (15.5%)\n 4 12/131 (9.2%) 20/132 (15.2%) 11/132 (8.3%) \n Any 73/131 (55.7%) 65/132 (49.2%) 64/132 (48.5%)\n Low \n 1 20/119 (16.8%) 18/113 (15.9%) 11/112 (9.8%) \n 2 24/122 (19.7%) 21/118 (17.8%) 17/121 (14%) \n 3 26/127 (20.5%) 20/127 (15.7%) 22/123 (17.9%)\n 4 10/131 (7.6%) 16/132 (12.1%) 21/130 (16.2%)\n Any 80/131 (61.1%) 75/132 (56.8%) 71/130 (54.6%)\nIGA \n High \n 1 18/119 (15.1%) 11/116 (9.5%) 15/113 (13.3%)\n 2 15/124 (12.1%) 23/120 (19.2%) 19/115 (16.5%)\n 3 21/128 (16.4%) 21/124 (16.9%) 20/120 (16.7%)\n 4 12/132 (9.1%) 12/129 (9.3%) 9/131 (6.9%) \n Any 66/132 (50%) 67/129 (51.9%) 63/131 (48.1%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:53:45 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Adverse Events", - "AEL04" + "Tables", + "Lab Results", + "LBT08" ] }, { - "objectID": "listings/adverse-events/ael02.html", - "href": "listings/adverse-events/ael02.html", - "title": "AEL02", + "objectID": "tables/lab-results/lbt09.html", + "href": "tables/lab-results/lbt09.html", + "title": "LBT09", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nout <- adae %>%\n mutate(\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n Date_First = toupper(format(as.Date(TRTSDTM), \"%d%b%Y\")),\n Duration = AENDY - ASTDY + 1,\n Serious = ifelse(AESER == \"Y\", \"Yes\", ifelse(AESER == \"N\", \"No\", \"\")),\n Related = ifelse(AEREL == \"Y\", \"Yes\", ifelse(AEREL == \"N\", \"No\", \"\")),\n Outcome = case_when(\n AEOUT == \"FATAL\" ~ 1,\n AEOUT == \"NOT RECOVERED/NOT RESOLVED\" ~ 2,\n AEOUT == \"RECOVERED/RESOLVED\" ~ 3,\n AEOUT == \"RECOVERED/RESOLVED WITH SEQUELAE\" ~ 4,\n AEOUT == \"RECOVERING/RESOLVING\" ~ 5,\n AEOUT == \"UNKNOWN\" ~ 6\n ),\n Treated = ifelse(AECONTRT == \"Y\", \"Yes\", ifelse(AECONTRT == \"N\", \"No\", \"\")),\n Action = case_when(\n AEACN == \"DOSE INCREASED\" ~ 1,\n AEACN == \"DOSE NOT CHANGED\" ~ 2,\n AEACN == \"DOSE REDUCED\" | AEACN == \"DOSE RATE REDUCED\" ~ 3,\n AEACN == \"DRUG INTERRUPTED\" ~ 4,\n AEACN == \"DRUG WITHDRAWN\" ~ 5,\n AEACN == \"NOT APPLICABLE\" | AEACN == \"NOT EVALUABLE\" ~ 6,\n AEACN == \"UNKNOWN\" ~ 7\n )\n ) %>%\n select(CPID, ASR, TRT01A, AEDECOD, Date_First, ASTDY, Duration, Serious, AESEV, Related, Outcome, Treated, Action)\n\nvar_labels(out) <- c(\n CPID = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n AEDECOD = \"Adverse\\nEvent MedDRA\\nPreferred Term\",\n Date_First = \"Date of\\nFirst Study\\nDrug\\nAdministration\",\n ASTDY = \"Study\\nDay of\\nOnset\",\n Duration = \"AE\\nDuration\\nin Days\",\n Serious = \"Serious\",\n AESEV = \"Most\\nExtreme\\nIntensity\",\n Related = \"Caused by\\nStudy\\nDrug\",\n Outcome = \"Outcome\\n(1)\",\n Treated = \"Treatment\\nfor AE\",\n Action = \"Action\\nTaken\\n(2)\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CPID\", \"ASR\"),\n disp_cols = names(out),\n main_title = \"Listing of Adverse Events\",\n main_footer = \"\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Adverse Events\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of \n Adverse First Study Study AE Most Caused by Action\n Event MedDRA Drug Day of Duration Extreme Study Outcome Treatment Taken \nTreatment Center/Patient ID Age/Sex/Race Preferred Term Administration Onset in Days Serious Intensity Drug (1) for AE (2) \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE dcd B.2.1.2.1 04NOV2020 162 173 No MODERATE No 5 Yes 2 \n dcd D.1.1.4.2 04NOV2020 196 166 No MODERATE No 5 No 2 \n dcd A.1.1.1.2 04NOV2020 321 149 Yes MODERATE No 5 Yes 2 \n dcd A.1.1.1.2 04NOV2020 393 43 Yes MODERATE No 5 No 5 \n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN dcd C.2.1.2.1 01JAN2020 39 506 No MODERATE Yes 2 No 6 \n dcd D.1.1.1.1 01JAN2020 64 630 Yes SEVERE Yes 1 No 6 \n dcd C.2.1.2.1 01JAN2020 95 306 No MODERATE Yes 5 No 2 \n dcd A.1.1.1.2 01JAN2020 160 259 Yes MODERATE No 2 Yes 2 \n dcd B.2.2.3.1 01JAN2020 292 50 Yes MILD No 3 No 2 \n dcd A.1.1.1.2 01JAN2020 459 195 Yes MODERATE No 5 Yes 2 \n dcd B.1.1.1.1 01JAN2020 470 131 Yes SEVERE Yes 1 No 6 \n dcd A.1.1.1.2 01JAN2020 475 113 Yes MODERATE No 4 Yes 2 \n dcd C.1.1.1.3 01JAN2020 496 162 No SEVERE Yes 5 Yes 2 \n dcd B.1.1.1.1 01JAN2020 641 15 Yes SEVERE Yes 1 Yes 6 \n BRA-1/id-93 34/F/ASIAN dcd D.1.1.4.2 20JUN2020 44 47 No MODERATE No 5 Yes 2 \n dcd D.2.1.5.3 20JUN2020 79 300 No MILD Yes 5 No 3 \n dcd A.1.1.1.1 20JUN2020 136 78 No MILD No 3 Yes 2 \n dcd D.2.1.5.3 20JUN2020 260 305 No MILD Yes 5 No 2 \n dcd C.1.1.1.3 20JUN2020 281 106 No SEVERE Yes 5 Yes 2 \n dcd D.1.1.1.1 20JUN2020 316 250 Yes SEVERE Yes 1 No 6 \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\n\n(1) Outcome: 1 = fatal; 2 = not recovered/not resolved; 3 = recovered/resolved;\n 4 = recovered/resolved with sequelae; 5 = recovering/resolving; 6 = unknown.\n(2) Action taken with study drug: 1 = dose increased; 2 = dose not changed;\n 3 = dose reduced; 4 = drug interrupted; 5 = drug withdrawn; 6 = not applicable;\n 7 = unknown.\n* Study day derived from imputed onset date.\n** Duration derived from imputed onset date and/or end date.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:30 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Selecting Sections\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadhy <- synthetic_cdisc_dataset(\"latest\", \"adhy\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadhy_liver <- df_explicit_na(adhy)\n\n# Define values of interest in PARAMCD variable.\nparamcd_tbili_alt <- c(\"BLAL\", \"BGAL\", \"BA2AL\", \"BA5AL\")\nparamcd_tbili_ast <- c(\"BLAS\", \"BGAS\", \"BA2AS\", \"BA5AS\")\n\n# Select LBT09 parameters.\nadhy_liver <- adhy_liver %>%\n filter(\n SAFFL == \"Y\",\n AVISIT %in% c(\"BASELINE\", \"POST-BASELINE\"),\n PARAMCD %in% c(paramcd_tbili_alt, paramcd_tbili_ast)\n )\n\n# Let's be explicit about factor levels for AVISIT and PARAMCD.\nadhy_liver <- adhy_liver %>%\n mutate(\n AVISIT = factor(AVISIT, levels = c(\"BASELINE\", \"POST-BASELINE\")),\n PARAMCD = factor(PARAMCD, levels = c(paramcd_tbili_alt, paramcd_tbili_ast))\n )\n\n# Create indicator and category variables.\nadhy_liver <- adhy_liver %>%\n mutate(\n # Create TBILI_CAT categories variable - this is needed so we get the right nesting in the table.\n TBILI_CAT = factor(\n case_when(\n PARAMCD %in% c(paramcd_tbili_alt[1], paramcd_tbili_ast[1]) ~ \"Total Bilirubin <= 2xULN\",\n PARAMCD %in% c(paramcd_tbili_alt[2], paramcd_tbili_ast[2]) ~ \"Total Bilirubin > 2xULN\",\n PARAMCD %in% c(paramcd_tbili_alt[3], paramcd_tbili_ast[3]) ~\n \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN\",\n PARAMCD %in% c(paramcd_tbili_alt[4], paramcd_tbili_ast[4]) ~\n \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN\"\n ),\n levels = c(\n \"Total Bilirubin <= 2xULN\",\n \"Total Bilirubin > 2xULN\",\n \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN\",\n \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN\"\n )\n ),\n # Create ALTAST_CAT categories variable\n # this will be the labels for different ALT/AST categories displayed in the table.\n ALTAST_CAT = factor(\n case_when(\n PARAMCD %in% paramcd_tbili_alt & AVALC == \">3-5ULN\" ~ \"ALT >3 - <= 5xULN\",\n PARAMCD %in% paramcd_tbili_alt & AVALC == \">5-10ULN\" ~ \"ALT >5 - <= 10xULN\",\n PARAMCD %in% paramcd_tbili_alt & AVALC == \">10-20ULN\" ~ \"ALT >10 - <= 20xULN\",\n PARAMCD %in% paramcd_tbili_alt & AVALC == \">20ULN\" ~ \"ALT > 20xULN\",\n PARAMCD %in% paramcd_tbili_ast & AVALC == \">3-5ULN\" ~ \"AST >3 - <= 5xULN\",\n PARAMCD %in% paramcd_tbili_ast & AVALC == \">5-10ULN\" ~ \"AST >5 - <= 10xULN\",\n PARAMCD %in% paramcd_tbili_ast & AVALC == \">10-20ULN\" ~ \"AST >10 - <= 20xULN\",\n PARAMCD %in% paramcd_tbili_ast & AVALC == \">20ULN\" ~ \"AST > 20xULN\",\n TRUE ~ \"Criteria not met\"\n ),\n levels = c(\n \"ALT >3 - <= 5xULN\", \"ALT >5 - <= 10xULN\", \"ALT >10 - <= 20xULN\",\n \"20\" = \"ALT > 20xULN\",\n \"AST >3 - <= 5xULN\", \"AST >5 - <= 10xULN\", \"AST >10 - <= 20xULN\", \"AST > 20xULN\",\n \"Criteria not met\"\n )\n ),\n ALTAST_ind = factor(\n case_when(\n PARAMCD %in% paramcd_tbili_alt ~ \"ALT\",\n PARAMCD %in% paramcd_tbili_ast ~ \"AST\"\n ),\n levels = c(\"ALT\", \"AST\")\n )\n )\n\nmap <- data.frame(\n ALTAST_ind = c(rep(\"ALT\", 5), rep(\"AST\", 5)),\n ALTAST_CAT = c(\n \"ALT >3 - <= 5xULN\", \"ALT >5 - <= 10xULN\", \"ALT >10 - <= 20xULN\",\n \"20\" = \"ALT > 20xULN\", \"Criteria not met\",\n \"AST >3 - <= 5xULN\", \"AST >5 - <= 10xULN\", \"AST >10 - <= 20xULN\", \"AST > 20xULN\", \"Criteria not met\"\n ),\n stringsAsFactors = FALSE\n)\n\n\n\n\n\nCoderesult <- basic_table() %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"AVISIT\") %>%\n split_rows_by(\"TBILI_CAT\") %>%\n # below split helps us get the right denominator between ALT/AST but it can be hidden\n split_rows_by(\"ALTAST_ind\", split_fun = trim_levels_to_map(map), child_labels = \"hidden\") %>%\n count_occurrences(\n vars = \"ALTAST_CAT\",\n .stats = \"fraction\",\n denom = \"n\",\n drop = FALSE\n ) %>%\n append_topleft(\"Liver Laboratory Test Criterion\") %>%\n build_table(df = adhy_liver)\n\n# trim away rows with criteria not met\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- result %>% trim_rows(criteria = criteria_fun)\nresult\n\n A: Drug X B: Placebo C: Combination \nLiver Laboratory Test Criterion BASELINE POST-BASELINE BASELINE POST-BASELINE BASELINE POST-BASELINE \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3 - <= 5xULN 23/134 (17.2%) 15/134 (11.2%) 25/134 (18.7%) 27/134 (20.1%) 27/132 (20.5%) 30/132 (22.7%)\n ALT >5 - <= 10xULN 28/134 (20.9%) 29/134 (21.6%) 29/134 (21.6%) 19/134 (14.2%) 36/132 (27.3%) 29/132 (22.0%)\n ALT >10 - <= 20xULN 24/134 (17.9%) 30/134 (22.4%) 32/134 (23.9%) 33/134 (24.6%) 28/132 (21.2%) 24/132 (18.2%)\n ALT > 20xULN 32/134 (23.9%) 35/134 (26.1%) 24/134 (17.9%) 23/134 (17.2%) 20/132 (15.2%) 26/132 (19.7%)\n AST >3 - <= 5xULN 31/134 (23.1%) 34/134 (25.4%) 30/134 (22.4%) 26/134 (19.4%) 34/132 (25.8%) 24/132 (18.2%)\n AST >5 - <= 10xULN 25/134 (18.7%) 25/134 (18.7%) 26/134 (19.4%) 26/134 (19.4%) 22/132 (16.7%) 27/132 (20.5%)\n AST >10 - <= 20xULN 22/134 (16.4%) 29/134 (21.6%) 16/134 (11.9%) 22/134 (16.4%) 34/132 (25.8%) 19/132 (14.4%)\n AST > 20xULN 20/134 (14.9%) 16/134 (11.9%) 28/134 (20.9%) 31/134 (23.1%) 21/132 (15.9%) 39/132 (29.5%)\nTotal Bilirubin > 2xULN \n ALT >3 - <= 5xULN 40/134 (29.9%) 28/134 (20.9%) 31/134 (23.1%) 28/134 (20.9%) 18/132 (13.6%) 32/132 (24.2%)\n ALT >5 - <= 10xULN 24/134 (17.9%) 29/134 (21.6%) 30/134 (22.4%) 37/134 (27.6%) 33/132 (25.0%) 24/132 (18.2%)\n ALT >10 - <= 20xULN 24/134 (17.9%) 22/134 (16.4%) 26/134 (19.4%) 18/134 (13.4%) 21/132 (15.9%) 30/132 (22.7%)\n ALT > 20xULN 19/134 (14.2%) 33/134 (24.6%) 23/134 (17.2%) 19/134 (14.2%) 30/132 (22.7%) 22/132 (16.7%)\n AST >3 - <= 5xULN 17/134 (12.7%) 27/134 (20.1%) 36/134 (26.9%) 25/134 (18.7%) 26/132 (19.7%) 34/132 (25.8%)\n AST >5 - <= 10xULN 25/134 (18.7%) 28/134 (20.9%) 24/134 (17.9%) 28/134 (20.9%) 20/132 (15.2%) 23/132 (17.4%)\n AST >10 - <= 20xULN 36/134 (26.9%) 28/134 (20.9%) 16/134 (11.9%) 26/134 (19.4%) 33/132 (25.0%) 26/132 (19.7%)\n AST > 20xULN 30/134 (22.4%) 21/134 (15.7%) 30/134 (22.4%) 24/134 (17.9%) 24/132 (18.2%) 25/132 (18.9%)\nTotal Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN \n ALT >3 - <= 5xULN 24/134 (17.9%) 22/134 (16.4%) 28/134 (20.9%) 23/134 (17.2%) 38/132 (28.8%) 23/132 (17.4%)\n ALT >5 - <= 10xULN 26/134 (19.4%) 25/134 (18.7%) 19/134 (14.2%) 22/134 (16.4%) 32/132 (24.2%) 32/132 (24.2%)\n ALT >10 - <= 20xULN 26/134 (19.4%) 30/134 (22.4%) 31/134 (23.1%) 30/134 (22.4%) 21/132 (15.9%) 27/132 (20.5%)\n ALT > 20xULN 30/134 (22.4%) 28/134 (20.9%) 24/134 (17.9%) 36/134 (26.9%) 20/132 (15.2%) 23/132 (17.4%)\n AST >3 - <= 5xULN 37/134 (27.6%) 25/134 (18.7%) 31/134 (23.1%) 26/134 (19.4%) 24/132 (18.2%) 36/132 (27.3%)\n AST >5 - <= 10xULN 25/134 (18.7%) 32/134 (23.9%) 29/134 (21.6%) 30/134 (22.4%) 26/132 (19.7%) 24/132 (18.2%)\n AST >10 - <= 20xULN 25/134 (18.7%) 31/134 (23.1%) 28/134 (20.9%) 22/134 (16.4%) 29/132 (22.0%) 23/132 (17.4%)\n AST > 20xULN 26/134 (19.4%) 25/134 (18.7%) 23/134 (17.2%) 30/134 (22.4%) 23/132 (17.4%) 24/132 (18.2%)\nTotal Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN \n ALT >3 - <= 5xULN 24/134 (17.9%) 21/134 (15.7%) 30/134 (22.4%) 17/134 (12.7%) 28/132 (21.2%) 31/132 (23.5%)\n ALT >5 - <= 10xULN 36/134 (26.9%) 28/134 (20.9%) 25/134 (18.7%) 27/134 (20.1%) 26/132 (19.7%) 29/132 (22.0%)\n ALT >10 - <= 20xULN 30/134 (22.4%) 21/134 (15.7%) 28/134 (20.9%) 36/134 (26.9%) 25/132 (18.9%) 24/132 (18.2%)\n ALT > 20xULN 14/134 (10.4%) 28/134 (20.9%) 25/134 (18.7%) 27/134 (20.1%) 31/132 (23.5%) 23/132 (17.4%)\n AST >3 - <= 5xULN 21/134 (15.7%) 26/134 (19.4%) 29/134 (21.6%) 31/134 (23.1%) 33/132 (25.0%) 19/132 (14.4%)\n AST >5 - <= 10xULN 29/134 (21.6%) 26/134 (19.4%) 24/134 (17.9%) 26/134 (19.4%) 23/132 (17.4%) 32/132 (24.2%)\n AST >10 - <= 20xULN 29/134 (21.6%) 31/134 (23.1%) 28/134 (20.9%) 22/134 (16.4%) 22/132 (16.7%) 21/132 (15.9%)\n AST > 20xULN 34/134 (25.4%) 21/134 (15.7%) 19/134 (14.2%) 28/134 (20.9%) 21/132 (15.9%) 33/132 (25.0%)\n\n\n\n\n\nCoderesult <- basic_table() %>%\n split_cols_by(\"ARM\") %>%\n split_cols_by(\"AVISIT\") %>%\n split_rows_by(\n \"TBILI_CAT\",\n split_fun = remove_split_levels(\"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN\")\n ) %>%\n # below split helps us get the right denominator between ALT/AST but it can be hidden\n split_rows_by(\n \"ALTAST_ind\",\n split_fun = trim_levels_to_map(map), child_labels = \"hidden\"\n ) %>%\n count_occurrences(\n vars = \"ALTAST_CAT\",\n .stats = \"fraction\",\n denom = \"n\",\n drop = FALSE\n ) %>%\n append_topleft(\"Liver Laboratory Test Criterion\") %>%\n build_table(df = adhy_liver)\n\n# trim away rows with criteria not met\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- result %>% trim_rows(criteria = criteria_fun)\nresult\n\n A: Drug X B: Placebo C: Combination \nLiver Laboratory Test Criterion BASELINE POST-BASELINE BASELINE POST-BASELINE BASELINE POST-BASELINE \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3 - <= 5xULN 23/134 (17.2%) 15/134 (11.2%) 25/134 (18.7%) 27/134 (20.1%) 27/132 (20.5%) 30/132 (22.7%)\n ALT >5 - <= 10xULN 28/134 (20.9%) 29/134 (21.6%) 29/134 (21.6%) 19/134 (14.2%) 36/132 (27.3%) 29/132 (22.0%)\n ALT >10 - <= 20xULN 24/134 (17.9%) 30/134 (22.4%) 32/134 (23.9%) 33/134 (24.6%) 28/132 (21.2%) 24/132 (18.2%)\n ALT > 20xULN 32/134 (23.9%) 35/134 (26.1%) 24/134 (17.9%) 23/134 (17.2%) 20/132 (15.2%) 26/132 (19.7%)\n AST >3 - <= 5xULN 31/134 (23.1%) 34/134 (25.4%) 30/134 (22.4%) 26/134 (19.4%) 34/132 (25.8%) 24/132 (18.2%)\n AST >5 - <= 10xULN 25/134 (18.7%) 25/134 (18.7%) 26/134 (19.4%) 26/134 (19.4%) 22/132 (16.7%) 27/132 (20.5%)\n AST >10 - <= 20xULN 22/134 (16.4%) 29/134 (21.6%) 16/134 (11.9%) 22/134 (16.4%) 34/132 (25.8%) 19/132 (14.4%)\n AST > 20xULN 20/134 (14.9%) 16/134 (11.9%) 28/134 (20.9%) 31/134 (23.1%) 21/132 (15.9%) 39/132 (29.5%)\nTotal Bilirubin > 2xULN \n ALT >3 - <= 5xULN 40/134 (29.9%) 28/134 (20.9%) 31/134 (23.1%) 28/134 (20.9%) 18/132 (13.6%) 32/132 (24.2%)\n ALT >5 - <= 10xULN 24/134 (17.9%) 29/134 (21.6%) 30/134 (22.4%) 37/134 (27.6%) 33/132 (25.0%) 24/132 (18.2%)\n ALT >10 - <= 20xULN 24/134 (17.9%) 22/134 (16.4%) 26/134 (19.4%) 18/134 (13.4%) 21/132 (15.9%) 30/132 (22.7%)\n ALT > 20xULN 19/134 (14.2%) 33/134 (24.6%) 23/134 (17.2%) 19/134 (14.2%) 30/132 (22.7%) 22/132 (16.7%)\n AST >3 - <= 5xULN 17/134 (12.7%) 27/134 (20.1%) 36/134 (26.9%) 25/134 (18.7%) 26/132 (19.7%) 34/132 (25.8%)\n AST >5 - <= 10xULN 25/134 (18.7%) 28/134 (20.9%) 24/134 (17.9%) 28/134 (20.9%) 20/132 (15.2%) 23/132 (17.4%)\n AST >10 - <= 20xULN 36/134 (26.9%) 28/134 (20.9%) 16/134 (11.9%) 26/134 (19.4%) 33/132 (25.0%) 26/132 (19.7%)\n AST > 20xULN 30/134 (22.4%) 21/134 (15.7%) 30/134 (22.4%) 24/134 (17.9%) 24/132 (18.2%) 25/132 (18.9%)\nTotal Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN \n ALT >3 - <= 5xULN 24/134 (17.9%) 21/134 (15.7%) 30/134 (22.4%) 17/134 (12.7%) 28/132 (21.2%) 31/132 (23.5%)\n ALT >5 - <= 10xULN 36/134 (26.9%) 28/134 (20.9%) 25/134 (18.7%) 27/134 (20.1%) 26/132 (19.7%) 29/132 (22.0%)\n ALT >10 - <= 20xULN 30/134 (22.4%) 21/134 (15.7%) 28/134 (20.9%) 36/134 (26.9%) 25/132 (18.9%) 24/132 (18.2%)\n ALT > 20xULN 14/134 (10.4%) 28/134 (20.9%) 25/134 (18.7%) 27/134 (20.1%) 31/132 (23.5%) 23/132 (17.4%)\n AST >3 - <= 5xULN 21/134 (15.7%) 26/134 (19.4%) 29/134 (21.6%) 31/134 (23.1%) 33/132 (25.0%) 19/132 (14.4%)\n AST >5 - <= 10xULN 29/134 (21.6%) 26/134 (19.4%) 24/134 (17.9%) 26/134 (19.4%) 23/132 (17.4%) 32/132 (24.2%)\n AST >10 - <= 20xULN 29/134 (21.6%) 31/134 (23.1%) 28/134 (20.9%) 22/134 (16.4%) 22/132 (16.7%) 21/132 (15.9%)\n AST > 20xULN 34/134 (25.4%) 21/134 (15.7%) 19/134 (14.2%) 28/134 (20.9%) 21/132 (15.9%) 33/132 (25.0%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:54:09 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Adverse Events", - "AEL02" + "Tables", + "Lab Results", + "LBT09" ] }, { - "objectID": "listings/adverse-events/ael01.html", - "href": "listings/adverse-events/ael01.html", - "title": "AEL01", + "objectID": "tables/lab-results/lbt06.html", + "href": "tables/lab-results/lbt06.html", + "title": "LBT06", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\")\n\nout <- adae %>%\n select(AESOC, AEDECOD, AELLT, AETERM) %>%\n unique()\n\nvar_labels(out) <- c(\n AESOC = \"MedDRA System Organ Class\",\n AEDECOD = \"MedDRA Preferred Term\",\n AELLT = \"MedDRA Lowest Level Term\",\n AETERM = \"Investigator-Specified\\nAdverse Event Term\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"AESOC\", \"AEDECOD\", \"AELLT\"),\n disp_cols = names(out),\n main_title = \"Listing of Preferred Terms, Lowest Level Terms, and Investigator-Specified Adverse Event Terms\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Preferred Terms, Lowest Level Terms, and Investigator-Specified Adverse Event Terms\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————\n Investigator-Specified\nMedDRA System Organ Class MedDRA Preferred Term MedDRA Lowest Level Term Adverse Event Term \n—————————————————————————————————————————————————————————————————————————————————————————————————————\n cl A dcd A.1.1.1.1 llt A.1.1.1.1 trm A.1.1.1.1 \n dcd A.1.1.1.2 llt A.1.1.1.2 trm A.1.1.1.2 \n cl B dcd B.1.1.1.1 llt B.1.1.1.1 trm B.1.1.1.1 \n dcd B.2.1.2.1 llt B.2.1.2.1 trm B.2.1.2.1 \n dcd B.2.2.3.1 llt B.2.2.3.1 trm B.2.2.3.1 \n cl C dcd C.1.1.1.3 llt C.1.1.1.3 trm C.1.1.1.3 \n dcd C.2.1.2.1 llt C.2.1.2.1 trm C.2.1.2.1 \n cl D dcd D.1.1.1.1 llt D.1.1.1.1 trm D.1.1.1.1 \n dcd D.1.1.4.2 llt D.1.1.4.2 trm D.1.1.4.2 \n dcd D.2.1.5.3 llt D.2.1.5.3 trm D.2.1.5.3 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:37 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table for Single Lab Test\nStandard Table for Multiple Lab Tests\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(tern)\nlibrary(dplyr)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n# Please note that df_explict_na has a na_level argument defaulting to \"<Missing>\",\n# Please don't change the na_level to anything other than NA, empty string or the default \"<Missing>\".\n\nadlb_f <- adlb %>%\n dplyr::filter(ABLFL != \"Y\") %>%\n dplyr::filter(!(AVISIT %in% c(\"SCREENING\", \"BASELINE\"))) %>%\n dplyr::mutate(AVISIT = droplevels(AVISIT)) %>%\n var_relabel(AVISIT = \"Visit\")\n\nadlb_f_crp <- adlb_f %>% dplyr::filter(PARAMCD == \"CRP\")\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f_crp$AVISIT)) %>%\n count_abnormal_by_baseline(\n \"ANRIND\",\n abnormal = c(Low = \"LOW\", High = \"HIGH\"),\n .indent_mods = 4L\n ) %>%\n append_varlabels(adlb_f_crp, \"ANRIND\", indent = 1L) %>%\n append_topleft(\" Baseline Status\")\n\nresult <- build_table(\n lyt = lyt,\n df = adlb_f_crp,\n alt_counts_df = adsl\n) %>%\n trim_rows()\n\nresult\n\nVisit \n Analysis Reference Range Indicator A: Drug X B: Placebo C: Combination\n Baseline Status (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————————\nWEEK 1 DAY 8 \n Low \n Not low 16/119 (13.4%) 22/113 (19.5%) 24/112 (21.4%)\n Low 2/15 (13.3%) 2/21 (9.5%) 7/20 (35%) \n Total 18/134 (13.4%) 24/134 (17.9%) 31/132 (23.5%)\n High \n Not high 21/114 (18.4%) 20/112 (17.9%) 17/115 (14.8%)\n High 2/20 (10%) 4/22 (18.2%) 3/17 (17.6%) \n Total 23/134 (17.2%) 24/134 (17.9%) 20/132 (15.2%)\nWEEK 2 DAY 15 \n Low \n Not low 26/119 (21.8%) 20/113 (17.7%) 12/112 (10.7%)\n Low 2/15 (13.3%) 3/21 (14.3%) 4/20 (20%) \n Total 28/134 (20.9%) 23/134 (17.2%) 16/132 (12.1%)\n High \n Not high 15/114 (13.2%) 17/112 (15.2%) 15/115 (13%) \n High 2/20 (10%) 4/22 (18.2%) 4/17 (23.5%) \n Total 17/134 (12.7%) 21/134 (15.7%) 19/132 (14.4%)\nWEEK 3 DAY 22 \n Low \n Not low 15/119 (12.6%) 21/113 (18.6%) 18/112 (16.1%)\n Low 0/15 3/21 (14.3%) 0/20 \n Total 15/134 (11.2%) 24/134 (17.9%) 18/132 (13.6%)\n High \n Not high 22/114 (19.3%) 18/112 (16.1%) 17/115 (14.8%)\n High 2/20 (10%) 5/22 (22.7%) 1/17 (5.9%) \n Total 24/134 (17.9%) 23/134 (17.2%) 18/132 (13.6%)\nWEEK 4 DAY 29 \n Low \n Not low 30/119 (25.2%) 13/113 (11.5%) 16/112 (14.3%)\n Low 3/15 (20%) 2/21 (9.5%) 5/20 (25%) \n Total 33/134 (24.6%) 15/134 (11.2%) 21/132 (15.9%)\n High \n Not high 17/114 (14.9%) 11/112 (9.8%) 16/115 (13.9%)\n High 2/20 (10%) 6/22 (27.3%) 3/17 (17.6%) \n Total 19/134 (14.2%) 17/134 (12.7%) 19/132 (14.4%)\nWEEK 5 DAY 36 \n Low \n Not low 17/119 (14.3%) 19/113 (16.8%) 16/112 (14.3%)\n Low 2/15 (13.3%) 3/21 (14.3%) 5/20 (25%) \n Total 19/134 (14.2%) 22/134 (16.4%) 21/132 (15.9%)\n High \n Not high 19/114 (16.7%) 17/112 (15.2%) 11/115 (9.6%) \n High 4/20 (20%) 6/22 (27.3%) 2/17 (11.8%) \n Total 23/134 (17.2%) 23/134 (17.2%) 13/132 (9.8%) \n\n\n\n\n\nCode# The following code generates one large table for multiple lab tests.\n# If separate tables are needed for each lab test per GDSR standard, use the code for \"single lab test\".\n\nlyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ARM\") %>%\n split_rows_by(\"PARAM\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f$PARAM)) %>%\n split_rows_by(\"AVISIT\", split_fun = split_fun, label_pos = \"topleft\", split_label = obj_label(adlb_f$AVISIT)) %>%\n count_abnormal_by_baseline(\n \"ANRIND\",\n abnormal = c(Low = \"LOW\", High = \"HIGH\"),\n .indent_mods = 4L\n ) %>%\n append_varlabels(adlb_f, \"ANRIND\", indent = 2L) %>%\n append_topleft(\" Baseline Status\")\n\nresult <- build_table(\n lyt = lyt,\n df = adlb_f,\n alt_counts_df = adsl\n) %>%\n trim_rows()\n\nresult\n\nParameter \n Visit \n Analysis Reference Range Indicator A: Drug X B: Placebo C: Combination\n Baseline Status (N=134) (N=134) (N=132) \n—————————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n WEEK 1 DAY 8 \n Low \n Not low 19/113 (16.8%) 13/117 (11.1%) 14/123 (11.4%)\n Low 2/21 (9.5%) 1/17 (5.9%) 1/9 (11.1%) \n Total 21/134 (15.7%) 14/134 (10.4%) 15/132 (11.4%)\n High \n Not high 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n WEEK 2 DAY 15 \n Low \n Not low 17/113 (15%) 13/117 (11.1%) 13/123 (10.6%)\n Low 2/21 (9.5%) 2/17 (11.8%) 4/9 (44.4%) \n Total 19/134 (14.2%) 15/134 (11.2%) 17/132 (12.9%)\n High \n Not high 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n WEEK 3 DAY 22 \n Low \n Not low 10/113 (8.8%) 20/117 (17.1%) 21/123 (17.1%)\n Low 4/21 (19%) 4/17 (23.5%) 2/9 (22.2%) \n Total 14/134 (10.4%) 24/134 (17.9%) 23/132 (17.4%)\n High \n Not high 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n WEEK 4 DAY 29 \n Low \n Not low 15/113 (13.3%) 19/117 (16.2%) 18/123 (14.6%)\n Low 2/21 (9.5%) 3/17 (17.6%) 1/9 (11.1%) \n Total 17/134 (12.7%) 22/134 (16.4%) 19/132 (14.4%)\n High \n Not high 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n WEEK 5 DAY 36 \n Low \n Not low 17/113 (15%) 23/117 (19.7%) 18/123 (14.6%)\n Low 0/21 1/17 (5.9%) 1/9 (11.1%) \n Total 17/134 (12.7%) 24/134 (17.9%) 19/132 (14.4%)\n High \n Not high 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \nC-Reactive Protein Measurement \n WEEK 1 DAY 8 \n Low \n Not low 16/119 (13.4%) 22/113 (19.5%) 24/112 (21.4%)\n Low 2/15 (13.3%) 2/21 (9.5%) 7/20 (35%) \n Total 18/134 (13.4%) 24/134 (17.9%) 31/132 (23.5%)\n High \n Not high 21/114 (18.4%) 20/112 (17.9%) 17/115 (14.8%)\n High 2/20 (10%) 4/22 (18.2%) 3/17 (17.6%) \n Total 23/134 (17.2%) 24/134 (17.9%) 20/132 (15.2%)\n WEEK 2 DAY 15 \n Low \n Not low 26/119 (21.8%) 20/113 (17.7%) 12/112 (10.7%)\n Low 2/15 (13.3%) 3/21 (14.3%) 4/20 (20%) \n Total 28/134 (20.9%) 23/134 (17.2%) 16/132 (12.1%)\n High \n Not high 15/114 (13.2%) 17/112 (15.2%) 15/115 (13%) \n High 2/20 (10%) 4/22 (18.2%) 4/17 (23.5%) \n Total 17/134 (12.7%) 21/134 (15.7%) 19/132 (14.4%)\n WEEK 3 DAY 22 \n Low \n Not low 15/119 (12.6%) 21/113 (18.6%) 18/112 (16.1%)\n Low 0/15 3/21 (14.3%) 0/20 \n Total 15/134 (11.2%) 24/134 (17.9%) 18/132 (13.6%)\n High \n Not high 22/114 (19.3%) 18/112 (16.1%) 17/115 (14.8%)\n High 2/20 (10%) 5/22 (22.7%) 1/17 (5.9%) \n Total 24/134 (17.9%) 23/134 (17.2%) 18/132 (13.6%)\n WEEK 4 DAY 29 \n Low \n Not low 30/119 (25.2%) 13/113 (11.5%) 16/112 (14.3%)\n Low 3/15 (20%) 2/21 (9.5%) 5/20 (25%) \n Total 33/134 (24.6%) 15/134 (11.2%) 21/132 (15.9%)\n High \n Not high 17/114 (14.9%) 11/112 (9.8%) 16/115 (13.9%)\n High 2/20 (10%) 6/22 (27.3%) 3/17 (17.6%) \n Total 19/134 (14.2%) 17/134 (12.7%) 19/132 (14.4%)\n WEEK 5 DAY 36 \n Low \n Not low 17/119 (14.3%) 19/113 (16.8%) 16/112 (14.3%)\n Low 2/15 (13.3%) 3/21 (14.3%) 5/20 (25%) \n Total 19/134 (14.2%) 22/134 (16.4%) 21/132 (15.9%)\n High \n Not high 19/114 (16.7%) 17/112 (15.2%) 11/115 (9.6%) \n High 4/20 (20%) 6/22 (27.3%) 2/17 (11.8%) \n Total 23/134 (17.2%) 23/134 (17.2%) 13/132 (9.8%) \nImmunoglobulin A Measurement \n WEEK 1 DAY 8 \n Low \n Not low 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n High \n Not high 18/119 (15.1%) 20/116 (17.2%) 14/113 (12.4%)\n High 1/15 (6.7%) 5/18 (27.8%) 4/19 (21.1%) \n Total 19/134 (14.2%) 25/134 (18.7%) 18/132 (13.6%)\n WEEK 2 DAY 15 \n Low \n Not low 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n High \n Not high 16/119 (13.4%) 13/116 (11.2%) 12/113 (10.6%)\n High 1/15 (6.7%) 1/18 (5.6%) 2/19 (10.5%) \n Total 17/134 (12.7%) 14/134 (10.4%) 14/132 (10.6%)\n WEEK 3 DAY 22 \n Low \n Not low 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n High \n Not high 17/119 (14.3%) 15/116 (12.9%) 21/113 (18.6%)\n High 0/15 1/18 (5.6%) 1/19 (5.3%) \n Total 17/134 (12.7%) 16/134 (11.9%) 22/132 (16.7%)\n WEEK 4 DAY 29 \n Low \n Not low 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n High \n Not high 19/119 (16%) 16/116 (13.8%) 19/113 (16.8%)\n High 4/15 (26.7%) 5/18 (27.8%) 3/19 (15.8%) \n Total 23/134 (17.2%) 21/134 (15.7%) 22/132 (16.7%)\n WEEK 5 DAY 36 \n Low \n Not low 0/134 0/134 0/132 \n Total 0/134 0/134 0/132 \n High \n Not high 16/119 (13.4%) 21/116 (18.1%) 20/113 (17.7%)\n High 1/15 (6.7%) 3/18 (16.7%) 0/19 \n Total 17/134 (12.7%) 24/134 (17.9%) 20/132 (15.2%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:54:23 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9018 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Adverse Events", - "AEL01" + "Tables", + "Lab Results", + "LBT06" ] }, { - "objectID": "listings/medical-history/mhl01.html", - "href": "listings/medical-history/mhl01.html", - "title": "MHL01", + "objectID": "tables/lab-results/lbt14.html", + "href": "tables/lab-results/lbt14.html", + "title": "LBT14", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadmh <- synthetic_cdisc_dataset(\"latest\", \"admh\")\n\nout <- admh %>%\n mutate(\n ASR = paste(AGE, SEX, RACE, sep = \"/\"),\n ID = paste(SITEID, SUBJID, sep = \"/\"),\n TRTSDTM = toupper(format(as.Date(TRTSDTM), \"%d%b%Y\")),\n ASTDTM = toupper(format(as.Date(ASTDTM), \"%d%b%Y\")),\n AENDTM = toupper(format(as.Date(AENDTM), \"%d%b%Y\"))\n ) %>%\n select(ID, ASR, TRT01A, MHBODSYS, MHDECOD, TRTSDTM, ASTDTM, ASTDY, AENDTM, AENDY, ATIREL)\n\nvar_labels(out) <- c(\n ID = \"Center/Patient ID\",\n ASR = \"Age/Sex/Race\",\n TRT01A = \"Treatment\",\n MHBODSYS = \"SOC\",\n MHDECOD = \"Disease Term\",\n TRTSDTM = \"Date of First\\nStudy Drug\\nAdministration\",\n ASTDTM = \"Start Date\\nof Disease\",\n ASTDY = \"Start Day\\nof Disease\",\n AENDTM = \"End Date\\nof Disease\",\n AENDY = \"End Day\\nof Disease\",\n ATIREL = \"Time Relation\\nof Disease\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"ID\", \"ASR\", \"MHBODSYS\", \"MHDECOD\"),\n disp_cols = names(out),\n main_title = \"Listing of Medical History and Concurrent Diseases\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Medical History and Concurrent Diseases\n\n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Date of First \n Study Drug Start Date Start Day End Date End Day Time Relation \nTreatment Center/Patient ID Age/Sex/Race SOC Disease Term Administration of Disease of Disease of Disease of Disease of Disease \n—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-134 47/M/WHITE cl A trm A_2/2 04NOV2020 21SEP2021 321 16FEB2022 469 PRIOR_CONCOMITANT\n 04NOV2020 02DEC2021 393 13JAN2022 435 PRIOR_CONCOMITANT\n cl B trm B_2/3 04NOV2020 15APR2021 162 04OCT2021 334 PRIOR_CONCOMITANT\n cl D trm D_2/3 04NOV2020 19MAY2021 196 31OCT2021 361 PRIOR_CONCOMITANT\n BRA-1/id-42 36/M/BLACK OR AFRICAN AMERICAN cl A trm A_2/2 01JAN2020 09JUN2020 160 22FEB2021 418 PRIOR_CONCOMITANT\n 01JAN2020 04APR2021 459 15OCT2021 653 PRIOR_CONCOMITANT\n 01JAN2020 20APR2021 475 10AUG2021 587 PRIOR_CONCOMITANT\n cl B trm B_1/3 01JAN2020 15APR2021 470 23AUG2021 600 PRIOR_CONCOMITANT\n 01JAN2020 03OCT2021 641 17OCT2021 655 PRIOR_CONCOMITANT\n trm B_3/3 01JAN2020 19OCT2020 292 07DEC2020 341 PRIOR_CONCOMITANT\n cl C trm C_1/2 01JAN2020 11MAY2021 496 19OCT2021 657 PRIOR_CONCOMITANT\n trm C_2/2 01JAN2020 09FEB2020 39 28JUN2021 544 PRIOR_CONCOMITANT\n 01JAN2020 05APR2020 95 04FEB2021 400 PRIOR_CONCOMITANT\n cl D trm D_1/3 01JAN2020 05MAR2020 64 24NOV2021 693 PRIOR_CONCOMITANT\n BRA-1/id-93 34/F/ASIAN cl A trm A_1/2 20JUN2020 03NOV2020 136 19JAN2021 213 PRIOR_CONCOMITANT\n cl B trm B_1/3 20JUN2020 25NOV2021 523 18DEC2021 546 PRIOR_CONCOMITANT\n trm B_3/3 20JUN2020 06FEB2022 596 15FEB2022 605 PRIOR_CONCOMITANT\n cl C trm C_1/2 20JUN2020 28MAR2021 281 11JUL2021 386 PRIOR_CONCOMITANT\n cl D trm D_1/3 20JUN2020 02MAY2021 316 06JAN2022 565 PRIOR_CONCOMITANT\n trm D_2/3 20JUN2020 03AUG2020 44 18SEP2020 90 PRIOR_CONCOMITANT\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:44 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table (High)\nStandard Table (Low)\nTable Without Patients with Missing Baseline (High)\nTable with Missing Baseline Considered as Grade 0 (Low)\nTable with Fill-In of Grades\nteal App\nReproducibility\n\n\n\nPlease note that for each variant, the adlb dataset needs to be filtered on correct flags like WGRLOFL, WGRHIFL, et al., otherwise the layout function will not return the correct counts. There is an option to create a record for a lab test where no record is found at that visit. If you specified add_derived_type = \"PHANTOM\" & dtype_phantom_cond, you don’t have to use the h_adsl_adlb_merge_using_worst_flag function to preprocess your adlb dataset. Otherwise please follow the pre-processing steps below before applying the layout functions.\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\n# Please note that in real clinical data, population flag like SAFFL, and parameter category like PARCAT2 needs to be\n# selected properly.\nadsl_f <- adsl %>% filter(SAFFL == \"Y\")\nadlb <- adlb %>% filter(SAFFL == \"Y\")\n\n\n\n\nNote that the worst laboratory flag (below WGRHIFL) must be selected appropriately in the pre-processing step. New grouping variables ATOXGR_GP (post-baseline) and BTOXGR_GP (baseline) are created to display the correct output.\n\nCodeadlb_f <- adlb %>% filter(WGRHIFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c(\"WGRHIFL\" = \"Y\"))\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = factor(case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n ) %>%\n mutate(\n BTOXGR_GP = factor(case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = \"Parameter\"\n ) %>%\n split_rows_by(\n \"BTOXGR_GP\",\n label_pos = \"topleft\",\n split_label = \" Baseline NCI-CTCAE Grade\",\n indent_mod = 2L\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\"), unique_count_suffix = FALSE) %>%\n count_occurrences_by_grade(\"ATOXGR_GP\", denom = \"n\", drop = FALSE, .indent_mods = 3L) %>%\n append_topleft(\" Post-baseline NCI-CTCAE Grade\") %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nParameter \n Baseline NCI-CTCAE Grade A: Drug X B: Placebo C: Combination\n Post-baseline NCI-CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Not High 134 134 132 \n Not High 134 (100%) 134 (100%) 132 (100%) \nC-Reactive Protein Measurement \n Not High 114 112 115 \n Not High 45 (33.6%) 55 (41.0%) 57 (43.2%) \n 1 18 (13.4%) 18 (13.4%) 19 (14.4%) \n 2 19 (14.2%) 10 (7.5%) 11 (8.3%) \n 3 22 (16.4%) 13 (9.7%) 20 (15.2%) \n 4 10 (7.5%) 16 (11.9%) 8 (6.1%) \n 1 8 10 7 \n Not High 5 (3.7%) 2 (1.5%) 2 (1.5%) \n 1 0 1 (0.7%) 0 \n 2 1 (0.7%) 3 (2.2%) 3 (2.3%) \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 3 (2.2%) 2 (1.5%) \n 2 2 6 7 \n Not High 1 (0.7%) 4 (3.0%) 4 (3.0%) \n 1 0 1 (0.7%) 2 (1.5%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 4 0 0 1 (0.8%) \n 3 7 4 3 \n Not High 3 (2.2%) 0 2 (1.5%) \n 1 2 (1.5%) 1 (0.7%) 1 (0.8%) \n 2 0 1 (0.7%) 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n 4 3 2 0 \n Not High 1 (0.7%) 0 0 \n 1 0 1 (0.7%) 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 0 0 \nImmunoglobulin A Measurement \n Not High 119 116 113 \n Not High 55 (41.0%) 54 (40.3%) 51 (38.6%) \n 1 18 (13.4%) 11 (8.2%) 15 (11.4%) \n 2 14 (10.4%) 22 (16.4%) 19 (14.4%) \n 3 20 (14.9%) 19 (14.2%) 20 (15.2%) \n 4 12 (9.0%) 10 (7.5%) 8 (6.1%) \n 1 5 4 2 \n Not High 4 (3.0%) 1 (0.7%) 2 (1.5%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 3 0 2 (1.5%) 0 \n 2 4 4 5 \n Not High 2 (1.5%) 3 (2.2%) 3 (2.3%) \n 1 1 (0.7%) 0 2 (1.5%) \n 3 1 (0.7%) 0 0 \n 4 0 1 (0.7%) 0 \n 3 4 5 11 \n Not High 3 (2.2%) 1 (0.7%) 6 (4.5%) \n 1 0 1 (0.7%) 1 (0.8%) \n 2 1 (0.7%) 0 0 \n 3 0 2 (1.5%) 3 (2.3%) \n 4 0 1 (0.7%) 1 (0.8%) \n 4 2 5 1 \n Not High 0 3 (2.2%) 1 (0.8%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n\n\n\n\nNote that the worst laboratory flag (below WGRLOFL) must be selected appropriately in the pre-processing step. New grouping variables ATOXGR_GP (post-baseline) and BTOXGR_GP (baseline) are created to display the correct output.\n\nCodeadlb_f <- adlb %>% filter(WGRLOFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c(\"WGRLOFL\" = \"Y\"))\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = factor(case_when(\n ATOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n ATOXGR == -1 ~ \"1\",\n ATOXGR == -2 ~ \"2\",\n ATOXGR == -3 ~ \"3\",\n ATOXGR == -4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n ) %>%\n mutate(\n BTOXGR_GP = factor(case_when(\n BTOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n BTOXGR == -1 ~ \"1\",\n BTOXGR == -2 ~ \"2\",\n BTOXGR == -3 ~ \"3\",\n BTOXGR == -4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = \"Parameter\"\n ) %>%\n split_rows_by(\n \"BTOXGR_GP\",\n label_pos = \"topleft\",\n split_label = \" Baseline NCI-CTCAE Grade\",\n indent_mod = 2L\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\"), unique_count_suffix = FALSE) %>%\n count_occurrences_by_grade(\"ATOXGR_GP\", denom = \"n\", drop = FALSE, .indent_mods = 3L) %>%\n append_topleft(\" Post-baseline NCI-CTCAE Grade\") %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nParameter \n Baseline NCI-CTCAE Grade A: Drug X B: Placebo C: Combination\n Post-baseline NCI-CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Not Low 113 117 123 \n Not Low 56 (41.8%) 55 (41.0%) 62 (47.0%) \n 1 11 (8.2%) 9 (6.7%) 15 (11.4%) \n 2 15 (11.2%) 23 (17.2%) 16 (12.1%) \n 3 15 (11.2%) 21 (15.7%) 13 (9.8%) \n 4 16 (11.9%) 9 (6.7%) 17 (12.9%) \n 1 6 6 4 \n Not Low 3 (2.2%) 5 (3.7%) 3 (2.3%) \n 1 3 (2.2%) 0 0 \n 4 0 1 (0.7%) 1 (0.8%) \n 2 8 5 1 \n Not Low 5 (3.7%) 3 (2.2%) 0 \n 1 0 1 (0.7%) 0 \n 2 2 (1.5%) 0 0 \n 3 0 1 (0.7%) 1 (0.8%) \n 4 1 (0.7%) 0 0 \n 3 3 3 2 \n Not Low 0 1 (0.7%) 0 \n 1 1 (0.7%) 0 0 \n 2 1 (0.7%) 0 1 (0.8%) \n 3 1 (0.7%) 2 (1.5%) 1 (0.8%) \n 4 4 3 2 \n Not Low 4 (3.0%) 1 (0.7%) 1 (0.8%) \n 1 0 1 (0.7%) 0 \n 2 0 1 (0.7%) 0 \n 3 0 0 1 (0.8%) \nC-Reactive Protein Measurement \n Not Low 119 113 112 \n Not Low 41 (30.6%) 42 (31.3%) 50 (37.9%) \n 1 20 (14.9%) 18 (13.4%) 11 (8.3%) \n 2 24 (17.9%) 20 (14.9%) 14 (10.6%) \n 3 25 (18.7%) 18 (13.4%) 21 (15.9%) \n 4 9 (6.7%) 15 (11.2%) 16 (12.1%) \n 1 3 5 9 \n Not Low 2 (1.5%) 2 (1.5%) 2 (1.5%) \n 2 0 1 (0.7%) 3 (2.3%) \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 0 1 (0.7%) 4 (3.0%) \n 2 5 9 2 \n Not Low 3 (2.2%) 4 (3.0%) 1 (0.8%) \n 1 1 (0.7%) 4 (3.0%) 0 \n 3 0 1 (0.7%) 1 (0.8%) \n 4 1 (0.7%) 0 0 \n 3 4 5 7 \n Not Low 1 (0.7%) 4 (3.0%) 2 (1.5%) \n 1 0 0 1 (0.8%) \n 2 0 0 1 (0.8%) \n 3 3 (2.2%) 1 (0.7%) 2 (1.5%) \n 4 0 0 1 (0.8%) \n 4 3 2 2 \n Not Low 3 (2.2%) 1 (0.7%) 0 \n 2 0 1 (0.7%) 0 \n 3 0 0 1 (0.8%) \n 4 0 0 1 (0.8%) \nImmunoglobulin A Measurement \n Not Low 134 134 132 \n Not Low 134 (100%) 134 (100%) 132 (100%) \n\n\n\n\nNote that missing baseline values are filtered out in the pre-processing step.\n\nCodeadlb_f <- adlb %>% filter(WGRHIFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c(\"WGRHIFL\" = \"Y\"))\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n filter(BTOXGR != \"<Missing>\") %>%\n mutate(\n ATOXGR_GP = factor(case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n ) %>%\n mutate(\n BTOXGR_GP = factor(case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\"))\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = \"Parameter\"\n ) %>%\n split_rows_by(\n \"BTOXGR_GP\",\n label_pos = \"topleft\",\n split_label = \" Baseline NCI-CTCAE Grade\",\n indent_mod = 2L\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\"), unique_count_suffix = FALSE) %>%\n count_occurrences_by_grade(\"ATOXGR_GP\", denom = \"n\", drop = FALSE, .indent_mods = 3L) %>%\n append_topleft(\" Post-baseline NCI-CTCAE Grade\") %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nParameter \n Baseline NCI-CTCAE Grade A: Drug X B: Placebo C: Combination\n Post-baseline NCI-CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Not High 134 134 132 \n Not High 134 (100%) 134 (100%) 132 (100%) \nC-Reactive Protein Measurement \n Not High 114 112 115 \n Not High 45 (33.6%) 55 (41.0%) 57 (43.2%) \n 1 18 (13.4%) 18 (13.4%) 19 (14.4%) \n 2 19 (14.2%) 10 (7.5%) 11 (8.3%) \n 3 22 (16.4%) 13 (9.7%) 20 (15.2%) \n 4 10 (7.5%) 16 (11.9%) 8 (6.1%) \n 1 8 10 7 \n Not High 5 (3.7%) 2 (1.5%) 2 (1.5%) \n 1 0 1 (0.7%) 0 \n 2 1 (0.7%) 3 (2.2%) 3 (2.3%) \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 3 (2.2%) 2 (1.5%) \n 2 2 6 7 \n Not High 1 (0.7%) 4 (3.0%) 4 (3.0%) \n 1 0 1 (0.7%) 2 (1.5%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 4 0 0 1 (0.8%) \n 3 7 4 3 \n Not High 3 (2.2%) 0 2 (1.5%) \n 1 2 (1.5%) 1 (0.7%) 1 (0.8%) \n 2 0 1 (0.7%) 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n 4 3 2 0 \n Not High 1 (0.7%) 0 0 \n 1 0 1 (0.7%) 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 0 0 \nImmunoglobulin A Measurement \n Not High 119 116 113 \n Not High 55 (41.0%) 54 (40.3%) 51 (38.6%) \n 1 18 (13.4%) 11 (8.2%) 15 (11.4%) \n 2 14 (10.4%) 22 (16.4%) 19 (14.4%) \n 3 20 (14.9%) 19 (14.2%) 20 (15.2%) \n 4 12 (9.0%) 10 (7.5%) 8 (6.1%) \n 1 5 4 2 \n Not High 4 (3.0%) 1 (0.7%) 2 (1.5%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 3 0 2 (1.5%) 0 \n 2 4 4 5 \n Not High 2 (1.5%) 3 (2.2%) 3 (2.3%) \n 1 1 (0.7%) 0 2 (1.5%) \n 3 1 (0.7%) 0 0 \n 4 0 1 (0.7%) 0 \n 3 4 5 11 \n Not High 3 (2.2%) 1 (0.7%) 6 (4.5%) \n 1 0 1 (0.7%) 1 (0.8%) \n 2 1 (0.7%) 0 0 \n 3 0 2 (1.5%) 3 (2.3%) \n 4 0 1 (0.7%) 1 (0.8%) \n 4 2 5 1 \n Not High 0 3 (2.2%) 1 (0.8%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n\n\n\n\nNote that when BTOXGR is missing, the grouping variable BTOXGR_GP now is \"Not Low\" instead of \"Missing\" compared to Standard Table (Low).\n\nCodeadlb_f <- adlb %>% filter(WGRLOFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c(\"WGRLOFL\" = \"Y\"))\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = factor(case_when(\n ATOXGR %in% c(0, 1, 2, 3, 4) ~ \"Not Low\",\n ATOXGR == -1 ~ \"1\",\n ATOXGR == -2 ~ \"2\",\n ATOXGR == -3 ~ \"3\",\n ATOXGR == -4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\"))\n ) %>%\n mutate(\n BTOXGR_GP = factor(case_when(\n BTOXGR %in% c(0, 1, 2, 3, 4, \"<Missing>\") ~ \"Not Low\",\n BTOXGR == -1 ~ \"1\",\n BTOXGR == -2 ~ \"2\",\n BTOXGR == -3 ~ \"3\",\n BTOXGR == -4 ~ \"4\"\n ), levels = c(\"Not Low\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = \"Parameter\"\n ) %>%\n split_rows_by(\n \"BTOXGR_GP\",\n label_pos = \"topleft\",\n split_label = \" Baseline NCI-CTCAE Grade\",\n indent_mod = 2L\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\"), unique_count_suffix = FALSE) %>%\n count_occurrences_by_grade(\"ATOXGR_GP\", denom = \"n\", drop = FALSE, .indent_mods = 3L) %>%\n append_topleft(\" Post-baseline NCI-CTCAE Grade\") %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f) %>%\n prune_table()\n\nresult\n\nParameter \n Baseline NCI-CTCAE Grade A: Drug X B: Placebo C: Combination\n Post-baseline NCI-CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Not Low 113 117 123 \n Not Low 56 (41.8%) 55 (41.0%) 62 (47.0%) \n 1 11 (8.2%) 9 (6.7%) 15 (11.4%) \n 2 15 (11.2%) 23 (17.2%) 16 (12.1%) \n 3 15 (11.2%) 21 (15.7%) 13 (9.8%) \n 4 16 (11.9%) 9 (6.7%) 17 (12.9%) \n 1 6 6 4 \n Not Low 3 (2.2%) 5 (3.7%) 3 (2.3%) \n 1 3 (2.2%) 0 0 \n 4 0 1 (0.7%) 1 (0.8%) \n 2 8 5 1 \n Not Low 5 (3.7%) 3 (2.2%) 0 \n 1 0 1 (0.7%) 0 \n 2 2 (1.5%) 0 0 \n 3 0 1 (0.7%) 1 (0.8%) \n 4 1 (0.7%) 0 0 \n 3 3 3 2 \n Not Low 0 1 (0.7%) 0 \n 1 1 (0.7%) 0 0 \n 2 1 (0.7%) 0 1 (0.8%) \n 3 1 (0.7%) 2 (1.5%) 1 (0.8%) \n 4 4 3 2 \n Not Low 4 (3.0%) 1 (0.7%) 1 (0.8%) \n 1 0 1 (0.7%) 0 \n 2 0 1 (0.7%) 0 \n 3 0 0 1 (0.8%) \nC-Reactive Protein Measurement \n Not Low 119 113 112 \n Not Low 41 (30.6%) 42 (31.3%) 50 (37.9%) \n 1 20 (14.9%) 18 (13.4%) 11 (8.3%) \n 2 24 (17.9%) 20 (14.9%) 14 (10.6%) \n 3 25 (18.7%) 18 (13.4%) 21 (15.9%) \n 4 9 (6.7%) 15 (11.2%) 16 (12.1%) \n 1 3 5 9 \n Not Low 2 (1.5%) 2 (1.5%) 2 (1.5%) \n 2 0 1 (0.7%) 3 (2.3%) \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 0 1 (0.7%) 4 (3.0%) \n 2 5 9 2 \n Not Low 3 (2.2%) 4 (3.0%) 1 (0.8%) \n 1 1 (0.7%) 4 (3.0%) 0 \n 3 0 1 (0.7%) 1 (0.8%) \n 4 1 (0.7%) 0 0 \n 3 4 5 7 \n Not Low 1 (0.7%) 4 (3.0%) 2 (1.5%) \n 1 0 0 1 (0.8%) \n 2 0 0 1 (0.8%) \n 3 3 (2.2%) 1 (0.7%) 2 (1.5%) \n 4 0 0 1 (0.8%) \n 4 3 2 2 \n Not Low 3 (2.2%) 1 (0.7%) 0 \n 2 0 1 (0.7%) 0 \n 3 0 0 1 (0.8%) \n 4 0 0 1 (0.8%) \nImmunoglobulin A Measurement \n Not Low 134 134 132 \n Not Low 134 (100%) 134 (100%) 132 (100%) \n\n\n\n\nPre-processing is the same as Standard Table (High), but in order to keep all levels, prune_table() is not applied.\n\nCodeadlb_f <- adlb %>% filter(WGRHIFL == \"Y\")\n\n# Please note the step below can be skipped if you are using DTYPE PHANTOM\nadlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c(\"WGRHIFL\" = \"Y\"))\n\n# Create new grouping variables ATOXGR_GP, BTOXGR_GP\nadlb_out <- adlb_out %>%\n mutate(\n ATOXGR_GP = factor(case_when(\n ATOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n ATOXGR == 1 ~ \"1\",\n ATOXGR == 2 ~ \"2\",\n ATOXGR == 3 ~ \"3\",\n ATOXGR == 4 ~ \"4\",\n ATOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n ) %>%\n mutate(\n BTOXGR_GP = factor(case_when(\n BTOXGR %in% c(0, -1, -2, -3, -4) ~ \"Not High\",\n BTOXGR == 1 ~ \"1\",\n BTOXGR == 2 ~ \"2\",\n BTOXGR == 3 ~ \"3\",\n BTOXGR == 4 ~ \"4\",\n BTOXGR == \"<Missing>\" ~ \"Missing\"\n ), levels = c(\"Not High\", \"1\", \"2\", \"3\", \"4\", \"Missing\"))\n )\n\nresult <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n split_fun = drop_split_levels,\n label_pos = \"topleft\",\n split_label = \"Parameter\"\n ) %>%\n split_rows_by(\n \"BTOXGR_GP\",\n label_pos = \"topleft\",\n split_label = \" Baseline NCI-CTCAE Grade\",\n indent_mod = 2L\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = c(\"unique_count\"), unique_count_suffix = FALSE) %>%\n count_occurrences_by_grade(\"ATOXGR_GP\", denom = \"n\", drop = FALSE, .indent_mods = 3L) %>%\n append_topleft(\" Post-baseline NCI-CTCAE Grade\") %>%\n build_table(df = adlb_out, alt_counts_df = adsl_f)\n\nresult\n\nParameter \n Baseline NCI-CTCAE Grade A: Drug X B: Placebo C: Combination\n Post-baseline NCI-CTCAE Grade (N=134) (N=134) (N=132) \n——————————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement \n Not High 134 134 132 \n Not High 134 (100%) 134 (100%) 132 (100%) \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 1 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 2 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 3 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n 4 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n Missing 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \nC-Reactive Protein Measurement \n Not High 114 112 115 \n Not High 45 (33.6%) 55 (41.0%) 57 (43.2%) \n 1 18 (13.4%) 18 (13.4%) 19 (14.4%) \n 2 19 (14.2%) 10 (7.5%) 11 (8.3%) \n 3 22 (16.4%) 13 (9.7%) 20 (15.2%) \n 4 10 (7.5%) 16 (11.9%) 8 (6.1%) \n Missing 0 0 0 \n 1 8 10 7 \n Not High 5 (3.7%) 2 (1.5%) 2 (1.5%) \n 1 0 1 (0.7%) 0 \n 2 1 (0.7%) 3 (2.2%) 3 (2.3%) \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 3 (2.2%) 2 (1.5%) \n Missing 0 0 0 \n 2 2 6 7 \n Not High 1 (0.7%) 4 (3.0%) 4 (3.0%) \n 1 0 1 (0.7%) 2 (1.5%) \n 2 1 (0.7%) 1 (0.7%) 0 \n 3 0 0 0 \n 4 0 0 1 (0.8%) \n Missing 0 0 0 \n 3 7 4 3 \n Not High 3 (2.2%) 0 2 (1.5%) \n 1 2 (1.5%) 1 (0.7%) 1 (0.8%) \n 2 0 1 (0.7%) 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n Missing 0 0 0 \n 4 3 2 0 \n Not High 1 (0.7%) 0 0 \n 1 0 1 (0.7%) 0 \n 2 0 0 0 \n 3 1 (0.7%) 1 (0.7%) 0 \n 4 1 (0.7%) 0 0 \n Missing 0 0 0 \n Missing 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \nImmunoglobulin A Measurement \n Not High 119 116 113 \n Not High 55 (41.0%) 54 (40.3%) 51 (38.6%) \n 1 18 (13.4%) 11 (8.2%) 15 (11.4%) \n 2 14 (10.4%) 22 (16.4%) 19 (14.4%) \n 3 20 (14.9%) 19 (14.2%) 20 (15.2%) \n 4 12 (9.0%) 10 (7.5%) 8 (6.1%) \n Missing 0 0 0 \n 1 5 4 2 \n Not High 4 (3.0%) 1 (0.7%) 2 (1.5%) \n 1 0 0 0 \n 2 1 (0.7%) 1 (0.7%) 0 \n 3 0 2 (1.5%) 0 \n 4 0 0 0 \n Missing 0 0 0 \n 2 4 4 5 \n Not High 2 (1.5%) 3 (2.2%) 3 (2.3%) \n 1 1 (0.7%) 0 2 (1.5%) \n 2 0 0 0 \n 3 1 (0.7%) 0 0 \n 4 0 1 (0.7%) 0 \n Missing 0 0 0 \n 3 4 5 11 \n Not High 3 (2.2%) 1 (0.7%) 6 (4.5%) \n 1 0 1 (0.7%) 1 (0.8%) \n 2 1 (0.7%) 0 0 \n 3 0 2 (1.5%) 3 (2.3%) \n 4 0 1 (0.7%) 1 (0.8%) \n Missing 0 0 0 \n 4 2 5 1 \n Not High 0 3 (2.2%) 1 (0.8%) \n 1 0 0 0 \n 2 1 (0.7%) 1 (0.7%) 0 \n 3 0 0 0 \n 4 1 (0.7%) 1 (0.7%) 0 \n Missing 0 0 0 \n Missing 0 0 0 \n Not High 0 0 0 \n 1 0 0 0 \n 2 0 0 0 \n 3 0 0 0 \n 4 0 0 0 \n Missing 0 0 0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_shift_by_grade(\n label = \"Grade Laboratory Abnormality Table\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, subset = c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = \"ALT\"\n ),\n worst_flag_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"WGRLOVFL\", \"WGRLOFL\", \"WGRHIVFL\", \"WGRHIFL\")),\n selected = c(\"WGRHIFL\")\n ),\n worst_flag_indicator = choices_selected(\n value_choices(ADLB, \"WGRLOVFL\"),\n selected = \"Y\", fixed = TRUE\n ),\n anl_toxgrade_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"ATOXGR\")),\n selected = c(\"ATOXGR\"),\n fixed = TRUE\n ),\n base_toxgrade_var = choices_selected(\n choices = variable_choices(ADLB, subset = c(\"BTOXGR\")),\n selected = c(\"BTOXGR\"),\n fixed = TRUE\n ),\n add_total = FALSE\n )\n ),\n filter = teal_slices(teal_slice(\"ADSL\", \"SAFFL\", selected = \"Y\"))\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:55:03 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 tern_0.9.3.9028 \n [9] rtables_0.6.6.9011 magrittr_2.0.3 \n[11] formatters_0.5.5.9018 dplyr_1.1.4 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 \n [4] webshot2_0.1.1 shinyjs_2.1.0 promises_1.2.1 \n [7] digest_0.6.35 estimability_1.5 mime_0.12 \n[10] tern.gee_0.1.3.9004 lifecycle_1.0.4 ellipsis_0.3.2 \n[13] survival_3.5-8 processx_3.8.4 compiler_4.3.3 \n[16] sass_0.4.9 rlang_1.1.3 tools_4.3.3 \n[19] utf8_1.2.4 yaml_2.3.8 knitr_1.45 \n[22] htmlwidgets_1.6.4 websocket_1.4.1 multcomp_1.4-25 \n[25] withr_3.0.0 purrr_1.0.2 shinyWidgets_0.8.2 \n[28] geepack_1.3.10 grid_4.3.3 fansi_1.0.6 \n[31] teal.logger_0.2.0.9001 xtable_1.8-4 colorspace_2.1-0 \n[34] ggplot2_3.5.0 emmeans_1.10.0 scales_1.3.0 \n[37] MASS_7.3-60.0.1 cli_3.6.2 mvtnorm_1.2-4 \n[40] rmarkdown_2.26 generics_0.1.3 cachem_1.0.8 \n[43] chromote_0.2.0 splines_4.3.3 formatR_1.14 \n[46] vctrs_0.6.5 webshot_0.5.5 Matrix_1.6-5 \n[49] sandwich_3.1-0 jsonlite_1.8.8 callr_3.7.5 \n[52] teal.widgets_0.4.2.9009 testthat_3.2.1 fontawesome_0.5.2 \n[55] jquerylib_0.1.4 tidyr_1.3.1 glue_1.7.0 \n[58] ps_1.7.6 codetools_0.2-19 stringi_1.8.3 \n[61] gtable_0.3.4 later_1.3.2 shinycssloaders_1.0.0 \n[64] munsell_0.5.0 tibble_3.2.1 logger_0.3.0 \n[67] pillar_1.9.0 htmltools_0.5.7 brio_1.1.4 \n[70] R6_2.5.1 Rdpack_2.6 evaluate_0.23 \n[73] lattice_0.22-6 rbibutils_2.2.16 backports_1.4.1 \n[76] memoise_2.0.1 broom_1.0.5 teal.reporter_0.3.1.9002\n[79] bslib_0.6.1 httpuv_1.6.14 Rcpp_1.0.12 \n[82] shinyvalidate_0.1.3 coda_0.19-4.1 nlme_3.1-164 \n[85] checkmate_2.3.1 xfun_0.42 zoo_1.8-12 \n[88] forcats_1.0.0 pkgconfig_2.0.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Medical History", - "MHL01" + "Tables", + "Lab Results", + "LBT14" ] }, { - "objectID": "listings/lab-results/lbl02a.html", - "href": "listings/lab-results/lbl02a.html", - "title": "LBL02A", + "objectID": "tables/lab-results/lbt10.html", + "href": "tables/lab-results/lbt10.html", + "title": "LBT10", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_x <- adlb %>%\n filter(\n ANRIND %in% c(\"LOW\", \"HIGH\"),\n !ATOXGR %in% c(\"0\", \"\"),\n LBTEST != \"\"\n ) %>%\n mutate(\n LBTEST_U = paste0(LBTEST, \" (\", AVALU, \")\"),\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n ADTM = toupper(format(as.Date(ADTM), \"%d%b%Y\")),\n AVAL = format(round(AVAL, 1), nsmall = 1),\n LBNRNG = paste(format(round(ANRLO, 1), nsmall = 1), format(round(ANRHI, 1), nsmall = 1), sep = \" - \"),\n ANRIND_GR = factor(\n case_when(\n ANRIND == \"LOW\" ~ paste0(\"L\", sub(\"-\", \"\", ATOXGR)),\n ANRIND == \"HIGH\" ~ paste0(\"H\", ATOXGR)\n )\n )\n ) %>%\n select(LBTEST_U, TRT01A, CPID, ADY, ADTM, AVAL, ADY, LBNRNG, ANRIND_GR) %>%\n unique() %>%\n arrange(CPID, ADY) %>%\n group_by(LBTEST_U, CPID) %>%\n mutate(DLD = ADY - lag(ADY)) %>%\n ungroup() %>%\n mutate(DLD = ifelse(is.na(DLD), 0, DLD))\n\nout <- adlb_x %>%\n select(LBTEST_U, TRT01A, CPID, ADY, ADTM, DLD, AVAL, LBNRNG, ANRIND_GR)\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n LBTEST_U = \"Lab Test (Unit)\",\n TRT01A = \"Treatment\",\n CPID = \"Center/Patient ID\",\n ADY = \"Study\\nDay\",\n ADTM = \"Date\",\n DLD = \"Days Since\\nLast Dose of\\nStudy Drug\",\n AVAL = \"Result\",\n LBNRNG = \"Lab Normal\\nRange\",\n ANRIND_GR = \"NCI\\nCTCAE\\nGrade\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"LBTEST_U\", \"CPID\"),\n disp_cols = names(out),\n main_title = \"Listing of Laboratory Abnormalities Defined by NCI CTCAE Grade >= 1\",\n main_footer = \"NCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Laboratory Abnormalities Defined by NCI CTCAE Grade >= 1\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Days Since NCI \n Study Last Dose of Lab Normal CTCAE\nTreatment Lab Test (Unit) Center/Patient ID Day Date Study Drug Result Range Grade\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X Alanine Aminotransferase Measurement (U/L) BRA-1/id-105 80 27MAY2020 0 4.3 7.0 - 55.0 L4 \n 398 10APR2021 318 3.7 7.0 - 55.0 L3 \n BRA-1/id-93 207 13JAN2021 0 6.1 7.0 - 55.0 L1 \n BRA-11/id-397 326 19MAY2021 0 1.5 7.0 - 55.0 L1 \n BRA-14/id-23 594 22JUN2021 0 0.6 7.0 - 55.0 L1 \n BRA-2/id-296 281 30OCT2021 0 2.6 7.0 - 55.0 L1 \n 734 26JAN2023 453 3.9 7.0 - 55.0 L1 \n CAN-1/id-18 465 12APR2022 0 1.8 7.0 - 55.0 L2 \n CHN-1/id-133 127 13DEC2020 0 5.6 7.0 - 55.0 L2 \n 197 21FEB2021 70 1.2 7.0 - 55.0 L4 \n CHN-1/id-199 277 11OCT2020 0 5.3 7.0 - 55.0 L4 \n 672 10NOV2021 395 6.8 7.0 - 55.0 L2 \n CHN-1/id-235 348 25JUN2020 0 3.0 7.0 - 55.0 L3 \n 381 28JUL2020 33 4.7 7.0 - 55.0 L1 \n CHN-1/id-26 905 07JAN2023 0 1.1 7.0 - 55.0 L1 \n CHN-1/id-275 364 01JUN2021 0 5.1 7.0 - 55.0 L2 \n CHN-1/id-277 483 12MAY2022 0 1.1 7.0 - 55.0 L4 \n CHN-1/id-287 182 23MAY2020 0 5.9 7.0 - 55.0 L2 \n 191 01JUN2020 9 5.3 7.0 - 55.0 L3 \n 515 21APR2021 324 2.9 7.0 - 55.0 L4 \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:52 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 pkgconfig_2.0.3 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Selecting Sections\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadhy <- synthetic_cdisc_dataset(\"latest\", \"adhy\")\n\nadhy_liver <- adhy %>%\n filter(PARAMCD %in% c(\n \"BL2AL2CU\", \"BL2AS2CU\", \"BG2AL2CU\", \"BG2AS2CU\", \"B2A2L2CU\", \"B2A2S2CU\", \"B2A5L2CU\", \"B2A5S2CU\"\n )) %>%\n mutate(PARAMCAT = case_when(\n PARAMCD %in% c(\"BL2AL2CU\", \"BL2AS2CU\") ~ \"Total Bilirubin <= 2xULN\",\n PARAMCD %in% c(\"BG2AL2CU\", \"BG2AS2CU\") ~ \"Total Bilirubin > 2xULN\",\n PARAMCD %in% c(\"B2A2L2CU\", \"B2A2S2CU\") ~ \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 2xULN\",\n PARAMCD %in% c(\"B2A5L2CU\", \"B2A5S2CU\") ~ \"Total Bilirubin > 2xULN and Alkaline Phosphatase <= 5xULN\"\n )) %>%\n mutate(AVALC_FORMAT = case_when(\n PARAMCD %in% c(\"BL2AL2CU\", \"BG2AL2CU\", \"B2A2L2CU\", \"B2A5L2CU\") & AVALC == \"Y\" ~ \"ALT >3xULN at 2 Visits\",\n PARAMCD %in% c(\"BL2AS2CU\", \"BG2AS2CU\", \"B2A2S2CU\", \"B2A5S2CU\") & AVALC == \"Y\" ~ \"AST >3xULN at 2 Visits\",\n TRUE ~ \"Criteria not met\"\n ))\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nanl <- df_explicit_na(adhy_liver)\n\n\n\n\n\nCodetbl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_rows_by(\"PARAMCAT\") %>%\n split_rows_by(\"PARAM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\n vars = \"AVALC_FORMAT\",\n .stats = c(\"fraction\"),\n denom = \"n\",\n drop = TRUE\n ) %>%\n build_table(anl, alt_counts_df = adsl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- tbl %>% trim_rows(criteria = criteria_fun)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3xULN at 2 Visits 20/134 (14.9%) 21/134 (15.7%) 20/132 (15.2%)\n AST >3xULN at 2 Visits 30/134 (22.4%) 25/134 (18.7%) 27/132 (20.5%)\nTotal Bilirubin > 2xULN \n ALT >3xULN at 2 Visits 24/134 (17.9%) 32/134 (23.9%) 24/132 (18.2%)\n AST >3xULN at 2 Visits 33/134 (24.6%) 29/134 (21.6%) 25/132 (18.9%)\n\n\n\n\n\nCodetbl2 <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARMCD\") %>%\n split_rows_by(\"PARAMCAT\", split_fun = remove_split_levels(\"Total Bilirubin > 2xULN\")) %>%\n split_rows_by(\"PARAM\", split_fun = drop_split_levels, child_labels = \"hidden\") %>%\n count_occurrences(\n vars = \"AVALC_FORMAT\",\n .stats = c(\"fraction\"),\n denom = \"n\",\n drop = TRUE\n ) %>%\n build_table(anl, alt_counts_df = adsl)\n\ncriteria_fun <- function(tr) {\n row_label <- obj_label(tr)\n ifelse(row_label == \"Criteria not met\", TRUE, FALSE)\n}\n\nresult <- tbl2 %>% trim_rows(criteria = criteria_fun)\nresult\n\n ARM A ARM B ARM C \n (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————\nTotal Bilirubin <= 2xULN \n ALT >3xULN at 2 Visits 20/134 (14.9%) 21/134 (15.7%) 20/132 (15.2%)\n AST >3xULN at 2 Visits 30/134 (22.4%) 25/134 (18.7%) 27/132 (20.5%)\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:55:25 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", + "Tables", "Lab Results", - "LBL02A" + "LBT10" ] }, { - "objectID": "listings/lab-results/lbl01.html", - "href": "listings/lab-results/lbl01.html", - "title": "LBL01", + "objectID": "tables/lab-results/lbt02.html", + "href": "tables/lab-results/lbt02.html", + "title": "LBT02", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(rlistings)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_x <- adlb %>%\n filter(!is.na(AVAL) & !is.na(LBSEQ) & !is.na(ADY) & ANRIND != \"\") %>%\n mutate(\n CPID = paste(SITEID, SUBJID, sep = \"/\"),\n PARAM_U = paste0(PARAMCD, \"\\n(\", AVALU, \" / NCI CTCAE grade)\"),\n ANRIND = factor(\n case_when(\n ANRIND == \"LOW\" ~ \"L\",\n ANRIND == \"HIGH\" ~ \"H\",\n TRUE ~ as.character(ANRIND)\n ),\n levels = c(\"\", \"H\", \"L\", \"NORMAL\")\n ),\n AVALC = as.character(format(round(AVAL, 2), nsmall = 2))\n ) %>%\n mutate(AVAL_GR = ifelse(\n !ANRIND %in% c(\"H\", \"L\"),\n AVALC,\n paste(AVALC, paste0(ANRIND, sub(\"-\", \"\", ATOXGR)), sep = \" / \")\n )) %>%\n select(CPID, TRT01A, ADY, LBSEQ, PARAM_U, AVAL_GR) %>%\n unique()\n\nout <- adlb_x %>%\n arrange(CPID, ADY, PARAM_U, LBSEQ) %>%\n tidyr::pivot_wider(\n id_cols = c(TRT01A, CPID, ADY),\n names_from = PARAM_U,\n values_from = AVAL_GR\n ) %>%\n group_by(CPID) %>%\n mutate(DLD = ADY - lag(ADY)) %>%\n ungroup() %>%\n select(CPID, TRT01A, ADY, DLD, unique(adlb_x$PARAM_U))\n\nvar_labels(out) <- names(out)\nout <- out %>%\n var_relabel(\n TRT01A = \"Treatment\",\n CPID = \"Center/Patient ID\",\n ADY = \"Study\\nDay\",\n DLD = \"Days Since\\nLast Dose of\\nStudy Drug\"\n )\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"TRT01A\", \"CPID\"),\n disp_cols = names(out),\n main_title = \"Listing of Laboratory Test Results\",\n main_footer = \"NCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\"\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Laboratory Test Results\n\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n Days Since \n Study Last Dose of ALT CRP IGA \nTreatment Center/Patient ID Day Study Drug (U/L / NCI CTCAE grade) (mg/L / NCI CTCAE grade) (g/L / NCI CTCAE grade)\n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\nA: Drug X BRA-1/id-105 80 NA 4.30 / L4 9.09 2.84 \n 149 69 24.70 9.15 2.93 \n 314 165 24.87 10.89 / H2 2.66 \n 398 84 3.67 / L3 8.14 2.86 \n 470 72 18.55 10.59 / H3 2.88 \n 528 58 7.73 10.09 / H3 2.93 \n 535 7 23.51 9.20 2.88 \n BRA-1/id-134 225 NA 7.37 10.46 / H1 2.86 \n 227 2 16.42 7.43 / L1 2.76 \n 255 28 11.16 9.41 2.75 \n 269 14 15.89 10.02 / H4 2.84 \n 357 88 24.35 8.01 2.86 \n 436 79 16.03 8.51 2.98 \n 440 4 17.21 7.63 / L3 2.78 \n BRA-1/id-42 176 NA 16.56 8.88 2.75 \n 477 301 16.49 8.11 2.95 \n 534 57 18.71 8.78 2.95 \n 550 16 11.44 9.53 2.99 \n 569 19 21.66 10.32 / H2 3.00 / H1 \n 608 39 24.61 7.95 / L2 2.78 \n———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n\nNCI CTCAE grade is displayed as abnormal high (H) or low (L) followed by the grade.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:53:59 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 purrr_1.0.2 generics_0.1.3 \n [9] jsonlite_1.8.8 glue_1.7.0 backports_1.4.1 htmltools_0.5.7 \n[13] brio_1.1.4 fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 \n[17] evaluate_0.23 fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 \n[21] compiler_4.3.3 codetools_0.2-19 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] pkgconfig_2.0.3 tidyr_1.3.1 digest_0.6.35 R6_2.5.1 \n[29] tidyselect_1.2.1 utf8_1.2.4 pillar_1.9.0 magrittr_2.0.3 \n[33] checkmate_2.3.1 withr_3.0.0 tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nteal App\nReproducibility\n\n\n\n\nCode# Preparation of an illustrative dataset\nlibrary(scda)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_labels <- var_labels(adlb)\n\n# For illustration purposes, the example focuses on ALT\n# Measurements starting from baseline and excluding all screening visits\nadlb <- subset(adlb, AVISIT != \"SCREENING\" & PARAMCD == \"ALT\")\nadlb$AVISIT <- droplevels(adlb$AVISIT)\n\nvar_labels(adlb) <- adlb_labels\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\n\n\n\n\nCode# Define the split function\nsplit_fun <- drop_split_levels\n\nl <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(var = \"ARM\") %>%\n add_overall_col(\"All Patients\") %>%\n split_rows_by(\n var = \"AVISIT\",\n split_fun = split_fun,\n label_pos = \"topleft\",\n split_label = obj_label(adlb$AVISIT)\n ) %>%\n analyze_vars(vars = \"AVAL\")\n\nresult <- build_table(l,\n df = adlb,\n alt_counts_df = adsl\n)\nresult\n\n A: Drug X B: Placebo C: Combination All Patients\nAnalysis Visit (N=134) (N=134) (N=132) (N=400) \n——————————————————————————————————————————————————————————————————————————\nBASELINE \n n 134 134 132 400 \n Mean (SD) 17.7 (9.9) 18.7 (9.8) 19.5 (9.1) 18.6 (9.6) \n Median 17.5 18.2 19.0 18.0 \n Min - Max 0.0 - 44.1 1.5 - 54.4 0.6 - 39.8 0.0 - 54.4 \nWEEK 1 DAY 8 \n n 134 134 132 400 \n Mean (SD) 16.8 (9.1) 18.9 (9.2) 19.6 (9.3) 18.4 (9.2) \n Median 16.0 18.2 19.0 18.0 \n Min - Max 0.1 - 36.3 0.7 - 39.9 0.9 - 44.7 0.1 - 44.7 \nWEEK 2 DAY 15 \n n 134 134 132 400 \n Mean (SD) 17.8 (9.6) 18.8 (9.7) 16.5 (8.2) 17.7 (9.2) \n Median 15.9 18.0 17.0 17.0 \n Min - Max 0.4 - 44.3 0.2 - 44.3 0.3 - 34.7 0.2 - 44.3 \nWEEK 3 DAY 22 \n n 134 134 132 400 \n Mean (SD) 18.4 (9.3) 17.6 (9.6) 16.8 (9.5) 17.6 (9.5) \n Median 18.1 17.7 15.1 17.2 \n Min - Max 0.6 - 41.7 0.0 - 38.6 0.5 - 39.2 0.0 - 41.7 \nWEEK 4 DAY 29 \n n 134 134 132 400 \n Mean (SD) 19.2 (11.0) 17.2 (10.6) 17.9 (9.3) 18.1 (10.3) \n Median 17.4 15.9 17.7 17.3 \n Min - Max 0.9 - 54.2 0.4 - 48.0 0.2 - 41.3 0.2 - 54.2 \nWEEK 5 DAY 36 \n n 134 134 132 400 \n Mean (SD) 19.2 (9.5) 18.0 (9.9) 18.5 (9.4) 18.6 (9.6) \n Median 19.8 18.3 19.3 19.0 \n Min - Max 0.0 - 43.4 0.1 - 40.6 0.0 - 37.5 0.0 - 43.4 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\n ADSL <- df_explicit_na(ADSL)\n ADLB <- df_explicit_na(ADLB)\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_t_summary_by(\n label = \"Laboratory Test Results by Visit\",\n dataname = \"ADLB\",\n arm_var = choices_selected(\n choices = variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n selected = \"ARM\"\n ),\n by_vars = choices_selected(\n # note: order matters here. If `PARAM` is first, the split will be first by `PARAM`and then by `AVISIT`\n choices = variable_choices(ADLB, c(\"PARAM\", \"AVISIT\")),\n selected = c(\"PARAM\", \"AVISIT\")\n ),\n summarize_vars = choices_selected(\n choices = variable_choices(ADLB, c(\"AVAL\")),\n selected = c(\"AVAL\")\n ),\n useNA = \"ifany\",\n paramcd = choices_selected(\n choices = value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n selected = \"ALT\"\n )\n )\n ),\n filter = teal_slices(teal_slice(\"ADLB\", \"AVAL\", selected = NULL))\n)\nshinyApp(app$ui, app$server)\n\nWarning: The 'plotly_relayout' event tied a source ID of\n'teal-main_ui-filter_panel-active-ADLB-filter-ADLB_AVAL-inputs-histogram_plot'\nis not registered. In order to obtain this event data, please add\n`event_register(p, 'plotly_relayout')` to the plot (`p`) that you wish to\nobtain event data from.\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:56:08 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] dplyr_1.1.4 teal.modules.clinical_0.9.0.9014\n [3] teal.transform_0.5.0.9004 teal_0.15.2.9020 \n [5] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 \n [7] teal.code_0.5.0.9004 shiny_1.8.0 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9018 \n[13] scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] fastmap_1.1.1 backports_1.4.1 ellipsis_0.3.2 \n[16] fontawesome_0.5.2 utf8_1.2.4 promises_1.2.1 \n[19] rmarkdown_2.26 ps_1.7.6 purrr_1.0.2 \n[22] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[25] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[28] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[31] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[34] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[37] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[40] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[43] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[46] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[49] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[52] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[55] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[58] plotly_4.10.4 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] lazyeval_0.2.2 tools_4.3.3 webshot2_0.1.1 \n[70] data.table_1.15.2 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 grid_4.3.3 tidyr_1.3.1 \n[76] rbibutils_2.2.16 colorspace_2.1-0 nlme_3.1-164 \n[79] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2 \n[82] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[85] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] httr_1.4.7 shinyWidgets_0.8.2 mime_0.12 \n[94] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", + "Tables", "Lab Results", - "LBL01" + "LBT02" ] }, { - "objectID": "listings/development-safety-update-report/dsur4.html", - "href": "listings/development-safety-update-report/dsur4.html", - "title": "DSUR4", + "objectID": "tables/lab-results/lbt05.html", + "href": "tables/lab-results/lbt05.html", + "title": "LBT05", "section": "", - "text": "Data Setup\nStandard Listing\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(rlistings)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\nout <- adsl %>%\n filter(DTHFL == \"Y\") %>%\n mutate(ID = paste(SITEID, SUBJID, sep = \"/\")) %>%\n select(ARM, ID, DTHCAUS)\ndeath_num <- length(unique(out$ID))\nvar_labels(out) <- c(\n ARM = \"Treatment Group\",\n ID = \"Center/Patient ID\",\n DTHCAUS = \"Cause of Death\"\n)\n\n\n\n\n\nCodelsting <- as_listing(\n out,\n key_cols = c(\"ARM\"),\n disp_cols = names(out),\n main_title = \"Listing of Patients Who Died During Reporting Period\",\n subtitles = paste(\"Number of patient deaths during reporting period =\", death_num)\n)\n\nsorting incoming data by key columns\n\nCodehead(lsting, 20)\n\nListing of Patients Who Died During Reporting Period\nNumber of patient deaths during reporting period = 70\n\n———————————————————————————————————————————————————————————————————\nTreatment Group Center/Patient ID Cause of Death \n———————————————————————————————————————————————————————————————————\n A: Drug X CHN-3/id-128 ADVERSE EVENT \n RUS-1/id-52 DISEASE PROGRESSION \n CHN-1/id-235 ADVERSE EVENT \n CHN-5/id-108 MISSING \n CHN-17/id-182 LOST TO FOLLOW UP \n BRA-11/id-217 ADVERSE EVENT \n CHN-15/id-14 DISEASE PROGRESSION \n CHN-2/id-274 SUICIDE \n USA-11/id-339 UNKNOWN \n BRA-15/id-36 DISEASE PROGRESSION \n CHN-1/id-199 DISEASE PROGRESSION \n CHN-2/id-272 DISEASE PROGRESSION \n CHN-1/id-123 DISEASE PROGRESSION \n CHN-12/id-258 SUICIDE \n CHN-17/id-92 LOST TO FOLLOW UP \n NGA-1/id-46 DISEASE PROGRESSION \n BRA-1/id-93 ADVERSE EVENT \n CHN-6/id-30 Post-study reporting of death\n CAN-11/id-139 ADVERSE EVENT \n GBR-1/id-319 ADVERSE EVENT \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:54:06 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] rlistings_0.2.7.9011 tibble_3.2.1 formatters_0.5.5.9016\n[4] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] vctrs_0.6.5 cli_3.6.2 knitr_1.45 rlang_1.1.3 \n [5] xfun_0.42 stringi_1.8.3 generics_0.1.3 jsonlite_1.8.8 \n [9] glue_1.7.0 backports_1.4.1 htmltools_0.5.7 brio_1.1.4 \n[13] fansi_1.0.6 rmarkdown_2.26 grid_4.3.3 evaluate_0.23 \n[17] fastmap_1.1.1 yaml_2.3.8 lifecycle_1.0.4 compiler_4.3.3 \n[21] codetools_0.2-19 pkgconfig_2.0.3 htmlwidgets_1.6.4 testthat_3.2.1 \n[25] digest_0.6.35 R6_2.5.1 tidyselect_1.2.1 utf8_1.2.4 \n[29] pillar_1.9.0 magrittr_2.0.3 checkmate_2.3.1 withr_3.0.0 \n[33] tools_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Table\nTable Showing All Categories\nTable with Study-Specific MLAs\nTable of Lab Abnormalities Showing All Categories But Only for Parameter Codes with At Least One Abnormality\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.\nadsl <- df_explicit_na(adsl)\nadlb <- df_explicit_na(adlb)\n\nqntls <- adlb %>%\n group_by(PARAMCD) %>%\n summarise(as_tibble(t(quantile(AVAL, probs = c(0.1, 0.9)))), .groups = \"drop_last\") %>%\n rename(q1 = 2, q2 = 3)\n\nadlb <- adlb %>%\n left_join(qntls, by = \"PARAMCD\")\n\nset.seed(1)\n\n# Modify ANRIND and create AVALCAT1/PARCAT2\n# PARCAT2 is just used for filtering, but in order to be the\n# filtering as realistic as possible, will create the variable.\nadlb <- adlb %>%\n mutate(\n ANRIND = factor(\n case_when(\n ANRIND == \"LOW\" & AVAL <= q1 ~ \"LOW LOW\",\n ANRIND == \"HIGH\" & AVAL >= q2 ~ \"HIGH HIGH\",\n TRUE ~ as.character(ANRIND)\n ),\n levels = c(\"\", \"HIGH\", \"HIGH HIGH\", \"LOW\", \"LOW LOW\", \"NORMAL\")\n ),\n AVALCAT1 = factor(\n case_when(\n ANRIND %in% c(\"HIGH HIGH\", \"LOW LOW\") ~\n sample(x = c(\"LAST\", \"REPLICATED\", \"SINGLE\"), size = n(), replace = TRUE, prob = c(0.3, 0.6, 0.1)),\n TRUE ~ \"\"\n ),\n levels = c(\"\", c(\"LAST\", \"REPLICATED\", \"SINGLE\"))\n ),\n PARCAT2 = factor(ifelse(ANRIND %in% c(\"HIGH HIGH\", \"LOW LOW\"), \"LS\",\n sample(c(\"SI\", \"CV\", \"LS\"), size = n(), replace = TRUE)\n ))\n ) %>%\n select(-q1, -q2)\n\n# Pre-processing steps\nadlb_f <- adlb %>%\n filter(ONTRTFL == \"Y\" & PARCAT2 == \"LS\" & SAFFL == \"Y\" & !is.na(AVAL)) %>%\n mutate(abn_dir = factor(case_when(\n ANRIND == \"LOW LOW\" ~ \"Low\",\n ANRIND == \"HIGH HIGH\" ~ \"High\",\n TRUE ~ \"\"\n ), levels = c(\"Low\", \"High\", \"\"))) %>%\n df_explicit_na()\n\n# Construct analysis map\nmap <- expand.grid(\n PARAM = levels(adlb$PARAM),\n abn_dir = c(\"Low\", \"High\"),\n stringsAsFactors = FALSE\n) %>%\n arrange(PARAM, desc(abn_dir))\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n label_pos = \"topleft\",\n split_label = \"Laboratory Test\"\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = \"unique_count\") %>%\n split_rows_by(\"abn_dir\", split_fun = trim_levels_to_map(map)) %>%\n count_abnormal_by_marked(\n var = \"AVALCAT1\",\n variables = list(id = \"USUBJID\", param = \"PARAM\", direction = \"abn_dir\")\n ) %>%\n append_topleft(\" Direction of Abnormality\")\n\nresult <- build_table(lyt, df = adlb_f, alt_counts_df = adsl)\n\nhas_lbl <- function(lbl) CombinationFunction(function(tr) obj_label(tr) == lbl || sum(unlist(row_values(tr))) != 0)\nresult <- prune_table(result, keep_rows(has_lbl(\"Any Abnormality\")))\n\nresult\n\nLaboratory Test A: Drug X B: Placebo C: Combination\n Direction of Abnormality (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement (n) 125 120 125 \n Low \n Single, not last 3 (2.4%) 5 (4.2%) 5 (4%) \n Last or replicated 52 (41.6%) 59 (49.2%) 44 (35.2%) \n Any Abnormality 55 (44%) 64 (53.3%) 49 (39.2%) \n High \n Any Abnormality 0 0 0 \nC-Reactive Protein Measurement (n) 129 130 121 \n Low \n Single, not last 3 (2.3%) 7 (5.4%) 6 (5%) \n Last or replicated 59 (45.7%) 50 (38.5%) 49 (40.5%) \n Any Abnormality 62 (48.1%) 57 (43.8%) 55 (45.5%) \n High \n Single, not last 5 (3.9%) 4 (3.1%) 2 (1.7%) \n Last or replicated 49 (38%) 54 (41.5%) 45 (37.2%) \n Any Abnormality 54 (41.9%) 58 (44.6%) 47 (38.8%) \nImmunoglobulin A Measurement (n) 129 122 121 \n Low \n Any Abnormality 0 0 0 \n High \n Single, not last 4 (3.1%) 6 (4.9%) 3 (2.5%) \n Last or replicated 48 (37.2%) 47 (38.5%) 55 (45.5%) \n Any Abnormality 52 (40.3%) 53 (43.4%) 58 (47.9%) \n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n label_pos = \"topleft\",\n split_label = \"Laboratory Test\"\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = \"unique_count\") %>%\n split_rows_by(\"abn_dir\", split_fun = trim_levels_to_map(map)) %>%\n count_abnormal_by_marked(\n var = \"AVALCAT1\",\n variables = list(id = \"USUBJID\", param = \"PARAM\", direction = \"abn_dir\")\n ) %>%\n append_topleft(\" Direction of Abnormality\")\n\nresult <- build_table(lyt, df = adlb_f, alt_counts_df = adsl)\n\nresult\n\nLaboratory Test A: Drug X B: Placebo C: Combination\n Direction of Abnormality (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement (n) 125 120 125 \n Low \n Single, not last 3 (2.4%) 5 (4.2%) 5 (4%) \n Last or replicated 52 (41.6%) 59 (49.2%) 44 (35.2%) \n Any Abnormality 55 (44%) 64 (53.3%) 49 (39.2%) \n High \n Single, not last 0 0 0 \n Last or replicated 0 0 0 \n Any Abnormality 0 0 0 \nC-Reactive Protein Measurement (n) 129 130 121 \n Low \n Single, not last 3 (2.3%) 7 (5.4%) 6 (5%) \n Last or replicated 59 (45.7%) 50 (38.5%) 49 (40.5%) \n Any Abnormality 62 (48.1%) 57 (43.8%) 55 (45.5%) \n High \n Single, not last 5 (3.9%) 4 (3.1%) 2 (1.7%) \n Last or replicated 49 (38%) 54 (41.5%) 45 (37.2%) \n Any Abnormality 54 (41.9%) 58 (44.6%) 47 (38.8%) \nImmunoglobulin A Measurement (n) 129 122 121 \n Low \n Single, not last 0 0 0 \n Last or replicated 0 0 0 \n Any Abnormality 0 0 0 \n High \n Single, not last 4 (3.1%) 6 (4.9%) 3 (2.5%) \n Last or replicated 48 (37.2%) 47 (38.5%) 55 (45.5%) \n Any Abnormality 52 (40.3%) 53 (43.4%) 58 (47.9%) \n\n\n\n\n\nCode# This variant reflects user modifications made to the laboratory analysis data set related to\n# Safety Lab Standardization metadata.\n# There is no unique layout level variation.\n\n\n\n\n\nCodelyt <- basic_table(show_colcounts = TRUE) %>%\n split_cols_by(\"ACTARM\") %>%\n split_rows_by(\n \"PARAM\",\n label_pos = \"topleft\",\n split_label = \"Laboratory Test\",\n split_fun = trim_levels_in_group(\"abn_dir\", drop_outlevs = TRUE)\n ) %>%\n summarize_num_patients(var = \"USUBJID\", .stats = \"unique_count\") %>%\n split_rows_by(\"abn_dir\") %>%\n count_abnormal_by_marked(\n var = \"AVALCAT1\",\n variables = list(id = \"USUBJID\", param = \"PARAM\", direction = \"abn_dir\")\n ) %>%\n append_topleft(\" Direction of Abnormality\")\n\nresult <- build_table(lyt, df = adlb_f, alt_counts_df = adsl)\n\nresult <- result %>% prune_table()\nresult\n\nLaboratory Test A: Drug X B: Placebo C: Combination\n Direction of Abnormality (N=134) (N=134) (N=132) \n———————————————————————————————————————————————————————————————————————————————————\nAlanine Aminotransferase Measurement (n) 125 120 125 \n Low \n Single, not last 3 (2.4%) 5 (4.2%) 5 (4%) \n Last or replicated 52 (41.6%) 59 (49.2%) 44 (35.2%) \n Any Abnormality 55 (44%) 64 (53.3%) 49 (39.2%) \nC-Reactive Protein Measurement (n) 129 130 121 \n Low \n Single, not last 3 (2.3%) 7 (5.4%) 6 (5%) \n Last or replicated 59 (45.7%) 50 (38.5%) 49 (40.5%) \n Any Abnormality 62 (48.1%) 57 (43.8%) 55 (45.5%) \n High \n Single, not last 5 (3.9%) 4 (3.1%) 2 (1.7%) \n Last or replicated 49 (38%) 54 (41.5%) 45 (37.2%) \n Any Abnormality 54 (41.9%) 58 (44.6%) 47 (38.8%) \nImmunoglobulin A Measurement (n) 129 122 121 \n High \n Single, not last 4 (3.1%) 6 (4.9%) 3 (2.5%) \n Last or replicated 48 (37.2%) 47 (38.5%) 55 (45.5%) \n Any Abnormality 52 (40.3%) 53 (43.4%) 58 (47.9%) \n\nCode# Another approach would be to create an empirical map by removing the ALT records\n# and use it in `trim_levels_to_map`.\n# this is an a posteriori approach, though.\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:56:31 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 \n[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] ggplot2_3.5.0 R6_2.5.1 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 stringi_1.8.3 \n[29] broom_1.0.5 xfun_0.42 cli_3.6.2 withr_3.0.0 \n[33] Rdpack_2.6 digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 \n[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ - "Listings", - "Development Safety Update Report", - "DSUR4" + "Tables", + "Lab Results", + "LBT05" ] }, { - "objectID": "graphs/pharmacokinetic/pkpg04.html", - "href": "graphs/pharmacokinetic/pkpg04.html", - "title": "PKPG04", + "objectID": "CODE_OF_CONDUCT.html#our-pledge", + "href": "CODE_OF_CONDUCT.html#our-pledge", + "title": "", + "section": "Our Pledge", + "text": "Our Pledge\nWe 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.\nWe pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community." + }, + { + "objectID": "CODE_OF_CONDUCT.html#our-standards", + "href": "CODE_OF_CONDUCT.html#our-standards", + "title": "", + "section": "Our Standards", + "text": "Our Standards\nExamples of behavior that contributes to a positive environment for our community include:\n\nDemonstrating empathy and kindness toward other people\nBeing respectful of differing opinions, viewpoints, and experiences\nGiving and gracefully accepting constructive feedback\nAccepting responsibility and apologizing to those affected by our mistakes, and learning from the experience\nFocusing on what is best not just for us as individuals, but for the overall community\n\nExamples of unacceptable behavior include:\n\nThe use of sexualized language or imagery, and sexual attention or advances of any kind\nTrolling, insulting or derogatory comments, and personal or political attacks\nPublic or private harassment\nPublishing others’ private information, such as a physical or email address, without their explicit permission\nOther conduct which could reasonably be considered inappropriate in a professional setting" + }, + { + "objectID": "CODE_OF_CONDUCT.html#enforcement-responsibilities", + "href": "CODE_OF_CONDUCT.html#enforcement-responsibilities", + "title": "", + "section": "Enforcement Responsibilities", + "text": "Enforcement Responsibilities\nCommunity 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.\nCommunity 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." + }, + { + "objectID": "CODE_OF_CONDUCT.html#scope", + "href": "CODE_OF_CONDUCT.html#scope", + "title": "", + "section": "Scope", + "text": "Scope\nThis 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." + }, + { + "objectID": "CODE_OF_CONDUCT.html#enforcement", + "href": "CODE_OF_CONDUCT.html#enforcement", + "title": "", + "section": "Enforcement", + "text": "Enforcement\nInstances 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.\nAll community leaders are obligated to respect the privacy and security of the reporter of any incident." + }, + { + "objectID": "CODE_OF_CONDUCT.html#enforcement-guidelines", + "href": "CODE_OF_CONDUCT.html#enforcement-guidelines", + "title": "", + "section": "Enforcement Guidelines", + "text": "Enforcement Guidelines\nCommunity leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:\n\n1. Correction\nCommunity Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.\nConsequence: 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.\n\n\n2. Warning\nCommunity Impact: A violation through a single incident or series of actions.\nConsequence: 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.\n\n\n3. Temporary Ban\nCommunity Impact: A serious violation of community standards, including sustained inappropriate behavior.\nConsequence: 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.\n\n\n4. Permanent Ban\nCommunity 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.\nConsequence: A permanent ban from any sort of public interaction within the community." + }, + { + "objectID": "CODE_OF_CONDUCT.html#attribution", + "href": "CODE_OF_CONDUCT.html#attribution", + "title": "", + "section": "Attribution", + "text": "Attribution\nThis 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.\nCommunity Impact Guidelines were inspired by Mozilla’s code of conduct enforcement ladder.\nFor 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." + }, + { + "objectID": "tlg-index.html", + "href": "tlg-index.html", + "title": "Index", "section": "", - "text": "Data Setup\nPlot of CMAX by Visit\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(ggrepel)\nlibrary(nestcolor)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\n\n\n\n\n\nCode# filtered parameter\nadpp <- adpp %>% filter(toupper(PARAMCD) == \"CMAX\" & toupper(PPSPEC) == \"PLASMA\")\n\nuse_title <- paste0(\"Boxplot of \", as.character(unique(adpp$PARAM)), \" by Visit\")\nuse_subtitle <- paste0(\n \"Analyte:\\nPK Parameter: \",\n as.character(unique(adpp$PARAM)),\n \" (\",\n as.character(unique(adpp$AVALU)),\n \")\"\n)\nuse_footnote <- \"Program: \\nOutput:\"\n\np <- ggplot(adpp, aes(x = AVISIT, y = AVAL, fill = ACTARM)) +\n geom_boxplot(outlier.size = 2) +\n stat_boxplot(geom = \"errorbar\") +\n stat_summary(geom = \"point\", fun = \"mean\", col = \"black\", size = 5, shape = 8, position = position_dodge(0.75)) +\n geom_text_repel(\n data = . %>% dplyr::group_by(AVISIT, ACTARM) %>% dplyr::filter(AVAL %in% boxplot.stats(AVAL)$out),\n aes(x = AVISIT, y = AVAL, label = SUBJID, color = ACTARM),\n size = 3, hjust = -0.2, position = position_dodge(0.75)\n ) +\n labs(\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n x = \"Visit\",\n y = paste0(as.character(unique(adpp$PARAM)), \" (\", as.character(unique(adpp$AVALU)), \")\")\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\nplot <- p + geom_point(aes(fill = ACTARM), size = 2, shape = 21, position = position_dodge(0.75))\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:54:18 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggrepel_0.9.5 ggplot2_3.5.0 \n[4] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 \n[7] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] utf8_1.2.4 generics_0.1.3 tidyr_1.3.1 lattice_0.22-6 \n [5] digest_0.6.35 evaluate_0.23 grid_4.3.3 fastmap_1.1.1 \n [9] jsonlite_1.8.8 Matrix_1.6-5 backports_1.4.1 brio_1.1.4 \n[13] survival_3.5-8 purrr_1.0.2 fansi_1.0.6 scales_1.3.0 \n[17] codetools_0.2-19 Rdpack_2.6 cli_3.6.2 rlang_1.1.3 \n[21] rbibutils_2.2.16 munsell_0.5.0 splines_4.3.3 withr_3.0.0 \n[25] yaml_2.3.8 tools_4.3.3 checkmate_2.3.1 colorspace_2.1-0 \n[29] broom_1.0.5 vctrs_0.6.5 R6_2.5.1 lifecycle_1.0.4 \n[33] htmlwidgets_1.6.4 pkgconfig_2.0.3 pillar_1.9.0 gtable_0.3.4 \n[37] glue_1.7.0 Rcpp_1.0.12 xfun_0.42 tibble_3.2.1 \n[41] tidyselect_1.2.1 knitr_1.45 farver_2.1.1 htmltools_0.5.7 \n[45] rmarkdown_2.26 labeling_0.4.3 testthat_3.2.1 compiler_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Tables\n\nADA\n        ADAT01 – Baseline Prevalence and Incidence of Treatment Emergent ADA\n        ADAT02 – Summary of Patients with Treatment-Induced ADA\n        ADAT03 – Summary of Serum Concentrations at Timepoints Where ADA Samples Were Collected and Analyzed\n        ADAT04A – Baseline Prevalence and Incidence of Treatment Emergent NAbs\n        ADAT04B – Baseline Prevalence and Incidence of NAbs\n\n\nAdverse Events\n        AET01 – Safety Summary\n        AET01_AESI – Safety Summary (Adverse Events of Special Interest)\n        AET02 – Adverse Events\n        AET02_SMQ – Adverse Events by Standardized MedDRA Query\n        AET03 – Adverse Events by Greatest Intensity\n        AET04 – Adverse Events by Highest NCI CTCAE Grade\n        AET04_PI – Adverse Events Reported in \\(\\geq\\) 10% of Patients by Highest NCI CTCAE Grade\n        AET05 – Adverse Event Rate Adjusted for Patient-Years at Risk – First Occurrence\n        AET05_ALL – Adverse Event Rate Adjusted for Patient-Years at Risk – All Occurrences\n        AET06 – Adverse Events by Baseline Characteristic\n        AET06_SMQ – Adverse Events by Baseline Characteristic, by SMQ and Preferred Term\n        AET07 – Adverse Events Resulting in Death\n        AET09 – Adverse Events Related to Study Drug\n        AET09_SMQ – Adverse Events Related to Study Drug by Standardized MedDRA Query\n        AET10 – Most Common (\\(\\geq\\) 5%) Adverse Events\n\n\nConcomitant Medications\n        CMT01 – Concomitant Medications (GNEDrug Legacy Coding)\n        CMT01A – Concomitant Medications by Medication Class and Preferred Name\n        CMT01B – Concomitant Medications by Medication Class and Preferred Name\n        CMT02_PT – Concomitant Medications by Preferred Name (WHODrug Coding)\n\n\nDeaths\n        DTHT01 – Deaths\n\n\nDemography\n        DMT01 – Demographics and Baseline Characteristics\n\n\nDisclosures\n        DISCLOSUREST01 – Disclosures Outputs\n        EUDRAT01 – Non-Serious Adverse Events Reported in \\(\\geq\\) 5% of Patients in Any Treatment Group – Patients and Events\n        EUDRAT02 – Serious Adverse Events, Fatal Serious Adverse Events, and Serious Adverse Events Related to Study Medication\n\n\nDisposition\n        DST01 – Patient Disposition\n        PDT01 – Major Protocol Deviations\n        PDT02 – Major Protocol Deviations Related to Epidemic/Pandemic\n\n\nECG\n        EGT01 – ECG Results and Change from Baseline by Visit\n        EGT02 – ECG Abnormalities (EGT02_1 & EGT02_2)\n        EGT03 – Shift Table of ECG Interval Data – Baseline Versus Minimum/Maximum Post-Baseline\n        EGT04 – Shift Table of Qualitative ECG Assessments\n        EGT05_QTCAT – ECG Actual Values and Changes from Baseline by Visit\n\n\nEfficacy\n        AOVT01 – ANCOVA for Multiple End Points\n        AOVT02 – ANCOVA with Single End Point and Customized Table\n        AOVT03 – ANCOVA with Consideration of Interaction\n        CFBT01 – Efficacy Data and Change from Baseline by Visit\n        CMHT01 – Cochran-Mantel-Haenszel (CMH) Summary\n        COXT01 – Cox Regression\n        COXT02 – Multivariable Cox Regression\n        DORT01 – Duration of Response\n        LGRT02 – Multi-Variable Logistic Regression\n        MMRMT01 – Tables for Mixed-Effect Model Repeated Measures Analysis\n        ONCT05 – Objective Response Rate by Subgroup\n        RATET01 – Event Rate Summary for Recurrent Events\n        RBMIT01 – Tables for RBMI\n        RSPT01 – Best Overall Response\n        TTET01 – Time-To-Event Summary\n\n\nExposure\n        EXT01 – Study Drug Exposure Table\n\n\nLab Results\n        LBT01 – Laboratory Test Results and Change from Baseline by Visit\n        LBT02 – Laboratory Test Results by Visit\n        LBT03 – Laboratory Test Results Change from Baseline by Visit\n        LBT04 – Laboratory Abnormalities Not Present at Baseline\n        LBT05 – Laboratory Abnormalities with Single and Replicated Marked\n        LBT06 – Laboratory Abnormalities by Visit and Baseline Status\n        LBT07 – Laboratory Test Results with Highest NCI CTCAE Grade Post-Baseline\n        LBT08 – Laboratory Test Results with Highest NCI CTCAE Grade at Any Time\n        LBT09 – Liver Laboratory Tests – Patients with Elevated Post-Baseline AST or ALT Levels\n        LBT10 – Liver Laboratory Tests – Patients with Elevated Post-Baseline AST or ALT Levels at Two Consecutive Visits (with Respect to ULN)\n        LBT10_BL – Liver Laboratory Tests – Patients with Elevated Post-Baseline AST or ALT Levels at Two Consecutive Visits (with Respect to Baseline)\n        LBT11 – Time to First Increase in Liver Laboratory Test Result Meeting Hy’s Law Laboratory Critieria (with Respect to ULN)\n        LBT11_BL – Time to First Increase in Liver Laboratory Test Result Meeting Hy’s Law Laboratory Critieria (with Respect to Baseline)\n        LBT12 – Liver Laboratory Tests by Time on Treatment – Patients with Elevated Post-Baseline AST or ALT Levels (with Respect to ULN)\n        LBT12_BL – Liver Laboratory Tests by Time on Treatment – Patients with Elevated Post-Baseline AST or ALT Levels (with Respect to Baseline)\n        LBT13 – NCI CTCAE Grade Laboratory Abnormalities by Visit and Baseline Grade\n        LBT14 – Laboratory Test Results Shift Table – Highest NCI CTCAE Grade Post-Baseline by Baseline NCI CTCAE Grade\n        LBT15 – Laboratory Test Shifts to NCI CTCAE Grade 3-4 Post-Baseline\n\n\nMedical History\n        MHT01 – Medical History\n\n\nPharmacokinetic\n        PKCT01 – Summary Concentration Table\n        PKPT02 – Pharmacokinetic Parameter Summary – Plasma/Serum/Blood PK Parameters (Stats in Rows)\n        PKPT03 – Pharmacokinetic Parameter Summary of Plasma by Treatment (Stats in Columns)\n        PKPT04 – Pharmacokinetic Parameter Summary – Urine PK Parameters (Stats in Rows)\n        PKPT05 – Summary of Urinary PK Parameters by Treatment Arm (Stats in Columns)\n        PKPT06 – Pharmacokinetic Parameter Summary – Dose-Normalized PK Parameters (Stats in Rows)\n        PKPT07 – Table of Mean Dose-Normalized Selected Pharmacokinetic Parameters (Stats in Columns)\n        PKPT08 – Pharmacokinetic Parameter Summary of Cumulative Amount of Drug Eliminated and Cumulative Percentage of Drug Recovered (Stats in Columns)\n        PKPT11 – Pharmacokinetic Parameter Estimated Ratios of Geometric Means and 90% Confidence Intervals for AUC and CMAX\n\n\nRisk Management Plan\n        RMPT01 – Duration of Exposure for Risk Management Plan\n        RMPT03 – Extent of Exposure by Age Group and Gender for Risk Management Plan\n        RMPT04 – Extent of Exposure by Ethnic Origin for Risk Management Plan\n        RMPT05 – Extent of Exposure by Race for Risk Management Plan\n        RMPT06 – Seriousness, Outcomes, Severity, Frequency with 95% CI for Risk Management Plan\n\n\nSafety\n        ENTXX – Enrollment Variants\n\n\nVital Signs\n        VST01 – Vital Sign Results and Change from Baseline by Visit\n        VST02 – Vital Sign Abnormalities\n\n\n\n\nListings\n\nADA\n        ADAL02 – Listing of Anti-Drug Antibody Data for Treatment Emergent ADA Positive Patients\n\n\nAdverse Events\n        AEL01 – Listing of Preferred Terms, Lowest Level Terms, and Investigator-Specified Adverse Event Terms\n        AEL01_NOLLT – Listing of Preferred Terms and Investigator-Specified Adverse Event Terms\n        AEL02 – Listing of Adverse Events\n        AEL02_ED – Listing of Adverse Events (for Early Development Studies)\n        AEL03 – Listing of Serious Adverse Events\n        AEL04 – Listing of Patient Deaths\n\n\nConcomitant Medications\n        CML01 – Listing of Previous and Concomitant Medications\n        CML02A_GL – Listing of Concomitant Medication Class Level 2, Preferred Name, and Investigator-Specified Terms\n        CML02B_GL – Listing of Concomitant Medication Class, Preferred Name, and Investigator-Specified Terms\n\n\nDisposition\n        DSL01 – Listing of Patients with Study Drug Withdrawn Due to Adverse Events\n        DSL02 – Listing of Patients Who Discontinued Early from Study\n\n\nDevelopment Safety Update Report\n        DSUR4 – Listing of Patients Who Died During Reporting Period\n\n\nECG\n        EGL01 – Listing of ECG Data: Safety-Evaluable Patients\n\n\nExposure\n        EXL01 – Listing of Exposure to Study Drug\n\n\nLab Results\n        LBL01 – Listing of Laboratory Test Results\n        LBL01_RLS – Listing of Laboratory Test Results Using Roche Safety Lab Standardization\n        LBL02A – Listing of Laboratory Abnormalities (constant units)\n        LBL02A_RLS – Listing of Laboratory Abnormalities Defined by Roche Safety Lab Standardization\n        LBL02B – Listing of Laboratory Abnormalities (variable units)\n\n\nMedical History\n        MHL01 – Listing of Medical History and Concurrent Diseases\n\n\nPharmacokinetic\n        PKCL01 – Listing of Drug A Concentration by Treatment Group, Patient and Nominal Time\n        PKCL02 – Listing of Drug A Urine Concentration and Volumes\n        PKPL01 – Listing of Drug A Plasma PK Parameters\n        PKPL02 – Listing of Drug A Urine PK Parameters\n        PKPL04 – Listing of Individual Drug A AUCIFO and CMAX Ratios Following Drug A or Drug B\n\n\nVital Signs\n        VSL01 – Listing of Vital Signs: Safety-Evaluable Patients\n\n\n\n\nGraphs\n\nEfficacy\n        FSTG01 – Subgroup Analysis of Best Overall Response\n        FSTG02 – Subgroup Analysis of Survival Duration\n        KMG01 – Kaplan-Meier Plot\n        MMRMG01 – Plots for Mixed-Effect Model Repeated Measures Analysis\n        MMRMG02 – Forest Plot for Mixed-Effect Model Repeated Measures\n\n\nPharmacokinetic\n        PKCG01 – Plot of PK Concentration Over Time by Subject\n        PKCG02 – Plot of PK Concentration Over Time by Cohort/Treatment Group/Dose\n        PKCG03 – Plot of Mean PK Concentration Over Time by Cohort\n        PKPG01 – Plot of Mean Cumulative Percentage (%) of Recovered Drug in Urine\n        PKPG02 – Pharmacokinetic Parameter Summary of Serum PK Parameters by Treatment\n        PKPG03 – Box Plot of Pharmacokinetic Parameters by Visit – Plasma\n        PKPG04 – Box Plot of Pharmacokinetic Parameters by Visit – Plasma\n        PKPG06 – Boxplot of Metabolite to Parent Ratios by Treatment\n\n\nOther\n        BRG01 – Bar Chart\n        BWG01 – Box Plot\n        CIG01 – Confidence Interval Plot\n        IPPG01 – Individual Patient Plot Over Time\n        LTG01 – Lattice Plot of Laboratory Tests by Treatment Group Over Time\n        MNG01 – Mean Plot", "crumbs": [ - "Graphs", - "Pharmacokinetic", - "PKPG04" + "Index" ] }, { - "objectID": "graphs/pharmacokinetic/pkcg02.html", - "href": "graphs/pharmacokinetic/pkcg02.html", - "title": "PKCG02", + "objectID": "graphs/other/bwg01.html", + "href": "graphs/other/bwg01.html", + "title": "BWG01", "section": "", - "text": "Data Setup\nPlot in Linear Scale\nPlot in Log Scale\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\")\n\n\n\n\n\n\nCodeadpc_a <- adpc %>%\n filter(\n PARAM == \"Plasma Drug X\",\n ARMCD == \"ARM A\"\n ) %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID)) %>%\n filter(Patient_ID %in% unique(Patient_ID)[1:10])\n\nuse_title1 <- \"Plot of X Concentration (ug/mL) Over Time by Treatment: \\nPK Evaluable Patients\"\nuse_subtitle1 <- \"Analyte: Plasma X (ug/mL) \\nTreatment Group: ARM A\"\nuse_footnote1 <- \"Program: \\nOutput:\"\n\nplot <- g_ipp(\n df = adpc_a,\n xvar = \"NFRLT\",\n yvar = \"AVAL\",\n xlab = \"Norminal Time from First Dose (hr)\",\n ylab = \"Concentration (ug/mL)\",\n id_var = \"Patient_ID\",\n add_baseline_hline = FALSE,\n yvar_baseline = \"AVAL\", # yvar_baseline cannot be NA or ignore\n title = use_title1,\n subtitle = use_subtitle1,\n caption = use_footnote1,\n plotting_choices = \"all_in_one\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeadpc_a <- adpc %>%\n filter(\n PARAM == \"Plasma Drug X\",\n ARMCD == \"ARM A\"\n ) %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID)) %>%\n mutate(avalog = ifelse(AVAL != 0, AVAL, 0.001)) %>%\n filter(Patient_ID %in% unique(Patient_ID)[1:10])\n\nuse_title3 <- \"Log-scale Plot of X Concentration (ug/mL) Over Time by Treatment: \\nPK Evaluable Patients\"\nuse_subtitle3 <- \"Analyte: Plasma X (ug/mL) \\nTreatment Group: ARM A\"\nuse_footnote3 <- \"Program: \\nOutput:\"\n\nresult <- g_ipp(\n df = adpc_a,\n xvar = \"NFRLT\",\n yvar = \"avalog\",\n xlab = \"Norminal Time from First Dose (hr)\",\n ylab = \"Concentration (ug/mL)\",\n id_var = \"Patient_ID\",\n add_baseline_hline = FALSE,\n yvar_baseline = \"AVAL\", # yvar_baseline cannot be NA or ignore\n title = use_title3,\n caption = use_footnote3,\n subtitle = use_subtitle3,\n plotting_choices = \"all_in_one\"\n)\nplot <- result + ggplot2::scale_y_log10(breaks = c(0.001, 0.01, 0.1, 1, 10), labels = c(0.001, 0.01, 0.1, 1, 10))\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:54:30 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 labeling_0.4.3 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 broom_1.0.5 xfun_0.42 \n[29] cli_3.6.2 withr_3.0.0 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 farver_2.1.1 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Plot\nPlot Changing Whiskers\nPlot Adding Outliers\nPlot Specifying Marker for Outliers and Adding Patient ID\nPlot Specifying Marker for Mean\nPlot by Treatment and Timepoint\nPlot by Timepoint and Treatment\nPlot with Table Section\nPlot with Number of Patients only in Table Section\nteal App\nReproducibility\n\n\n\n\nCode# generic code for all plots\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\nadlb <- adlb %>% filter(PARAMCD == \"ALT\" & AVISIT == \"WEEK 2 DAY 15\")\n\n# Definition of boxplot boundaries and whiskers\nfive_num <- function(x, probs = c(0, 0.25, 0.5, 0.75, 1)) {\n r <- quantile(x, probs)\n names(r) <- c(\"ymin\", \"lower\", \"middle\", \"upper\", \"ymax\")\n r\n}\n\n# get outliers based on quantile\n# for outliers based on IQR see coef in geom_boxplot\nget_outliers <- function(x, probs = c(0.05, 0.95)) {\n r <- subset(x, x < quantile(x, probs[1]) | quantile(x, probs[2]) < x)\n if (!is.null(x)) {\n x_names <- subset(names(x), x < quantile(x, probs[1]) | quantile(x, probs[2]) < x)\n names(r) <- x_names\n }\n r\n}\n\n# create theme used for all plots\ntheme_bp <- theme(\n plot.title = element_text(hjust = 0),\n plot.subtitle = element_text(hjust = 0),\n plot.caption = element_text(hjust = 0),\n panel.background = element_rect(fill = \"white\", color = \"grey50\")\n)\n\n# assign fill color and outline color\nfc <- \"#eaeef5\"\noc <- getOption(\"ggplot2.discrete.fill\")[1]\n\n# get plot metadata data to derive coordinates for adding annotations\nbp_annos <- function(bp, color, annos = 1) {\n bp_mdat <- ggplot_build(bp)$data[[1]]\n if (annos == 1) {\n bp <- bp +\n geom_segment(data = bp_mdat, aes(\n x = xmin + (xmax - xmin) / 4, xend = xmax - (xmax - xmin) / 4,\n y = ymax, yend = ymax\n ), linewidth = .5, color = color) +\n geom_segment(data = bp_mdat, aes(\n x = xmin + (xmax - xmin) / 4, xend = xmax - (xmax - xmin) / 4,\n y = ymin, yend = ymin\n ), linewidth = .5, color = color)\n } else {\n bp <- bp +\n geom_segment(data = bp_mdat, aes(\n x = xmin + (xmax - xmin) / 4, xend = xmax - (xmax - xmin) / 4,\n y = ymax, yend = ymax\n ), linewidth = .5, color = color) +\n geom_segment(data = bp_mdat, aes(\n x = xmin + (xmax - xmin) / 4, xend = xmax - (xmax - xmin) / 4,\n y = ymin, yend = ymin\n ), linewidth = .5, color = color) +\n geom_segment(data = bp_mdat, aes(\n x = xmin, xend = xmax,\n y = middle, yend = middle\n ), colour = color, linewidth = .5)\n }\n return(bp)\n}\n\n\n\n\n\nCodebp_1 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n stat_summary(geom = \"boxplot\", fun.data = five_num, fill = fc, color = oc) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 8) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n caption = \"The whiskers extend to the minimum and maximum values.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_1, oc)\nplot\n\n\n\n\n\n\n\n\n\n\nCodebp_3 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n stat_summary(\n geom = \"boxplot\", fun.data = five_num,\n fun.args = list(probs = c(0.05, 0.25, 0.5, 0.75, 0.95)), fill = fc, color = oc\n ) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 8) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n caption = \"The whiskers extend to the 5th and 95th percentile. Values outside the whiskers have not been plotted.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_3, oc)\nplot\n\n\n\n\n\n\n\n\n\n\nCodebp_4 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n stat_summary(\n geom = \"boxplot\", fun.data = five_num,\n fun.args = list(probs = c(0.05, 0.25, 0.5, 0.75, 0.95)), fill = fc, color = oc\n ) +\n stat_summary(geom = \"point\", fun = get_outliers, shape = 1) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 8) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n caption = \"The whiskers extend to the 5th and 95th percentile.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_4, oc)\nplot\n\n\n\n\n\n\n\n\n\n\nCodeadlb_o <- adlb %>%\n group_by(ARMCD) %>%\n mutate(OUTLIER = AVAL < quantile(AVAL, 0.01) | AVAL > quantile(AVAL, 0.99)) %>%\n filter(OUTLIER == TRUE) %>%\n select(ARMCD, AVAL, USUBJID)\n# Next step may be study-specific: shorten USUBJID to make annotation labels\n# next 2 lines of code split USUBJID by \"-\" and take the last syllable as ID\nn_split <- max(vapply(strsplit(adlb_o$USUBJID, \"-\"), length, numeric(1)))\nadlb_o$ID <- vapply(strsplit(adlb_o$USUBJID, \"-\"), `[[`, n_split, FUN.VALUE = \"a\")\n\nbp_5 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n stat_summary(\n geom = \"boxplot\", fun.data = five_num,\n fun.args = list(probs = c(0.01, 0.25, 0.5, 0.75, 0.99)), fill = fc, color = oc\n ) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 8) +\n geom_point(data = adlb_o, aes(x = ARMCD, y = AVAL), shape = 1) +\n geom_text(data = adlb_o, aes(x = ARMCD, y = AVAL, label = ID), size = 3, hjust = -0.2) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n caption = \"The whiskers extend to the largest and smallest observed value within 1.5*IQR.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_5, oc)\nplot\n\n\n\n\n\n\n\n\n\n\nCodebp_6 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n geom_boxplot(fill = fc, color = oc) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 5) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n caption = \"The whiskers extend to the minimum and maximum values.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_6, oc)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_v <- adlb %>%\n filter(PARAMCD == \"ALT\" & AVISIT %in% c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\", \"WEEK 3 DAY 22\", \"WEEK 4 DAY 29\"))\n\nbp_7 <- ggplot(adlb_v, aes(x = AVISIT, y = AVAL)) +\n stat_summary(\n geom = \"boxplot\",\n fun.data = five_num,\n position = position_dodge2(.5),\n aes(fill = ARMCD, color = ARMCD)\n ) +\n stat_summary(\n geom = \"point\",\n fun = mean,\n aes(group = ARMCD),\n size = 3,\n shape = 8,\n position = position_dodge2(1)\n ) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n caption = \"The whiskers extend to the minimum and maximum values.\",\n x = \"Visit\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_7, oc, 2)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodebp_8 <- ggplot(adlb_v, aes(x = ARMCD, y = AVAL)) +\n stat_summary(\n geom = \"boxplot\",\n fun.data = five_num,\n position = position_dodge2(width = .5),\n aes(fill = AVISIT, color = AVISIT)\n ) +\n stat_summary(\n geom = \"point\",\n fun = mean,\n aes(group = AVISIT),\n size = 3,\n shape = 8,\n position = position_dodge2(1)\n ) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n caption = \"The whiskers extend to the minimum and maximum values.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_8, oc, 2)\nplot\n\n\n\n\n\n\n\n\n\n\nCode# Make wide dataset with summary statistics\nadlb_wide <- adlb %>%\n group_by(ARMCD) %>%\n summarise(\n n = n(),\n mean = round(mean(AVAL), 1),\n median = round(median(AVAL), 1),\n median_ci = paste(round(DescTools::MedianCI(AVAL)[1:2], 1), collapse = \" - \"),\n q1_q3 = paste(round(quantile(AVAL, c(0.25, 0.75)), 1), collapse = \" - \"),\n min_max = paste0(round(min(AVAL), 1), \"-\", max(round(AVAL, 2)))\n )\n\n# Make long dataset\nadlb_long <- tidyr::gather(adlb_wide, key = type, value = stat, n:min_max)\nadlb_long <- adlb_long %>% mutate(\n type_lbl = case_when(\n type == \"n\" ~ \"n\",\n type == \"mean\" ~ \"Mean\",\n type == \"median\" ~ \"Median\",\n type == \"median_ci\" ~ \"95% CI for Median\",\n type == \"q1_q3\" ~ \"25% and 75%-ile\",\n type == \"min_max\" ~ \"Min - Max\"\n )\n)\nadlb_long$type_lbl <- factor(adlb_long$type_lbl,\n levels = c(\"Min - Max\", \"25% and 75%-ile\", \"95% CI for Median\", \"Median\", \"Mean\", \"n\")\n)\n\nbp_9 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n stat_summary(geom = \"boxplot\", fun.data = five_num, fill = fc, color = oc) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 8) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\ntbl_theme <- theme(\n panel.border = element_blank(),\n panel.grid.major = element_blank(),\n panel.grid.minor = element_blank(),\n axis.ticks = element_blank(),\n axis.title = element_blank(),\n axis.text.y = element_text(face = \"plain\"),\n axis.text.x = element_blank()\n)\n\ntbl_1 <- ggplot(adlb_long, aes(x = ARMCD, y = type_lbl, label = stat), vjust = 10) +\n geom_text(size = 3) +\n scale_y_discrete(labels = levels(adlb_long$type_lbl)) +\n theme_bw() +\n tbl_theme +\n labs(caption = \"The whiskers extend to the minimum and maximum values.\") +\n theme_bp\n\nplot <- ggpubr::ggarrange(bp_annos(bp_9, oc), tbl_1,\n heights = c(4, 2),\n ncol = 1, nrow = 2, align = \"v\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\nCodetbl_2 <- adlb_long %>%\n filter(type == \"n\") %>%\n ggplot(aes(x = ARMCD, y = type_lbl, label = stat)) +\n geom_text(size = 3) +\n scale_y_discrete(labels = \"n\") +\n theme_bw() +\n tbl_theme +\n labs(caption = \"The whiskers extend to the minimum and maximum values.\") +\n theme_bp\n\nplot <- ggpubr::ggarrange(bp_annos(bp_9, oc), tbl_2,\n heights = c(6, 1),\n ncol = 1, nrow = 2, align = \"v\"\n)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.general)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(tern)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n # If PARAMCD and AVISIT are not factors, convert to factors\n # Also fill in missing values with \"<Missing>\"\n ADLB <- ADLB %>%\n df_explicit_na(\n omit_columns = setdiff(names(ADLB), c(\"PARAMCD\", \"AVISIT\")),\n char_as_factor = TRUE\n )\n\n # If statment below fails, pre-process ADLB to be one record per\n # study, subject, param and visit eg. filter with ANLFL = 'Y'\n stopifnot(nrow(ADLB) == nrow(unique(ADLB[, c(\"STUDYID\", \"USUBJID\", \"PARAMCD\", \"AVISIT\")])))\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_bivariate(\n x = data_extract_spec(\n dataname = \"ADSL\",\n select = select_spec(\n label = \"Select variable:\",\n choices = names(ADSL),\n selected = \"ARMCD\",\n fixed = FALSE\n )\n ),\n y = data_extract_spec(\n dataname = \"ADLB\",\n filter = list(\n filter_spec(\n vars = c(\"PARAMCD\"),\n choices = levels(ADLB$PARAMCD),\n selected = levels(ADLB$PARAMCD)[1],\n multiple = FALSE,\n label = \"Choose lab parameter\"\n ),\n filter_spec(\n vars = c(\"AVISIT\"),\n choices = levels(ADLB$AVISIT),\n selected = levels(ADLB$AVISIT)[1],\n multiple = FALSE,\n label = \"Choose visit\"\n )\n ),\n select = select_spec(\n label = \"Select variable:\",\n choices = names(ADLB),\n selected = \"AVAL\",\n multiple = FALSE,\n fixed = TRUE\n )\n ),\n row_facet = data_extract_spec(\n dataname = \"ADLB\",\n select = select_spec(\n label = \"Select variables:\",\n choices = names(ADLB),\n selected = NULL,\n multiple = FALSE,\n fixed = FALSE\n )\n ),\n col_facet = data_extract_spec(\n dataname = \"ADLB\",\n select = select_spec(\n label = \"Select variables:\",\n choices = names(ADLB),\n selected = NULL,\n multiple = FALSE,\n fixed = FALSE\n )\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: Removed 8000 rows containing non-finite outside the scale range\n(`stat_boxplot()`).\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:57:28 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] tern_0.9.3.9028 rtables_0.6.6.9011 \n [3] magrittr_2.0.3 formatters_0.5.5.9018 \n [5] teal.modules.general_0.3.0.9006 teal.transform_0.5.0.9004 \n [7] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [9] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n[11] shiny_1.8.0 ggmosaic_0.3.3 \n[13] nestcolor_0.1.2.9009 ggplot2_3.5.0 \n[15] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] rstudioapi_0.15.0 jsonlite_1.8.8 farver_2.1.1 \n [4] rmarkdown_2.26 ragg_1.3.0 vctrs_0.6.5 \n [7] memoise_2.0.1 rstatix_0.7.2 webshot_0.5.5 \n [10] htmltools_0.5.7 forcats_1.0.0 broom_1.0.5 \n [13] cellranger_1.1.0 sass_0.4.9 bslib_0.6.1 \n [16] htmlwidgets_1.6.4 fontawesome_0.5.2 testthat_3.2.1 \n [19] rootSolve_1.8.2.4 plotly_4.10.4 cachem_1.0.8 \n [22] mime_0.12 lifecycle_1.0.4 teal.widgets_0.4.2.9009 \n [25] pkgconfig_2.0.3 webshot2_0.1.1 Matrix_1.6-5 \n [28] R6_2.5.1 fastmap_1.1.1 rbibutils_2.2.16 \n [31] digest_0.6.35 Exact_3.2 colorspace_2.1-0 \n [34] shinycssloaders_1.0.0 ps_1.7.6 textshaping_0.3.7 \n [37] ggpubr_0.6.0 labeling_0.4.3 fansi_1.0.6 \n [40] httr_1.4.7 abind_1.4-5 compiler_4.3.3 \n [43] proxy_0.4-27 withr_3.0.0 backports_1.4.1 \n [46] carData_3.0-5 logger_0.3.0 ggsignif_0.6.4 \n [49] MASS_7.3-60.0.1 gld_2.6.6 tools_4.3.3 \n [52] chromote_0.2.0 httpuv_1.6.14 shinyvalidate_0.1.3 \n [55] glue_1.7.0 callr_3.7.5 promises_1.2.1 \n [58] grid_4.3.3 checkmate_2.3.1 generics_0.1.3 \n [61] gtable_0.3.4 class_7.3-22 tidyr_1.3.1 \n [64] websocket_1.4.1 data.table_1.15.2 lmom_3.0 \n [67] car_3.1-2 utf8_1.2.4 ggrepel_0.9.5 \n [70] pillar_1.9.0 stringr_1.5.1 later_1.3.2 \n [73] splines_4.3.3 lattice_0.22-6 survival_3.5-8 \n [76] tidyselect_1.2.1 knitr_1.45 teal.logger_0.2.0.9001 \n [79] xfun_0.42 expm_0.999-9 brio_1.1.4 \n [82] stringi_1.8.3 lazyeval_0.2.2 yaml_2.3.8 \n [85] boot_1.3-30 shinyWidgets_0.8.2 evaluate_0.23 \n [88] codetools_0.2-19 tibble_3.2.1 cli_3.6.2 \n [91] xtable_1.8-4 DescTools_0.99.54 systemfonts_1.0.6 \n [94] Rdpack_2.6 munsell_0.5.0 processx_3.8.4 \n [97] jquerylib_0.1.4 Rcpp_1.0.12 teal.reporter_0.3.1.9002\n[100] readxl_1.4.3 ellipsis_0.3.2 viridisLite_0.4.2 \n[103] mvtnorm_1.2-4 scales_1.3.0 e1071_1.7-14 \n[106] purrr_1.0.2 rlang_1.1.3 cowplot_1.1.3 \n[109] formatR_1.14 shinyjs_2.1.0 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Pharmacokinetic", - "PKCG02" + "Other", + "BWG01" ] }, { - "objectID": "graphs/pharmacokinetic/pkcg03.html", - "href": "graphs/pharmacokinetic/pkcg03.html", - "title": "PKCG03", + "objectID": "graphs/other/brg01.html", + "href": "graphs/other/brg01.html", + "title": "BRG01", "section": "", - "text": "Data Setup\nPlot in Linear Scale\nPlot in Log Scale\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\nadsl_f <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>%\n filter(SAFFL == \"Y\" & ARM != \"B: Placebo\") %>%\n df_explicit_na()\n\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\") %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID)) %>%\n filter(PARAM == \"Plasma Drug X\") %>%\n droplevels() %>%\n df_explicit_na()\n\n\n\n\n\n\nCodeuse_title <- \"Plot of Mean (+/- SD) Plasma Concentrations Over Time by Treatment, \\nPK Evaluable Patients\"\nuse_subtitle <- \"Analyte:\"\nuse_footnote <- \"Program: \\nOutput:\"\n\nresult <- g_lineplot(\n df = adpc,\n variables = control_lineplot_vars(\n x = \"NFRLT\",\n y = \"AVAL\",\n group_var = \"ARM\",\n paramcd = \"PARAM\",\n y_unit = \"AVALU\",\n subject_var = \"USUBJID\"\n ),\n alt_counts_df = adsl_f,\n y_lab = \"Concentration\",\n y_lab_add_paramcd = FALSE,\n y_lab_add_unit = TRUE,\n interval = \"mean_sdi\",\n whiskers = c(\"mean_sdi_lwr\", \"mean_sdi_upr\"),\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n ggtheme = theme_nest()\n)\n\nplot <- result + theme(plot.caption = element_text(hjust = 0))\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeuse_title <- \"Plot of Mean (+/- SD) Log-Scale Plasma Concentrations Over Time by Treatment, \\nPK Evaluable Patients\"\nuse_subtitle <- \"Analyte:\"\nuse_footnote <- \"Program: \\nOutput:\"\n\nadpc <- adpc %>%\n mutate(avalog = ifelse(AVAL != 0, AVAL, 0.001))\n\nresult <- g_lineplot(\n df = adpc,\n variables = control_lineplot_vars(\n x = \"NFRLT\",\n y = \"avalog\",\n group_var = \"ARM\",\n paramcd = \"PARAM\",\n y_unit = \"AVALU\",\n subject_var = \"USUBJID\"\n ),\n alt_counts_df = adsl_f,\n y_lab = \"Concentration\",\n y_lab_add_paramcd = FALSE,\n y_lab_add_unit = TRUE,\n interval = \"mean_sdi\",\n whiskers = c(\"mean_sdi_lwr\", \"mean_sdi_upr\"),\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n ggtheme = theme_nest()\n)\n\nplot <- result + theme(plot.caption = element_text(hjust = 0)) +\n ggplot2::scale_y_log10(breaks = c(0.001, 0.01, 0.1, 1, 10), labels = c(0.001, 0.01, 0.1, 1, 10))\n\nScale for y is already present.\nAdding another scale for y, which will replace the existing scale.\n\nCodeplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:54:44 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9016\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 labeling_0.4.3 generics_0.1.3 knitr_1.45 \n[17] forcats_1.0.0 rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 \n[21] checkmate_2.3.1 tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 \n[25] rlang_1.1.3 utf8_1.2.4 testthat_3.2.1 broom_1.0.5 \n[29] xfun_0.42 cli_3.6.2 withr_3.0.0 Rdpack_2.6 \n[33] digest_0.6.35 grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 \n[37] evaluate_0.23 glue_1.7.0 farver_2.1.1 codetools_0.2-19 \n[41] survival_3.5-8 fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 \n[45] rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nPlot of Frequency\nPlot of Percentage\nPlot of Frequency with Total Number of Subjects\nPlot of Frequency with Horizontal Bars\nPlot of Percentage and Confidence Intervals\nPlot of Percentage by Treatment and Covariate\nPlot of Percentage by Covariate and Treatment\nPlot of Percentage with Mean and Median\nPlot of Categorical Variable\nteal App\nReproducibility\n\n\n\n\nCodelibrary(binom)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(scda)\nlibrary(tidyr)\nlibrary(tern)\nlibrary(nestcolor)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# filtered population\npatpop_df <- adsl %>%\n group_by(STUDYID) %>%\n summarise(patpop = n())\npatpop <- setNames(patpop_df$patpop, patpop_df$STUDYID)\ndenom <- patpop_df$patpop\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\") %>%\n mutate(AETOXGRC = as.character(AETOXGR))\nattributes(adae$AETOXGRC)$label <- \"Analysis Toxicity Grade (C)\"\nvl_ae <- var_labels(adae)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\nvl_lb <- var_labels(adlb)\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESER == \"Y\")\nanl <- anl[!duplicated(anl$USUBJID), ]\n\nplot <- ggplot(anl, aes(x = .data[[\"ACTARM\"]])) +\n geom_bar(fill = getOption(\"ggplot2.discrete.fill\")[1]) +\n geom_text(stat = \"count\", aes(label = ggplot2::after_stat(count)), vjust = -.5) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Frequency of Subjects With Serious AEs: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Frequency\")\nplot\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESOC == \"cl A\")\n\nanl <- anl[!duplicated(anl$USUBJID), ] %>%\n group_by(ACTARM) %>%\n summarise(n = n()) %>%\n mutate(N = patpop) %>%\n mutate(N = as.numeric(N)) %>%\n mutate(pct = round((n / N) * 100, 2))\n\nplot <- ggplot(anl, aes(x = .data[[\"ACTARM\"]])) +\n geom_col(aes(x = ACTARM, y = pct), fill = getOption(\"ggplot2.discrete.fill\")[1]) +\n scale_y_continuous(labels = scales::comma) +\n geom_text(aes(y = pct, label = pct), stat = \"identity\", vjust = -0.5) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects With cl A Disorders: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Percent\")\nplot\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESOC == \"cl A\")\nanl <- anl[!duplicated(anl$USUBJID), ]\n\nanl <- anl %>%\n group_by(ACTARM) %>%\n mutate(n = n()) %>%\n mutate(xvarlabel = paste0(ACTARM, \"\\n\\nN = \", n))\n\nplot <- ggplot(anl, aes(x = .data[[\"xvarlabel\"]])) +\n geom_bar(fill = getOption(\"ggplot2.discrete.fill\")[1]) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Frequency of Subjects With Serious AEs: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Frequency\")\nplot\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESER == \"Y\")\nanl <- anl[!duplicated(anl$USUBJID), ]\n\nplot <- ggplot(anl, aes(x = .data[[\"ACTARM\"]])) +\n geom_bar(fill = getOption(\"ggplot2.discrete.fill\")[1]) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Frequency of Subjects With Serious AEs: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Frequency\") +\n coord_flip()\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adlb %>%\n filter(PARAMCD == \"ALT\" & ANRIND == \"HIGH\")\nanl <- anl[!duplicated(anl$USUBJID), ]\n\npatpop5 <- as.data.frame(table(adsl$ACTARM)) %>%\n mutate(ACTARM = as.vector(Var1)) %>%\n mutate(TRTPOP = Freq) %>%\n select(ACTARM, TRTPOP)\n\nanlpop <- as.data.frame(table(anl$ANRIND, anl$ACTARM)) %>%\n filter(Var1 == \"HIGH\") %>%\n mutate(ACTARM = as.vector(Var2)) %>%\n mutate(EVENTCOUNT = Freq) %>%\n select(ACTARM, EVENTCOUNT)\n\nanl <- left_join(patpop5, anlpop, by = \"ACTARM\")\nCIs <- binom.confint(x = anl$EVENTCOUNT, n = anl$TRTPOP, methods = \"exact\") \nanl <- cbind(anl, CIs[, 4:6])\n\nplot <- ggplot(anl) +\n geom_bar(\n aes(x = ACTARM, y = mean * 100),\n stat = \"identity\",\n fill = getOption(\"ggplot2.discrete.fill\")[1],\n alpha = 0.7\n ) +\n geom_errorbar(\n aes(x = ACTARM, ymin = lower * 100, ymax = upper * 100),\n width = 0.5,\n colour = \"#20b4ff\",\n alpha = 0.9,\n linewidth = 1.0\n ) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects with Abnormaly High ALT: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Percentage\")\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESER == \"Y\")\n\npatpop6 <- dplyr::count(adsl, ACTARM, SEX, name = \"N_arm_sex\")\n\nanl <- anl[!duplicated(anl$USUBJID), ] %>%\n group_by(ACTARM, SEX) %>%\n summarise(n = n(), .groups = \"drop\") %>%\n left_join(patpop6, by = c(\"ACTARM\", \"SEX\")) %>%\n mutate(pct = round((n / N_arm_sex) * 100, 2))\n\nplot <- ggplot(anl, aes(x = .data[[\"ACTARM\"]], fill = .data[[\"SEX\"]])) +\n geom_col(aes(y = pct), position = position_dodge()) +\n guides(fill = guide_legend(title = getElement(vl_ae, \"SEX\"))) +\n scale_y_continuous(labels = scales::comma) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects With Serious AEs: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Percent\")\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESER == \"Y\")\n\nanl <- anl[!duplicated(anl$USUBJID), ] %>%\n group_by(SEX, ACTARM) %>%\n summarise(n = n(), .groups = \"drop_last\") %>%\n mutate(N = patpop) %>%\n mutate(N = as.numeric(N)) %>%\n mutate(pct = round((n / N) * 100, 2))\n\nplot <- ggplot(anl, aes(x = .data[[\"SEX\"]], fill = .data[[\"ACTARM\"]])) +\n geom_col(aes(y = pct), position = position_dodge()) +\n guides(fill = guide_legend(title = getElement(vl_ae, \"ACTARM\"))) +\n scale_y_continuous(labels = scales::comma) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects With Serious AEs: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"SEX\"), \" (N = \", denom, \")\")) +\n ylab(\"Percent\")\nplot\n\n\n\n\n\n\n\n\n\n\nCodeanl1 <- adlb %>%\n filter(AVISIT == \"BASELINE\", PARAMCD == \"CRP\" & ANRIND == \"HIGH\")\n\nanl <- anl1[!duplicated(anl1$USUBJID), ] %>%\n group_by(ACTARM) %>%\n summarise(n = n()) %>%\n mutate(N = patpop) %>%\n mutate(N = as.numeric(N)) %>%\n mutate(pct = round((n / N) * 100, 2))\n\ngraph <- ggplot(anl, aes(x = .data[[\"ACTARM\"]])) +\n geom_col(aes(x = ACTARM, y = pct), fill = getOption(\"ggplot2.discrete.fill\")[1]) +\n scale_y_continuous(labels = scales::comma, expand = expansion(c(0, .25))) +\n geom_text(aes(y = pct, label = pct), stat = \"identity\", vjust = -0.5) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects with Abnormaly High CRP at Baseline \\n Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_lb, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Percent\")\n\nsd_w <- anl1 %>%\n group_by(ACTARM) %>%\n summarise(\n mean = round(mean(AVAL, na.rm = TRUE), 2),\n median = round(median(AVAL, na.rm = TRUE), 2)\n ) %>%\n arrange(ACTARM)\n\nsd_l <- gather(sd_w, key = stat, value = value, mean:median)\nsd_l <- sd_l %>% mutate(\n stat_lbl = case_when(\n stat == \"mean\" ~ \"Mean\",\n stat == \"median\" ~ \"Median\"\n )\n)\n\nsd_l$stat_lbl <- factor(sd_l$stat_lbl, levels = c(\"Median\", \"Mean\"))\n\ntbl_theme <- theme(\n panel.border = element_blank(),\n panel.grid.major = element_blank(),\n panel.grid.minor = element_blank(),\n axis.ticks = element_blank(),\n axis.title = element_blank(),\n axis.text.y = element_text(face = \"plain\"),\n axis.text.x = element_blank()\n)\n\ntbl <- ggplot(sd_l, aes(x = ACTARM, y = stat_lbl, label = value)) +\n geom_text(size = 3) +\n scale_y_discrete(labels = levels(sd_l$stat_lbl)) +\n theme_bw() +\n tbl_theme\n\nplot <- ggpubr::ggarrange(graph, tbl,\n heights = c(4, 1),\n ncol = 1, nrow = 2, align = \"v\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae\n\nanl <- anl %>%\n arrange(USUBJID, AETOXGRC) %>%\n group_by(USUBJID) %>%\n slice(n()) %>%\n ungroup()\n\nanl <- anl[!duplicated(anl$USUBJID), ] %>%\n group_by(ACTARM, AETOXGRC) %>%\n summarise(n = n(), .groups = \"drop_last\") %>%\n mutate(N = patpop) %>%\n mutate(N = as.numeric(N)) %>%\n mutate(pct = round((n / N) * 100, 2))\n\nplot <- ggplot(anl, aes(x = .data[[\"ACTARM\"]], fill = .data[[\"AETOXGRC\"]])) +\n geom_col(aes(y = pct)) +\n guides(fill = guide_legend(title = getElement(vl_ae, \"AETOXGRC\"))) +\n scale_y_continuous(labels = scales::comma) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects With AE by Highest \\n NCI CTCAE Grade: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Percent\")\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:57:54 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] nestcolor_0.1.2.9009 tern_0.9.3.9028 rtables_0.6.6.9011 \n [4] magrittr_2.0.3 formatters_0.5.5.9018 tidyr_1.3.1 \n [7] scda_0.1.6.9017 ggplot2_3.5.0 dplyr_1.1.4 \n[10] binom_1.1-1.1 \n\nloaded via a namespace (and not attached):\n [1] utf8_1.2.4 generics_0.1.3 rstatix_0.7.2 lattice_0.22-6 \n [5] digest_0.6.35 evaluate_0.23 grid_4.3.3 fastmap_1.1.1 \n [9] jsonlite_1.8.8 Matrix_1.6-5 backports_1.4.1 brio_1.1.4 \n[13] survival_3.5-8 purrr_1.0.2 fansi_1.0.6 scales_1.3.0 \n[17] codetools_0.2-19 abind_1.4-5 Rdpack_2.6 cli_3.6.2 \n[21] rlang_1.1.3 rbibutils_2.2.16 cowplot_1.1.3 munsell_0.5.0 \n[25] splines_4.3.3 withr_3.0.0 yaml_2.3.8 tools_4.3.3 \n[29] ggsignif_0.6.4 checkmate_2.3.1 colorspace_2.1-0 ggpubr_0.6.0 \n[33] broom_1.0.5 vctrs_0.6.5 R6_2.5.1 lifecycle_1.0.4 \n[37] car_3.1-2 htmlwidgets_1.6.4 pkgconfig_2.0.3 pillar_1.9.0 \n[41] gtable_0.3.4 glue_1.7.0 xfun_0.42 tibble_3.2.1 \n[45] tidyselect_1.2.1 knitr_1.45 farver_2.1.1 htmltools_0.5.7 \n[49] carData_3.0-5 rmarkdown_2.26 labeling_0.4.3 testthat_3.2.1 \n[53] compiler_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Pharmacokinetic", - "PKCG03" + "Other", + "BRG01" ] }, { - "objectID": "graphs/pharmacokinetic/pkpg06.html", - "href": "graphs/pharmacokinetic/pkpg06.html", - "title": "PKPG06", + "objectID": "graphs/other/mng01.html", + "href": "graphs/other/mng01.html", + "title": "MNG01", "section": "", - "text": "Data Setup\nPlot with Whiskers at ±1.5 Times Inter-Quartile Range\nPlot with Whiskers at Minimum and Maximum Values\nPlot with Whiskers at 5th and 95th Percentiles\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(ggplot2)\nlibrary(tidyr)\nlibrary(tern)\nlibrary(nestcolor)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\n# Filter NAs\nadpp <- adpp %>%\n filter(PPSPEC != \"NA\" & PARAM != \"NA\" & PPCAT != \"NA\") %>%\n filter(PARAMCD == \"CMAX\" | PARAMCD == \"AUCIFO\", AVISITN == 1)\n\n# filter data by PPCAT and calculate ratio\nanl_x <- adpp %>%\n filter(PPCAT %in% c(\"Metabolite Drug X\", \"Plasma Drug X\")) %>%\n pivot_wider(\n id_cols = c(USUBJID, ACTARM, PARAMCD, AVISIT),\n names_from = PPCAT,\n values_from = AVAL\n ) %>%\n dplyr::mutate(ratio = `Metabolite Drug X` / `Plasma Drug X`) %>%\n filter(!is.na(ratio), ratio != Inf)\n\nanl_y <- adpp %>%\n filter(PPCAT %in% c(\"Metabolite Drug Y\", \"Plasma Drug Y\")) %>%\n pivot_wider(\n id_cols = c(USUBJID, ACTARM, PARAMCD, AVISIT),\n names_from = PPCAT,\n values_from = AVAL\n ) %>%\n dplyr::mutate(ratio = `Metabolite Drug Y` / `Plasma Drug Y`) %>%\n filter(!is.na(ratio), ratio != Inf)\n\n# functions to calculate custom quantiles and outliers\nquantiles <- function(x) {\n quant <- quantile(x, probs = c(0.05, 0.25, 0.5, 0.75, 0.95))\n names(quant) <- c(\"ymin\", \"lower\", \"middle\", \"upper\", \"ymax\")\n quant\n}\n\noutliers <- function(x) {\n return(x < quantile(x, 0.05) | x > quantile(x, 0.95))\n}\n\n\n\n\nDrug X Boxplot\n\n\nCodeplot <- ggplot(anl_x, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +\n geom_boxplot(outlier.size = 2) +\n stat_boxplot(geom = \"errorbar\") +\n stat_summary(\n geom = \"point\",\n fun = \"mean\",\n col = \"black\",\n size = 5,\n shape = 8,\n position = position_dodge(0.75)\n ) +\n geom_text(\n data = . %>% dplyr::group_by(PARAMCD, ACTARM) %>% dplyr::filter(ratio %in% boxplot.stats(ratio)$out),\n aes(x = PARAMCD, y = ratio, label = USUBJID, col = ACTARM),\n size = 3,\n hjust = -0.2,\n position = position_dodge(0.75),\n show.legend = FALSE\n ) +\n labs(\n title = \"Boxplot of Metabolite to Parent Ratios by Treatment\",\n subtitle = paste0(\n \"Analyte: Plasma Drug X, Metabolite Drug X \",\n \"\\nPK Parameter: \",\n as.character(paste(unique(anl_x$PARAMCD), collapse = \", \")),\n \"\\nVisit: \",\n as.character((unique(anl_x$AVISIT)))\n ),\n caption = \"Program: \\nOutput:\",\n x = \"Parameter\",\n y = \"Metabolite to Parent Ratio\"\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\n# PKPG06\nplot\n\n\n\n\n\n\n\nDrug Y Boxplot\n\n\nCodeplot <- ggplot(anl_y, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +\n geom_boxplot(outlier.size = 2) +\n stat_boxplot(geom = \"errorbar\") +\n stat_summary(\n geom = \"point\",\n fun = \"mean\",\n col = \"black\",\n size = 5,\n shape = 8,\n position = position_dodge(0.75)\n ) +\n geom_text(\n data = . %>% dplyr::group_by(PARAMCD, ACTARM) %>% dplyr::filter(ratio %in% boxplot.stats(ratio)$out),\n aes(x = PARAMCD, y = ratio, label = USUBJID, color = ACTARM),\n size = 3,\n hjust = -0.2,\n position = position_dodge(0.75),\n show.legend = FALSE\n ) +\n labs(\n title = \"Boxplot of Metabolite to Parent Ratios by Treatment\",\n subtitle = paste0(\n \"Analyte: Plasma Drug Y, Metabolite Drug Y \",\n \"\\nPK Parameter: \",\n as.character(paste(unique(anl_y$PARAMCD), collapse = \", \")),\n \"\\nVisit: \",\n as.character((unique(anl_y$AVISIT)))\n ),\n caption = \"Program: \\nOutput:\",\n x = \"Parameter\",\n y = \"Metabolite to Parent Ratio\"\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\n# result\nplot\n\n\n\n\n\n\n\n\n\n\n\n\nCode# whiskers are formed with the minimum and maximum values\nplot <- ggplot(anl_x, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +\n geom_boxplot(outlier.size = 0) +\n stat_boxplot(geom = \"errorbar\", coef = NULL) +\n stat_summary(geom = \"point\", fun = \"mean\", col = \"black\", size = 5, shape = 8, position = position_dodge(0.75)) +\n labs(\n title = \"Boxplot of Metabolite to Parent Ratios by Treatment\",\n subtitle = paste0(\n \"Analyte: Plasma Drug X, Metabolite Drug X \",\n \"\\nPK Parameter: \",\n as.character(paste(unique(anl_x$PARAMCD), collapse = \", \")),\n \"\\nVisit: \",\n as.character((unique(anl_x$AVISIT)))\n ),\n caption = \"Program:\\nOutput:\",\n x = \"Parameter\",\n y = \"Metabolite to Parent Ratio\"\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\n# result\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl_x_without_outliers <- anl_x %>%\n dplyr::group_by(PARAMCD, ACTARM) %>%\n dplyr::mutate(outlier = ifelse(outliers(ratio), ratio, as.numeric(NA)))\nplot <- ggplot(anl_x, aes(PARAMCD, ratio, fill = ACTARM, label = USUBJID)) +\n stat_summary(\n fun.data = quantiles, geom = \"boxplot\",\n position = position_dodge(1)\n ) +\n stat_summary(\n geom = \"point\",\n fun = \"mean\",\n col = \"black\",\n size = 5,\n shape = 8,\n position = position_dodge(1)\n ) +\n stat_summary(\n fun.data = quantiles, geom = \"errorbar\",\n position = position_dodge(1)\n ) +\n geom_point(\n data = anl_x_without_outliers,\n aes(x = PARAMCD, y = outlier),\n na.rm = TRUE,\n size = 2,\n position = position_dodge(1),\n show.legend = FALSE\n ) +\n geom_text(\n data = anl_x_without_outliers,\n aes(x = PARAMCD, y = outlier, label = USUBJID, color = ACTARM),\n na.rm = TRUE,\n size = 3,\n hjust = -0.2,\n vjust = 1,\n position = position_dodge(1),\n show.legend = FALSE\n ) +\n labs(\n title = \"Boxplot of Metabolite to Parent Ratios by Treatment\",\n subtitle = paste0(\n \"Analyte: Plasma Drug X, Metabolite Drug X \",\n \"\\nPK Parameter: \",\n as.character(paste(unique(anl_x$PARAMCD), collapse = \", \")),\n \"\\nVisit: \",\n as.character((unique(anl_x$AVISIT)))\n ),\n caption = \"Program: \\nOutput:\",\n x = \"Parameter\",\n y = \"Metabolite to Parent Ratio\"\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\n# result\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:55:00 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9016 tidyr_1.3.1 \n[7] ggplot2_3.5.0 scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 splines_4.3.3 scales_1.3.0 \n [9] yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 R6_2.5.1 \n[13] labeling_0.4.3 generics_0.1.3 knitr_1.45 rbibutils_2.2.16 \n[17] htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 tibble_3.2.1 \n[21] munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 utf8_1.2.4 \n[25] testthat_3.2.1 broom_1.0.5 xfun_0.42 cli_3.6.2 \n[29] withr_3.0.0 Rdpack_2.6 digest_0.6.35 grid_4.3.3 \n[33] lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 glue_1.7.0 \n[37] farver_2.1.1 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 rmarkdown_2.26 purrr_1.0.2 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nPlot of Mean and CI\nPlot of Mean and CIs of Change from Baseline (Changing the Input Analysis Data Set and Analysis Variable)\nPlot of Mean (+/-SD) (Changing the Statistics)\nPlot of Mean and CI (Modify Alpha Level)\nPlot of Mean and CI (with Number of Patients only in Table Section)\nPlot of Mean and CI (with Table Section)\nPlot of Median and CI (Visits Condensed in Table Section)\nPlot of Mean and Upper Confidence Limit\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(tern)\nlibrary(scda)\nlibrary(nestcolor)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\nadvs <- synthetic_cdisc_dataset(\"latest\", \"advs\")\n\nadsl_f <- adsl %>%\n filter(SAFFL == \"Y\") %>%\n df_explicit_na()\n\nadlb_f <- adlb %>%\n mutate(AVISIT = forcats::fct_reorder(AVISIT, AVISITN, min)) %>%\n dplyr::filter(\n SAFFL == \"Y\",\n ANL01FL == \"Y\",\n ONTRTFL == \"Y\",\n PARAMCD == \"ALT\",\n AVISIT != \"SCREENING\"\n ) %>%\n droplevels() %>%\n df_explicit_na()\n\nadvs_f <- advs %>%\n mutate(AVISIT = forcats::fct_reorder(AVISIT, AVISITN, min)) %>%\n dplyr::filter(\n SAFFL == \"Y\",\n ONTRTFL == \"Y\",\n PARAMCD == \"DIABP\",\n AVISIT != \"SCREENING\"\n ) %>%\n droplevels() %>%\n df_explicit_na()\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = advs_f,\n alt_counts_df = adsl_f,\n variables = control_lineplot_vars(y = \"CHG\"),\n title = \"Plot of Mean and 95% Confidence Intervals of Change from Baseline by Visit\",\n subtitle = \"Assessment:\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n interval = \"mean_sdi\",\n whiskers = c(\"mean_sdi_lwr\", \"mean_sdi_upr\"),\n title = \"Plot of Mean (+/-SD)\",\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n control = control_analyze_vars(conf_level = 0.80),\n title = \"Plot of Mean and 80% Confidence Limits by Visit\",\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n table = \"n\",\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n table = c(\"n\", \"mean\", \"mean_ci\"),\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\n\nThis option is not supported.\n\n\n\n\nCodeplot <- g_lineplot(\n df = adlb_f,\n alt_counts_df = adsl_f,\n whiskers = \"mean_ci_upr\",\n subtitle = \"Laboratory Test:\"\n)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(dplyr)\n library(forcats)\n\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n mutate(AVISIT = fct_reorder(AVISIT, AVISITN, min))\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_lineplot(\n label = \"LINE PLOT\",\n dataname = \"ADLB\",\n strata = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n y = choices_selected(\n variable_choices(ADLB, c(\"AVAL\", \"BASE\", \"CHG\", \"PCHG\")),\n \"AVAL\"\n ),\n param = choices_selected(\n value_choices(ADLB, \"PARAMCD\", \"PARAM\"),\n \"ALT\"\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: Error in : could not find function \"control_summarize_vars\" \n when evaluating qenv code:\nplot <- g_lineplot(df = anl, variables = variables, interval = \"mean_ci\", mid = \"mean\", whiskers = c(\"mean_ci_lwr\", \"mean_ci_upr\"), table = c(\"n\", \"mean_sd\", \"median\", \"range\"), mid_type = \"pl\", mid_point_size = 2, table_font_size = 4, newpage = FALSE, title = \"Plot of Mean and 95% Mean Confidence Interval of AVAL by Visit\", subtitle = \"\", caption = NULL, y_lab = \"AVAL Mean Values for\", legend_title = NULL, ggtheme = ggplot2::theme_minimal(), control = control_summarize_vars(conf_level = 0.95), subtitle_add_paramcd = FALSE, subtitle_add_unit = FALSE)\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:58:30 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] forcats_1.0.0 teal.modules.clinical_0.9.0.9014\n [3] teal.transform_0.5.0.9004 teal_0.15.2.9020 \n [5] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 \n [7] teal.code_0.5.0.9004 shiny_1.8.0 \n [9] nestcolor_0.1.2.9009 scda_0.1.6.9017 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9018 \n[15] dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] callr_3.7.5 vctrs_0.6.5 pkgconfig_2.0.3 \n[13] crayon_1.5.2 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 purrr_1.0.2 xfun_0.42 \n[25] shinyvalidate_0.1.3 cachem_1.0.8 teal.reporter_0.3.1.9002\n[28] jsonlite_1.8.8 later_1.3.2 broom_1.0.5 \n[31] R6_2.5.1 bslib_0.6.1 brio_1.1.4 \n[34] jquerylib_0.1.4 estimability_1.5 Rcpp_1.0.12 \n[37] knitr_1.45 zoo_1.8-12 teal.logger_0.2.0.9001 \n[40] httpuv_1.6.14 Matrix_1.6-5 splines_4.3.3 \n[43] tidyselect_1.2.1 yaml_2.3.8 codetools_0.2-19 \n[46] websocket_1.4.1 processx_3.8.4 teal.widgets_0.4.2.9009 \n[49] lattice_0.22-6 tibble_3.2.1 withr_3.0.0 \n[52] coda_0.19-4.1 evaluate_0.23 survival_3.5-8 \n[55] pillar_1.9.0 shinycssloaders_1.0.0 checkmate_2.3.1 \n[58] shinyjs_2.1.0 generics_0.1.3 chromote_0.2.0 \n[61] ggplot2_3.5.0 munsell_0.5.0 scales_1.3.0 \n[64] xtable_1.8-4 glue_1.7.0 emmeans_1.10.0 \n[67] tools_4.3.3 webshot2_0.1.1 webshot_0.5.5 \n[70] mvtnorm_1.2-4 cowplot_1.1.3 grid_4.3.3 \n[73] tidyr_1.3.1 rbibutils_2.2.16 colorspace_2.1-0 \n[76] nlme_3.1-164 cli_3.6.2 fansi_1.0.6 \n[79] geepack_1.3.10 gtable_0.3.4 sass_0.4.9 \n[82] digest_0.6.35 TH.data_1.1-2 htmlwidgets_1.6.4 \n[85] farver_2.1.1 memoise_2.0.1 htmltools_0.5.7 \n[88] lifecycle_1.0.4 shinyWidgets_0.8.2 mime_0.12 \n[91] MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Pharmacokinetic", - "PKPG06" + "Other", + "MNG01" ] }, { - "objectID": "graphs/efficacy/fstg01.html", - "href": "graphs/efficacy/fstg01.html", - "title": "FSTG01", + "objectID": "graphs/efficacy/kmg01.html", + "href": "graphs/efficacy/kmg01.html", + "title": "KMG01", "section": "", - "text": "Data Setup\nStandard Plot\nPlot Specifying Class Variables and Options for the Treatment Variable\nPlot Selecting Columns and Changing the Alpha Level\nPlot with Fixed Symbol Size\nPlot of CR Only, Setting Values Indicating Response\nteal App\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern)\nlibrary(nestcolor)\n\nadsl_f <- synthetic_cdisc_dataset(\"latest\", \"adsl\") %>%\n select(STUDYID, USUBJID, ARMCD, ARM, SEX, BMRKR2, STRATA1, STRATA2)\n\nadrs_f <- synthetic_cdisc_dataset(\"latest\", \"adrs\") %>%\n filter(PARAMCD == \"INVET\") %>%\n select(STUDYID, USUBJID, PARAMCD, AVISIT, AVALC)\n\nanl <- inner_join(adsl_f, adrs_f, by = c(\"STUDYID\", \"USUBJID\"))\nanl <- df_explicit_na(anl)\nanl_labels <- var_labels(anl)\n\nanl_rsp_arms_ab <- anl %>%\n mutate(is_rsp = AVALC %in% c(\"CR\", \"PR\")) %>%\n filter(ARMCD %in% c(\"ARM B\", \"ARM A\")) %>%\n mutate(\n ARMCD = relevel(ARMCD, ref = \"ARM B\") %>%\n droplevels(),\n ARM = relevel(ARM, ref = \"B: Placebo\") %>%\n droplevels()\n ) %>%\n droplevels()\nvar_labels(anl_rsp_arms_ab) <- c(anl_labels, is_rsp = \"Is Responder\")\n\n\n\n\n\n\n\nCodedf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"is_rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"BMRKR2\"),\n strata = \"STRATA2\"\n ),\n data = anl_rsp_arms_ab,\n conf_level = 0.95\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\n\nCodeanl_rsp_comb_arms_ac <- anl %>%\n mutate(is_rsp = AVALC %in% c(\"CR\", \"PR\")) %>%\n filter(ARMCD %in% c(\"ARM B\", \"ARM A\", \"ARM C\")) %>%\n mutate(\n ARMCD = relevel(ARMCD, ref = \"ARM B\") %>%\n droplevels() %>%\n combine_levels(levels = c(\"ARM A\", \"ARM C\")),\n ARM = relevel(ARM, ref = \"B: Placebo\") %>%\n droplevels() %>%\n combine_levels(levels = c(\"A: Drug X\", \"C: Combination\")),\n # reorder levels of SEX\n SEX = forcats::fct_relevel(SEX, \"M\", \"F\"),\n # reorder levels of STRATA1 by frequency\n STRATA1 = forcats::fct_infreq(STRATA1)\n ) %>%\n droplevels()\nvar_labels(anl_rsp_comb_arms_ac) <- c(anl_labels, is_rsp = \"Is Responder\")\n\ndf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"is_rsp\",\n arm = \"ARMCD\",\n subgroups = c(\"SEX\", \"BMRKR2\"),\n strata = \"STRATA2\"\n ),\n data = anl_rsp_comb_arms_ac,\n conf_level = 0.95\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\n\nCodedf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"is_rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"BMRKR2\"),\n strata = \"STRATA2\"\n ),\n data = anl_rsp_arms_ab,\n conf_level = 0.90\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"or\", \"ci\"))\n\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\n\n\n\n\nCodedf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"is_rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"BMRKR2\"),\n strata = \"STRATA2\"\n ),\n data = anl_rsp_arms_ab,\n conf_level = 0.95\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nplot <- g_forest(\n tbl = result,\n col_symbol_size = NULL\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\n\nCodeanl_cr_arms_ab <- anl %>%\n mutate(is_rsp = AVALC == \"CR\") %>%\n filter(ARMCD %in% c(\"ARM B\", \"ARM A\")) %>%\n mutate(\n ARMCD = relevel(ARMCD, ref = \"ARM B\") %>%\n droplevels(),\n ARM = relevel(ARM, ref = \"B: Placebo\") %>%\n droplevels()\n ) %>%\n droplevels()\nvar_labels(anl_cr_arms_ab) <- c(anl_labels, is_rsp = \"Is CR\")\n\ndf <- extract_rsp_subgroups(\n variables = list(\n rsp = \"is_rsp\",\n arm = \"ARM\",\n subgroups = c(\"SEX\", \"BMRKR2\"),\n strata = \"STRATA2\"\n ),\n data = anl_cr_arms_ab,\n conf_level = 0.95\n)\n\nresult <- basic_table() %>%\n tabulate_rsp_subgroups(df, vars = c(\"n_tot\", \"n\", \"n_rsp\", \"prop\", \"or\", \"ci\"))\n\nplot <- g_forest(tbl = result)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADRS <- synthetic_cdisc_dataset(\"latest\", \"adrs\")\n})\ndatanames <- c(\"ADSL\", \"ADRS\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\narm_ref_comp <- list(\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n ),\n ARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n )\n)\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADRS <- data[[\"ADRS\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_forest_rsp(\n label = \"Forest Response\",\n dataname = \"ADRS\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\")),\n \"ARMCD\"\n ),\n arm_ref_comp = arm_ref_comp,\n paramcd = choices_selected(\n value_choices(ADRS, \"PARAMCD\", \"PARAM\"),\n \"BESRSPI\"\n ),\n subgroup_var = choices_selected(\n variable_choices(ADSL, names(ADSL)),\n c(\"BMRKR2\", \"SEX\")\n ),\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"STRATA1\", \"STRATA2\")),\n \"STRATA2\"\n ),\n plot_height = c(600L, 200L, 2000L),\n plot_width = c(1100L, 200L, 2000L)\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:55:54 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 nestcolor_0.1.2.9009 \n [9] tern_0.9.3.9028 rtables_0.6.6.9011 \n[11] magrittr_2.0.3 formatters_0.5.5.9016 \n[13] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[37] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[40] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[43] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[46] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[49] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[52] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[55] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[58] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[61] generics_0.1.3 chromote_0.2.0 ggplot2_3.5.0 \n[64] munsell_0.5.0 scales_1.3.0 xtable_1.8-4 \n[67] glue_1.7.0 emmeans_1.10.0 tools_4.3.3 \n[70] webshot2_0.1.1 webshot_0.5.5 forcats_1.0.0 \n[73] mvtnorm_1.2-4 cowplot_1.1.3 grid_4.3.3 \n[76] tidyr_1.3.1 rbibutils_2.2.16 colorspace_2.1-0 \n[79] nlme_3.1-164 cli_3.6.2 textshaping_0.3.7 \n[82] fansi_1.0.6 geepack_1.3.10 gtable_0.3.4 \n[85] sass_0.4.9 digest_0.6.35 TH.data_1.1-2 \n[88] htmlwidgets_1.6.4 farver_2.1.1 memoise_2.0.1 \n[91] htmltools_0.5.7 lifecycle_1.0.4 shinyWidgets_0.8.2 \n[94] mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nStandard Plot\nPlot of Failures\nPlot Without Comparative Statistics\nPlot Without Censoring Marks\nPlot Modifying Censoring Marks\nPlot Modifying Options for Statistics, Tie Handling, Stratification, etc.\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(nestcolor)\n\nadtte <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\nanl <- adtte %>%\n dplyr::filter(PARAMCD == \"OS\") %>%\n dplyr::mutate(is_event = CNSR == 0)\nvariables <- list(tte = \"AVAL\", is_event = \"is_event\", arm = \"ARMCD\")\n\n\n\n\n\n\nCodeplot <- g_km(\n df = anl,\n variables = variables,\n xlab = \"Time (Days)\",\n ylim = c(0, 1),\n annot_coxph = TRUE\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_km(\n df = anl,\n variables = variables,\n xlab = \"Time (Days)\",\n yval = \"Failure\",\n ylim = c(0, 1),\n font_size = 8,\n annot_coxph = TRUE\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_km(\n df = anl,\n variables = variables,\n xlab = \"Time (Days)\",\n ylim = c(0, 1)\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_km(\n df = anl,\n variables = variables,\n censor_show = FALSE,\n xlab = \"Time (Days)\",\n ylim = c(0, 1),\n annot_coxph = TRUE\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- g_km(\n df = anl,\n variables = variables,\n pch = 1,\n size = 2,\n xlab = \"Time (Days)\",\n ylim = c(0, 1),\n annot_coxph = TRUE\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodevariables$strata <- c(\"STRATA1\", \"STRATA2\")\nplot <- g_km(\n df = anl,\n variables = variables,\n control_surv = control_surv_timepoint(conf_level = 0.8),\n xlab = \"Time (Days)\",\n ylim = c(0, 1),\n annot_coxph = TRUE,\n control_coxph_pw = control_coxph(\n pval_method = \"wald\",\n ties = \"breslow\",\n conf_level = 0.8\n )\n)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADTTE <- synthetic_cdisc_dataset(\"latest\", \"adtte\")\n})\ndatanames <- c(\"ADSL\", \"ADTTE\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\narm_ref_comp <- list(\n ACTARMCD = list(\n ref = \"ARM B\",\n comp = c(\"ARM A\", \"ARM C\")\n ),\n ARM = list(\n ref = \"B: Placebo\",\n comp = c(\"A: Drug X\", \"C: Combination\")\n )\n)\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADTTE <- data[[\"ADTTE\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_km(\n label = \"KM PLOT\",\n plot_height = c(600, 100, 2000),\n dataname = \"ADTTE\",\n arm_var = choices_selected(\n variable_choices(ADSL, c(\"ARM\", \"ARMCD\", \"ACTARMCD\")),\n \"ARM\"\n ),\n paramcd = choices_selected(\n value_choices(ADTTE, \"PARAMCD\", \"PARAM\"),\n \"OS\"\n ),\n arm_ref_comp = arm_ref_comp,\n strata_var = choices_selected(\n variable_choices(ADSL, c(\"SEX\", \"BMRKR2\")),\n \"SEX\"\n ),\n facet_var = choices_selected(\n variable_choices(ADSL, c(\"SEX\", \"BMRKR2\")),\n NULL\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 17:59:24 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 nestcolor_0.1.2.9009 \n [9] dplyr_1.1.4 scda_0.1.6.9017 \n[11] tern_0.9.3.9028 rtables_0.6.6.9011 \n[13] magrittr_2.0.3 formatters_0.5.5.9018 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] brio_1.1.4 jquerylib_0.1.4 estimability_1.5 \n[37] Rcpp_1.0.12 knitr_1.45 zoo_1.8-12 \n[40] teal.logger_0.2.0.9001 httpuv_1.6.14 Matrix_1.6-5 \n[43] splines_4.3.3 tidyselect_1.2.1 yaml_2.3.8 \n[46] codetools_0.2-19 websocket_1.4.1 processx_3.8.4 \n[49] teal.widgets_0.4.2.9009 lattice_0.22-6 tibble_3.2.1 \n[52] withr_3.0.0 coda_0.19-4.1 evaluate_0.23 \n[55] survival_3.5-8 pillar_1.9.0 shinycssloaders_1.0.0 \n[58] checkmate_2.3.1 shinyjs_2.1.0 generics_0.1.3 \n[61] chromote_0.2.0 ggplot2_3.5.0 munsell_0.5.0 \n[64] scales_1.3.0 xtable_1.8-4 glue_1.7.0 \n[67] emmeans_1.10.0 tools_4.3.3 webshot2_0.1.1 \n[70] webshot_0.5.5 mvtnorm_1.2-4 cowplot_1.1.3 \n[73] grid_4.3.3 tidyr_1.3.1 rbibutils_2.2.16 \n[76] colorspace_2.1-0 nlme_3.1-164 cli_3.6.2 \n[79] textshaping_0.3.7 fansi_1.0.6 geepack_1.3.10 \n[82] gtable_0.3.4 sass_0.4.9 digest_0.6.35 \n[85] TH.data_1.1-2 htmlwidgets_1.6.4 farver_2.1.1 \n[88] memoise_2.0.1 htmltools_0.5.7 lifecycle_1.0.4 \n[91] shinyWidgets_0.8.2 mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", "Efficacy", - "FSTG01" + "KMG01" ] }, { @@ -1715,7 +1762,7 @@ "href": "graphs/efficacy/mmrmg02.html", "title": "MMRMG02", "section": "", - "text": "Data Setup\nComparing Multiple Populations\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern.mmrm)\nlibrary(nestcolor)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\nadqs_f <- adqs %>%\n dplyr::filter(PARAMCD == \"FKSI-FWB\" & !AVISIT %in% c(\"BASELINE\")) %>%\n droplevels() %>%\n dplyr::mutate(ARMCD = factor(ARMCD, levels = c(\"ARM B\", \"ARM A\", \"ARM C\"))) %>%\n dplyr::mutate(\n AVISITN = rank(AVISITN) %>%\n as.factor() %>%\n as.numeric() %>%\n as.factor()\n )\n\n# Simulation of groups.\nset.seed(2)\nadqs_f_with_groups <- rbind(\n within(\n adqs_f[sample(seq_len(nrow(adqs_f)), size = 1 / 2 * nrow(adqs_f)), ],\n group <- \"subpopulation 1\"\n ),\n within(\n adqs_f,\n {\n group <- \"subpopulation 2\"\n AVAL <- AVAL + rnorm(length(AVAL), mean = 10, sd = 2)\n USUBJID <- paste0(USUBJID, \"-S2\")\n }\n )\n)\nadqs_f_with_groups$group <- factor(adqs_f_with_groups$group)\n\n\n\n\nFor the following part, an MMRM model is fitted for the dataset and from this result forest plots are constructed for each set of subgroups, treatment arm, and visit that is of interest.\nFirst an MMRM model is fitted for the whole dataset.\n\nCodemmrm_results <- fit_mmrm(\n data = adqs_f_with_groups,\n vars = list(\n response = \"AVAL\",\n covariates = c(),\n id = \"USUBJID\",\n arm = \"ARMCD\",\n visit = \"AVISIT\"\n ),\n cor_struct = \"unstructured\",\n weights_emmeans = \"equal\",\n parallel = TRUE\n)\n\nmmrm() registered as emmeans extension\n\n\nApplying the tern.mmrm::extract_mmrm_subgroups function prepares the obtained mmrm_results for a specific visit - in this case we use the SCREENING visit - and treatment arm relative to the reference arm. From these results a table is obtained using the tern.mmrm::tabulate_mmrm_subgroups function from which the graphic can be directly obtained with tern::g_forest.\nHere we compare ARM A with the reference arm, ARM B.\n\nCodedf_a <- extract_mmrm_subgroups(\n fit = mmrm_results,\n visit = \"SCREENING\",\n subgroups = c(\"group\", \"SEX\"),\n treatment_arm = \"ARM A\"\n)\n\ntab_a <- basic_table() %>%\n tabulate_mmrm_subgroups(\n df = df_a,\n vars = c(\"n_tot\", \"diff\", \"ci\", \"pval\")\n )\n\nplot <- g_forest(\n tab_a,\n logx = FALSE,\n xlim = c(-5, 2.5),\n x_at = c(-5, -2.5, 0, 2.5),\n vline = 0\n)\nplot\n\n\n\n\n\n\n\nThen we compare ARM C with ARM B.\n\nCodedf_c <- extract_mmrm_subgroups(\n fit = mmrm_results,\n visit = \"SCREENING\",\n subgroups = c(\"group\", \"SEX\"),\n treatment_arm = \"ARM C\"\n)\n\ntab_c <- basic_table() %>%\n tabulate_mmrm_subgroups(\n df = df_c,\n vars = c(\"n_tot\", \"diff\", \"ci\", \"pval\")\n )\n\nplot <- g_forest(\n tab_c,\n logx = FALSE,\n xlim = c(-5, 2.5),\n x_at = c(-5, -2.5, 0, 2.5),\n vline = 0\n)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:56:47 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 tern.mmrm_0.3.0.9005 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016\n[7] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] gtable_0.3.4 TMB_1.9.10 xfun_0.42 ggplot2_3.5.0 \n [5] htmlwidgets_1.6.4 lattice_0.22-6 vctrs_0.6.5 tools_4.3.3 \n [9] Rdpack_2.6 generics_0.1.3 parallel_4.3.3 sandwich_3.1-0 \n[13] tibble_3.2.1 mmrm_0.3.11 fansi_1.0.6 pkgconfig_2.0.3 \n[17] Matrix_1.6-5 checkmate_2.3.1 lifecycle_1.0.4 farver_2.1.1 \n[21] compiler_4.3.3 stringr_1.5.1 brio_1.1.4 munsell_0.5.0 \n[25] codetools_0.2-19 htmltools_0.5.7 yaml_2.3.8 pillar_1.9.0 \n[29] tidyr_1.3.1 MASS_7.3-60.0.1 multcomp_1.4-25 nlme_3.1-164 \n[33] parallelly_1.37.1 tidyselect_1.2.1 digest_0.6.35 mvtnorm_1.2-4 \n[37] stringi_1.8.3 purrr_1.0.2 labeling_0.4.3 splines_4.3.3 \n[41] cowplot_1.1.3 fastmap_1.1.1 grid_4.3.3 colorspace_2.1-0 \n[45] cli_3.6.2 survival_3.5-8 utf8_1.2.4 broom_1.0.5 \n[49] TH.data_1.1-2 withr_3.0.0 scales_1.3.0 backports_1.4.1 \n[53] estimability_1.5 rmarkdown_2.26 emmeans_1.10.0 zoo_1.8-12 \n[57] coda_0.19-4.1 evaluate_0.23 knitr_1.45 rbibutils_2.2.16 \n[61] testthat_3.2.1 rlang_1.1.3 Rcpp_1.0.12 xtable_1.8-4 \n[65] glue_1.7.0 jsonlite_1.8.8 R6_2.5.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nComparing Multiple Populations\nReproducibility\n\n\n\n\nCodelibrary(scda)\nlibrary(dplyr)\nlibrary(tern.mmrm)\nlibrary(nestcolor)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadqs <- synthetic_cdisc_dataset(\"latest\", \"adqs\")\n\nadqs_f <- adqs %>%\n dplyr::filter(PARAMCD == \"FKSI-FWB\" & !AVISIT %in% c(\"BASELINE\")) %>%\n droplevels() %>%\n dplyr::mutate(ARMCD = factor(ARMCD, levels = c(\"ARM B\", \"ARM A\", \"ARM C\"))) %>%\n dplyr::mutate(\n AVISITN = rank(AVISITN) %>%\n as.factor() %>%\n as.numeric() %>%\n as.factor()\n )\n\n# Simulation of groups.\nset.seed(2)\nadqs_f_with_groups <- rbind(\n within(\n adqs_f[sample(seq_len(nrow(adqs_f)), size = 1 / 2 * nrow(adqs_f)), ],\n group <- \"subpopulation 1\"\n ),\n within(\n adqs_f,\n {\n group <- \"subpopulation 2\"\n AVAL <- AVAL + rnorm(length(AVAL), mean = 10, sd = 2)\n USUBJID <- paste0(USUBJID, \"-S2\")\n }\n )\n)\nadqs_f_with_groups$group <- factor(adqs_f_with_groups$group)\n\n\n\n\nFor the following part, an MMRM model is fitted for the dataset and from this result forest plots are constructed for each set of subgroups, treatment arm, and visit that is of interest.\nFirst an MMRM model is fitted for the whole dataset.\n\nCodemmrm_results <- fit_mmrm(\n data = adqs_f_with_groups,\n vars = list(\n response = \"AVAL\",\n covariates = c(),\n id = \"USUBJID\",\n arm = \"ARMCD\",\n visit = \"AVISIT\"\n ),\n cor_struct = \"unstructured\",\n weights_emmeans = \"equal\",\n parallel = TRUE\n)\n\nmmrm() registered as emmeans extension\n\n\nApplying the tern.mmrm::extract_mmrm_subgroups function prepares the obtained mmrm_results for a specific visit - in this case we use the SCREENING visit - and treatment arm relative to the reference arm. From these results a table is obtained using the tern.mmrm::tabulate_mmrm_subgroups function from which the graphic can be directly obtained with tern::g_forest.\nHere we compare ARM A with the reference arm, ARM B.\n\nCodedf_a <- extract_mmrm_subgroups(\n fit = mmrm_results,\n visit = \"SCREENING\",\n subgroups = c(\"group\", \"SEX\"),\n treatment_arm = \"ARM A\"\n)\n\ntab_a <- basic_table() %>%\n tabulate_mmrm_subgroups(\n df = df_a,\n vars = c(\"n_tot\", \"diff\", \"ci\", \"pval\")\n )\n\nplot <- g_forest(\n tab_a,\n logx = FALSE,\n xlim = c(-5, 2.5),\n x_at = c(-5, -2.5, 0, 2.5),\n vline = 0\n)\nplot\n\n\n\n\n\n\n\nThen we compare ARM C with ARM B.\n\nCodedf_c <- extract_mmrm_subgroups(\n fit = mmrm_results,\n visit = \"SCREENING\",\n subgroups = c(\"group\", \"SEX\"),\n treatment_arm = \"ARM C\"\n)\n\ntab_c <- basic_table() %>%\n tabulate_mmrm_subgroups(\n df = df_c,\n vars = c(\"n_tot\", \"diff\", \"ci\", \"pval\")\n )\n\nplot <- g_forest(\n tab_c,\n logx = FALSE,\n xlim = c(-5, 2.5),\n x_at = c(-5, -2.5, 0, 2.5),\n vline = 0\n)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 18:00:20 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 tern.mmrm_0.3.0.9005 tern_0.9.3.9028 \n[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018\n[7] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] gtable_0.3.4 TMB_1.9.10 xfun_0.42 ggplot2_3.5.0 \n [5] htmlwidgets_1.6.4 lattice_0.22-6 vctrs_0.6.5 tools_4.3.3 \n [9] Rdpack_2.6 generics_0.1.3 parallel_4.3.3 sandwich_3.1-0 \n[13] tibble_3.2.1 mmrm_0.3.11 fansi_1.0.6 pkgconfig_2.0.3 \n[17] Matrix_1.6-5 checkmate_2.3.1 lifecycle_1.0.4 farver_2.1.1 \n[21] compiler_4.3.3 stringr_1.5.1 brio_1.1.4 munsell_0.5.0 \n[25] codetools_0.2-19 htmltools_0.5.7 yaml_2.3.8 pillar_1.9.0 \n[29] tidyr_1.3.1 MASS_7.3-60.0.1 multcomp_1.4-25 nlme_3.1-164 \n[33] parallelly_1.37.1 tidyselect_1.2.1 digest_0.6.35 mvtnorm_1.2-4 \n[37] stringi_1.8.3 purrr_1.0.2 labeling_0.4.3 splines_4.3.3 \n[41] cowplot_1.1.3 fastmap_1.1.1 grid_4.3.3 colorspace_2.1-0 \n[45] cli_3.6.2 survival_3.5-8 utf8_1.2.4 broom_1.0.5 \n[49] TH.data_1.1-2 withr_3.0.0 scales_1.3.0 backports_1.4.1 \n[53] estimability_1.5 rmarkdown_2.26 emmeans_1.10.0 zoo_1.8-12 \n[57] coda_0.19-4.1 evaluate_0.23 knitr_1.45 rbibutils_2.2.16 \n[61] testthat_3.2.1 rlang_1.1.3 Rcpp_1.0.12 xtable_1.8-4 \n[65] glue_1.7.0 jsonlite_1.8.8 R6_2.5.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", "Efficacy", @@ -1723,109 +1770,62 @@ ] }, { - "objectID": "graphs/other/bwg01.html", - "href": "graphs/other/bwg01.html", - "title": "BWG01", + "objectID": "graphs/pharmacokinetic/pkcg02.html", + "href": "graphs/pharmacokinetic/pkcg02.html", + "title": "PKCG02", "section": "", - "text": "Data Setup\nStandard Plot\nPlot Changing Whiskers\nPlot Adding Outliers\nPlot Specifying Marker for Outliers and Adding Patient ID\nPlot Specifying Marker for Mean\nPlot by Treatment and Timepoint\nPlot by Timepoint and Treatment\nPlot with Table Section\nPlot with Number of Patients only in Table Section\nteal App\nReproducibility\n\n\n\n\nCode# generic code for all plots\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\nadlb <- adlb %>% filter(PARAMCD == \"ALT\" & AVISIT == \"WEEK 2 DAY 15\")\n\n# Definition of boxplot boundaries and whiskers\nfive_num <- function(x, probs = c(0, 0.25, 0.5, 0.75, 1)) {\n r <- quantile(x, probs)\n names(r) <- c(\"ymin\", \"lower\", \"middle\", \"upper\", \"ymax\")\n r\n}\n\n# get outliers based on quantile\n# for outliers based on IQR see coef in geom_boxplot\nget_outliers <- function(x, probs = c(0.05, 0.95)) {\n r <- subset(x, x < quantile(x, probs[1]) | quantile(x, probs[2]) < x)\n if (!is.null(x)) {\n x_names <- subset(names(x), x < quantile(x, probs[1]) | quantile(x, probs[2]) < x)\n names(r) <- x_names\n }\n r\n}\n\n# create theme used for all plots\ntheme_bp <- theme(\n plot.title = element_text(hjust = 0),\n plot.subtitle = element_text(hjust = 0),\n plot.caption = element_text(hjust = 0),\n panel.background = element_rect(fill = \"white\", color = \"grey50\")\n)\n\n# assign fill color and outline color\nfc <- \"#eaeef5\"\noc <- getOption(\"ggplot2.discrete.fill\")[1]\n\n# get plot metadata data to derive coordinates for adding annotations\nbp_annos <- function(bp, color, annos = 1) {\n bp_mdat <- ggplot_build(bp)$data[[1]]\n if (annos == 1) {\n bp <- bp +\n geom_segment(data = bp_mdat, aes(\n x = xmin + (xmax - xmin) / 4, xend = xmax - (xmax - xmin) / 4,\n y = ymax, yend = ymax\n ), linewidth = .5, color = color) +\n geom_segment(data = bp_mdat, aes(\n x = xmin + (xmax - xmin) / 4, xend = xmax - (xmax - xmin) / 4,\n y = ymin, yend = ymin\n ), linewidth = .5, color = color)\n } else {\n bp <- bp +\n geom_segment(data = bp_mdat, aes(\n x = xmin + (xmax - xmin) / 4, xend = xmax - (xmax - xmin) / 4,\n y = ymax, yend = ymax\n ), linewidth = .5, color = color) +\n geom_segment(data = bp_mdat, aes(\n x = xmin + (xmax - xmin) / 4, xend = xmax - (xmax - xmin) / 4,\n y = ymin, yend = ymin\n ), linewidth = .5, color = color) +\n geom_segment(data = bp_mdat, aes(\n x = xmin, xend = xmax,\n y = middle, yend = middle\n ), colour = color, linewidth = .5)\n }\n return(bp)\n}\n\n\n\n\n\nCodebp_1 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n stat_summary(geom = \"boxplot\", fun.data = five_num, fill = fc, color = oc) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 8) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n caption = \"The whiskers extend to the minimum and maximum values.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_1, oc)\nplot\n\n\n\n\n\n\n\n\n\n\nCodebp_3 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n stat_summary(\n geom = \"boxplot\", fun.data = five_num,\n fun.args = list(probs = c(0.05, 0.25, 0.5, 0.75, 0.95)), fill = fc, color = oc\n ) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 8) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n caption = \"The whiskers extend to the 5th and 95th percentile. Values outside the whiskers have not been plotted.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_3, oc)\nplot\n\n\n\n\n\n\n\n\n\n\nCodebp_4 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n stat_summary(\n geom = \"boxplot\", fun.data = five_num,\n fun.args = list(probs = c(0.05, 0.25, 0.5, 0.75, 0.95)), fill = fc, color = oc\n ) +\n stat_summary(geom = \"point\", fun = get_outliers, shape = 1) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 8) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n caption = \"The whiskers extend to the 5th and 95th percentile.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_4, oc)\nplot\n\n\n\n\n\n\n\n\n\n\nCodeadlb_o <- adlb %>%\n group_by(ARMCD) %>%\n mutate(OUTLIER = AVAL < quantile(AVAL, 0.01) | AVAL > quantile(AVAL, 0.99)) %>%\n filter(OUTLIER == TRUE) %>%\n select(ARMCD, AVAL, USUBJID)\n# Next step may be study-specific: shorten USUBJID to make annotation labels\n# next 2 lines of code split USUBJID by \"-\" and take the last syllable as ID\nn_split <- max(vapply(strsplit(adlb_o$USUBJID, \"-\"), length, numeric(1)))\nadlb_o$ID <- vapply(strsplit(adlb_o$USUBJID, \"-\"), `[[`, n_split, FUN.VALUE = \"a\")\n\nbp_5 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n stat_summary(\n geom = \"boxplot\", fun.data = five_num,\n fun.args = list(probs = c(0.01, 0.25, 0.5, 0.75, 0.99)), fill = fc, color = oc\n ) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 8) +\n geom_point(data = adlb_o, aes(x = ARMCD, y = AVAL), shape = 1) +\n geom_text(data = adlb_o, aes(x = ARMCD, y = AVAL, label = ID), size = 3, hjust = -0.2) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n caption = \"The whiskers extend to the largest and smallest observed value within 1.5*IQR.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_5, oc)\nplot\n\n\n\n\n\n\n\n\n\n\nCodebp_6 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n geom_boxplot(fill = fc, color = oc) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 5) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n caption = \"The whiskers extend to the minimum and maximum values.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_6, oc)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\nadlb_v <- adlb %>%\n filter(PARAMCD == \"ALT\" & AVISIT %in% c(\"WEEK 1 DAY 8\", \"WEEK 2 DAY 15\", \"WEEK 3 DAY 22\", \"WEEK 4 DAY 29\"))\n\nbp_7 <- ggplot(adlb_v, aes(x = AVISIT, y = AVAL)) +\n stat_summary(\n geom = \"boxplot\",\n fun.data = five_num,\n position = position_dodge2(.5),\n aes(fill = ARMCD, color = ARMCD)\n ) +\n stat_summary(\n geom = \"point\",\n fun = mean,\n aes(group = ARMCD),\n size = 3,\n shape = 8,\n position = position_dodge2(1)\n ) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n caption = \"The whiskers extend to the minimum and maximum values.\",\n x = \"Visit\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_7, oc, 2)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodebp_8 <- ggplot(adlb_v, aes(x = ARMCD, y = AVAL)) +\n stat_summary(\n geom = \"boxplot\",\n fun.data = five_num,\n position = position_dodge2(width = .5),\n aes(fill = AVISIT, color = AVISIT)\n ) +\n stat_summary(\n geom = \"point\",\n fun = mean,\n aes(group = AVISIT),\n size = 3,\n shape = 8,\n position = position_dodge2(1)\n ) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n caption = \"The whiskers extend to the minimum and maximum values.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\nplot <- bp_annos(bp_8, oc, 2)\nplot\n\n\n\n\n\n\n\n\n\n\nCode# Make wide dataset with summary statistics\nadlb_wide <- adlb %>%\n group_by(ARMCD) %>%\n summarise(\n n = n(),\n mean = round(mean(AVAL), 1),\n median = round(median(AVAL), 1),\n median_ci = paste(round(DescTools::MedianCI(AVAL)[1:2], 1), collapse = \" - \"),\n q1_q3 = paste(round(quantile(AVAL, c(0.25, 0.75)), 1), collapse = \" - \"),\n min_max = paste0(round(min(AVAL), 1), \"-\", max(round(AVAL, 2)))\n )\n\n# Make long dataset\nadlb_long <- tidyr::gather(adlb_wide, key = type, value = stat, n:min_max)\nadlb_long <- adlb_long %>% mutate(\n type_lbl = case_when(\n type == \"n\" ~ \"n\",\n type == \"mean\" ~ \"Mean\",\n type == \"median\" ~ \"Median\",\n type == \"median_ci\" ~ \"95% CI for Median\",\n type == \"q1_q3\" ~ \"25% and 75%-ile\",\n type == \"min_max\" ~ \"Min - Max\"\n )\n)\nadlb_long$type_lbl <- factor(adlb_long$type_lbl,\n levels = c(\"Min - Max\", \"25% and 75%-ile\", \"95% CI for Median\", \"Median\", \"Mean\", \"n\")\n)\n\nbp_9 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +\n stat_summary(geom = \"boxplot\", fun.data = five_num, fill = fc, color = oc) +\n stat_summary(geom = \"point\", fun = mean, size = 3, shape = 8) +\n labs(\n title = \"Box Plot of Laboratory Test Results\",\n subtitle = paste(\"Visit:\", adlb$AVISIT[1]),\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n ) +\n theme_bp\n\ntbl_theme <- theme(\n panel.border = element_blank(),\n panel.grid.major = element_blank(),\n panel.grid.minor = element_blank(),\n axis.ticks = element_blank(),\n axis.title = element_blank(),\n axis.text.y = element_text(face = \"plain\"),\n axis.text.x = element_blank()\n)\n\ntbl_1 <- ggplot(adlb_long, aes(x = ARMCD, y = type_lbl, label = stat), vjust = 10) +\n geom_text(size = 3) +\n scale_y_discrete(labels = levels(adlb_long$type_lbl)) +\n theme_bw() +\n tbl_theme +\n labs(caption = \"The whiskers extend to the minimum and maximum values.\") +\n theme_bp\n\nplot <- ggpubr::ggarrange(bp_annos(bp_9, oc), tbl_1,\n heights = c(4, 2),\n ncol = 1, nrow = 2, align = \"v\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\nCodetbl_2 <- adlb_long %>%\n filter(type == \"n\") %>%\n ggplot(aes(x = ARMCD, y = type_lbl, label = stat)) +\n geom_text(size = 3) +\n scale_y_discrete(labels = \"n\") +\n theme_bw() +\n tbl_theme +\n labs(caption = \"The whiskers extend to the minimum and maximum values.\") +\n theme_bp\n\nplot <- ggpubr::ggarrange(bp_annos(bp_9, oc), tbl_2,\n heights = c(6, 1),\n ncol = 1, nrow = 2, align = \"v\"\n)\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.general)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n library(tern)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n\n # If PARAMCD and AVISIT are not factors, convert to factors\n # Also fill in missing values with \"<Missing>\"\n ADLB <- ADLB %>%\n df_explicit_na(\n omit_columns = setdiff(names(ADLB), c(\"PARAMCD\", \"AVISIT\")),\n char_as_factor = TRUE\n )\n\n # If statment below fails, pre-process ADLB to be one record per\n # study, subject, param and visit eg. filter with ANLFL = 'Y'\n stopifnot(nrow(ADLB) == nrow(unique(ADLB[, c(\"STUDYID\", \"USUBJID\", \"PARAMCD\", \"AVISIT\")])))\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADSL <- data[[\"ADSL\"]]\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_bivariate(\n x = data_extract_spec(\n dataname = \"ADSL\",\n select = select_spec(\n label = \"Select variable:\",\n choices = names(ADSL),\n selected = \"ARMCD\",\n fixed = FALSE\n )\n ),\n y = data_extract_spec(\n dataname = \"ADLB\",\n filter = list(\n filter_spec(\n vars = c(\"PARAMCD\"),\n choices = levels(ADLB$PARAMCD),\n selected = levels(ADLB$PARAMCD)[1],\n multiple = FALSE,\n label = \"Choose lab parameter\"\n ),\n filter_spec(\n vars = c(\"AVISIT\"),\n choices = levels(ADLB$AVISIT),\n selected = levels(ADLB$AVISIT)[1],\n multiple = FALSE,\n label = \"Choose visit\"\n )\n ),\n select = select_spec(\n label = \"Select variable:\",\n choices = names(ADLB),\n selected = \"AVAL\",\n multiple = FALSE,\n fixed = TRUE\n )\n ),\n row_facet = data_extract_spec(\n dataname = \"ADLB\",\n select = select_spec(\n label = \"Select variables:\",\n choices = names(ADLB),\n selected = NULL,\n multiple = FALSE,\n fixed = FALSE\n )\n ),\n col_facet = data_extract_spec(\n dataname = \"ADLB\",\n select = select_spec(\n label = \"Select variables:\",\n choices = names(ADLB),\n selected = NULL,\n multiple = FALSE,\n fixed = FALSE\n )\n )\n )\n )\n)\n\nshinyApp(app$ui, app$server)\n\nWarning: Removed 8000 rows containing non-finite outside the scale range\n(`stat_boxplot()`).\n\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:57:31 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] tern_0.9.3.9028 rtables_0.6.6.9011 \n [3] magrittr_2.0.3 formatters_0.5.5.9016 \n [5] teal.modules.general_0.3.0.9005 teal.transform_0.5.0.9004 \n [7] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [9] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n[11] shiny_1.8.0 ggmosaic_0.3.3 \n[13] nestcolor_0.1.2.9009 ggplot2_3.5.0 \n[15] dplyr_1.1.4 scda_0.1.6.9017 \n\nloaded via a namespace (and not attached):\n [1] rstudioapi_0.15.0 jsonlite_1.8.8 farver_2.1.1 \n [4] rmarkdown_2.26 ragg_1.3.0 vctrs_0.6.5 \n [7] memoise_2.0.1 rstatix_0.7.2 webshot_0.5.5 \n [10] htmltools_0.5.7 forcats_1.0.0 broom_1.0.5 \n [13] cellranger_1.1.0 sass_0.4.9 bslib_0.6.1 \n [16] htmlwidgets_1.6.4 fontawesome_0.5.2 testthat_3.2.1 \n [19] rootSolve_1.8.2.4 plotly_4.10.4 cachem_1.0.8 \n [22] mime_0.12 lifecycle_1.0.4 teal.widgets_0.4.2.9009 \n [25] pkgconfig_2.0.3 webshot2_0.1.1 Matrix_1.6-5 \n [28] R6_2.5.1 fastmap_1.1.1 rbibutils_2.2.16 \n [31] digest_0.6.35 Exact_3.2 colorspace_2.1-0 \n [34] shinycssloaders_1.0.0 ps_1.7.6 textshaping_0.3.7 \n [37] ggpubr_0.6.0 labeling_0.4.3 fansi_1.0.6 \n [40] httr_1.4.7 abind_1.4-5 compiler_4.3.3 \n [43] proxy_0.4-27 withr_3.0.0 backports_1.4.1 \n [46] carData_3.0-5 logger_0.3.0 ggsignif_0.6.4 \n [49] MASS_7.3-60.0.1 gld_2.6.6 tools_4.3.3 \n [52] chromote_0.2.0 httpuv_1.6.14 shinyvalidate_0.1.3 \n [55] glue_1.7.0 callr_3.7.5 promises_1.2.1 \n [58] grid_4.3.3 checkmate_2.3.1 generics_0.1.3 \n [61] gtable_0.3.4 class_7.3-22 tidyr_1.3.1 \n [64] websocket_1.4.1 data.table_1.15.2 lmom_3.0 \n [67] car_3.1-2 utf8_1.2.4 ggrepel_0.9.5 \n [70] pillar_1.9.0 stringr_1.5.1 later_1.3.2 \n [73] splines_4.3.3 lattice_0.22-6 survival_3.5-8 \n [76] tidyselect_1.2.1 knitr_1.45 teal.logger_0.2.0.9001 \n [79] xfun_0.42 expm_0.999-9 brio_1.1.4 \n [82] stringi_1.8.3 lazyeval_0.2.2 yaml_2.3.8 \n [85] boot_1.3-30 shinyWidgets_0.8.2 evaluate_0.23 \n [88] codetools_0.2-19 tibble_3.2.1 cli_3.6.2 \n [91] xtable_1.8-4 DescTools_0.99.54 systemfonts_1.0.6 \n [94] Rdpack_2.6 munsell_0.5.0 processx_3.8.4 \n [97] jquerylib_0.1.4 Rcpp_1.0.12 teal.reporter_0.3.1.9002\n[100] readxl_1.4.3 ellipsis_0.3.2 viridisLite_0.4.2 \n[103] mvtnorm_1.2-4 scales_1.3.0 e1071_1.7-14 \n[106] purrr_1.0.2 rlang_1.1.3 cowplot_1.1.3 \n[109] formatR_1.14 shinyjs_2.1.0 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nPlot in Linear Scale\nPlot in Log Scale\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\")\n\n\n\n\n\n\nCodeadpc_a <- adpc %>%\n filter(\n PARAM == \"Plasma Drug X\",\n ARMCD == \"ARM A\"\n ) %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID)) %>%\n filter(Patient_ID %in% unique(Patient_ID)[1:10])\n\nuse_title1 <- \"Plot of X Concentration (ug/mL) Over Time by Treatment: \\nPK Evaluable Patients\"\nuse_subtitle1 <- \"Analyte: Plasma X (ug/mL) \\nTreatment Group: ARM A\"\nuse_footnote1 <- \"Program: \\nOutput:\"\n\nplot <- g_ipp(\n df = adpc_a,\n xvar = \"NFRLT\",\n yvar = \"AVAL\",\n xlab = \"Norminal Time from First Dose (hr)\",\n ylab = \"Concentration (ug/mL)\",\n id_var = \"Patient_ID\",\n add_baseline_hline = FALSE,\n yvar_baseline = \"AVAL\", # yvar_baseline cannot be NA or ignore\n title = use_title1,\n subtitle = use_subtitle1,\n caption = use_footnote1,\n plotting_choices = \"all_in_one\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeadpc_a <- adpc %>%\n filter(\n PARAM == \"Plasma Drug X\",\n ARMCD == \"ARM A\"\n ) %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID)) %>%\n mutate(avalog = ifelse(AVAL != 0, AVAL, 0.001)) %>%\n filter(Patient_ID %in% unique(Patient_ID)[1:10])\n\nuse_title3 <- \"Log-scale Plot of X Concentration (ug/mL) Over Time by Treatment: \\nPK Evaluable Patients\"\nuse_subtitle3 <- \"Analyte: Plasma X (ug/mL) \\nTreatment Group: ARM A\"\nuse_footnote3 <- \"Program: \\nOutput:\"\n\nresult <- g_ipp(\n df = adpc_a,\n xvar = \"NFRLT\",\n yvar = \"avalog\",\n xlab = \"Norminal Time from First Dose (hr)\",\n ylab = \"Concentration (ug/mL)\",\n id_var = \"Patient_ID\",\n add_baseline_hline = FALSE,\n yvar_baseline = \"AVAL\", # yvar_baseline cannot be NA or ignore\n title = use_title3,\n caption = use_footnote3,\n subtitle = use_subtitle3,\n plotting_choices = \"all_in_one\"\n)\nplot <- result + ggplot2::scale_y_log10(breaks = c(0.001, 0.01, 0.1, 1, 10), labels = c(0.001, 0.01, 0.1, 1, 10))\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 18:00:53 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 labeling_0.4.3 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 broom_1.0.5 xfun_0.42 \n[29] cli_3.6.2 withr_3.0.0 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 farver_2.1.1 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Other", - "BWG01" + "Pharmacokinetic", + "PKCG02" ] }, { - "objectID": "graphs/other/brg01.html", - "href": "graphs/other/brg01.html", - "title": "BRG01", + "objectID": "graphs/pharmacokinetic/pkpg06.html", + "href": "graphs/pharmacokinetic/pkpg06.html", + "title": "PKPG06", "section": "", - "text": "Data Setup\nPlot of Frequency\nPlot of Percentage\nPlot of Frequency with Total Number of Subjects\nPlot of Frequency with Horizontal Bars\nPlot of Percentage and Confidence Intervals\nPlot of Percentage by Treatment and Covariate\nPlot of Percentage by Covariate and Treatment\nPlot of Percentage with Mean and Median\nPlot of Categorical Variable\nteal App\nReproducibility\n\n\n\n\nCodelibrary(binom)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(scda)\nlibrary(tidyr)\nlibrary(tern)\nlibrary(nestcolor)\n\nadsl <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n\n# filtered population\npatpop_df <- adsl %>%\n group_by(STUDYID) %>%\n summarise(patpop = n())\npatpop <- setNames(patpop_df$patpop, patpop_df$STUDYID)\ndenom <- patpop_df$patpop\n\nadae <- synthetic_cdisc_dataset(\"latest\", \"adae\") %>%\n mutate(AETOXGRC = as.character(AETOXGR))\nattributes(adae$AETOXGRC)$label <- \"Analysis Toxicity Grade (C)\"\nvl_ae <- var_labels(adae)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\nvl_lb <- var_labels(adlb)\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESER == \"Y\")\nanl <- anl[!duplicated(anl$USUBJID), ]\n\nplot <- ggplot(anl, aes(x = .data[[\"ACTARM\"]])) +\n geom_bar(fill = getOption(\"ggplot2.discrete.fill\")[1]) +\n geom_text(stat = \"count\", aes(label = ggplot2::after_stat(count)), vjust = -.5) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Frequency of Subjects With Serious AEs: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Frequency\")\nplot\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESOC == \"cl A\")\n\nanl <- anl[!duplicated(anl$USUBJID), ] %>%\n group_by(ACTARM) %>%\n summarise(n = n()) %>%\n mutate(N = patpop) %>%\n mutate(N = as.numeric(N)) %>%\n mutate(pct = round((n / N) * 100, 2))\n\nplot <- ggplot(anl, aes(x = .data[[\"ACTARM\"]])) +\n geom_col(aes(x = ACTARM, y = pct), fill = getOption(\"ggplot2.discrete.fill\")[1]) +\n scale_y_continuous(labels = scales::comma) +\n geom_text(aes(y = pct, label = pct), stat = \"identity\", vjust = -0.5) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects With cl A Disorders: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Percent\")\nplot\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESOC == \"cl A\")\nanl <- anl[!duplicated(anl$USUBJID), ]\n\nanl <- anl %>%\n group_by(ACTARM) %>%\n mutate(n = n()) %>%\n mutate(xvarlabel = paste0(ACTARM, \"\\n\\nN = \", n))\n\nplot <- ggplot(anl, aes(x = .data[[\"xvarlabel\"]])) +\n geom_bar(fill = getOption(\"ggplot2.discrete.fill\")[1]) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Frequency of Subjects With Serious AEs: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Frequency\")\nplot\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESER == \"Y\")\nanl <- anl[!duplicated(anl$USUBJID), ]\n\nplot <- ggplot(anl, aes(x = .data[[\"ACTARM\"]])) +\n geom_bar(fill = getOption(\"ggplot2.discrete.fill\")[1]) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Frequency of Subjects With Serious AEs: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Frequency\") +\n coord_flip()\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adlb %>%\n filter(PARAMCD == \"ALT\" & ANRIND == \"HIGH\")\nanl <- anl[!duplicated(anl$USUBJID), ]\n\npatpop5 <- as.data.frame(table(adsl$ACTARM)) %>%\n mutate(ACTARM = as.vector(Var1)) %>%\n mutate(TRTPOP = Freq) %>%\n select(ACTARM, TRTPOP)\n\nanlpop <- as.data.frame(table(anl$ANRIND, anl$ACTARM)) %>%\n filter(Var1 == \"HIGH\") %>%\n mutate(ACTARM = as.vector(Var2)) %>%\n mutate(EVENTCOUNT = Freq) %>%\n select(ACTARM, EVENTCOUNT)\n\nanl <- left_join(patpop5, anlpop, by = \"ACTARM\")\nCIs <- binom.confint(x = anl$EVENTCOUNT, n = anl$TRTPOP, methods = \"exact\") \nanl <- cbind(anl, CIs[, 4:6])\n\nplot <- ggplot(anl) +\n geom_bar(\n aes(x = ACTARM, y = mean * 100),\n stat = \"identity\",\n fill = getOption(\"ggplot2.discrete.fill\")[1],\n alpha = 0.7\n ) +\n geom_errorbar(\n aes(x = ACTARM, ymin = lower * 100, ymax = upper * 100),\n width = 0.5,\n colour = \"#20b4ff\",\n alpha = 0.9,\n linewidth = 1.0\n ) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects with Abnormaly High ALT: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Percentage\")\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESER == \"Y\")\n\npatpop6 <- dplyr::count(adsl, ACTARM, SEX, name = \"N_arm_sex\")\n\nanl <- anl[!duplicated(anl$USUBJID), ] %>%\n group_by(ACTARM, SEX) %>%\n summarise(n = n(), .groups = \"drop\") %>%\n left_join(patpop6, by = c(\"ACTARM\", \"SEX\")) %>%\n mutate(pct = round((n / N_arm_sex) * 100, 2))\n\nplot <- ggplot(anl, aes(x = .data[[\"ACTARM\"]], fill = .data[[\"SEX\"]])) +\n geom_col(aes(y = pct), position = position_dodge()) +\n guides(fill = guide_legend(title = getElement(vl_ae, \"SEX\"))) +\n scale_y_continuous(labels = scales::comma) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects With Serious AEs: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Percent\")\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae %>%\n filter(AESER == \"Y\")\n\nanl <- anl[!duplicated(anl$USUBJID), ] %>%\n group_by(SEX, ACTARM) %>%\n summarise(n = n(), .groups = \"drop_last\") %>%\n mutate(N = patpop) %>%\n mutate(N = as.numeric(N)) %>%\n mutate(pct = round((n / N) * 100, 2))\n\nplot <- ggplot(anl, aes(x = .data[[\"SEX\"]], fill = .data[[\"ACTARM\"]])) +\n geom_col(aes(y = pct), position = position_dodge()) +\n guides(fill = guide_legend(title = getElement(vl_ae, \"ACTARM\"))) +\n scale_y_continuous(labels = scales::comma) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects With Serious AEs: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"SEX\"), \" (N = \", denom, \")\")) +\n ylab(\"Percent\")\nplot\n\n\n\n\n\n\n\n\n\n\nCodeanl1 <- adlb %>%\n filter(AVISIT == \"BASELINE\", PARAMCD == \"CRP\" & ANRIND == \"HIGH\")\n\nanl <- anl1[!duplicated(anl1$USUBJID), ] %>%\n group_by(ACTARM) %>%\n summarise(n = n()) %>%\n mutate(N = patpop) %>%\n mutate(N = as.numeric(N)) %>%\n mutate(pct = round((n / N) * 100, 2))\n\ngraph <- ggplot(anl, aes(x = .data[[\"ACTARM\"]])) +\n geom_col(aes(x = ACTARM, y = pct), fill = getOption(\"ggplot2.discrete.fill\")[1]) +\n scale_y_continuous(labels = scales::comma, expand = expansion(c(0, .25))) +\n geom_text(aes(y = pct, label = pct), stat = \"identity\", vjust = -0.5) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects with Abnormaly High CRP at Baseline \\n Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_lb, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Percent\")\n\nsd_w <- anl1 %>%\n group_by(ACTARM) %>%\n summarise(\n mean = round(mean(AVAL, na.rm = TRUE), 2),\n median = round(median(AVAL, na.rm = TRUE), 2)\n ) %>%\n arrange(ACTARM)\n\nsd_l <- gather(sd_w, key = stat, value = value, mean:median)\nsd_l <- sd_l %>% mutate(\n stat_lbl = case_when(\n stat == \"mean\" ~ \"Mean\",\n stat == \"median\" ~ \"Median\"\n )\n)\n\nsd_l$stat_lbl <- factor(sd_l$stat_lbl, levels = c(\"Median\", \"Mean\"))\n\ntbl_theme <- theme(\n panel.border = element_blank(),\n panel.grid.major = element_blank(),\n panel.grid.minor = element_blank(),\n axis.ticks = element_blank(),\n axis.title = element_blank(),\n axis.text.y = element_text(face = \"plain\"),\n axis.text.x = element_blank()\n)\n\ntbl <- ggplot(sd_l, aes(x = ACTARM, y = stat_lbl, label = value)) +\n geom_text(size = 3) +\n scale_y_discrete(labels = levels(sd_l$stat_lbl)) +\n theme_bw() +\n tbl_theme\n\nplot <- ggpubr::ggarrange(graph, tbl,\n heights = c(4, 1),\n ncol = 1, nrow = 2, align = \"v\"\n)\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl <- adae\n\nanl <- anl %>%\n arrange(USUBJID, AETOXGRC) %>%\n group_by(USUBJID) %>%\n slice(n()) %>%\n ungroup()\n\nanl <- anl[!duplicated(anl$USUBJID), ] %>%\n group_by(ACTARM, AETOXGRC) %>%\n summarise(n = n(), .groups = \"drop_last\") %>%\n mutate(N = patpop) %>%\n mutate(N = as.numeric(N)) %>%\n mutate(pct = round((n / N) * 100, 2))\n\nplot <- ggplot(anl, aes(x = .data[[\"ACTARM\"]], fill = .data[[\"AETOXGRC\"]])) +\n geom_col(aes(y = pct)) +\n guides(fill = guide_legend(title = getElement(vl_ae, \"AETOXGRC\"))) +\n scale_y_continuous(labels = scales::comma) +\n theme(plot.title = element_text(hjust = 0.5)) +\n ggtitle(\"Percent of Subjects With AE by Highest \\n NCI CTCAE Grade: Safety-Evaluable Subjects\") +\n xlab(paste0(getElement(vl_ae, \"ACTARM\"), \" (N = \", denom, \")\")) +\n ylab(\"Percent\")\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:57:58 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] nestcolor_0.1.2.9009 tern_0.9.3.9028 rtables_0.6.6.9011 \n [4] magrittr_2.0.3 formatters_0.5.5.9016 tidyr_1.3.1 \n [7] scda_0.1.6.9017 ggplot2_3.5.0 dplyr_1.1.4 \n[10] binom_1.1-1.1 \n\nloaded via a namespace (and not attached):\n [1] utf8_1.2.4 generics_0.1.3 rstatix_0.7.2 lattice_0.22-6 \n [5] digest_0.6.35 evaluate_0.23 grid_4.3.3 fastmap_1.1.1 \n [9] jsonlite_1.8.8 Matrix_1.6-5 backports_1.4.1 brio_1.1.4 \n[13] survival_3.5-8 purrr_1.0.2 fansi_1.0.6 scales_1.3.0 \n[17] codetools_0.2-19 abind_1.4-5 Rdpack_2.6 cli_3.6.2 \n[21] rlang_1.1.3 rbibutils_2.2.16 cowplot_1.1.3 munsell_0.5.0 \n[25] splines_4.3.3 withr_3.0.0 yaml_2.3.8 tools_4.3.3 \n[29] ggsignif_0.6.4 checkmate_2.3.1 colorspace_2.1-0 ggpubr_0.6.0 \n[33] broom_1.0.5 vctrs_0.6.5 R6_2.5.1 lifecycle_1.0.4 \n[37] car_3.1-2 htmlwidgets_1.6.4 pkgconfig_2.0.3 pillar_1.9.0 \n[41] gtable_0.3.4 glue_1.7.0 xfun_0.42 tibble_3.2.1 \n[45] tidyselect_1.2.1 knitr_1.45 farver_2.1.1 htmltools_0.5.7 \n[49] carData_3.0-5 rmarkdown_2.26 labeling_0.4.3 testthat_3.2.1 \n[53] compiler_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nPlot with Whiskers at ±1.5 Times Inter-Quartile Range\nPlot with Whiskers at Minimum and Maximum Values\nPlot with Whiskers at 5th and 95th Percentiles\nteal App\nReproducibility\n\n\n\n\nCodelibrary(dplyr)\nlibrary(scda)\nlibrary(ggplot2)\nlibrary(tidyr)\nlibrary(tern)\nlibrary(nestcolor)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\n# Filter NAs\nadpp <- adpp %>%\n filter(PPSPEC != \"NA\" & PARAM != \"NA\" & PPCAT != \"NA\") %>%\n filter(PARAMCD == \"CMAX\" | PARAMCD == \"AUCIFO\", AVISITN == 1)\n\n# filter data by PPCAT and calculate ratio\nanl_x <- adpp %>%\n filter(PPCAT %in% c(\"Metabolite Drug X\", \"Plasma Drug X\")) %>%\n pivot_wider(\n id_cols = c(USUBJID, ACTARM, PARAMCD, AVISIT),\n names_from = PPCAT,\n values_from = AVAL\n ) %>%\n dplyr::mutate(ratio = `Metabolite Drug X` / `Plasma Drug X`) %>%\n filter(!is.na(ratio), ratio != Inf)\n\nanl_y <- adpp %>%\n filter(PPCAT %in% c(\"Metabolite Drug Y\", \"Plasma Drug Y\")) %>%\n pivot_wider(\n id_cols = c(USUBJID, ACTARM, PARAMCD, AVISIT),\n names_from = PPCAT,\n values_from = AVAL\n ) %>%\n dplyr::mutate(ratio = `Metabolite Drug Y` / `Plasma Drug Y`) %>%\n filter(!is.na(ratio), ratio != Inf)\n\n# functions to calculate custom quantiles and outliers\nquantiles <- function(x) {\n quant <- quantile(x, probs = c(0.05, 0.25, 0.5, 0.75, 0.95))\n names(quant) <- c(\"ymin\", \"lower\", \"middle\", \"upper\", \"ymax\")\n quant\n}\n\noutliers <- function(x) {\n return(x < quantile(x, 0.05) | x > quantile(x, 0.95))\n}\n\n\n\n\nDrug X Boxplot\n\n\nCodeplot <- ggplot(anl_x, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +\n geom_boxplot(outlier.size = 2) +\n stat_boxplot(geom = \"errorbar\") +\n stat_summary(\n geom = \"point\",\n fun = \"mean\",\n col = \"black\",\n size = 5,\n shape = 8,\n position = position_dodge(0.75)\n ) +\n geom_text(\n data = . %>% dplyr::group_by(PARAMCD, ACTARM) %>% dplyr::filter(ratio %in% boxplot.stats(ratio)$out),\n aes(x = PARAMCD, y = ratio, label = USUBJID, col = ACTARM),\n size = 3,\n hjust = -0.2,\n position = position_dodge(0.75),\n show.legend = FALSE\n ) +\n labs(\n title = \"Boxplot of Metabolite to Parent Ratios by Treatment\",\n subtitle = paste0(\n \"Analyte: Plasma Drug X, Metabolite Drug X \",\n \"\\nPK Parameter: \",\n as.character(paste(unique(anl_x$PARAMCD), collapse = \", \")),\n \"\\nVisit: \",\n as.character((unique(anl_x$AVISIT)))\n ),\n caption = \"Program: \\nOutput:\",\n x = \"Parameter\",\n y = \"Metabolite to Parent Ratio\"\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\n# PKPG06\nplot\n\n\n\n\n\n\n\nDrug Y Boxplot\n\n\nCodeplot <- ggplot(anl_y, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +\n geom_boxplot(outlier.size = 2) +\n stat_boxplot(geom = \"errorbar\") +\n stat_summary(\n geom = \"point\",\n fun = \"mean\",\n col = \"black\",\n size = 5,\n shape = 8,\n position = position_dodge(0.75)\n ) +\n geom_text(\n data = . %>% dplyr::group_by(PARAMCD, ACTARM) %>% dplyr::filter(ratio %in% boxplot.stats(ratio)$out),\n aes(x = PARAMCD, y = ratio, label = USUBJID, color = ACTARM),\n size = 3,\n hjust = -0.2,\n position = position_dodge(0.75),\n show.legend = FALSE\n ) +\n labs(\n title = \"Boxplot of Metabolite to Parent Ratios by Treatment\",\n subtitle = paste0(\n \"Analyte: Plasma Drug Y, Metabolite Drug Y \",\n \"\\nPK Parameter: \",\n as.character(paste(unique(anl_y$PARAMCD), collapse = \", \")),\n \"\\nVisit: \",\n as.character((unique(anl_y$AVISIT)))\n ),\n caption = \"Program: \\nOutput:\",\n x = \"Parameter\",\n y = \"Metabolite to Parent Ratio\"\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\n# result\nplot\n\n\n\n\n\n\n\n\n\n\n\n\nCode# whiskers are formed with the minimum and maximum values\nplot <- ggplot(anl_x, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +\n geom_boxplot(outlier.size = 0) +\n stat_boxplot(geom = \"errorbar\", coef = NULL) +\n stat_summary(geom = \"point\", fun = \"mean\", col = \"black\", size = 5, shape = 8, position = position_dodge(0.75)) +\n labs(\n title = \"Boxplot of Metabolite to Parent Ratios by Treatment\",\n subtitle = paste0(\n \"Analyte: Plasma Drug X, Metabolite Drug X \",\n \"\\nPK Parameter: \",\n as.character(paste(unique(anl_x$PARAMCD), collapse = \", \")),\n \"\\nVisit: \",\n as.character((unique(anl_x$AVISIT)))\n ),\n caption = \"Program:\\nOutput:\",\n x = \"Parameter\",\n y = \"Metabolite to Parent Ratio\"\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\n# result\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeanl_x_without_outliers <- anl_x %>%\n dplyr::group_by(PARAMCD, ACTARM) %>%\n dplyr::mutate(outlier = ifelse(outliers(ratio), ratio, as.numeric(NA)))\nplot <- ggplot(anl_x, aes(PARAMCD, ratio, fill = ACTARM, label = USUBJID)) +\n stat_summary(\n fun.data = quantiles, geom = \"boxplot\",\n position = position_dodge(1)\n ) +\n stat_summary(\n geom = \"point\",\n fun = \"mean\",\n col = \"black\",\n size = 5,\n shape = 8,\n position = position_dodge(1)\n ) +\n stat_summary(\n fun.data = quantiles, geom = \"errorbar\",\n position = position_dodge(1)\n ) +\n geom_point(\n data = anl_x_without_outliers,\n aes(x = PARAMCD, y = outlier),\n na.rm = TRUE,\n size = 2,\n position = position_dodge(1),\n show.legend = FALSE\n ) +\n geom_text(\n data = anl_x_without_outliers,\n aes(x = PARAMCD, y = outlier, label = USUBJID, color = ACTARM),\n na.rm = TRUE,\n size = 3,\n hjust = -0.2,\n vjust = 1,\n position = position_dodge(1),\n show.legend = FALSE\n ) +\n labs(\n title = \"Boxplot of Metabolite to Parent Ratios by Treatment\",\n subtitle = paste0(\n \"Analyte: Plasma Drug X, Metabolite Drug X \",\n \"\\nPK Parameter: \",\n as.character(paste(unique(anl_x$PARAMCD), collapse = \", \")),\n \"\\nVisit: \",\n as.character((unique(anl_x$AVISIT)))\n ),\n caption = \"Program: \\nOutput:\",\n x = \"Parameter\",\n y = \"Metabolite to Parent Ratio\"\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\n# result\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 18:01:06 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 tern_0.9.3.9028 rtables_0.6.6.9011 \n[4] magrittr_2.0.3 formatters_0.5.5.9018 tidyr_1.3.1 \n[7] ggplot2_3.5.0 scda_0.1.6.9017 dplyr_1.1.4 \n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 splines_4.3.3 scales_1.3.0 \n [9] yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 R6_2.5.1 \n[13] labeling_0.4.3 generics_0.1.3 knitr_1.45 rbibutils_2.2.16 \n[17] htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 tibble_3.2.1 \n[21] munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 utf8_1.2.4 \n[25] testthat_3.2.1 broom_1.0.5 xfun_0.42 cli_3.6.2 \n[29] withr_3.0.0 Rdpack_2.6 digest_0.6.35 grid_4.3.3 \n[33] lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 glue_1.7.0 \n[37] farver_2.1.1 codetools_0.2-19 survival_3.5-8 fansi_1.0.6 \n[41] colorspace_2.1-0 rmarkdown_2.26 purrr_1.0.2 tools_4.3.3 \n[45] pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Other", - "BRG01" + "Pharmacokinetic", + "PKPG06" ] }, { - "objectID": "graphs/other/cig01.html", - "href": "graphs/other/cig01.html", - "title": "CIG01", + "objectID": "graphs/pharmacokinetic/pkpg04.html", + "href": "graphs/pharmacokinetic/pkpg04.html", + "title": "PKPG04", "section": "", - "text": "Data Setup\nPlot of Mean and 95% CIs for Mean\nPlot of Confidence Interval Using a Different Stratification Variable\nPlot of Median and 95% CIs for Median\nPlot of Median and 95% CIs for Median Using Different Alpha Level\nTable of Mean and Median\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(ggplot2)\nlibrary(dplyr)\nlibrary(scda)\nlibrary(nestcolor)\n\nadlb <- synthetic_cdisc_dataset(\"latest\", \"adlb\") %>%\n filter(PARAMCD == \"ALT\", AVISIT == \"BASELINE\")\n\n\n\n\nThe function stat_mean_ci from the tern package can be used with default values to draw the 95% confidence interval around the mean.\n\n\nCodeplot <- ggplot(\n data = adlb,\n mapping = aes(\n x = ARMCD, y = AVAL, color = SEX,\n lty = SEX, shape = SEX\n )\n) +\n stat_summary(\n fun.data = tern::stat_mean_ci,\n geom = \"errorbar\",\n width = 0.1,\n position = position_dodge(width = 0.5)\n ) +\n stat_summary(\n fun = mean,\n geom = \"point\",\n position = position_dodge(width = 0.5)\n ) +\n labs(\n title = \"Confidence Interval Plot by Treatment Group\",\n caption = \"Mean and 95% CIs for mean are displayed.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n )\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeplot <- ggplot(\n data = adlb,\n mapping = aes(\n x = ARMCD, y = AVAL, color = STRATA2,\n lty = STRATA2, shape = STRATA2\n )\n) +\n stat_summary(\n fun.data = tern::stat_mean_ci,\n geom = \"errorbar\",\n width = 0.1,\n position = position_dodge(width = 0.5)\n ) +\n stat_summary(\n fun = mean,\n geom = \"point\",\n position = position_dodge(width = 0.5)\n ) +\n labs(\n title = \"Confidence Interval Plot by Treatment Group\",\n caption = \"Mean and 95% CIs for mean are displayed.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n )\nplot\n\n\n\n\n\n\n\n\n\nThe function stat_median_ci from the tern package works similarly to stat_mean_ci.\n\n\nCodeplot <- ggplot(\n data = adlb,\n mapping = aes(\n x = ARMCD, y = AVAL, color = STRATA1,\n lty = STRATA1, shape = STRATA1\n )\n) +\n stat_summary(\n fun.data = stat_median_ci,\n geom = \"errorbar\",\n width = 0.1,\n position = position_dodge(width = 0.5)\n ) +\n stat_summary(\n fun = median,\n geom = \"point\",\n position = position_dodge(width = 0.5)\n ) +\n labs(\n title = \"Confidence Interval Plot by Treatment Group\",\n caption = \"Median and 95% CIs for median are displayed.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n )\nplot\n\n\n\n\n\n\n\n\n\nTo modify the confidence level for the estimation of the confidence interval, the call to stat_mean_ci (or stat_median_ci) can be slightly modified.\n\n\nCodeplot <- ggplot(\n data = adlb,\n mapping = aes(\n x = ARMCD, y = AVAL, color = SEX,\n lty = SEX, shape = SEX\n )\n) +\n stat_summary(\n fun.data = function(x) tern::stat_mean_ci(x, conf_level = 0.9),\n geom = \"errorbar\",\n width = 0.1,\n position = position_dodge(width = 0.5)\n ) +\n stat_summary(\n fun = mean,\n geom = \"point\",\n position = position_dodge(width = 0.5)\n ) +\n labs(\n title = \"Confidence Interval Plot by Treatment Group\",\n caption = \"Mean and 90% CIs for mean are displayed.\",\n x = \"Treatment Group\",\n y = paste0(adlb$PARAMCD[1], \" (\", adlb$AVALU[1], \")\")\n )\nplot\n\n\n\n\n\n\n\n\n\nThe corresponding table is simply obtained using the rtables framework:\n\nCodelyt <- basic_table() %>%\n split_cols_by(var = \"ARMCD\") %>%\n analyze_vars(vars = \"AVAL\", .stats = c(\"mean_sd\", \"median\"))\ntable <- build_table(lyt = lyt, df = adlb)\ntable\n\n ARM A ARM B ARM C \n————————————————————————————————————————————————\nMean (SD) 17.7 (9.9) 18.7 (9.8) 19.5 (9.1)\nMedian 17.5 18.2 19.0 \n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCodelibrary(teal.modules.clinical)\n\n## Data reproducible code\ndata <- teal_data()\ndata <- within(data, {\n library(scda)\n ADSL <- synthetic_cdisc_dataset(\"latest\", \"adsl\")\n ADLB <- synthetic_cdisc_dataset(\"latest\", \"adlb\")\n})\ndatanames <- c(\"ADSL\", \"ADLB\")\ndatanames(data) <- datanames\njoin_keys(data) <- default_cdisc_join_keys[datanames]\n\n## Reusable Configuration For Modules\nADLB <- data[[\"ADLB\"]]\n\n## Setup App\napp <- init(\n data = data,\n modules = modules(\n tm_g_ci(\n label = \"Confidence Interval Plot\",\n x_var = data_extract_spec(\n dataname = \"ADSL\",\n select = select_spec(\n choices = c(\"ARMCD\", \"BMRKR2\"),\n selected = c(\"ARMCD\"),\n multiple = FALSE,\n fixed = FALSE\n )\n ),\n y_var = data_extract_spec(\n dataname = \"ADLB\",\n filter = list(\n filter_spec(\n vars = \"PARAMCD\",\n choices = levels(ADLB$PARAMCD),\n selected = levels(ADLB$PARAMCD)[1],\n multiple = FALSE,\n label = \"Select lab:\"\n ),\n filter_spec(\n vars = \"AVISIT\",\n choices = levels(ADLB$AVISIT),\n selected = levels(ADLB$AVISIT)[1],\n multiple = FALSE,\n label = \"Select visit:\"\n )\n ),\n select = select_spec(\n label = \"Analyzed Value\",\n choices = c(\"AVAL\", \"CHG\"),\n selected = \"AVAL\",\n multiple = FALSE,\n fixed = FALSE\n )\n ),\n color = data_extract_spec(\n dataname = \"ADSL\",\n select = select_spec(\n label = \"Color by variable\",\n choices = c(\"SEX\", \"STRATA1\", \"STRATA2\"),\n selected = c(\"STRATA1\"),\n multiple = FALSE,\n fixed = FALSE\n )\n )\n )\n ),\n header = \"Example of Confidence Interval Plot\",\n footer = tags$p(\n class = \"text-muted\", \"Source: `teal.modules.clinical::tm_g_ci`\"\n )\n)\n\nshinyApp(app$ui, app$server)\n\n\n\n\n\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:58:27 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 \n [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 \n [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 \n [7] shiny_1.8.0 nestcolor_0.1.2.9009 \n [9] scda_0.1.6.9017 dplyr_1.1.4 \n[11] ggplot2_3.5.0 tern_0.9.3.9028 \n[13] rtables_0.6.6.9011 magrittr_2.0.3 \n[15] formatters_0.5.5.9016 \n\nloaded via a namespace (and not attached):\n [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 \n [4] logger_0.3.0 testthat_3.2.1 sandwich_3.1-0 \n [7] rlang_1.1.3 multcomp_1.4-25 compiler_4.3.3 \n[10] systemfonts_1.0.6 callr_3.7.5 vctrs_0.6.5 \n[13] pkgconfig_2.0.3 fastmap_1.1.1 backports_1.4.1 \n[16] ellipsis_0.3.2 fontawesome_0.5.2 labeling_0.4.3 \n[19] utf8_1.2.4 promises_1.2.1 rmarkdown_2.26 \n[22] ps_1.7.6 ragg_1.3.0 purrr_1.0.2 \n[25] xfun_0.42 shinyvalidate_0.1.3 cachem_1.0.8 \n[28] teal.reporter_0.3.1.9002 jsonlite_1.8.8 later_1.3.2 \n[31] broom_1.0.5 R6_2.5.1 bslib_0.6.1 \n[34] stringi_1.8.3 brio_1.1.4 jquerylib_0.1.4 \n[37] estimability_1.5 Rcpp_1.0.12 knitr_1.45 \n[40] zoo_1.8-12 teal.logger_0.2.0.9001 httpuv_1.6.14 \n[43] Matrix_1.6-5 splines_4.3.3 tidyselect_1.2.1 \n[46] yaml_2.3.8 codetools_0.2-19 websocket_1.4.1 \n[49] processx_3.8.4 teal.widgets_0.4.2.9009 lattice_0.22-6 \n[52] tibble_3.2.1 withr_3.0.0 coda_0.19-4.1 \n[55] evaluate_0.23 survival_3.5-8 pillar_1.9.0 \n[58] shinycssloaders_1.0.0 checkmate_2.3.1 shinyjs_2.1.0 \n[61] generics_0.1.3 chromote_0.2.0 munsell_0.5.0 \n[64] scales_1.3.0 xtable_1.8-4 glue_1.7.0 \n[67] emmeans_1.10.0 tools_4.3.3 webshot2_0.1.1 \n[70] webshot_0.5.5 mvtnorm_1.2-4 grid_4.3.3 \n[73] tidyr_1.3.1 rbibutils_2.2.16 colorspace_2.1-0 \n[76] nlme_3.1-164 cli_3.6.2 textshaping_0.3.7 \n[79] fansi_1.0.6 geepack_1.3.10 gtable_0.3.4 \n[82] sass_0.4.9 digest_0.6.35 TH.data_1.1-2 \n[85] htmlwidgets_1.6.4 farver_2.1.1 memoise_2.0.1 \n[88] htmltools_0.5.7 lifecycle_1.0.4 shinyWidgets_0.8.2 \n[91] mime_0.12 MASS_7.3-60.0.1 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "text": "Data Setup\nPlot of CMAX by Visit\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(ggrepel)\nlibrary(nestcolor)\n\nadpp <- synthetic_cdisc_dataset(\"latest\", \"adpp\")\n\n\n\n\n\n\nCode# filtered parameter\nadpp <- adpp %>% filter(toupper(PARAMCD) == \"CMAX\" & toupper(PPSPEC) == \"PLASMA\")\n\nuse_title <- paste0(\"Boxplot of \", as.character(unique(adpp$PARAM)), \" by Visit\")\nuse_subtitle <- paste0(\n \"Analyte:\\nPK Parameter: \",\n as.character(unique(adpp$PARAM)),\n \" (\",\n as.character(unique(adpp$AVALU)),\n \")\"\n)\nuse_footnote <- \"Program: \\nOutput:\"\n\np <- ggplot(adpp, aes(x = AVISIT, y = AVAL, fill = ACTARM)) +\n geom_boxplot(outlier.size = 2) +\n stat_boxplot(geom = \"errorbar\") +\n stat_summary(geom = \"point\", fun = \"mean\", col = \"black\", size = 5, shape = 8, position = position_dodge(0.75)) +\n geom_text_repel(\n data = . %>% dplyr::group_by(AVISIT, ACTARM) %>% dplyr::filter(AVAL %in% boxplot.stats(AVAL)$out),\n aes(x = AVISIT, y = AVAL, label = SUBJID, color = ACTARM),\n size = 3, hjust = -0.2, position = position_dodge(0.75)\n ) +\n labs(\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n x = \"Visit\",\n y = paste0(as.character(unique(adpp$PARAM)), \" (\", as.character(unique(adpp$AVALU)), \")\")\n ) +\n theme(plot.caption = element_text(hjust = 0)) +\n theme_nest()\n\nplot <- p + geom_point(aes(fill = ACTARM), size = 2, shape = 21, position = position_dodge(0.75))\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 18:01:20 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggrepel_0.9.5 ggplot2_3.5.0 \n[4] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 \n[7] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] utf8_1.2.4 generics_0.1.3 tidyr_1.3.1 lattice_0.22-6 \n [5] digest_0.6.35 evaluate_0.23 grid_4.3.3 fastmap_1.1.1 \n [9] jsonlite_1.8.8 Matrix_1.6-5 backports_1.4.1 brio_1.1.4 \n[13] survival_3.5-8 purrr_1.0.2 fansi_1.0.6 scales_1.3.0 \n[17] codetools_0.2-19 Rdpack_2.6 cli_3.6.2 rlang_1.1.3 \n[21] rbibutils_2.2.16 munsell_0.5.0 splines_4.3.3 withr_3.0.0 \n[25] yaml_2.3.8 tools_4.3.3 checkmate_2.3.1 colorspace_2.1-0 \n[29] broom_1.0.5 vctrs_0.6.5 R6_2.5.1 lifecycle_1.0.4 \n[33] htmlwidgets_1.6.4 pkgconfig_2.0.3 pillar_1.9.0 gtable_0.3.4 \n[37] glue_1.7.0 Rcpp_1.0.12 xfun_0.42 tibble_3.2.1 \n[41] tidyselect_1.2.1 knitr_1.45 farver_2.1.1 htmltools_0.5.7 \n[45] rmarkdown_2.26 labeling_0.4.3 testthat_3.2.1 compiler_4.3.3 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", "crumbs": [ "Graphs", - "Other", - "CIG01" + "Pharmacokinetic", + "PKPG04" ] }, { - "objectID": "repro.html#reproducibility", - "href": "repro.html#reproducibility", - "title": "", - "section": "Reproducibility", - "text": "Reproducibility\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-03-30 17:58:52 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nloaded via a namespace (and not attached):\n [1] htmlwidgets_1.6.4 compiler_4.3.3 fastmap_1.1.1 cli_3.6.2 \n [5] tools_4.3.3 htmltools_0.5.7 yaml_2.3.8 codetools_0.2-19 \n [9] rmarkdown_2.26 knitr_1.45 jsonlite_1.8.8 xfun_0.42 \n[13] digest_0.6.35 rlang_1.1.3 evaluate_0.23 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload" - }, - { - "objectID": "CONTRIBUTING.html#table-of-contents", - "href": "CONTRIBUTING.html#table-of-contents", - "title": "", - "section": "Table of contents", - "text": "Table of contents\n👶 Getting started\n📔 Code of Conduct\n🗃 License\n📜 Issues\n🚩 Pull requests\n💻 Coding guidelines\n🏆 Recognition model\n❓ Questions" - }, - { - "objectID": "CONTRIBUTING.html#getting-started", - "href": "CONTRIBUTING.html#getting-started", - "title": "", - "section": "Getting started", - "text": "Getting started\nPlease familiarize yourself with the specific project structure and the book content. Please make sure you read the “Development” section in the README file." - }, - { - "objectID": "CONTRIBUTING.html#code-of-conduct", - "href": "CONTRIBUTING.html#code-of-conduct", - "title": "", - "section": "Code of Conduct", - "text": "Code of Conduct\nA Code of Conduct governs this project. Participants and contributors are expected to follow the rules outlined therein." - }, - { - "objectID": "CONTRIBUTING.html#license", - "href": "CONTRIBUTING.html#license", - "title": "", - "section": "License", - "text": "License\nAll your contributions will be covered by this project’s license." - }, - { - "objectID": "CONTRIBUTING.html#issues", - "href": "CONTRIBUTING.html#issues", - "title": "", - "section": "Issues", - "text": "Issues\nWe 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 👍.\nFor new feature requests, please elaborate on the context and the benefit the feature will have for users, developers, or other relevant personas." - }, - { - "objectID": "CONTRIBUTING.html#pull-requests", - "href": "CONTRIBUTING.html#pull-requests", - "title": "", - "section": "Pull requests", - "text": "Pull requests\n\nGitHub Flow\nThis repository uses the GitHub Flow model for collaboration. To submit a pull request:\n\nCreate a branch\nPlease see the branch naming convention below. If you don’t have write access to this repository, please fork it.\nMake changes\nMake sure your code\n\npasses all checks imposed by GitHub Actions\nis well documented\nis well tested with unit tests sufficiently covering the changes introduced\n\nCreate a pull request (PR)\nIn the pull request description, please link the relevant issue (if any), provide a detailed description of the change, and include any assumptions.\nAddress review comments, if any\nPost approval\nMerge your PR if you have write access. Otherwise, the reviewer will merge the PR on your behalf.\nPat yourself on the back\nCongratulations! 🎉 You are now an official contributor to this project! We are grateful for your contribution.\n\n\n\nBranch naming convention\nSuppose 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.\nIf 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.\n\n\nmonorepo and staged.dependencies\nSometimes 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.\nPlease refer to the staged.dependencies package documentation for more details." - }, - { - "objectID": "CONTRIBUTING.html#coding-guidelines", - "href": "CONTRIBUTING.html#coding-guidelines", - "title": "", - "section": "Coding guidelines", - "text": "Coding guidelines\nThis 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.\n\nStyle guide\nThis repository follows the standard tidyverse style guide and uses lintr for lint checks. Customized lint configurations are available in this repository’s .lintr file.\n\n\nDependency management\nLightweight is the right weight. This repository follows tinyverse recommedations of limiting dependencies to minimum.\n\n\nDependency version management\nIf 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).\n\n\nRecommended development environment & tools\n\nR & package versions\nWe 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().\nIf you discover bugs on older R versions or with an older set of dependencies, please create the relevant bug reports.\n\n\npre-commit\nWe 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.\nPre-commit hooks are already available in this repository’s .pre-commit-config.yaml file." - }, - { - "objectID": "CONTRIBUTING.html#recognition-model", - "href": "CONTRIBUTING.html#recognition-model", - "title": "", - "section": "Recognition model", - "text": "Recognition model\nAs 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:\n\nMinimum 5% of lines of code authored* (determined by git blame query) OR\nBeing at the top 5 contributors in terms of number of commits OR lines added OR lines removed*\n\n*Excluding auto-generated code, including but not limited to roxygen comments or renv.lock files.\nThe package maintainer also reserves the right to adjust the criteria to recognize contributions." + "objectID": "graphs/pharmacokinetic/pkcg01.html", + "href": "graphs/pharmacokinetic/pkcg01.html", + "title": "PKCG01", + "section": "", + "text": "Data Setup\nPlot in Linear Scale\nPlot in Log Scale\nteal App\nReproducibility\n\n\n\n\nCodelibrary(tern)\nlibrary(scda)\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(nestcolor)\n\nadpc <- synthetic_cdisc_dataset(\"latest\", \"adpc\")\n\n\n\n\n\n\nCodeadpc_a <- adpc %>%\n filter(\n PARAM == \"Plasma Drug X\",\n ARMCD == \"ARM A\"\n ) %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID))\n\nuse_title <- \"Plot of Plasma Drug X (ug/mL) Concentrations Over Time by\\nPatient: PK Evaluable Patients\"\nuse_subtitle <- \"Analyte: Plasma Drug X (ug/mL) \\nTreatment Group: ARM A\"\nuse_footnote <- \"Program: \\nOutput:\"\n\nresult <- g_ipp(\n df = adpc_a,\n xvar = \"NFRLT\",\n yvar = \"AVAL\",\n xlab = \"Norminal Time from First Dose (hr)\",\n ylab = \"Concentration (ug/mL)\",\n id_var = \"Patient_ID\",\n add_baseline_hline = FALSE,\n yvar_baseline = \"AVAL\", # yvar_baseline cannot be NA or ignore\n title = use_title,\n subtitle = use_subtitle,\n caption = use_footnote,\n plotting_choices = \"separate_by_obs\"\n)\nplot <- result[[1]] # only show the first subject\nplot\n\n\n\n\n\n\n\n\n\n\n\nCodeadpc_a <- adpc %>%\n filter(\n PARAM == \"Plasma Drug X\",\n ARMCD == \"ARM A\"\n ) %>%\n mutate(avalog = ifelse(AVAL != 0, AVAL, 0.001)) %>%\n mutate(Patient_ID = sub(\".*id-\", \"\", USUBJID))\n\nuse_title2 <- \"Plot of Plasma Drug X (ug/mL) Concentrations Over Time by\\nPatient: PK Evaluable Patients\"\nuse_subtitle2 <- \"Analyte: Plasma Drug X (ug/mL) \\nTreatment Group: ARM A\"\nuse_footnote2 <- \"Program: \\nOutput:\"\n\nresult <- g_ipp(\n df = adpc_a,\n xvar = \"NFRLT\",\n yvar = \"avalog\",\n xlab = \"Norminal Time from First Dose (hr)\",\n ylab = \"Concentration (ug/mL)\",\n id_var = \"Patient_ID\",\n add_baseline_hline = FALSE,\n yvar_baseline = \"AVAL\", # yvar_baseline cannot be NA or ignore\n title = use_title2,\n subtitle = use_subtitle2,\n caption = use_footnote2,\n plotting_choices = \"separate_by_obs\"\n)\nplot <- result[[1]] + ggplot2::scale_y_log10(breaks = c(0.001, 0.01, 0.1, 1, 10), labels = c(0.001, 0.01, 0.1, 1, 10))\nplot\n\n\n\n\n\n\n\n\nCodeif (exists(\"tenv\")) {\n filename <- paste0(gsub(\"\\\\.rmarkdown$\", \"\", knitr::current_input(dir = TRUE)), \".rds\")\n filepath <- gsub(normalizePath(Sys.getenv(\"QUARTO_PROJECT_DIR\")), file.path(Sys.getenv(\"QUARTO_TESTTHAT_DATA_PATH\"), Sys.getenv(\"QUARTO_PROFILE\")), filename)\n if (!dir.exists(dirname(filepath))) {\n dir.create(dirname(filepath), recursive = TRUE)\n }\n saveRDS(tenv, filepath)\n}\n\n\n\n\n\nCode# In progress\n\n\n\n\nTimestamp\n\nCodeSys.time()\n\n[1] \"2024-04-03 18:01:36 UTC\"\n\n\nSession Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nother attached packages:\n[1] nestcolor_0.1.2.9009 ggplot2_3.5.0 dplyr_1.1.4 \n[4] scda_0.1.6.9017 tern_0.9.3.9028 rtables_0.6.6.9011 \n[7] magrittr_2.0.3 formatters_0.5.5.9018\n\nloaded via a namespace (and not attached):\n [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 \n [5] brio_1.1.4 tidyselect_1.2.1 tidyr_1.3.1 splines_4.3.3 \n [9] scales_1.3.0 yaml_2.3.8 fastmap_1.1.1 lattice_0.22-6 \n[13] R6_2.5.1 labeling_0.4.3 generics_0.1.3 knitr_1.45 \n[17] rbibutils_2.2.16 htmlwidgets_1.6.4 backports_1.4.1 checkmate_2.3.1 \n[21] tibble_3.2.1 munsell_0.5.0 pillar_1.9.0 rlang_1.1.3 \n[25] utf8_1.2.4 testthat_3.2.1 broom_1.0.5 xfun_0.42 \n[29] cli_3.6.2 withr_3.0.0 Rdpack_2.6 digest_0.6.35 \n[33] grid_4.3.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23 \n[37] glue_1.7.0 farver_2.1.1 codetools_0.2-19 survival_3.5-8 \n[41] fansi_1.0.6 colorspace_2.1-0 purrr_1.0.2 rmarkdown_2.26 \n[45] tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.7 \n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodeparent_file_path <- knitr::current_input(dir = TRUE)\n\nbook_root_dir <- parent_file_path\nwhile (!file.exists(file.path(book_root_dir, \"_quarto.yml\"))) book_root_dir <- dirname(book_root_dir)\n\nlock_path <- file.path(\n \"../../assets/www/lock\",\n paste0(\n gsub(\n file.path(book_root_dir, \"\"),\n \"\",\n gsub(\n \"\\\\.rmarkdown$\",\n \"\",\n knitr::current_input(dir = TRUE)\n )\n ),\n \".lock\"\n )\n)\n\nwithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(parent_file_path, lockfile = lock_path, prompt = FALSE, force = TRUE)\n)\n\n\nDownload", + "crumbs": [ + "Graphs", + "Pharmacokinetic", + "PKCG01" + ] }, { - "objectID": "CONTRIBUTING.html#questions", - "href": "CONTRIBUTING.html#questions", - "title": "", - "section": "Questions", - "text": "Questions\nIf you have further questions regarding the contribution guidelines, please contact the package/repository maintainer." + "objectID": "appendix/reproducibility.html#session-info", + "href": "appendix/reproducibility.html#session-info", + "title": "Reproducibility", + "section": "Session Info", + "text": "Session Info\n\nCodesessionInfo()\n\nR version 4.3.3 (2024-02-29)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Ubuntu 22.04.4 LTS\n\nMatrix products: default\nBLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 \nLAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0\n\nlocale:\n [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C \n [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 \n [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 \n [7] LC_PAPER=en_US.UTF-8 LC_NAME=C \n [9] LC_ADDRESS=C LC_TELEPHONE=C \n[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C \n\ntime zone: Etc/UTC\ntzcode source: system (glibc)\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nloaded via a namespace (and not attached):\n [1] digest_0.6.35 R6_2.5.1 codetools_0.2-19 fastmap_1.1.1 \n [5] xfun_0.42 magrittr_2.0.3 knitr_1.45 htmltools_0.5.7 \n [9] rmarkdown_2.26 cli_3.6.2 testthat_3.2.1 compiler_4.3.3 \n[13] tools_4.3.3 brio_1.1.4 evaluate_0.23 yaml_2.3.8 \n[17] rlang_1.1.3 jsonlite_1.8.8 htmlwidgets_1.6.4\n\n\n\n.lock file\nDownload the .lock file and use renv::restore() on it to recreate environment used to generate this website.\n\nCodewithr::with_options(\n list(renv.verbose = FALSE),\n renv::snapshot(\"..\", lockfile = \"../assets/www/renv.lock\", prompt = FALSE, force = TRUE)\n)\n\n\nNOTE: Dependency discovery took 11 seconds during snapshot.\nConsider using .renvignore to ignore files, or switching to explicit snapshots.\nSee `?renv::dependencies` for more information.\n\n\nDownload", + "crumbs": [ + "Appendix", + "Reproducibility" + ] } ] \ No newline at end of file diff --git a/development/site_libs/bootstrap/bootstrap-dark.min.css b/development/site_libs/bootstrap/bootstrap-dark.min.css index 5b2082024f..5299cf7425 100644 --- a/development/site_libs/bootstrap/bootstrap-dark.min.css +++ b/development/site_libs/bootstrap/bootstrap-dark.min.css @@ -2,7 +2,7 @@ * Bootstrap v5.3.1 (https://getbootstrap.com/) * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */@import"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&display=swap";:root,[data-bs-theme=light]{--bs-blue: #375a7f;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #e83e8c;--bs-red: #e74c3c;--bs-orange: #fd7e14;--bs-yellow: #f39c12;--bs-green: #00bc8c;--bs-teal: #20c997;--bs-cyan: #3498db;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #ebebeb;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #444;--bs-gray-800: #343a40;--bs-gray-900: #222;--bs-default: #434343;--bs-primary: #375a7f;--bs-secondary: #434343;--bs-success: #00bc8c;--bs-info: #3498db;--bs-warning: #f39c12;--bs-danger: #e74c3c;--bs-light: #6f6f6f;--bs-dark: #2d2d2d;--bs-default-rgb: 67, 67, 67;--bs-primary-rgb: 55, 90, 127;--bs-secondary-rgb: 67, 67, 67;--bs-success-rgb: 0, 188, 140;--bs-info-rgb: 52, 152, 219;--bs-warning-rgb: 243, 156, 18;--bs-danger-rgb: 231, 76, 60;--bs-light-rgb: 111, 111, 111;--bs-dark-rgb: 45, 45, 45;--bs-primary-text-emphasis: #162433;--bs-secondary-text-emphasis: #1b1b1b;--bs-success-text-emphasis: #004b38;--bs-info-text-emphasis: #153d58;--bs-warning-text-emphasis: #613e07;--bs-danger-text-emphasis: #5c1e18;--bs-light-text-emphasis: #444;--bs-dark-text-emphasis: #444;--bs-primary-bg-subtle: #d7dee5;--bs-secondary-bg-subtle: #d9d9d9;--bs-success-bg-subtle: #ccf2e8;--bs-info-bg-subtle: #d6eaf8;--bs-warning-bg-subtle: #fdebd0;--bs-danger-bg-subtle: #fadbd8;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #afbdcc;--bs-secondary-border-subtle: #b4b4b4;--bs-success-border-subtle: #99e4d1;--bs-info-border-subtle: #aed6f1;--bs-warning-border-subtle: #fad7a0;--bs-danger-border-subtle: #f5b7b1;--bs-light-border-subtle: #ebebeb;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #fff;--bs-body-color-rgb: 255, 255, 255;--bs-body-bg: #222;--bs-body-bg-rgb: 34, 34, 34;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(255, 255, 255, 0.75);--bs-secondary-color-rgb: 255, 255, 255;--bs-secondary-bg: #ebebeb;--bs-secondary-bg-rgb: 235, 235, 235;--bs-tertiary-color: rgba(255, 255, 255, 0.5);--bs-tertiary-color-rgb: 255, 255, 255;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #00bc8c;--bs-link-color-rgb: 0, 188, 140;--bs-link-decoration: underline;--bs-link-hover-color: #009670;--bs-link-hover-color-rgb: 0, 150, 112;--bs-code-color: #7d12ba;--bs-highlight-bg: #fdebd0;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(55, 90, 127, 0.25);--bs-form-valid-color: #00bc8c;--bs-form-valid-border-color: #00bc8c;--bs-form-invalid-color: #e74c3c;--bs-form-invalid-border-color: #e74c3c}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #222;--bs-body-bg-rgb: 34, 34, 34;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b2e31;--bs-tertiary-bg-rgb: 43, 46, 49;--bs-primary-text-emphasis: #879cb2;--bs-secondary-text-emphasis: #8e8e8e;--bs-success-text-emphasis: #66d7ba;--bs-info-text-emphasis: #85c1e9;--bs-warning-text-emphasis: #f8c471;--bs-danger-text-emphasis: #f1948a;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #0b1219;--bs-secondary-bg-subtle: #0d0d0d;--bs-success-bg-subtle: #00261c;--bs-info-bg-subtle: #0a1e2c;--bs-warning-bg-subtle: #311f04;--bs-danger-bg-subtle: #2e0f0c;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #21364c;--bs-secondary-border-subtle: #282828;--bs-success-border-subtle: #007154;--bs-info-border-subtle: #1f5b83;--bs-warning-border-subtle: #925e0b;--bs-danger-border-subtle: #8b2e24;--bs-light-border-subtle: #444;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #879cb2;--bs-link-hover-color: #9fb0c1;--bs-link-color-rgb: 135, 156, 178;--bs-link-hover-color-rgb: 159, 176, 193;--bs-code-color: white;--bs-border-color: #444;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #66d7ba;--bs-form-valid-border-color: #66d7ba;--bs-form-invalid-color: #f1948a;--bs-form-invalid-border-color: #f1948a}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #ebebeb}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:inherit;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6);border-radius:.25rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.25rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#222;background-color:#fff;border-radius:.2em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(255,255,255,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#222;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(255,255,255,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #fff;--bs-table-bg: #222;--bs-table-border-color: #434343;--bs-table-accent-bg: transparent;--bs-table-striped-color: #fff;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #fff;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #fff;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #fff}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #fff;--bs-table-bg: #375a7f;--bs-table-border-color: #4b6b8c;--bs-table-striped-bg: #416285;--bs-table-striped-color: #fff;--bs-table-active-bg: #4b6b8c;--bs-table-active-color: #fff;--bs-table-hover-bg: #466689;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #fff;--bs-table-bg: #434343;--bs-table-border-color: #565656;--bs-table-striped-bg: #4c4c4c;--bs-table-striped-color: #fff;--bs-table-active-bg: #565656;--bs-table-active-color: #fff;--bs-table-hover-bg: #515151;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #fff;--bs-table-bg: #00bc8c;--bs-table-border-color: #1ac398;--bs-table-striped-bg: #0dbf92;--bs-table-striped-color: #fff;--bs-table-active-bg: #1ac398;--bs-table-active-color: #fff;--bs-table-hover-bg: #13c195;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #fff;--bs-table-bg: #3498db;--bs-table-border-color: #48a2df;--bs-table-striped-bg: #3e9ddd;--bs-table-striped-color: #fff;--bs-table-active-bg: #48a2df;--bs-table-active-color: #fff;--bs-table-hover-bg: #43a0de;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #fff;--bs-table-bg: #f39c12;--bs-table-border-color: #f4a62a;--bs-table-striped-bg: #f4a11e;--bs-table-striped-color: #fff;--bs-table-active-bg: #f4a62a;--bs-table-active-color: #fff;--bs-table-hover-bg: #f4a324;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #fff;--bs-table-bg: #e74c3c;--bs-table-border-color: #e95e50;--bs-table-striped-bg: #e85546;--bs-table-striped-color: #fff;--bs-table-active-bg: #e95e50;--bs-table-active-color: #fff;--bs-table-hover-bg: #e9594b;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #fff;--bs-table-bg: #6f6f6f;--bs-table-border-color: #7d7d7d;--bs-table-striped-bg: #767676;--bs-table-striped-color: #fff;--bs-table-active-bg: #7d7d7d;--bs-table-active-color: #fff;--bs-table-hover-bg: #7a7a7a;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #2d2d2d;--bs-table-border-color: #424242;--bs-table-striped-bg: #383838;--bs-table-striped-color: #fff;--bs-table-active-bg: #424242;--bs-table-active-color: #fff;--bs-table-hover-bg: #3d3d3d;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(255,255,255,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#2d2d2d;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #adb5bd;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#2d2d2d;background-color:#fff;border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:#595959;opacity:1}.form-control:disabled{background-color:#ebebeb;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#6f6f6f;background-color:#434343;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#363636}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#fff;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#2d2d2d;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #adb5bd;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{color:#595959;background-color:#ebebeb}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #2d2d2d}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.2em}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:none;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#375a7f;border-color:#375a7f}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#375a7f;border-color:#375a7f;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%239badbf'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #222,0 0 0 .25rem rgba(55,90,127,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #222,0 0 0 .25rem rgba(55,90,127,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#375a7f;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c3ced9}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#375a7f;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#c3ced9}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(255,255,255,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(255,255,255,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.25rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#ebebeb}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#6f6f6f;text-align:center;white-space:nowrap;background-color:#434343;border:1px solid #adb5bd;border-radius:.25rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#00bc8c}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#00bc8c;border-radius:.25rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#00bc8c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300bc8c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#00bc8c;box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#00bc8c}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300bc8c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#00bc8c;box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#00bc8c}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#00bc8c}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#00bc8c}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e74c3c}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#e74c3c;border-radius:.25rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#e74c3c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#e74c3c}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#e74c3c}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#e74c3c}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e74c3c}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #fff;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #393939;--bs-btn-hover-border-color: #363636;--bs-btn-focus-shadow-rgb: 95, 95, 95;--bs-btn-active-color: #fff;--bs-btn-active-bg: #363636;--bs-btn-active-border-color: #323232;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #434343;--bs-btn-disabled-border-color: #434343}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #375a7f;--bs-btn-border-color: #375a7f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2f4d6c;--bs-btn-hover-border-color: #2c4866;--bs-btn-focus-shadow-rgb: 85, 115, 146;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2c4866;--bs-btn-active-border-color: #29445f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #375a7f;--bs-btn-disabled-border-color: #375a7f}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #393939;--bs-btn-hover-border-color: #363636;--bs-btn-focus-shadow-rgb: 95, 95, 95;--bs-btn-active-color: #fff;--bs-btn-active-bg: #363636;--bs-btn-active-border-color: #323232;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #434343;--bs-btn-disabled-border-color: #434343}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #00bc8c;--bs-btn-border-color: #00bc8c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #00a077;--bs-btn-hover-border-color: #009670;--bs-btn-focus-shadow-rgb: 38, 198, 157;--bs-btn-active-color: #fff;--bs-btn-active-bg: #009670;--bs-btn-active-border-color: #008d69;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #00bc8c;--bs-btn-disabled-border-color: #00bc8c}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c81ba;--bs-btn-hover-border-color: #2a7aaf;--bs-btn-focus-shadow-rgb: 82, 167, 224;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a7aaf;--bs-btn-active-border-color: #2772a4;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3498db;--bs-btn-disabled-border-color: #3498db}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #cf850f;--bs-btn-hover-border-color: #c27d0e;--bs-btn-focus-shadow-rgb: 245, 171, 54;--bs-btn-active-color: #fff;--bs-btn-active-bg: #c27d0e;--bs-btn-active-border-color: #b6750e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #f39c12;--bs-btn-disabled-border-color: #f39c12}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #c44133;--bs-btn-hover-border-color: #b93d30;--bs-btn-focus-shadow-rgb: 235, 103, 89;--bs-btn-active-color: #fff;--bs-btn-active-bg: #b93d30;--bs-btn-active-border-color: #ad392d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #e74c3c;--bs-btn-disabled-border-color: #e74c3c}.btn-light{--bs-btn-color: #fff;--bs-btn-bg: #6f6f6f;--bs-btn-border-color: #6f6f6f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #5e5e5e;--bs-btn-hover-border-color: #595959;--bs-btn-focus-shadow-rgb: 133, 133, 133;--bs-btn-active-color: #fff;--bs-btn-active-bg: #595959;--bs-btn-active-border-color: #535353;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6f6f6f;--bs-btn-disabled-border-color: #6f6f6f}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #2d2d2d;--bs-btn-border-color: #2d2d2d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #4d4d4d;--bs-btn-hover-border-color: #424242;--bs-btn-focus-shadow-rgb: 77, 77, 77;--bs-btn-active-color: #fff;--bs-btn-active-bg: #575757;--bs-btn-active-border-color: #424242;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2d2d2d;--bs-btn-disabled-border-color: #2d2d2d}.btn-outline-default{--bs-btn-color: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #434343;--bs-btn-hover-border-color: #434343;--bs-btn-focus-shadow-rgb: 67, 67, 67;--bs-btn-active-color: #fff;--bs-btn-active-bg: #434343;--bs-btn-active-border-color: #434343;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #434343;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #434343;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #375a7f;--bs-btn-border-color: #375a7f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #375a7f;--bs-btn-hover-border-color: #375a7f;--bs-btn-focus-shadow-rgb: 55, 90, 127;--bs-btn-active-color: #fff;--bs-btn-active-bg: #375a7f;--bs-btn-active-border-color: #375a7f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #375a7f;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #375a7f;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #434343;--bs-btn-hover-border-color: #434343;--bs-btn-focus-shadow-rgb: 67, 67, 67;--bs-btn-active-color: #fff;--bs-btn-active-bg: #434343;--bs-btn-active-border-color: #434343;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #434343;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #434343;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #00bc8c;--bs-btn-border-color: #00bc8c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #00bc8c;--bs-btn-hover-border-color: #00bc8c;--bs-btn-focus-shadow-rgb: 0, 188, 140;--bs-btn-active-color: #fff;--bs-btn-active-bg: #00bc8c;--bs-btn-active-border-color: #00bc8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #00bc8c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #00bc8c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3498db;--bs-btn-hover-border-color: #3498db;--bs-btn-focus-shadow-rgb: 52, 152, 219;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3498db;--bs-btn-active-border-color: #3498db;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3498db;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3498db;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #f39c12;--bs-btn-hover-border-color: #f39c12;--bs-btn-focus-shadow-rgb: 243, 156, 18;--bs-btn-active-color: #fff;--bs-btn-active-bg: #f39c12;--bs-btn-active-border-color: #f39c12;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f39c12;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f39c12;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #e74c3c;--bs-btn-hover-border-color: #e74c3c;--bs-btn-focus-shadow-rgb: 231, 76, 60;--bs-btn-active-color: #fff;--bs-btn-active-bg: #e74c3c;--bs-btn-active-border-color: #e74c3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #e74c3c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #e74c3c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #6f6f6f;--bs-btn-border-color: #6f6f6f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6f6f6f;--bs-btn-hover-border-color: #6f6f6f;--bs-btn-focus-shadow-rgb: 111, 111, 111;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6f6f6f;--bs-btn-active-border-color: #6f6f6f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6f6f6f;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6f6f6f;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #2d2d2d;--bs-btn-border-color: #2d2d2d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2d2d2d;--bs-btn-hover-border-color: #2d2d2d;--bs-btn-focus-shadow-rgb: 45, 45, 45;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2d2d2d;--bs-btn-active-border-color: #2d2d2d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2d2d2d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2d2d2d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #00bc8c;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #009670;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #009670;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 38, 198, 157;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #fff;--bs-dropdown-bg: #222;--bs-dropdown-border-color: #434343;--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: #434343;--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #fff;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-link-hover-bg: #375a7f;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #375a7f;--bs-dropdown-link-disabled-color: rgba(255, 255, 255, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: #434343;--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: #434343;--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #375a7f;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.25rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 2rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #00bc8c;--bs-nav-link-hover-color: #009670;--bs-nav-link-disabled-color: #6f6f6f;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #434343;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #434343 #434343 transparent;--bs-nav-tabs-link-active-color: #fff;--bs-nav-tabs-link-active-bg: #222;--bs-nav-tabs-link-active-border-color: #434343 #434343 transparent;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #375a7f}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 1rem;--bs-navbar-color: #dee2e6;--bs-navbar-hover-color: rgba(250, 254, 253, 0.8);--bs-navbar-disabled-color: rgba(222, 226, 230, 0.75);--bs-navbar-active-color: #fafefd;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #dee2e6;--bs-navbar-brand-hover-color: #fafefd;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(222, 226, 230, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #dee2e6;--bs-navbar-hover-color: rgba(250, 254, 253, 0.8);--bs-navbar-disabled-color: rgba(222, 226, 230, 0.75);--bs-navbar-active-color: #fafefd;--bs-navbar-brand-color: #dee2e6;--bs-navbar-brand-hover-color: #fafefd;--bs-navbar-toggler-border-color: rgba(222, 226, 230, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #2d2d2d;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #fff;--bs-accordion-bg: #222;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #fff;--bs-accordion-btn-bg: #222;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162433'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #9badbf;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #162433;--bs-accordion-active-bg: #d7dee5}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23879cb2'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23879cb2'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0.75rem;--bs-breadcrumb-padding-y: 0.375rem;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: #434343;--bs-breadcrumb-border-radius: 0.25rem;--bs-breadcrumb-divider-color: rgba(255, 255, 255, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(255, 255, 255, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #fff;--bs-pagination-bg: #00bc8c;--bs-pagination-border-width: 0;--bs-pagination-border-color: transparent;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #fff;--bs-pagination-hover-bg: #00efb2;--bs-pagination-hover-border-color: transparent;--bs-pagination-focus-color: #009670;--bs-pagination-focus-bg: #ebebeb;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #00efb2;--bs-pagination-active-border-color: transparent;--bs-pagination-disabled-color: #fff;--bs-pagination-disabled-bg: #007053;--bs-pagination-disabled-border-color: transparent;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(0*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #434343;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #375a7f;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #fff;--bs-list-group-bg: #2d2d2d;--bs-list-group-border-color: #434343;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(255, 255, 255, 0.75);--bs-list-group-action-hover-color: #fff;--bs-list-group-action-hover-bg: #434343;--bs-list-group-action-active-color: #fff;--bs-list-group-action-active-bg: #222;--bs-list-group-disabled-color: rgba(255, 255, 255, 0.75);--bs-list-group-disabled-bg: #2d2d2d;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #375a7f;--bs-list-group-active-border-color: #375a7f;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #fff;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.4;--bs-btn-close-hover-opacity: 1;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: #434343;--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(255, 255, 255, 0.75);--bs-toast-header-bg: #2d2d2d;--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #2d2d2d;--bs-modal-border-color: #434343;--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #434343;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #434343;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #222;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #2d2d2d;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #434343;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #fff;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #fff;--bs-offcanvas-bg: #222;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: #434343;--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#fff !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(54, 54, 54, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(54, 54, 54, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(44, 72, 102, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(44, 72, 102, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(54, 54, 54, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(54, 54, 54, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(0, 150, 112, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(0, 150, 112, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(42, 122, 175, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 122, 175, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(194, 125, 14, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(194, 125, 14, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(185, 61, 48, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(185, 61, 48, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(89, 89, 89, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(89, 89, 89, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(36, 36, 36, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(36, 36, 36, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#fff}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}.bg-blue{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #375a7f;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #00bc8c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #434343}.bg-default{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #375a7f}.bg-primary{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #434343}.bg-secondary{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #00bc8c}.bg-success{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #6f6f6f}.bg-light{--bslib-color-bg: #6f6f6f;--bslib-color-fg: #fff}.text-dark{--bslib-color-fg: #2d2d2d}.bg-dark{--bslib-color-bg: #2d2d2d;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4a3cad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4a3cad;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d5099;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4d5099;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7e4f84;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7e4f84;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d5464;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7d5464;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #866854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #866854;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #827453;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #827453;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #218184;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #218184;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2e8689;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2e8689;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #3673a4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #3673a4;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #532ec4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #532ec4;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #3d55c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #3d55c9;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #594ca7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #594ca7;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4373ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #4373ac;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a14987;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a14987;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b708c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b708c;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a15257;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a15257;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b795c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b795c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #ae703f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #ae703f;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #989744;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #989744;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a8823e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a8823e;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #92a943;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #92a943;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #169587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #169587;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #2977b5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #2977b5;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #2c8ba1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #2c8ba1;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #5d8a8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #5d8a8c;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #5c8f6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #5c8f6c;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #65a35c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #65a35c;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #61af5b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #61af5b;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #0dc190;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #0dc190;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #15aeac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #15aeac;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #299d8d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #299d8d;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #13c493;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #13c493;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #357fb6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #357fb6;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #1fa6bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #1fa6bb;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #375a7f;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #00bc8c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #434343}.bg-default{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #375a7f}.bg-primary{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #434343}.bg-secondary{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #00bc8c}.bg-success{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #6f6f6f}.bg-light{--bslib-color-bg: #6f6f6f;--bslib-color-fg: #fff}.text-dark{--bslib-color-fg: #2d2d2d}.bg-dark{--bslib-color-bg: #2d2d2d;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4a3cad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4a3cad;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d5099;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4d5099;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7e4f84;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7e4f84;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d5464;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7d5464;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #866854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #866854;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #827453;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #827453;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #218184;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #218184;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2e8689;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2e8689;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #3673a4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #3673a4;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #532ec4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #532ec4;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #3d55c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #3d55c9;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #594ca7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #594ca7;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4373ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #4373ac;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a14987;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a14987;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b708c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b708c;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a15257;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a15257;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b795c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b795c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #ae703f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #ae703f;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #989744;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #989744;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a8823e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a8823e;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #92a943;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #92a943;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #169587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #169587;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #2977b5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #2977b5;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #2c8ba1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #2c8ba1;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #5d8a8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #5d8a8c;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #5c8f6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #5c8f6c;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #65a35c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #65a35c;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #61af5b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #61af5b;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #0dc190;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #0dc190;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #15aeac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #15aeac;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #299d8d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #299d8d;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #13c493;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #13c493;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #357fb6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #357fb6;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #1fa6bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #1fa6bb;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #222);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}:root{--bslib-page-sidebar-title-bg: #375a7f;--bslib-page-sidebar-title-color: #fff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#dee2e6}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#fafefd}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#adadad}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#adadad;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#adadad}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#adadad}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(26,195,152,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#7a7a7a}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#adadad}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(26,195,152,.8)}div.sidebar-item-container.disabled{color:rgba(173,173,173,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#1ac398}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#222}.sidebar.sidebar-navigation:not(.rollup){border-right:1px solid #434343 !important}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #434343}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#222;border-bottom:1px solid #434343}.quarto-banner nav.quarto-secondary-nav{background-color:#375a7f;color:#dee2e6;border-top:1px solid #434343}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#009670}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#222}body.nav-fixed{padding-top:82px}body .nav-footer{border-top:1px solid #434343}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#8a8a8a}.nav-footer a{color:#8a8a8a}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}.nav-footer-left{flex:1 1 0px;text-align:left}.nav-footer-right{flex:1 1 0px;text-align:right}.nav-footer-center{flex:1 1 0px;min-height:3em;text-align:center}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#dee2e6;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#adadad;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#222;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#222;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#dee2e6;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#dee2e6;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #adb5bd;border-radius:.25rem;color:#2d2d2d;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(55,90,127,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#2d2d2d;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#2d2d2d;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#2d2d2d;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#2d2d2d;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #adb5bd 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#2f2f2f;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#375a7f}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#375a7f}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#2b4663}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#2d2d2d}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#000}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#2d2d2d;color:#fff}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#2d2d2d;border-color:#adb5bd;color:#fff}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #adb5bd}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#dee2e6}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#adadad}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(34,34,34,.65);width:90%;bottom:0;box-shadow:rgba(173,181,189,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#222;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#222;border-bottom:1px solid #adb5bd;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#fff;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(55,90,127,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(255,255,255,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#375a7f !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#434343 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#00bc8c !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:#3498db !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#f39c12 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:#e74c3c !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#6f6f6f !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#2d2d2d !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #4673a3;border-bottom:solid 1px #4673a3}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#436e9b}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#dee2e6}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#fff}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#fff}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px silver;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#222;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#222;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#fff}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#2d2d2d}.tableFloatingHeaderOriginal{background-color:#2d2d2d;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.listing-actions-group .form-select,.listing-actions-group .form-control{background-color:#222;color:#fff}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid #6c757d 1px;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#fff;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid #6c757d 1px;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#00bc8c}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#00bc8c}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#00bc8c}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#00bc8c}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#00bc8c}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#222;border:solid 1px #dee2e6;border-radius:.25rem;color:#fff;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#222}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#222}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#222;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#222}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#222;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#fff}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*! + */@import"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&display=swap";:root,[data-bs-theme=light]{--bs-blue: #375a7f;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #e83e8c;--bs-red: #e74c3c;--bs-orange: #fd7e14;--bs-yellow: #f39c12;--bs-green: #00bc8c;--bs-teal: #20c997;--bs-cyan: #3498db;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #ebebeb;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #444;--bs-gray-800: #343a40;--bs-gray-900: #222;--bs-default: #434343;--bs-primary: #375a7f;--bs-secondary: #434343;--bs-success: #00bc8c;--bs-info: #3498db;--bs-warning: #f39c12;--bs-danger: #e74c3c;--bs-light: #6f6f6f;--bs-dark: #2d2d2d;--bs-default-rgb: 67, 67, 67;--bs-primary-rgb: 55, 90, 127;--bs-secondary-rgb: 67, 67, 67;--bs-success-rgb: 0, 188, 140;--bs-info-rgb: 52, 152, 219;--bs-warning-rgb: 243, 156, 18;--bs-danger-rgb: 231, 76, 60;--bs-light-rgb: 111, 111, 111;--bs-dark-rgb: 45, 45, 45;--bs-primary-text-emphasis: #162433;--bs-secondary-text-emphasis: #1b1b1b;--bs-success-text-emphasis: #004b38;--bs-info-text-emphasis: #153d58;--bs-warning-text-emphasis: #613e07;--bs-danger-text-emphasis: #5c1e18;--bs-light-text-emphasis: #444;--bs-dark-text-emphasis: #444;--bs-primary-bg-subtle: #d7dee5;--bs-secondary-bg-subtle: #d9d9d9;--bs-success-bg-subtle: #ccf2e8;--bs-info-bg-subtle: #d6eaf8;--bs-warning-bg-subtle: #fdebd0;--bs-danger-bg-subtle: #fadbd8;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #afbdcc;--bs-secondary-border-subtle: #b4b4b4;--bs-success-border-subtle: #99e4d1;--bs-info-border-subtle: #aed6f1;--bs-warning-border-subtle: #fad7a0;--bs-danger-border-subtle: #f5b7b1;--bs-light-border-subtle: #ebebeb;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #fff;--bs-body-color-rgb: 255, 255, 255;--bs-body-bg: #222;--bs-body-bg-rgb: 34, 34, 34;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(255, 255, 255, 0.75);--bs-secondary-color-rgb: 255, 255, 255;--bs-secondary-bg: #ebebeb;--bs-secondary-bg-rgb: 235, 235, 235;--bs-tertiary-color: rgba(255, 255, 255, 0.5);--bs-tertiary-color-rgb: 255, 255, 255;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #00bc8c;--bs-link-color-rgb: 0, 188, 140;--bs-link-decoration: underline;--bs-link-hover-color: #009670;--bs-link-hover-color-rgb: 0, 150, 112;--bs-code-color: #7d12ba;--bs-highlight-bg: #fdebd0;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(55, 90, 127, 0.25);--bs-form-valid-color: #00bc8c;--bs-form-valid-border-color: #00bc8c;--bs-form-invalid-color: #e74c3c;--bs-form-invalid-border-color: #e74c3c}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #222;--bs-body-bg-rgb: 34, 34, 34;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b2e31;--bs-tertiary-bg-rgb: 43, 46, 49;--bs-primary-text-emphasis: #879cb2;--bs-secondary-text-emphasis: #8e8e8e;--bs-success-text-emphasis: #66d7ba;--bs-info-text-emphasis: #85c1e9;--bs-warning-text-emphasis: #f8c471;--bs-danger-text-emphasis: #f1948a;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #0b1219;--bs-secondary-bg-subtle: #0d0d0d;--bs-success-bg-subtle: #00261c;--bs-info-bg-subtle: #0a1e2c;--bs-warning-bg-subtle: #311f04;--bs-danger-bg-subtle: #2e0f0c;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #21364c;--bs-secondary-border-subtle: #282828;--bs-success-border-subtle: #007154;--bs-info-border-subtle: #1f5b83;--bs-warning-border-subtle: #925e0b;--bs-danger-border-subtle: #8b2e24;--bs-light-border-subtle: #444;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #879cb2;--bs-link-hover-color: #9fb0c1;--bs-link-color-rgb: 135, 156, 178;--bs-link-hover-color-rgb: 159, 176, 193;--bs-code-color: white;--bs-border-color: #444;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #66d7ba;--bs-form-valid-border-color: #66d7ba;--bs-form-invalid-color: #f1948a;--bs-form-invalid-border-color: #f1948a}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #ebebeb}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:inherit;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6);border-radius:.25rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.25rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#222;background-color:#fff;border-radius:.2em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(255,255,255,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#222;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(255,255,255,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #fff;--bs-table-bg: #222;--bs-table-border-color: #434343;--bs-table-accent-bg: transparent;--bs-table-striped-color: #fff;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #fff;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #fff;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #fff}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #fff;--bs-table-bg: #375a7f;--bs-table-border-color: #4b6b8c;--bs-table-striped-bg: #416285;--bs-table-striped-color: #fff;--bs-table-active-bg: #4b6b8c;--bs-table-active-color: #fff;--bs-table-hover-bg: #466689;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #fff;--bs-table-bg: #434343;--bs-table-border-color: #565656;--bs-table-striped-bg: #4c4c4c;--bs-table-striped-color: #fff;--bs-table-active-bg: #565656;--bs-table-active-color: #fff;--bs-table-hover-bg: #515151;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #fff;--bs-table-bg: #00bc8c;--bs-table-border-color: #1ac398;--bs-table-striped-bg: #0dbf92;--bs-table-striped-color: #fff;--bs-table-active-bg: #1ac398;--bs-table-active-color: #fff;--bs-table-hover-bg: #13c195;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #fff;--bs-table-bg: #3498db;--bs-table-border-color: #48a2df;--bs-table-striped-bg: #3e9ddd;--bs-table-striped-color: #fff;--bs-table-active-bg: #48a2df;--bs-table-active-color: #fff;--bs-table-hover-bg: #43a0de;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #fff;--bs-table-bg: #f39c12;--bs-table-border-color: #f4a62a;--bs-table-striped-bg: #f4a11e;--bs-table-striped-color: #fff;--bs-table-active-bg: #f4a62a;--bs-table-active-color: #fff;--bs-table-hover-bg: #f4a324;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #fff;--bs-table-bg: #e74c3c;--bs-table-border-color: #e95e50;--bs-table-striped-bg: #e85546;--bs-table-striped-color: #fff;--bs-table-active-bg: #e95e50;--bs-table-active-color: #fff;--bs-table-hover-bg: #e9594b;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #fff;--bs-table-bg: #6f6f6f;--bs-table-border-color: #7d7d7d;--bs-table-striped-bg: #767676;--bs-table-striped-color: #fff;--bs-table-active-bg: #7d7d7d;--bs-table-active-color: #fff;--bs-table-hover-bg: #7a7a7a;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #2d2d2d;--bs-table-border-color: #424242;--bs-table-striped-bg: #383838;--bs-table-striped-color: #fff;--bs-table-active-bg: #424242;--bs-table-active-color: #fff;--bs-table-hover-bg: #3d3d3d;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(255,255,255,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#2d2d2d;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #adb5bd;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#2d2d2d;background-color:#fff;border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:#595959;opacity:1}.form-control:disabled{background-color:#ebebeb;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#6f6f6f;background-color:#434343;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#363636}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#fff;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#2d2d2d;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #adb5bd;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{color:#595959;background-color:#ebebeb}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #2d2d2d}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.2em}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:none;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#375a7f;border-color:#375a7f}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#375a7f;border-color:#375a7f;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%239badbf'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #222,0 0 0 .25rem rgba(55,90,127,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #222,0 0 0 .25rem rgba(55,90,127,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#375a7f;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c3ced9}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#375a7f;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#c3ced9}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(255,255,255,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(255,255,255,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.25rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#ebebeb}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#6f6f6f;text-align:center;white-space:nowrap;background-color:#434343;border:1px solid #adb5bd;border-radius:.25rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#00bc8c}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#00bc8c;border-radius:.25rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#00bc8c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300bc8c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#00bc8c;box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#00bc8c}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300bc8c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#00bc8c;box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#00bc8c}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#00bc8c}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#00bc8c}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e74c3c}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#e74c3c;border-radius:.25rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#e74c3c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#e74c3c}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#e74c3c}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#e74c3c}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e74c3c}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #fff;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #393939;--bs-btn-hover-border-color: #363636;--bs-btn-focus-shadow-rgb: 95, 95, 95;--bs-btn-active-color: #fff;--bs-btn-active-bg: #363636;--bs-btn-active-border-color: #323232;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #434343;--bs-btn-disabled-border-color: #434343}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #375a7f;--bs-btn-border-color: #375a7f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2f4d6c;--bs-btn-hover-border-color: #2c4866;--bs-btn-focus-shadow-rgb: 85, 115, 146;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2c4866;--bs-btn-active-border-color: #29445f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #375a7f;--bs-btn-disabled-border-color: #375a7f}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #393939;--bs-btn-hover-border-color: #363636;--bs-btn-focus-shadow-rgb: 95, 95, 95;--bs-btn-active-color: #fff;--bs-btn-active-bg: #363636;--bs-btn-active-border-color: #323232;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #434343;--bs-btn-disabled-border-color: #434343}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #00bc8c;--bs-btn-border-color: #00bc8c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #00a077;--bs-btn-hover-border-color: #009670;--bs-btn-focus-shadow-rgb: 38, 198, 157;--bs-btn-active-color: #fff;--bs-btn-active-bg: #009670;--bs-btn-active-border-color: #008d69;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #00bc8c;--bs-btn-disabled-border-color: #00bc8c}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c81ba;--bs-btn-hover-border-color: #2a7aaf;--bs-btn-focus-shadow-rgb: 82, 167, 224;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a7aaf;--bs-btn-active-border-color: #2772a4;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3498db;--bs-btn-disabled-border-color: #3498db}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #cf850f;--bs-btn-hover-border-color: #c27d0e;--bs-btn-focus-shadow-rgb: 245, 171, 54;--bs-btn-active-color: #fff;--bs-btn-active-bg: #c27d0e;--bs-btn-active-border-color: #b6750e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #f39c12;--bs-btn-disabled-border-color: #f39c12}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #c44133;--bs-btn-hover-border-color: #b93d30;--bs-btn-focus-shadow-rgb: 235, 103, 89;--bs-btn-active-color: #fff;--bs-btn-active-bg: #b93d30;--bs-btn-active-border-color: #ad392d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #e74c3c;--bs-btn-disabled-border-color: #e74c3c}.btn-light{--bs-btn-color: #fff;--bs-btn-bg: #6f6f6f;--bs-btn-border-color: #6f6f6f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #5e5e5e;--bs-btn-hover-border-color: #595959;--bs-btn-focus-shadow-rgb: 133, 133, 133;--bs-btn-active-color: #fff;--bs-btn-active-bg: #595959;--bs-btn-active-border-color: #535353;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6f6f6f;--bs-btn-disabled-border-color: #6f6f6f}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #2d2d2d;--bs-btn-border-color: #2d2d2d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #4d4d4d;--bs-btn-hover-border-color: #424242;--bs-btn-focus-shadow-rgb: 77, 77, 77;--bs-btn-active-color: #fff;--bs-btn-active-bg: #575757;--bs-btn-active-border-color: #424242;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2d2d2d;--bs-btn-disabled-border-color: #2d2d2d}.btn-outline-default{--bs-btn-color: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #434343;--bs-btn-hover-border-color: #434343;--bs-btn-focus-shadow-rgb: 67, 67, 67;--bs-btn-active-color: #fff;--bs-btn-active-bg: #434343;--bs-btn-active-border-color: #434343;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #434343;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #434343;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #375a7f;--bs-btn-border-color: #375a7f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #375a7f;--bs-btn-hover-border-color: #375a7f;--bs-btn-focus-shadow-rgb: 55, 90, 127;--bs-btn-active-color: #fff;--bs-btn-active-bg: #375a7f;--bs-btn-active-border-color: #375a7f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #375a7f;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #375a7f;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #434343;--bs-btn-hover-border-color: #434343;--bs-btn-focus-shadow-rgb: 67, 67, 67;--bs-btn-active-color: #fff;--bs-btn-active-bg: #434343;--bs-btn-active-border-color: #434343;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #434343;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #434343;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #00bc8c;--bs-btn-border-color: #00bc8c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #00bc8c;--bs-btn-hover-border-color: #00bc8c;--bs-btn-focus-shadow-rgb: 0, 188, 140;--bs-btn-active-color: #fff;--bs-btn-active-bg: #00bc8c;--bs-btn-active-border-color: #00bc8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #00bc8c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #00bc8c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3498db;--bs-btn-hover-border-color: #3498db;--bs-btn-focus-shadow-rgb: 52, 152, 219;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3498db;--bs-btn-active-border-color: #3498db;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3498db;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3498db;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #f39c12;--bs-btn-hover-border-color: #f39c12;--bs-btn-focus-shadow-rgb: 243, 156, 18;--bs-btn-active-color: #fff;--bs-btn-active-bg: #f39c12;--bs-btn-active-border-color: #f39c12;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f39c12;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f39c12;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #e74c3c;--bs-btn-hover-border-color: #e74c3c;--bs-btn-focus-shadow-rgb: 231, 76, 60;--bs-btn-active-color: #fff;--bs-btn-active-bg: #e74c3c;--bs-btn-active-border-color: #e74c3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #e74c3c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #e74c3c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #6f6f6f;--bs-btn-border-color: #6f6f6f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6f6f6f;--bs-btn-hover-border-color: #6f6f6f;--bs-btn-focus-shadow-rgb: 111, 111, 111;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6f6f6f;--bs-btn-active-border-color: #6f6f6f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6f6f6f;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6f6f6f;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #2d2d2d;--bs-btn-border-color: #2d2d2d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2d2d2d;--bs-btn-hover-border-color: #2d2d2d;--bs-btn-focus-shadow-rgb: 45, 45, 45;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2d2d2d;--bs-btn-active-border-color: #2d2d2d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2d2d2d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2d2d2d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #00bc8c;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #009670;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #009670;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 38, 198, 157;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #fff;--bs-dropdown-bg: #222;--bs-dropdown-border-color: #434343;--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: #434343;--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #fff;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-link-hover-bg: #375a7f;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #375a7f;--bs-dropdown-link-disabled-color: rgba(255, 255, 255, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: #434343;--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: #434343;--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #375a7f;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.25rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 2rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #00bc8c;--bs-nav-link-hover-color: #009670;--bs-nav-link-disabled-color: #6f6f6f;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #434343;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #434343 #434343 transparent;--bs-nav-tabs-link-active-color: #fff;--bs-nav-tabs-link-active-bg: #222;--bs-nav-tabs-link-active-border-color: #434343 #434343 transparent;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #375a7f}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 1rem;--bs-navbar-color: #dee2e6;--bs-navbar-hover-color: rgba(250, 254, 253, 0.8);--bs-navbar-disabled-color: rgba(222, 226, 230, 0.75);--bs-navbar-active-color: #fafefd;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #dee2e6;--bs-navbar-brand-hover-color: #fafefd;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(222, 226, 230, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #dee2e6;--bs-navbar-hover-color: rgba(250, 254, 253, 0.8);--bs-navbar-disabled-color: rgba(222, 226, 230, 0.75);--bs-navbar-active-color: #fafefd;--bs-navbar-brand-color: #dee2e6;--bs-navbar-brand-hover-color: #fafefd;--bs-navbar-toggler-border-color: rgba(222, 226, 230, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #2d2d2d;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #fff;--bs-accordion-bg: #222;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #fff;--bs-accordion-btn-bg: #222;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162433'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #9badbf;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #162433;--bs-accordion-active-bg: #d7dee5}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23879cb2'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23879cb2'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0.75rem;--bs-breadcrumb-padding-y: 0.375rem;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: #434343;--bs-breadcrumb-border-radius: 0.25rem;--bs-breadcrumb-divider-color: rgba(255, 255, 255, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(255, 255, 255, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #fff;--bs-pagination-bg: #00bc8c;--bs-pagination-border-width: 0;--bs-pagination-border-color: transparent;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #fff;--bs-pagination-hover-bg: #00efb2;--bs-pagination-hover-border-color: transparent;--bs-pagination-focus-color: #009670;--bs-pagination-focus-bg: #ebebeb;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #00efb2;--bs-pagination-active-border-color: transparent;--bs-pagination-disabled-color: #fff;--bs-pagination-disabled-bg: #007053;--bs-pagination-disabled-border-color: transparent;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(0*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #434343;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #375a7f;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #fff;--bs-list-group-bg: #2d2d2d;--bs-list-group-border-color: #434343;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(255, 255, 255, 0.75);--bs-list-group-action-hover-color: #fff;--bs-list-group-action-hover-bg: #434343;--bs-list-group-action-active-color: #fff;--bs-list-group-action-active-bg: #222;--bs-list-group-disabled-color: rgba(255, 255, 255, 0.75);--bs-list-group-disabled-bg: #2d2d2d;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #375a7f;--bs-list-group-active-border-color: #375a7f;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #fff;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.4;--bs-btn-close-hover-opacity: 1;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: #434343;--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(255, 255, 255, 0.75);--bs-toast-header-bg: #2d2d2d;--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #2d2d2d;--bs-modal-border-color: #434343;--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #434343;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #434343;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #222;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #2d2d2d;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #434343;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #fff;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #fff;--bs-offcanvas-bg: #222;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: #434343;--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#fff !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(54, 54, 54, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(54, 54, 54, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(44, 72, 102, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(44, 72, 102, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(54, 54, 54, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(54, 54, 54, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(0, 150, 112, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(0, 150, 112, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(42, 122, 175, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 122, 175, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(194, 125, 14, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(194, 125, 14, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(185, 61, 48, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(185, 61, 48, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(89, 89, 89, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(89, 89, 89, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(36, 36, 36, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(36, 36, 36, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#fff}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #375a7f;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #00bc8c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #434343}.bg-default{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #375a7f}.bg-primary{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #434343}.bg-secondary{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #00bc8c}.bg-success{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #6f6f6f}.bg-light{--bslib-color-bg: #6f6f6f;--bslib-color-fg: #fff}.text-dark{--bslib-color-fg: #2d2d2d}.bg-dark{--bslib-color-bg: #2d2d2d;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4a3cad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4a3cad;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d5099;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4d5099;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7e4f84;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7e4f84;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d5464;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7d5464;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #866854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #866854;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #827453;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #827453;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #218184;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #218184;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2e8689;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2e8689;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #3673a4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #3673a4;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #532ec4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #532ec4;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #3d55c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #3d55c9;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #594ca7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #594ca7;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4373ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #4373ac;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a14987;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a14987;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b708c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b708c;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a15257;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a15257;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b795c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b795c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #ae703f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #ae703f;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #989744;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #989744;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a8823e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a8823e;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #92a943;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #92a943;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #169587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #169587;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #2977b5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #2977b5;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #2c8ba1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #2c8ba1;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #5d8a8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #5d8a8c;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #5c8f6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #5c8f6c;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #65a35c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #65a35c;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #61af5b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #61af5b;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #0dc190;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #0dc190;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #15aeac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #15aeac;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #299d8d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #299d8d;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #13c493;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #13c493;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #357fb6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #357fb6;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #1fa6bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #1fa6bb;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #375a7f;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #00bc8c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #434343}.bg-default{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #375a7f}.bg-primary{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #434343}.bg-secondary{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #00bc8c}.bg-success{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #6f6f6f}.bg-light{--bslib-color-bg: #6f6f6f;--bslib-color-fg: #fff}.text-dark{--bslib-color-fg: #2d2d2d}.bg-dark{--bslib-color-bg: #2d2d2d;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4a3cad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4a3cad;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d5099;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4d5099;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7e4f84;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7e4f84;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d5464;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7d5464;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #866854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #866854;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #827453;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #827453;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #218184;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #218184;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2e8689;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2e8689;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #3673a4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #3673a4;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #532ec4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #532ec4;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #3d55c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #3d55c9;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #594ca7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #594ca7;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4373ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #4373ac;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a14987;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a14987;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b708c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b708c;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a15257;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a15257;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b795c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b795c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #ae703f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #ae703f;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #989744;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #989744;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a8823e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a8823e;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #92a943;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #92a943;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #169587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #169587;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #2977b5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #2977b5;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #2c8ba1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #2c8ba1;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #5d8a8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #5d8a8c;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #5c8f6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #5c8f6c;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #65a35c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #65a35c;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #61af5b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #61af5b;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #0dc190;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #0dc190;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #15aeac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #15aeac;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #299d8d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #299d8d;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #13c493;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #13c493;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #357fb6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #357fb6;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #1fa6bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #1fa6bb;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}:root{--bslib-page-sidebar-title-bg: #375a7f;--bslib-page-sidebar-title-color: #fff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #222);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#dee2e6}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#fafefd}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#adadad}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#adadad;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#adadad}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#adadad}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(26,195,152,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#7a7a7a}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#adadad}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(26,195,152,.8)}div.sidebar-item-container.disabled{color:rgba(173,173,173,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#1ac398}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#222}.sidebar.sidebar-navigation:not(.rollup){border-right:1px solid #434343 !important}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #434343}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#222;border-bottom:1px solid #434343}.quarto-banner nav.quarto-secondary-nav{background-color:#375a7f;color:#dee2e6;border-top:1px solid #434343}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#009670}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#222}body.nav-fixed{padding-top:82px}body .nav-footer{border-top:1px solid #434343}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#8a8a8a}.nav-footer a{color:#8a8a8a}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}.nav-footer-left{flex:1 1 0px;text-align:left}.nav-footer-right{flex:1 1 0px;text-align:right}.nav-footer-center{flex:1 1 0px;min-height:3em;text-align:center}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#dee2e6;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#adadad;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#222;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#222;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#dee2e6;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#dee2e6;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #adb5bd;border-radius:.25rem;color:#2d2d2d;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(55,90,127,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#2d2d2d;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#2d2d2d;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#2d2d2d;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#2d2d2d;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #adb5bd 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#2f2f2f;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#375a7f}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#375a7f}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#2b4663}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#2d2d2d}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#000}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#2d2d2d;color:#fff}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#2d2d2d;border-color:#adb5bd;color:#fff}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #adb5bd}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#dee2e6}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#adadad}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(34,34,34,.65);width:90%;bottom:0;box-shadow:rgba(173,181,189,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#222;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#222;border-bottom:1px solid #adb5bd;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#fff;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(55,90,127,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(255,255,255,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#375a7f !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#434343 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#00bc8c !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:#3498db !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#f39c12 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:#e74c3c !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#6f6f6f !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#2d2d2d !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #4673a3;border-bottom:solid 1px #4673a3}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#436e9b}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#dee2e6}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#fff}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#fff}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px silver;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#222;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#222;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#fff}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#2d2d2d}.tableFloatingHeaderOriginal{background-color:#2d2d2d;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.listing-actions-group .form-select,.listing-actions-group .form-control{background-color:#222;color:#fff}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid #6c757d 1px;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#fff;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid #6c757d 1px;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#00bc8c}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#00bc8c}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#00bc8c}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#00bc8c}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#00bc8c}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#222;border:solid 1px #dee2e6;border-radius:.25rem;color:#fff;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#222}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#222}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#222;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#222}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#222;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#fff}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*! * * ansi colors from IPython notebook's * diff --git a/development/site_libs/bootstrap/bootstrap.min.css b/development/site_libs/bootstrap/bootstrap.min.css index 242138efe3..96d859c47e 100644 --- a/development/site_libs/bootstrap/bootstrap.min.css +++ b/development/site_libs/bootstrap/bootstrap.min.css @@ -2,7 +2,7 @@ * Bootstrap v5.3.1 (https://getbootstrap.com/) * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */@import"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&display=swap";:root,[data-bs-theme=light]{--bs-blue: #2c3e50;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #e83e8c;--bs-red: #e74c3c;--bs-orange: #fd7e14;--bs-yellow: #f39c12;--bs-green: #18bc9c;--bs-teal: #20c997;--bs-cyan: #3498db;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #ecf0f1;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #7b8a8b;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #6c757d;--bs-primary: #2c3e50;--bs-secondary: #6c757d;--bs-success: #18bc9c;--bs-info: #3498db;--bs-warning: #f39c12;--bs-danger: #e74c3c;--bs-light: #ecf0f1;--bs-dark: #7b8a8b;--bs-default-rgb: 108, 117, 125;--bs-primary-rgb: 44, 62, 80;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 24, 188, 156;--bs-info-rgb: 52, 152, 219;--bs-warning-rgb: 243, 156, 18;--bs-danger-rgb: 231, 76, 60;--bs-light-rgb: 236, 240, 241;--bs-dark-rgb: 123, 138, 139;--bs-primary-text-emphasis: #121920;--bs-secondary-text-emphasis: #2b2f32;--bs-success-text-emphasis: #0a4b3e;--bs-info-text-emphasis: #153d58;--bs-warning-text-emphasis: #613e07;--bs-danger-text-emphasis: #5c1e18;--bs-light-text-emphasis: #7b8a8b;--bs-dark-text-emphasis: #7b8a8b;--bs-primary-bg-subtle: #d5d8dc;--bs-secondary-bg-subtle: #e2e3e5;--bs-success-bg-subtle: #d1f2eb;--bs-info-bg-subtle: #d6eaf8;--bs-warning-bg-subtle: #fdebd0;--bs-danger-bg-subtle: #fadbd8;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #abb2b9;--bs-secondary-border-subtle: #c4c8cb;--bs-success-border-subtle: #a3e4d7;--bs-info-border-subtle: #aed6f1;--bs-warning-border-subtle: #fad7a0;--bs-danger-border-subtle: #f5b7b1;--bs-light-border-subtle: #ecf0f1;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #ecf0f1;--bs-secondary-bg-rgb: 236, 240, 241;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #18bc9c;--bs-link-color-rgb: 24, 188, 156;--bs-link-decoration: underline;--bs-link-hover-color: #13967d;--bs-link-hover-color-rgb: 19, 150, 125;--bs-code-color: #7d12ba;--bs-highlight-bg: #fdebd0;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(44, 62, 80, 0.25);--bs-form-valid-color: #18bc9c;--bs-form-valid-border-color: #18bc9c;--bs-form-invalid-color: #e74c3c;--bs-form-invalid-border-color: #e74c3c}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #808b96;--bs-secondary-text-emphasis: #a7acb1;--bs-success-text-emphasis: #74d7c4;--bs-info-text-emphasis: #85c1e9;--bs-warning-text-emphasis: #f8c471;--bs-danger-text-emphasis: #f1948a;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #090c10;--bs-secondary-bg-subtle: #161719;--bs-success-bg-subtle: #05261f;--bs-info-bg-subtle: #0a1e2c;--bs-warning-bg-subtle: #311f04;--bs-danger-bg-subtle: #2e0f0c;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #1a2530;--bs-secondary-border-subtle: #41464b;--bs-success-border-subtle: #0e715e;--bs-info-border-subtle: #1f5b83;--bs-warning-border-subtle: #925e0b;--bs-danger-border-subtle: #8b2e24;--bs-light-border-subtle: #7b8a8b;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #808b96;--bs-link-hover-color: #99a2ab;--bs-link-color-rgb: 128, 139, 150;--bs-link-hover-color-rgb: 153, 162, 171;--bs-code-color: white;--bs-border-color: #7b8a8b;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #74d7c4;--bs-form-valid-border-color: #74d7c4;--bs-form-invalid-color: #f1948a;--bs-form-invalid-border-color: #f1948a}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #ecf0f1}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6);border-radius:.25rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.25rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:.2em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(33,37,41,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(33,37,41,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #212529;--bs-table-bg: #fff;--bs-table-border-color: #dee2e6;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #9ba5ae}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #fff;--bs-table-bg: #2c3e50;--bs-table-border-color: #415162;--bs-table-striped-bg: #374859;--bs-table-striped-color: #fff;--bs-table-active-bg: #415162;--bs-table-active-color: #fff;--bs-table-hover-bg: #3c4c5d;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #fff;--bs-table-bg: #6c757d;--bs-table-border-color: #7b838a;--bs-table-striped-bg: #737c84;--bs-table-striped-color: #fff;--bs-table-active-bg: #7b838a;--bs-table-active-color: #fff;--bs-table-hover-bg: #777f87;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #fff;--bs-table-bg: #18bc9c;--bs-table-border-color: #2fc3a6;--bs-table-striped-bg: #24bfa1;--bs-table-striped-color: #fff;--bs-table-active-bg: #2fc3a6;--bs-table-active-color: #fff;--bs-table-hover-bg: #29c1a3;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #fff;--bs-table-bg: #3498db;--bs-table-border-color: #48a2df;--bs-table-striped-bg: #3e9ddd;--bs-table-striped-color: #fff;--bs-table-active-bg: #48a2df;--bs-table-active-color: #fff;--bs-table-hover-bg: #43a0de;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #fff;--bs-table-bg: #f39c12;--bs-table-border-color: #f4a62a;--bs-table-striped-bg: #f4a11e;--bs-table-striped-color: #fff;--bs-table-active-bg: #f4a62a;--bs-table-active-color: #000;--bs-table-hover-bg: #f4a324;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #fff;--bs-table-bg: #e74c3c;--bs-table-border-color: #e95e50;--bs-table-striped-bg: #e85546;--bs-table-striped-color: #fff;--bs-table-active-bg: #e95e50;--bs-table-active-color: #fff;--bs-table-hover-bg: #e9594b;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #ecf0f1;--bs-table-border-color: #d4d8d9;--bs-table-striped-bg: #e0e4e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4d8d9;--bs-table-active-color: #000;--bs-table-hover-bg: #dadedf;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #7b8a8b;--bs-table-border-color: #889697;--bs-table-striped-bg: #829091;--bs-table-striped-color: #fff;--bs-table-active-bg: #889697;--bs-table-active-color: #fff;--bs-table-hover-bg: #859394;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(33,37,41,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#969fa8;outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(33,37,41,.75);opacity:1}.form-control:disabled{background-color:#ecf0f1;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#212529;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#ecf0f1}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #dee2e6;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#969fa8;outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#ecf0f1}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.2em}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #dee2e6;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#969fa8;outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2c3e50;border-color:#2c3e50}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2c3e50;border-color:#2c3e50;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23969fa8'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(44,62,80,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(44,62,80,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2c3e50;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c0c5cb}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2c3e50;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#c0c5cb}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(33,37,41,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(33,37,41,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.25rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#ecf0f1}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #dee2e6;border-radius:.25rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#18bc9c}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#18bc9c;border-radius:.25rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#18bc9c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2318bc9c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#18bc9c;box-shadow:0 0 0 .25rem rgba(24,188,156,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#18bc9c}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2318bc9c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#18bc9c;box-shadow:0 0 0 .25rem rgba(24,188,156,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#18bc9c}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#18bc9c}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(24,188,156,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#18bc9c}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e74c3c}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#e74c3c;border-radius:.25rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#e74c3c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#e74c3c}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#e74c3c}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#e74c3c}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e74c3c}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #212529;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #5c636a;--bs-btn-hover-border-color: #565e64;--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #fff;--bs-btn-active-bg: #565e64;--bs-btn-active-border-color: #51585e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2c3e50;--bs-btn-border-color: #2c3e50;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #253544;--bs-btn-hover-border-color: #233240;--bs-btn-focus-shadow-rgb: 76, 91, 106;--bs-btn-active-color: #fff;--bs-btn-active-bg: #233240;--bs-btn-active-border-color: #212f3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2c3e50;--bs-btn-disabled-border-color: #2c3e50}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #5c636a;--bs-btn-hover-border-color: #565e64;--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #fff;--bs-btn-active-bg: #565e64;--bs-btn-active-border-color: #51585e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #18bc9c;--bs-btn-border-color: #18bc9c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #14a085;--bs-btn-hover-border-color: #13967d;--bs-btn-focus-shadow-rgb: 59, 198, 171;--bs-btn-active-color: #fff;--bs-btn-active-bg: #13967d;--bs-btn-active-border-color: #128d75;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #18bc9c;--bs-btn-disabled-border-color: #18bc9c}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c81ba;--bs-btn-hover-border-color: #2a7aaf;--bs-btn-focus-shadow-rgb: 82, 167, 224;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a7aaf;--bs-btn-active-border-color: #2772a4;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3498db;--bs-btn-disabled-border-color: #3498db}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #cf850f;--bs-btn-hover-border-color: #c27d0e;--bs-btn-focus-shadow-rgb: 245, 171, 54;--bs-btn-active-color: #fff;--bs-btn-active-bg: #c27d0e;--bs-btn-active-border-color: #b6750e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #f39c12;--bs-btn-disabled-border-color: #f39c12}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #c44133;--bs-btn-hover-border-color: #b93d30;--bs-btn-focus-shadow-rgb: 235, 103, 89;--bs-btn-active-color: #fff;--bs-btn-active-bg: #b93d30;--bs-btn-active-border-color: #ad392d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #e74c3c;--bs-btn-disabled-border-color: #e74c3c}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #ecf0f1;--bs-btn-border-color: #ecf0f1;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #c9cccd;--bs-btn-hover-border-color: #bdc0c1;--bs-btn-focus-shadow-rgb: 201, 204, 205;--bs-btn-active-color: #000;--bs-btn-active-bg: #bdc0c1;--bs-btn-active-border-color: #b1b4b5;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ecf0f1;--bs-btn-disabled-border-color: #ecf0f1}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #7b8a8b;--bs-btn-border-color: #7b8a8b;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #8f9c9c;--bs-btn-hover-border-color: #889697;--bs-btn-focus-shadow-rgb: 143, 156, 156;--bs-btn-active-color: #fff;--bs-btn-active-bg: #95a1a2;--bs-btn-active-border-color: #889697;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #7b8a8b;--bs-btn-disabled-border-color: #7b8a8b}.btn-outline-default{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2c3e50;--bs-btn-border-color: #2c3e50;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3e50;--bs-btn-hover-border-color: #2c3e50;--bs-btn-focus-shadow-rgb: 44, 62, 80;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2c3e50;--bs-btn-active-border-color: #2c3e50;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2c3e50;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2c3e50;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #18bc9c;--bs-btn-border-color: #18bc9c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #18bc9c;--bs-btn-hover-border-color: #18bc9c;--bs-btn-focus-shadow-rgb: 24, 188, 156;--bs-btn-active-color: #fff;--bs-btn-active-bg: #18bc9c;--bs-btn-active-border-color: #18bc9c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #18bc9c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #18bc9c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3498db;--bs-btn-hover-border-color: #3498db;--bs-btn-focus-shadow-rgb: 52, 152, 219;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3498db;--bs-btn-active-border-color: #3498db;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3498db;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3498db;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #f39c12;--bs-btn-hover-border-color: #f39c12;--bs-btn-focus-shadow-rgb: 243, 156, 18;--bs-btn-active-color: #fff;--bs-btn-active-bg: #f39c12;--bs-btn-active-border-color: #f39c12;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f39c12;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f39c12;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #e74c3c;--bs-btn-hover-border-color: #e74c3c;--bs-btn-focus-shadow-rgb: 231, 76, 60;--bs-btn-active-color: #fff;--bs-btn-active-bg: #e74c3c;--bs-btn-active-border-color: #e74c3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #e74c3c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #e74c3c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #ecf0f1;--bs-btn-border-color: #ecf0f1;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ecf0f1;--bs-btn-hover-border-color: #ecf0f1;--bs-btn-focus-shadow-rgb: 236, 240, 241;--bs-btn-active-color: #000;--bs-btn-active-bg: #ecf0f1;--bs-btn-active-border-color: #ecf0f1;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ecf0f1;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ecf0f1;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #7b8a8b;--bs-btn-border-color: #7b8a8b;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #7b8a8b;--bs-btn-hover-border-color: #7b8a8b;--bs-btn-focus-shadow-rgb: 123, 138, 139;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7b8a8b;--bs-btn-active-border-color: #7b8a8b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #7b8a8b;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #7b8a8b;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #18bc9c;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #13967d;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #13967d;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 59, 198, 171;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #212529;--bs-dropdown-bg: #fff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #7b8a8b;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-link-hover-bg: #2c3e50;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2c3e50;--bs-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2c3e50;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.25rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 2rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #18bc9c;--bs-nav-link-hover-color: #13967d;--bs-nav-link-disabled-color: #6c757d;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #ecf0f1;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #ecf0f1 #ecf0f1 #ecf0f1;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #fff;--bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2c3e50}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 1rem;--bs-navbar-color: #ccd1d5;--bs-navbar-hover-color: rgba(140, 222, 206, 0.8);--bs-navbar-disabled-color: rgba(204, 209, 213, 0.75);--bs-navbar-active-color: #8cdece;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #ccd1d5;--bs-navbar-brand-hover-color: #8cdece;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23ccd1d5' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(204, 209, 213, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #ccd1d5;--bs-navbar-hover-color: rgba(140, 222, 206, 0.8);--bs-navbar-disabled-color: rgba(204, 209, 213, 0.75);--bs-navbar-active-color: #8cdece;--bs-navbar-brand-color: #ccd1d5;--bs-navbar-brand-hover-color: #8cdece;--bs-navbar-toggler-border-color: rgba(204, 209, 213, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23ccd1d5' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23ccd1d5' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #fff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #212529;--bs-accordion-bg: #fff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #212529;--bs-accordion-btn-bg: #fff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23121920'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #969fa8;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(44, 62, 80, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #121920;--bs-accordion-active-bg: #d5d8dc}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23808b96'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23808b96'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0.75rem;--bs-breadcrumb-padding-y: 0.375rem;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: 0.25rem;--bs-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #fff;--bs-pagination-bg: #18bc9c;--bs-pagination-border-width: 0;--bs-pagination-border-color: transparent;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #fff;--bs-pagination-hover-bg: #0f7864;--bs-pagination-hover-border-color: transparent;--bs-pagination-focus-color: #13967d;--bs-pagination-focus-bg: #ecf0f1;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(44, 62, 80, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0f7864;--bs-pagination-active-border-color: transparent;--bs-pagination-disabled-color: #ecf0f1;--bs-pagination-disabled-bg: #3be6c4;--bs-pagination-disabled-border-color: transparent;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(0*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #ecf0f1;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2c3e50;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #212529;--bs-list-group-bg: #fff;--bs-list-group-border-color: #dee2e6;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(33, 37, 41, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #ecf0f1;--bs-list-group-action-active-color: #212529;--bs-list-group-action-active-bg: #ecf0f1;--bs-list-group-disabled-color: rgba(33, 37, 41, 0.75);--bs-list-group-disabled-bg: #ecf0f1;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2c3e50;--bs-list-group-active-border-color: #2c3e50;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #fff;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.4;--bs-btn-close-hover-opacity: 1;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(44, 62, 80, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(33, 37, 41, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #fff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #dee2e6;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #dee2e6;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #fff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #fff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #ecf0f1;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #212529;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #212529;--bs-offcanvas-bg: #fff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(35, 50, 64, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(35, 50, 64, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(19, 150, 125, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(19, 150, 125, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(42, 122, 175, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 122, 175, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(194, 125, 14, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(194, 125, 14, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(185, 61, 48, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(185, 61, 48, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(240, 243, 244, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(240, 243, 244, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(98, 110, 111, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(98, 110, 111, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}.bg-blue{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2c3e50;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #18bc9c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #6c757d}.bg-default{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2c3e50}.bg-primary{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #18bc9c}.bg-success{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #ecf0f1}.bg-light{--bslib-color-bg: #ecf0f1;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #7b8a8b}.bg-dark{--bslib-color-bg: #7b8a8b;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #432c91;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #432c91;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #47407d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #47407d;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #773e68;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #773e68;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #774448;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #774448;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #805838;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #805838;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7c6437;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #7c6437;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #24706e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #24706e;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #27766c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #27766c;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #2f6288;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #2f6288;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4f22b1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #4f22b1;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #4755d0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #4755d0;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #544094;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #544094;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4c73b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #4c73b2;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9d3e74;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #9d3e74;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #957092;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #957092;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9c4644;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #9c4644;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #947962;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #947962;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9642c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #a9642c;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #a1974a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #a1974a;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a3762b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #a3762b;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #9ba949;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #9ba949;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #208a7e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #208a7e;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3777be;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3777be;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3b8bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b8bab;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #6b8a96;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #6b8a96;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #6b8f76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #6b8f76;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #74a366;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74a366;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #70af65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #70af65;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #1bc19a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1bc19a;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #23aeb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #23aeb5;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #25917b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #25917b;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #1dc499;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #1dc499;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #3174a3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #3174a3;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #29a6c2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #29a6c2;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2c3e50;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #18bc9c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #6c757d}.bg-default{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2c3e50}.bg-primary{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #18bc9c}.bg-success{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #ecf0f1}.bg-light{--bslib-color-bg: #ecf0f1;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #7b8a8b}.bg-dark{--bslib-color-bg: #7b8a8b;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #432c91;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #432c91;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #47407d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #47407d;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #773e68;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #773e68;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #774448;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #774448;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #805838;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #805838;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7c6437;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #7c6437;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #24706e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #24706e;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #27766c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #27766c;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #2f6288;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #2f6288;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4f22b1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #4f22b1;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #4755d0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #4755d0;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #544094;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #544094;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4c73b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #4c73b2;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9d3e74;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #9d3e74;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #957092;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #957092;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9c4644;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #9c4644;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #947962;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #947962;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9642c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #a9642c;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #a1974a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #a1974a;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a3762b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #a3762b;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #9ba949;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #9ba949;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #208a7e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #208a7e;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3777be;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3777be;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3b8bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b8bab;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #6b8a96;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #6b8a96;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #6b8f76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #6b8f76;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #74a366;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74a366;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #70af65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #70af65;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #1bc19a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1bc19a;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #23aeb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #23aeb5;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #25917b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #25917b;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #1dc499;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #1dc499;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #3174a3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #3174a3;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #29a6c2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #29a6c2;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #fff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}:root{--bslib-page-sidebar-title-bg: #2c3e50;--bslib-page-sidebar-title-color: #fff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#ccd1d5}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#8cdece}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#595959}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#595959;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(13,100,83,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#8c8c8c}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#595959}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(13,100,83,.8)}div.sidebar-item-container.disabled{color:rgba(89,89,89,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#0d6453}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#fff}.sidebar.sidebar-navigation:not(.rollup){border-right:1px solid #dee2e6 !important}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#fff;border-bottom:1px solid #dee2e6}.quarto-banner nav.quarto-secondary-nav{background-color:#2c3e50;color:#ccd1d5;border-top:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#13967d}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:82px}body .nav-footer{border-top:1px solid #dee2e6}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}.nav-footer-left{flex:1 1 0px;text-align:left}.nav-footer-right{flex:1 1 0px;text-align:right}.nav-footer-center{flex:1 1 0px;min-height:3em;text-align:center}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#ccd1d5;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#595959;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#ccd1d5;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#ccd1d5;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;color:#212529;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(44,62,80,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#212529;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#212529;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#212529;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#212529;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#212529;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#212529;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#212529;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #dee2e6 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2c3e50}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2c3e50}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#3a526a}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#212529}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#90a9c2}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#212529}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#dee2e6;color:#212529}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #dee2e6}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#ccd1d5}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#595959}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(222,226,230,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #dee2e6;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#212529;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(44,62,80,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(33,37,41,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:rgba(39,128,227,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#6c757d !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:rgba(63,182,24,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:rgba(153,84,187,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:rgba(255,117,24,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:rgba(255,0,57,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#ecf0f1 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#7b8a8b !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #3e5871;border-bottom:solid 1px #3e5871}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#3a526a}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#ccd1d5}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#212529}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#212529}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px #c7c9cd;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#fff;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#fff;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#212529}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#fff}.tableFloatingHeaderOriginal{background-color:#fff;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#212529;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#4e5862;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#18bc9c}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#4e5862;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#18bc9c}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#4e5862;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#18bc9c}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#4e5862;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#18bc9c}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#4e5862;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#18bc9c}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#212529;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#212529}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*! + */@import"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&display=swap";:root,[data-bs-theme=light]{--bs-blue: #2c3e50;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #e83e8c;--bs-red: #e74c3c;--bs-orange: #fd7e14;--bs-yellow: #f39c12;--bs-green: #18bc9c;--bs-teal: #20c997;--bs-cyan: #3498db;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #ecf0f1;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #7b8a8b;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #6c757d;--bs-primary: #2c3e50;--bs-secondary: #6c757d;--bs-success: #18bc9c;--bs-info: #3498db;--bs-warning: #f39c12;--bs-danger: #e74c3c;--bs-light: #ecf0f1;--bs-dark: #7b8a8b;--bs-default-rgb: 108, 117, 125;--bs-primary-rgb: 44, 62, 80;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 24, 188, 156;--bs-info-rgb: 52, 152, 219;--bs-warning-rgb: 243, 156, 18;--bs-danger-rgb: 231, 76, 60;--bs-light-rgb: 236, 240, 241;--bs-dark-rgb: 123, 138, 139;--bs-primary-text-emphasis: #121920;--bs-secondary-text-emphasis: #2b2f32;--bs-success-text-emphasis: #0a4b3e;--bs-info-text-emphasis: #153d58;--bs-warning-text-emphasis: #613e07;--bs-danger-text-emphasis: #5c1e18;--bs-light-text-emphasis: #7b8a8b;--bs-dark-text-emphasis: #7b8a8b;--bs-primary-bg-subtle: #d5d8dc;--bs-secondary-bg-subtle: #e2e3e5;--bs-success-bg-subtle: #d1f2eb;--bs-info-bg-subtle: #d6eaf8;--bs-warning-bg-subtle: #fdebd0;--bs-danger-bg-subtle: #fadbd8;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #abb2b9;--bs-secondary-border-subtle: #c4c8cb;--bs-success-border-subtle: #a3e4d7;--bs-info-border-subtle: #aed6f1;--bs-warning-border-subtle: #fad7a0;--bs-danger-border-subtle: #f5b7b1;--bs-light-border-subtle: #ecf0f1;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #ecf0f1;--bs-secondary-bg-rgb: 236, 240, 241;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #18bc9c;--bs-link-color-rgb: 24, 188, 156;--bs-link-decoration: underline;--bs-link-hover-color: #13967d;--bs-link-hover-color-rgb: 19, 150, 125;--bs-code-color: #7d12ba;--bs-highlight-bg: #fdebd0;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(44, 62, 80, 0.25);--bs-form-valid-color: #18bc9c;--bs-form-valid-border-color: #18bc9c;--bs-form-invalid-color: #e74c3c;--bs-form-invalid-border-color: #e74c3c}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #808b96;--bs-secondary-text-emphasis: #a7acb1;--bs-success-text-emphasis: #74d7c4;--bs-info-text-emphasis: #85c1e9;--bs-warning-text-emphasis: #f8c471;--bs-danger-text-emphasis: #f1948a;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #090c10;--bs-secondary-bg-subtle: #161719;--bs-success-bg-subtle: #05261f;--bs-info-bg-subtle: #0a1e2c;--bs-warning-bg-subtle: #311f04;--bs-danger-bg-subtle: #2e0f0c;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #1a2530;--bs-secondary-border-subtle: #41464b;--bs-success-border-subtle: #0e715e;--bs-info-border-subtle: #1f5b83;--bs-warning-border-subtle: #925e0b;--bs-danger-border-subtle: #8b2e24;--bs-light-border-subtle: #7b8a8b;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #808b96;--bs-link-hover-color: #99a2ab;--bs-link-color-rgb: 128, 139, 150;--bs-link-hover-color-rgb: 153, 162, 171;--bs-code-color: white;--bs-border-color: #7b8a8b;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #74d7c4;--bs-form-valid-border-color: #74d7c4;--bs-form-invalid-color: #f1948a;--bs-form-invalid-border-color: #f1948a}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #ecf0f1}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6);border-radius:.25rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.25rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:.2em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(33,37,41,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(33,37,41,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #212529;--bs-table-bg: #fff;--bs-table-border-color: #dee2e6;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #9ba5ae}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #fff;--bs-table-bg: #2c3e50;--bs-table-border-color: #415162;--bs-table-striped-bg: #374859;--bs-table-striped-color: #fff;--bs-table-active-bg: #415162;--bs-table-active-color: #fff;--bs-table-hover-bg: #3c4c5d;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #fff;--bs-table-bg: #6c757d;--bs-table-border-color: #7b838a;--bs-table-striped-bg: #737c84;--bs-table-striped-color: #fff;--bs-table-active-bg: #7b838a;--bs-table-active-color: #fff;--bs-table-hover-bg: #777f87;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #fff;--bs-table-bg: #18bc9c;--bs-table-border-color: #2fc3a6;--bs-table-striped-bg: #24bfa1;--bs-table-striped-color: #fff;--bs-table-active-bg: #2fc3a6;--bs-table-active-color: #fff;--bs-table-hover-bg: #29c1a3;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #fff;--bs-table-bg: #3498db;--bs-table-border-color: #48a2df;--bs-table-striped-bg: #3e9ddd;--bs-table-striped-color: #fff;--bs-table-active-bg: #48a2df;--bs-table-active-color: #fff;--bs-table-hover-bg: #43a0de;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #fff;--bs-table-bg: #f39c12;--bs-table-border-color: #f4a62a;--bs-table-striped-bg: #f4a11e;--bs-table-striped-color: #fff;--bs-table-active-bg: #f4a62a;--bs-table-active-color: #000;--bs-table-hover-bg: #f4a324;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #fff;--bs-table-bg: #e74c3c;--bs-table-border-color: #e95e50;--bs-table-striped-bg: #e85546;--bs-table-striped-color: #fff;--bs-table-active-bg: #e95e50;--bs-table-active-color: #fff;--bs-table-hover-bg: #e9594b;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #ecf0f1;--bs-table-border-color: #d4d8d9;--bs-table-striped-bg: #e0e4e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4d8d9;--bs-table-active-color: #000;--bs-table-hover-bg: #dadedf;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #7b8a8b;--bs-table-border-color: #889697;--bs-table-striped-bg: #829091;--bs-table-striped-color: #fff;--bs-table-active-bg: #889697;--bs-table-active-color: #fff;--bs-table-hover-bg: #859394;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(33,37,41,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#969fa8;outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(33,37,41,.75);opacity:1}.form-control:disabled{background-color:#ecf0f1;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#212529;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#ecf0f1}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #dee2e6;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#969fa8;outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#ecf0f1}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.2em}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #dee2e6;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#969fa8;outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2c3e50;border-color:#2c3e50}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2c3e50;border-color:#2c3e50;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23969fa8'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(44,62,80,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(44,62,80,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2c3e50;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c0c5cb}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2c3e50;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#c0c5cb}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(33,37,41,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(33,37,41,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.25rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#ecf0f1}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #dee2e6;border-radius:.25rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#18bc9c}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#18bc9c;border-radius:.25rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#18bc9c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2318bc9c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#18bc9c;box-shadow:0 0 0 .25rem rgba(24,188,156,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#18bc9c}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2318bc9c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#18bc9c;box-shadow:0 0 0 .25rem rgba(24,188,156,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#18bc9c}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#18bc9c}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(24,188,156,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#18bc9c}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e74c3c}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#e74c3c;border-radius:.25rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#e74c3c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#e74c3c}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#e74c3c}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#e74c3c}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e74c3c}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #212529;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #5c636a;--bs-btn-hover-border-color: #565e64;--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #fff;--bs-btn-active-bg: #565e64;--bs-btn-active-border-color: #51585e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2c3e50;--bs-btn-border-color: #2c3e50;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #253544;--bs-btn-hover-border-color: #233240;--bs-btn-focus-shadow-rgb: 76, 91, 106;--bs-btn-active-color: #fff;--bs-btn-active-bg: #233240;--bs-btn-active-border-color: #212f3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2c3e50;--bs-btn-disabled-border-color: #2c3e50}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #5c636a;--bs-btn-hover-border-color: #565e64;--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #fff;--bs-btn-active-bg: #565e64;--bs-btn-active-border-color: #51585e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #18bc9c;--bs-btn-border-color: #18bc9c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #14a085;--bs-btn-hover-border-color: #13967d;--bs-btn-focus-shadow-rgb: 59, 198, 171;--bs-btn-active-color: #fff;--bs-btn-active-bg: #13967d;--bs-btn-active-border-color: #128d75;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #18bc9c;--bs-btn-disabled-border-color: #18bc9c}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c81ba;--bs-btn-hover-border-color: #2a7aaf;--bs-btn-focus-shadow-rgb: 82, 167, 224;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a7aaf;--bs-btn-active-border-color: #2772a4;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3498db;--bs-btn-disabled-border-color: #3498db}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #cf850f;--bs-btn-hover-border-color: #c27d0e;--bs-btn-focus-shadow-rgb: 245, 171, 54;--bs-btn-active-color: #fff;--bs-btn-active-bg: #c27d0e;--bs-btn-active-border-color: #b6750e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #f39c12;--bs-btn-disabled-border-color: #f39c12}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #c44133;--bs-btn-hover-border-color: #b93d30;--bs-btn-focus-shadow-rgb: 235, 103, 89;--bs-btn-active-color: #fff;--bs-btn-active-bg: #b93d30;--bs-btn-active-border-color: #ad392d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #e74c3c;--bs-btn-disabled-border-color: #e74c3c}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #ecf0f1;--bs-btn-border-color: #ecf0f1;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #c9cccd;--bs-btn-hover-border-color: #bdc0c1;--bs-btn-focus-shadow-rgb: 201, 204, 205;--bs-btn-active-color: #000;--bs-btn-active-bg: #bdc0c1;--bs-btn-active-border-color: #b1b4b5;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ecf0f1;--bs-btn-disabled-border-color: #ecf0f1}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #7b8a8b;--bs-btn-border-color: #7b8a8b;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #8f9c9c;--bs-btn-hover-border-color: #889697;--bs-btn-focus-shadow-rgb: 143, 156, 156;--bs-btn-active-color: #fff;--bs-btn-active-bg: #95a1a2;--bs-btn-active-border-color: #889697;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #7b8a8b;--bs-btn-disabled-border-color: #7b8a8b}.btn-outline-default{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2c3e50;--bs-btn-border-color: #2c3e50;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3e50;--bs-btn-hover-border-color: #2c3e50;--bs-btn-focus-shadow-rgb: 44, 62, 80;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2c3e50;--bs-btn-active-border-color: #2c3e50;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2c3e50;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2c3e50;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #18bc9c;--bs-btn-border-color: #18bc9c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #18bc9c;--bs-btn-hover-border-color: #18bc9c;--bs-btn-focus-shadow-rgb: 24, 188, 156;--bs-btn-active-color: #fff;--bs-btn-active-bg: #18bc9c;--bs-btn-active-border-color: #18bc9c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #18bc9c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #18bc9c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3498db;--bs-btn-hover-border-color: #3498db;--bs-btn-focus-shadow-rgb: 52, 152, 219;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3498db;--bs-btn-active-border-color: #3498db;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3498db;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3498db;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #f39c12;--bs-btn-hover-border-color: #f39c12;--bs-btn-focus-shadow-rgb: 243, 156, 18;--bs-btn-active-color: #fff;--bs-btn-active-bg: #f39c12;--bs-btn-active-border-color: #f39c12;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f39c12;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f39c12;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #e74c3c;--bs-btn-hover-border-color: #e74c3c;--bs-btn-focus-shadow-rgb: 231, 76, 60;--bs-btn-active-color: #fff;--bs-btn-active-bg: #e74c3c;--bs-btn-active-border-color: #e74c3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #e74c3c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #e74c3c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #ecf0f1;--bs-btn-border-color: #ecf0f1;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ecf0f1;--bs-btn-hover-border-color: #ecf0f1;--bs-btn-focus-shadow-rgb: 236, 240, 241;--bs-btn-active-color: #000;--bs-btn-active-bg: #ecf0f1;--bs-btn-active-border-color: #ecf0f1;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ecf0f1;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ecf0f1;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #7b8a8b;--bs-btn-border-color: #7b8a8b;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #7b8a8b;--bs-btn-hover-border-color: #7b8a8b;--bs-btn-focus-shadow-rgb: 123, 138, 139;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7b8a8b;--bs-btn-active-border-color: #7b8a8b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #7b8a8b;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #7b8a8b;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #18bc9c;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #13967d;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #13967d;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 59, 198, 171;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #212529;--bs-dropdown-bg: #fff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #7b8a8b;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-link-hover-bg: #2c3e50;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2c3e50;--bs-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2c3e50;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.25rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 2rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #18bc9c;--bs-nav-link-hover-color: #13967d;--bs-nav-link-disabled-color: #6c757d;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #ecf0f1;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #ecf0f1 #ecf0f1 #ecf0f1;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #fff;--bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2c3e50}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 1rem;--bs-navbar-color: #ccd1d5;--bs-navbar-hover-color: rgba(140, 222, 206, 0.8);--bs-navbar-disabled-color: rgba(204, 209, 213, 0.75);--bs-navbar-active-color: #8cdece;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #ccd1d5;--bs-navbar-brand-hover-color: #8cdece;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23ccd1d5' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(204, 209, 213, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #ccd1d5;--bs-navbar-hover-color: rgba(140, 222, 206, 0.8);--bs-navbar-disabled-color: rgba(204, 209, 213, 0.75);--bs-navbar-active-color: #8cdece;--bs-navbar-brand-color: #ccd1d5;--bs-navbar-brand-hover-color: #8cdece;--bs-navbar-toggler-border-color: rgba(204, 209, 213, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23ccd1d5' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23ccd1d5' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #fff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #212529;--bs-accordion-bg: #fff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #212529;--bs-accordion-btn-bg: #fff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23121920'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #969fa8;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(44, 62, 80, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #121920;--bs-accordion-active-bg: #d5d8dc}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23808b96'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23808b96'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0.75rem;--bs-breadcrumb-padding-y: 0.375rem;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: 0.25rem;--bs-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #fff;--bs-pagination-bg: #18bc9c;--bs-pagination-border-width: 0;--bs-pagination-border-color: transparent;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #fff;--bs-pagination-hover-bg: #0f7864;--bs-pagination-hover-border-color: transparent;--bs-pagination-focus-color: #13967d;--bs-pagination-focus-bg: #ecf0f1;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(44, 62, 80, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0f7864;--bs-pagination-active-border-color: transparent;--bs-pagination-disabled-color: #ecf0f1;--bs-pagination-disabled-bg: #3be6c4;--bs-pagination-disabled-border-color: transparent;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(0*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #ecf0f1;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2c3e50;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #212529;--bs-list-group-bg: #fff;--bs-list-group-border-color: #dee2e6;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(33, 37, 41, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #ecf0f1;--bs-list-group-action-active-color: #212529;--bs-list-group-action-active-bg: #ecf0f1;--bs-list-group-disabled-color: rgba(33, 37, 41, 0.75);--bs-list-group-disabled-bg: #ecf0f1;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2c3e50;--bs-list-group-active-border-color: #2c3e50;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #fff;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.4;--bs-btn-close-hover-opacity: 1;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(44, 62, 80, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(33, 37, 41, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #fff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #dee2e6;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #dee2e6;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #fff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #fff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #ecf0f1;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #212529;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #212529;--bs-offcanvas-bg: #fff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(35, 50, 64, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(35, 50, 64, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(19, 150, 125, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(19, 150, 125, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(42, 122, 175, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 122, 175, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(194, 125, 14, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(194, 125, 14, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(185, 61, 48, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(185, 61, 48, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(240, 243, 244, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(240, 243, 244, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(98, 110, 111, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(98, 110, 111, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2c3e50;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #18bc9c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #6c757d}.bg-default{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2c3e50}.bg-primary{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #18bc9c}.bg-success{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #ecf0f1}.bg-light{--bslib-color-bg: #ecf0f1;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #7b8a8b}.bg-dark{--bslib-color-bg: #7b8a8b;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #432c91;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #432c91;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #47407d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #47407d;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #773e68;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #773e68;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #774448;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #774448;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #805838;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #805838;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7c6437;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #7c6437;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #24706e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #24706e;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #27766c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #27766c;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #2f6288;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #2f6288;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4f22b1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #4f22b1;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #4755d0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #4755d0;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #544094;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #544094;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4c73b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #4c73b2;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9d3e74;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #9d3e74;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #957092;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #957092;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9c4644;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #9c4644;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #947962;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #947962;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9642c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #a9642c;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #a1974a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #a1974a;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a3762b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #a3762b;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #9ba949;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #9ba949;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #208a7e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #208a7e;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3777be;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3777be;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3b8bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b8bab;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #6b8a96;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #6b8a96;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #6b8f76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #6b8f76;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #74a366;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74a366;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #70af65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #70af65;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #1bc19a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1bc19a;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #23aeb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #23aeb5;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #25917b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #25917b;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #1dc499;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #1dc499;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #3174a3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #3174a3;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #29a6c2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #29a6c2;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2c3e50;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #18bc9c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #6c757d}.bg-default{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2c3e50}.bg-primary{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #18bc9c}.bg-success{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #ecf0f1}.bg-light{--bslib-color-bg: #ecf0f1;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #7b8a8b}.bg-dark{--bslib-color-bg: #7b8a8b;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #432c91;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #432c91;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #47407d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #47407d;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #773e68;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #773e68;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #774448;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #774448;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #805838;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #805838;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7c6437;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #7c6437;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #24706e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #24706e;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #27766c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #27766c;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #2f6288;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #2f6288;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4f22b1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #4f22b1;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #4755d0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #4755d0;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #544094;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #544094;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4c73b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #4c73b2;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9d3e74;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #9d3e74;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #957092;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #957092;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9c4644;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #9c4644;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #947962;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #947962;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9642c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #a9642c;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #a1974a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #a1974a;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a3762b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #a3762b;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #9ba949;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #9ba949;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #208a7e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #208a7e;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3777be;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3777be;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3b8bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b8bab;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #6b8a96;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #6b8a96;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #6b8f76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #6b8f76;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #74a366;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74a366;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #70af65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #70af65;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #1bc19a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1bc19a;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #23aeb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #23aeb5;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #25917b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #25917b;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #1dc499;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #1dc499;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #3174a3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #3174a3;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #29a6c2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #29a6c2;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}:root{--bslib-page-sidebar-title-bg: #2c3e50;--bslib-page-sidebar-title-color: #fff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #fff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#ccd1d5}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#8cdece}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#595959}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#595959;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(13,100,83,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#8c8c8c}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#595959}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(13,100,83,.8)}div.sidebar-item-container.disabled{color:rgba(89,89,89,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#0d6453}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#fff}.sidebar.sidebar-navigation:not(.rollup){border-right:1px solid #dee2e6 !important}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#fff;border-bottom:1px solid #dee2e6}.quarto-banner nav.quarto-secondary-nav{background-color:#2c3e50;color:#ccd1d5;border-top:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#13967d}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:82px}body .nav-footer{border-top:1px solid #dee2e6}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}.nav-footer-left{flex:1 1 0px;text-align:left}.nav-footer-right{flex:1 1 0px;text-align:right}.nav-footer-center{flex:1 1 0px;min-height:3em;text-align:center}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#ccd1d5;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#595959;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#ccd1d5;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#ccd1d5;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;color:#212529;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(44,62,80,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#212529;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#212529;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#212529;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#212529;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#212529;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#212529;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#212529;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #dee2e6 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2c3e50}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2c3e50}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#3a526a}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#212529}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#90a9c2}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#212529}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#dee2e6;color:#212529}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #dee2e6}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#ccd1d5}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#595959}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(222,226,230,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #dee2e6;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#212529;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(44,62,80,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(33,37,41,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:rgba(39,128,227,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#6c757d !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:rgba(63,182,24,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:rgba(153,84,187,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:rgba(255,117,24,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:rgba(255,0,57,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#ecf0f1 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#7b8a8b !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #3e5871;border-bottom:solid 1px #3e5871}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#3a526a}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#ccd1d5}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#212529}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#212529}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px #c7c9cd;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#fff;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#fff;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#212529}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#fff}.tableFloatingHeaderOriginal{background-color:#fff;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#212529;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#4e5862;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#18bc9c}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#4e5862;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#18bc9c}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#4e5862;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#18bc9c}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#4e5862;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#18bc9c}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#4e5862;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#18bc9c}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#212529;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#212529}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*! * * ansi colors from IPython notebook's * diff --git a/development/sitemap.xml b/development/sitemap.xml index bd2f68191b..fe8b87b6f4 100644 --- a/development/sitemap.xml +++ b/development/sitemap.xml @@ -1,579 +1,579 @@ - https://insightsengineering.github.io/tlg-catalog/test-utils/save_results.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/CONTRIBUTING.html + 2024-04-03T17:25:28.530Z - https://insightsengineering.github.io/tlg-catalog/index.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkpg01.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/appendix/reproducibility.html - 2024-03-30T17:23:45.417Z + https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkcg03.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/other/mng01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkpg02.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/other/ltg01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkpg03.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/other/ippg01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/efficacy/fstg01.html + 2024-04-03T17:25:28.542Z https://insightsengineering.github.io/tlg-catalog/graphs/efficacy/mmrmg01.html - 2024-03-30T17:23:45.429Z + 2024-04-03T17:25:28.542Z https://insightsengineering.github.io/tlg-catalog/graphs/efficacy/fstg02.html - 2024-03-30T17:23:45.429Z + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/efficacy/kmg01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/other/ltg01.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkcg01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/other/ippg01.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkpg01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/other/cig01.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkpg02.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/repro.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkpg03.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/exposure/ext01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/lab-results/lbl02b.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt04.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/lab-results/lbl02a_rls.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt13.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/lab-results/lbl01_rls.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt15.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/vital-signs/vsl01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt03.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael02_ed.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt12_bl.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael01_nollt.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt11.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael03.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/disposition/dsl01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt10_bl.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/ECG/egl01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt11_bl.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/concomitant-medications/cml02a_gl.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/vital-signs/vst01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/efficacy/oncl01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/concomitant-medications/cmt01b.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/listings/pharmacokinetic/pkpl04.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/concomitant-medications/cmt02_pt.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/listings/pharmacokinetic/pkcl02.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/risk-management-plan/rmpt01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/pharmacokinetic/pkpl02.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/risk-management-plan/rmpt03.html + 2024-04-03T17:25:28.550Z https://insightsengineering.github.io/tlg-catalog/tables/risk-management-plan/rmpt06.html - 2024-03-30T17:23:45.437Z + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/risk-management-plan/rmpt01.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/tables/ECG/egt03.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt10.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/ECG/egt04.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt15.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt06.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt09.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt04.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt07.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt03.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt03.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt10_bl.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt08.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt02.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/disclosures/eudrat02.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt04.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/disposition/pdt01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt07.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/disposition/pdt02.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/medical-history/mht01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/vital-signs/vst02.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet09.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet01_aesi.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet10.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet02_smq.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet07.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet05.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet06_smq.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet09.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet05_all.html + 2024-04-03T17:25:28.546Z https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet06.html - 2024-03-30T17:23:45.433Z + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet09_smq.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet01_aesi.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet02.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/ratet01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet10.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/aovt01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/disposition/pdt02.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/aovt02.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/ADA/adat02.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/mmrmt01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/ADA/adat01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/rbmit01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/ADA/adat04b.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/onct05.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/ECG/egt01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/coxt01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/ECG/egt05_qtcat.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/ttet01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/concomitant-medications/cmt01a.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/ADA/adat04a.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/concomitant-medications/cmt01b.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/ADA/adat01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/dort01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/ADA/adat04b.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/rspt01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/lab-results/lbl02a.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/rbmit01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/lab-results/lbl02b.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/aovt02.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/lab-results/lbl02a_rls.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/coxt02.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/concomitant-medications/cml02b_gl.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/aovt03.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/concomitant-medications/cml01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/onct05.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/pharmacokinetic/pkpl02.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/lgrt02.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/pharmacokinetic/pkpl04.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/disclosures/eudrat02.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/pharmacokinetic/pkcl02.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/disclosures/eudrat01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/disposition/dsl02.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/demography/dmt01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael02_ed.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt07.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael01_nollt.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt11.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael04.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkct01.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/listings/development-safety-update-report/dsur4.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt04.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/listings/ADA/adal02.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/CODE_OF_CONDUCT.html - 2024-03-30T17:23:45.413Z + https://insightsengineering.github.io/tlg-catalog/test-utils/save_results.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tlg-index.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/test-utils/envir_hook.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt05.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/index.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt03.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/listings/efficacy/oncl01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt08.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/listings/medical-history/mhl01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt02.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael03.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt06.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael02.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/deaths/dtht01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/disclosures/disclosurest01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/disposition/dsl01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/exposure/ext01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/pharmacokinetic/pkpl01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/cmht01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/pharmacokinetic/pkcl01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/mmrmt01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/ECG/egl01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/ratet01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/concomitant-medications/cml02a_gl.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/aovt01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/vital-signs/vsl01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/cfbt01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/lab-results/lbl01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/coxt01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/lab-results/lbl01_rls.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/efficacy/ttet01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/listings/exposure/exl01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/concomitant-medications/cmt01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/ADA/adat03.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/concomitant-medications/cmt02_pt.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/ADA/adat02.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/ECG/egt04.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/demography/dmt01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/ECG/egt02.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/cmht01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/ECG/egt03.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/dort01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/ADA/adat03.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/cfbt01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/ADA/adat04a.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/rspt01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/disposition/dst01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/coxt02.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/disposition/pdt01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/aovt03.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet05_all.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/efficacy/lgrt02.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet06_smq.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/medical-history/mht01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet04.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet05.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet07.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet04.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet03.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet02.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet01.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet02_smq.html + 2024-04-03T17:25:28.546Z https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet04_pi.html - 2024-03-30T17:23:45.433Z + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/vital-signs/vst01.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet09_smq.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/safety/enrollment01.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/tables/adverse-events/aet03.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt13.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/safety/enrollment01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt12.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/disposition/dst01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt11_bl.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/disclosures/disclosurest01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt11.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/disclosures/eudrat01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt06.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt05.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt08.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt02.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt14.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkct01.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt05.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/pharmacokinetic/pkpt11.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt12_bl.html - 2024-03-30T17:23:45.433Z + https://insightsengineering.github.io/tlg-catalog/tables/ECG/egt05_qtcat.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/risk-management-plan/rmpt03.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/tables/ECG/egt01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/tables/risk-management-plan/rmpt05.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/tables/ECG/egt02.html + 2024-04-03T17:25:28.546Z https://insightsengineering.github.io/tlg-catalog/tables/risk-management-plan/rmpt04.html - 2024-03-30T17:23:45.437Z + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/pharmacokinetic/pkpl01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/risk-management-plan/rmpt05.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/pharmacokinetic/pkcl01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/concomitant-medications/cmt01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/listings/exposure/exl01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/concomitant-medications/cmt01a.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/listings/concomitant-medications/cml01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/vital-signs/vst02.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/concomitant-medications/cml02b_gl.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/deaths/dtht01.html + 2024-04-03T17:25:28.546Z - https://insightsengineering.github.io/tlg-catalog/listings/ADA/adal02.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt07.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/disposition/dsl02.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt12.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael04.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt08.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael02.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt09.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/adverse-events/ael01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt06.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/medical-history/mhl01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt14.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/lab-results/lbl02a.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt10.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/lab-results/lbl01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt02.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/listings/development-safety-update-report/dsur4.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tables/lab-results/lbt05.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkpg04.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/CODE_OF_CONDUCT.html + 2024-04-03T17:25:28.530Z - https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkcg02.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/tlg-index.html + 2024-04-03T17:25:28.550Z - https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkcg03.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/other/bwg01.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkpg06.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/other/brg01.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/efficacy/fstg01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/other/mng01.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/efficacy/mmrmg02.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/efficacy/kmg01.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/other/bwg01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/efficacy/mmrmg02.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/other/brg01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkcg02.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/graphs/other/cig01.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkpg06.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/repro.html - 2024-03-30T17:23:45.429Z + https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkpg04.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/CONTRIBUTING.html - 2024-03-30T17:23:45.413Z + https://insightsengineering.github.io/tlg-catalog/graphs/pharmacokinetic/pkcg01.html + 2024-04-03T17:25:28.542Z - https://insightsengineering.github.io/tlg-catalog/test-utils/envir_hook.html - 2024-03-30T17:23:45.437Z + https://insightsengineering.github.io/tlg-catalog/appendix/reproducibility.html + 2024-04-03T17:25:28.530Z diff --git a/development/tables/ADA/adat01.html b/development/tables/ADA/adat01.html index e24efb7de0..d6192a3b46 100644 --- a/development/tables/ADA/adat01.html +++ b/development/tables/ADA/adat01.html @@ -1720,7 +1720,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:41:01 UTC"
+
[1] "2024-04-03 17:36:22 UTC"

Session Info

@@ -1752,7 +1752,7 @@ other attached packages: [1] tibble_3.2.1 scda_0.1.6.9017 dplyr_1.1.4 [4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[7] formatters_0.5.5.9016 +[7] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/ADA/adat02.html b/development/tables/ADA/adat02.html index dc850c863f..f26ae16e6d 100644 --- a/development/tables/ADA/adat02.html +++ b/development/tables/ADA/adat02.html @@ -1622,7 +1622,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:41:12 UTC"
+
[1] "2024-04-03 17:36:28 UTC"

Session Info

@@ -1653,7 +1653,7 @@ other attached packages: [1] scda_0.1.6.9017 dplyr_1.1.4 tern_0.9.3.9028 -[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016 +[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/ADA/adat03.html b/development/tables/ADA/adat03.html index 7b7c87c06e..31c7896bbf 100644 --- a/development/tables/ADA/adat03.html +++ b/development/tables/ADA/adat03.html @@ -1595,7 +1595,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:40:55 UTC"
+
[1] "2024-04-03 17:36:16 UTC"

Session Info

@@ -1626,7 +1626,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 scda_0.1.6.9017 dplyr_1.1.4 +[4] formatters_0.5.5.9018 scda_0.1.6.9017 dplyr_1.1.4 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/ADA/adat04a.html b/development/tables/ADA/adat04a.html index fc56d2e34a..06eb301f85 100644 --- a/development/tables/ADA/adat04a.html +++ b/development/tables/ADA/adat04a.html @@ -1751,7 +1751,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:41:07 UTC"
+
[1] "2024-04-03 17:36:34 UTC"

Session Info

@@ -1783,7 +1783,7 @@ other attached packages: [1] tibble_3.2.1 scda_0.1.6.9017 dplyr_1.1.4 [4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[7] formatters_0.5.5.9016 +[7] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/ADA/adat04b.html b/development/tables/ADA/adat04b.html index c8bd6a1812..a3d2a016bb 100644 --- a/development/tables/ADA/adat04b.html +++ b/development/tables/ADA/adat04b.html @@ -1700,7 +1700,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:40:49 UTC"
+
[1] "2024-04-03 17:36:10 UTC"

Session Info

@@ -1732,7 +1732,7 @@ other attached packages: [1] tibble_3.2.1 scda_0.1.6.9017 dplyr_1.1.4 [4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[7] formatters_0.5.5.9016 +[7] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/ECG/egt01.html b/development/tables/ECG/egt01.html index d486d52537..ef1f525723 100644 --- a/development/tables/ECG/egt01.html +++ b/development/tables/ECG/egt01.html @@ -1699,7 +1699,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:40:22 UTC"
+
[1] "2024-04-03 17:49:03 UTC"

Session Info

@@ -1730,11 +1730,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/ECG/egt01_files/figure-html/teal-1.png b/development/tables/ECG/egt01_files/figure-html/teal-1.png index 71fdbde6c2..1ee8d9da6f 100644 Binary files a/development/tables/ECG/egt01_files/figure-html/teal-1.png and b/development/tables/ECG/egt01_files/figure-html/teal-1.png differ diff --git a/development/tables/ECG/egt02.html b/development/tables/ECG/egt02.html index 6dde305163..b25e08a6d1 100644 --- a/development/tables/ECG/egt02.html +++ b/development/tables/ECG/egt02.html @@ -1607,7 +1607,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:40:05 UTC"
+
[1] "2024-04-03 17:49:40 UTC"

Session Info

@@ -1638,11 +1638,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 scda_0.1.6.9017 +[11] formatters_0.5.5.9018 scda_0.1.6.9017 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/ECG/egt02_files/figure-html/teal-1.png b/development/tables/ECG/egt02_files/figure-html/teal-1.png index a58078394d..e0c285bf4a 100644 Binary files a/development/tables/ECG/egt02_files/figure-html/teal-1.png and b/development/tables/ECG/egt02_files/figure-html/teal-1.png differ diff --git a/development/tables/ECG/egt03.html b/development/tables/ECG/egt03.html index 7b2b1016f3..9f15a99d41 100644 --- a/development/tables/ECG/egt03.html +++ b/development/tables/ECG/egt03.html @@ -1693,7 +1693,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:40:42 UTC"
+
[1] "2024-04-03 17:49:24 UTC"

Session Info

@@ -1724,11 +1724,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/ECG/egt03_files/figure-html/teal-1.png b/development/tables/ECG/egt03_files/figure-html/teal-1.png index 7bdc1ba340..e8ff623ec1 100644 Binary files a/development/tables/ECG/egt03_files/figure-html/teal-1.png and b/development/tables/ECG/egt03_files/figure-html/teal-1.png differ diff --git a/development/tables/ECG/egt04.html b/development/tables/ECG/egt04.html index ea8bf686a7..e630e36481 100644 --- a/development/tables/ECG/egt04.html +++ b/development/tables/ECG/egt04.html @@ -1553,7 +1553,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:39:34 UTC"
+
[1] "2024-04-03 17:48:47 UTC"

Session Info

@@ -1584,7 +1584,7 @@ other attached packages: [1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 -[4] magrittr_2.0.3 formatters_0.5.5.9016 scda_0.1.6.9017 +[4] magrittr_2.0.3 formatters_0.5.5.9018 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/ECG/egt05_qtcat.html b/development/tables/ECG/egt05_qtcat.html index d3502eb517..577ca15308 100644 --- a/development/tables/ECG/egt05_qtcat.html +++ b/development/tables/ECG/egt05_qtcat.html @@ -1735,7 +1735,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:39:49 UTC"
+
[1] "2024-04-03 17:48:40 UTC"

Session Info

@@ -1766,12 +1766,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/ECG/egt05_qtcat_files/figure-html/teal-1.png b/development/tables/ECG/egt05_qtcat_files/figure-html/teal-1.png index f8b2f65154..e463b41f31 100644 Binary files a/development/tables/ECG/egt05_qtcat_files/figure-html/teal-1.png and b/development/tables/ECG/egt05_qtcat_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet01.html b/development/tables/adverse-events/aet01.html index 8f9932401e..5206bf71f4 100644 --- a/development/tables/adverse-events/aet01.html +++ b/development/tables/adverse-events/aet01.html @@ -1965,7 +1965,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:45:17 UTC"
+
[1] "2024-04-03 17:45:55 UTC"

Session Info

@@ -1996,12 +1996,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] dplyr_1.1.4 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/adverse-events/aet01_aesi.html b/development/tables/adverse-events/aet01_aesi.html index 5379b3468f..0e18c88e03 100644 --- a/development/tables/adverse-events/aet01_aesi.html +++ b/development/tables/adverse-events/aet01_aesi.html @@ -2398,7 +2398,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:46:13 UTC"
+
[1] "2024-04-03 17:41:38 UTC"

Session Info

@@ -2429,12 +2429,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] dplyr_1.1.4 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/adverse-events/aet01_aesi_files/figure-html/teal-1.png b/development/tables/adverse-events/aet01_aesi_files/figure-html/teal-1.png index c1177c4eef..e36e592d80 100644 Binary files a/development/tables/adverse-events/aet01_aesi_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet01_aesi_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet01_files/figure-html/teal-1.png b/development/tables/adverse-events/aet01_files/figure-html/teal-1.png index 4d1ada6240..f09608b832 100644 Binary files a/development/tables/adverse-events/aet01_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet01_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet02.html b/development/tables/adverse-events/aet02.html index f680bfbbb6..e576665180 100644 --- a/development/tables/adverse-events/aet02.html +++ b/development/tables/adverse-events/aet02.html @@ -2509,7 +2509,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:42:38 UTC"
+
[1] "2024-04-03 17:43:23 UTC"

Session Info

@@ -2540,11 +2540,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/adverse-events/aet02_files/figure-html/teal-1.png b/development/tables/adverse-events/aet02_files/figure-html/teal-1.png index 1bbc53646e..4c69d5c0ea 100644 Binary files a/development/tables/adverse-events/aet02_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet02_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet02_smq.html b/development/tables/adverse-events/aet02_smq.html index 3bdb463771..8a7c43d8cb 100644 --- a/development/tables/adverse-events/aet02_smq.html +++ b/development/tables/adverse-events/aet02_smq.html @@ -1714,7 +1714,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:45:32 UTC"
+
[1] "2024-04-03 17:43:55 UTC"

Session Info

@@ -1745,12 +1745,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 stringr_1.5.1 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 dplyr_1.1.4 +[13] formatters_0.5.5.9018 dplyr_1.1.4 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/adverse-events/aet02_smq_files/figure-html/teal-1.png b/development/tables/adverse-events/aet02_smq_files/figure-html/teal-1.png index 1b52dea19c..a49956c597 100644 Binary files a/development/tables/adverse-events/aet02_smq_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet02_smq_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet03.html b/development/tables/adverse-events/aet03.html index 560821f655..8a36e73806 100644 --- a/development/tables/adverse-events/aet03.html +++ b/development/tables/adverse-events/aet03.html @@ -1680,7 +1680,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:44:47 UTC"
+
[1] "2024-04-03 17:45:39 UTC"

Session Info

@@ -1711,12 +1711,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] dplyr_1.1.4 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/adverse-events/aet03_files/figure-html/teal-1.png b/development/tables/adverse-events/aet03_files/figure-html/teal-1.png index bdf32c3e27..e14e312f11 100644 Binary files a/development/tables/adverse-events/aet03_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet03_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet04.html b/development/tables/adverse-events/aet04.html index cc64935b68..cbbc79ab31 100644 --- a/development/tables/adverse-events/aet04.html +++ b/development/tables/adverse-events/aet04.html @@ -2894,7 +2894,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:43:37 UTC"
+
[1] "2024-04-03 17:42:45 UTC"

Session Info

@@ -2925,11 +2925,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/adverse-events/aet04_files/figure-html/teal-1.png b/development/tables/adverse-events/aet04_files/figure-html/teal-1.png index 22132cb188..c7cae6eb1b 100644 Binary files a/development/tables/adverse-events/aet04_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet04_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet04_pi.html b/development/tables/adverse-events/aet04_pi.html index 6ef015cacc..595c82b17d 100644 --- a/development/tables/adverse-events/aet04_pi.html +++ b/development/tables/adverse-events/aet04_pi.html @@ -1998,7 +1998,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:45:55 UTC"
+
[1] "2024-04-03 17:44:34 UTC"

Session Info

@@ -2029,11 +2029,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 dplyr_1.1.4 +[11] formatters_0.5.5.9018 dplyr_1.1.4 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/adverse-events/aet04_pi_files/figure-html/teal-1.png b/development/tables/adverse-events/aet04_pi_files/figure-html/teal-1.png index 9bce1c1285..6edc36205c 100644 Binary files a/development/tables/adverse-events/aet04_pi_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet04_pi_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet05.html b/development/tables/adverse-events/aet05.html index a7c1df15b4..9835a7a5bb 100644 --- a/development/tables/adverse-events/aet05.html +++ b/development/tables/adverse-events/aet05.html @@ -1596,7 +1596,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:45:01 UTC"
+
[1] "2024-04-03 17:41:54 UTC"

Session Info

@@ -1627,11 +1627,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 scda_0.1.6.9017 +[11] formatters_0.5.5.9018 scda_0.1.6.9017 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/adverse-events/aet05_all.html b/development/tables/adverse-events/aet05_all.html index a608b372bb..017e641a7a 100644 --- a/development/tables/adverse-events/aet05_all.html +++ b/development/tables/adverse-events/aet05_all.html @@ -1604,7 +1604,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:42:16 UTC"
+
[1] "2024-04-03 17:43:00 UTC"

Session Info

@@ -1635,12 +1635,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/adverse-events/aet05_all_files/figure-html/teal-1.png b/development/tables/adverse-events/aet05_all_files/figure-html/teal-1.png index 5214cbbbb0..1db7e6e836 100644 Binary files a/development/tables/adverse-events/aet05_all_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet05_all_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet05_files/figure-html/teal-1.png b/development/tables/adverse-events/aet05_files/figure-html/teal-1.png index e7d000e863..9a082f2118 100644 Binary files a/development/tables/adverse-events/aet05_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet05_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet06.html b/development/tables/adverse-events/aet06.html index baf2cc217b..52b231c658 100644 --- a/development/tables/adverse-events/aet06.html +++ b/development/tables/adverse-events/aet06.html @@ -2085,7 +2085,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:43:59 UTC"
+
[1] "2024-04-03 17:42:16 UTC"

Session Info

@@ -2116,11 +2116,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/adverse-events/aet06_files/figure-html/teal-1.png b/development/tables/adverse-events/aet06_files/figure-html/teal-1.png index 0b700d6288..01c89c89f1 100644 Binary files a/development/tables/adverse-events/aet06_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet06_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet06_smq.html b/development/tables/adverse-events/aet06_smq.html index b412bab1d8..f078dc3cba 100644 --- a/development/tables/adverse-events/aet06_smq.html +++ b/development/tables/adverse-events/aet06_smq.html @@ -1812,7 +1812,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:42:55 UTC"
+
[1] "2024-04-03 17:43:39 UTC"

Session Info

@@ -1843,12 +1843,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 stringr_1.5.1 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 dplyr_1.1.4 +[13] formatters_0.5.5.9018 dplyr_1.1.4 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/adverse-events/aet06_smq_files/figure-html/teal-1.png b/development/tables/adverse-events/aet06_smq_files/figure-html/teal-1.png index 48f169976b..3f6f36a9eb 100644 Binary files a/development/tables/adverse-events/aet06_smq_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet06_smq_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet07.html b/development/tables/adverse-events/aet07.html index 412181ef1a..ec7bccfc2b 100644 --- a/development/tables/adverse-events/aet07.html +++ b/development/tables/adverse-events/aet07.html @@ -1648,7 +1648,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:44:14 UTC"
+
[1] "2024-04-03 17:44:11 UTC"

Session Info

@@ -1679,11 +1679,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/adverse-events/aet07_files/figure-html/teal-1.png b/development/tables/adverse-events/aet07_files/figure-html/teal-1.png index 857d29b9fe..acae976e21 100644 Binary files a/development/tables/adverse-events/aet07_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet07_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet09.html b/development/tables/adverse-events/aet09.html index f5613e1e73..a63862ad5b 100644 --- a/development/tables/adverse-events/aet09.html +++ b/development/tables/adverse-events/aet09.html @@ -1742,7 +1742,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:44:31 UTC"
+
[1] "2024-04-03 17:45:22 UTC"

Session Info

@@ -1773,11 +1773,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/adverse-events/aet09_files/figure-html/teal-1.png b/development/tables/adverse-events/aet09_files/figure-html/teal-1.png index 19348dd98c..369947e8f6 100644 Binary files a/development/tables/adverse-events/aet09_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet09_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet09_smq.html b/development/tables/adverse-events/aet09_smq.html index ca27d90526..c849128f4f 100644 --- a/development/tables/adverse-events/aet09_smq.html +++ b/development/tables/adverse-events/aet09_smq.html @@ -1718,7 +1718,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:43:10 UTC"
+
[1] "2024-04-03 17:45:05 UTC"

Session Info

@@ -1749,12 +1749,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 stringr_1.5.1 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 dplyr_1.1.4 +[13] formatters_0.5.5.9018 dplyr_1.1.4 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/adverse-events/aet09_smq_files/figure-html/teal-1.png b/development/tables/adverse-events/aet09_smq_files/figure-html/teal-1.png index 8939cd1ad5..5f9f51fdee 100644 Binary files a/development/tables/adverse-events/aet09_smq_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet09_smq_files/figure-html/teal-1.png differ diff --git a/development/tables/adverse-events/aet10.html b/development/tables/adverse-events/aet10.html index 6bf83fa961..a1b682b7c3 100644 --- a/development/tables/adverse-events/aet10.html +++ b/development/tables/adverse-events/aet10.html @@ -1654,7 +1654,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:42:01 UTC"
+
[1] "2024-04-03 17:44:49 UTC"

Session Info

@@ -1685,12 +1685,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] dplyr_1.1.4 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/adverse-events/aet10_files/figure-html/teal-1.png b/development/tables/adverse-events/aet10_files/figure-html/teal-1.png index 10a128a7cb..717790f81a 100644 Binary files a/development/tables/adverse-events/aet10_files/figure-html/teal-1.png and b/development/tables/adverse-events/aet10_files/figure-html/teal-1.png differ diff --git a/development/tables/concomitant-medications/cmt01.html b/development/tables/concomitant-medications/cmt01.html index 75efe044d2..64419fa77a 100644 --- a/development/tables/concomitant-medications/cmt01.html +++ b/development/tables/concomitant-medications/cmt01.html @@ -1813,7 +1813,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:38:36 UTC"
+
[1] "2024-04-03 17:51:05 UTC"

Session Info

@@ -1844,11 +1844,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/concomitant-medications/cmt01_files/figure-html/teal-1.png b/development/tables/concomitant-medications/cmt01_files/figure-html/teal-1.png index 7807fe1100..c265672e37 100644 Binary files a/development/tables/concomitant-medications/cmt01_files/figure-html/teal-1.png and b/development/tables/concomitant-medications/cmt01_files/figure-html/teal-1.png differ diff --git a/development/tables/concomitant-medications/cmt01a.html b/development/tables/concomitant-medications/cmt01a.html index 9babb7eb2b..15d49b82a8 100644 --- a/development/tables/concomitant-medications/cmt01a.html +++ b/development/tables/concomitant-medications/cmt01a.html @@ -1894,7 +1894,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:39:27 UTC"
+
[1] "2024-04-03 17:51:38 UTC"

Session Info

@@ -1925,11 +1925,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/concomitant-medications/cmt01a_files/figure-html/teal-1.png b/development/tables/concomitant-medications/cmt01a_files/figure-html/teal-1.png index a3d50c4bbb..0c503f6ec5 100644 Binary files a/development/tables/concomitant-medications/cmt01a_files/figure-html/teal-1.png and b/development/tables/concomitant-medications/cmt01a_files/figure-html/teal-1.png differ diff --git a/development/tables/concomitant-medications/cmt01b.html b/development/tables/concomitant-medications/cmt01b.html index befcce4b62..ab48653081 100644 --- a/development/tables/concomitant-medications/cmt01b.html +++ b/development/tables/concomitant-medications/cmt01b.html @@ -1957,7 +1957,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:38:54 UTC"
+
[1] "2024-04-03 17:51:57 UTC"

Session Info

@@ -1988,11 +1988,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/concomitant-medications/cmt01b_files/figure-html/teal-1.png b/development/tables/concomitant-medications/cmt01b_files/figure-html/teal-1.png index fc231d4279..8d2ec9d9d6 100644 Binary files a/development/tables/concomitant-medications/cmt01b_files/figure-html/teal-1.png and b/development/tables/concomitant-medications/cmt01b_files/figure-html/teal-1.png differ diff --git a/development/tables/concomitant-medications/cmt02_pt.html b/development/tables/concomitant-medications/cmt02_pt.html index efb1bfbaaf..c3faaf58b1 100644 --- a/development/tables/concomitant-medications/cmt02_pt.html +++ b/development/tables/concomitant-medications/cmt02_pt.html @@ -1590,7 +1590,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:39:10 UTC"
+
[1] "2024-04-03 17:51:20 UTC"

Session Info

@@ -1621,11 +1621,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/concomitant-medications/cmt02_pt_files/figure-html/teal-1.png b/development/tables/concomitant-medications/cmt02_pt_files/figure-html/teal-1.png index 17093866b6..163214eb37 100644 Binary files a/development/tables/concomitant-medications/cmt02_pt_files/figure-html/teal-1.png and b/development/tables/concomitant-medications/cmt02_pt_files/figure-html/teal-1.png differ diff --git a/development/tables/deaths/dtht01.html b/development/tables/deaths/dtht01.html index a0d4e91c06..d08afd6e77 100644 --- a/development/tables/deaths/dtht01.html +++ b/development/tables/deaths/dtht01.html @@ -1708,7 +1708,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:33:37 UTC"
+
[1] "2024-04-03 17:52:38 UTC"

Session Info

@@ -1739,7 +1739,7 @@ other attached packages: [1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 -[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016 +[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/demography/dmt01.html b/development/tables/demography/dmt01.html index 2e144d48e2..e4ca0642f0 100644 --- a/development/tables/demography/dmt01.html +++ b/development/tables/demography/dmt01.html @@ -1870,7 +1870,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:33:29 UTC"
+
[1] "2024-04-03 17:36:50 UTC"

Session Info

@@ -1901,12 +1901,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tidyr_1.3.1 [9] dplyr_1.1.4 scda_0.1.6.9017 [11] tern_0.9.3.9028 rtables_0.6.6.9011 -[13] magrittr_2.0.3 formatters_0.5.5.9016 +[13] magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/demography/dmt01_files/figure-html/teal-1.png b/development/tables/demography/dmt01_files/figure-html/teal-1.png index d99dd06573..82bc9e4a1c 100644 Binary files a/development/tables/demography/dmt01_files/figure-html/teal-1.png and b/development/tables/demography/dmt01_files/figure-html/teal-1.png differ diff --git a/development/tables/disclosures/disclosurest01.html b/development/tables/disclosures/disclosurest01.html index 7f24f80496..065ce039db 100644 --- a/development/tables/disclosures/disclosurest01.html +++ b/development/tables/disclosures/disclosurest01.html @@ -1947,7 +1947,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:33:50 UTC"
+
[1] "2024-04-03 17:47:10 UTC"

Session Info

@@ -1978,7 +1978,7 @@ other attached packages: [1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 -[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016 +[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/disclosures/eudrat01.html b/development/tables/disclosures/eudrat01.html index 287514cd0f..2c374b6e29 100644 --- a/development/tables/disclosures/eudrat01.html +++ b/development/tables/disclosures/eudrat01.html @@ -1587,7 +1587,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:33:42 UTC"
+
[1] "2024-04-03 17:47:23 UTC"

Session Info

@@ -1618,7 +1618,7 @@ other attached packages: [1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 -[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016 +[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/disclosures/eudrat02.html b/development/tables/disclosures/eudrat02.html index 67d0b70d8a..049f11beec 100644 --- a/development/tables/disclosures/eudrat02.html +++ b/development/tables/disclosures/eudrat02.html @@ -1535,7 +1535,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:33:55 UTC"
+
[1] "2024-04-03 17:47:17 UTC"

Session Info

@@ -1566,7 +1566,7 @@ other attached packages: [1] dplyr_1.1.4 scda_0.1.6.9017 tern_0.9.3.9028 -[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016 +[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/disposition/dst01.html b/development/tables/disposition/dst01.html index 30efa86e57..be7d986a96 100644 --- a/development/tables/disposition/dst01.html +++ b/development/tables/disposition/dst01.html @@ -1682,7 +1682,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:41:27 UTC"
+
[1] "2024-04-03 17:46:48 UTC"

Session Info

@@ -1713,12 +1713,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/disposition/dst01_files/figure-html/teal-1.png b/development/tables/disposition/dst01_files/figure-html/teal-1.png index df32055f64..a8e2649301 100644 Binary files a/development/tables/disposition/dst01_files/figure-html/teal-1.png and b/development/tables/disposition/dst01_files/figure-html/teal-1.png differ diff --git a/development/tables/disposition/pdt01.html b/development/tables/disposition/pdt01.html index 96a9fb2e9b..4089bbe104 100644 --- a/development/tables/disposition/pdt01.html +++ b/development/tables/disposition/pdt01.html @@ -1599,7 +1599,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:41:46 UTC"
+
[1] "2024-04-03 17:47:02 UTC"

Session Info

@@ -1630,11 +1630,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/disposition/pdt01_files/figure-html/teal-1.png b/development/tables/disposition/pdt01_files/figure-html/teal-1.png index d190a92e3e..c82789756b 100644 Binary files a/development/tables/disposition/pdt01_files/figure-html/teal-1.png and b/development/tables/disposition/pdt01_files/figure-html/teal-1.png differ diff --git a/development/tables/disposition/pdt02.html b/development/tables/disposition/pdt02.html index 5756c3804b..aa09ffb61d 100644 --- a/development/tables/disposition/pdt02.html +++ b/development/tables/disposition/pdt02.html @@ -1530,7 +1530,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:41:33 UTC"
+
[1] "2024-04-03 17:46:33 UTC"

Session Info

@@ -1561,7 +1561,7 @@ other attached packages: [1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 -[4] magrittr_2.0.3 formatters_0.5.5.9016 scda_0.1.6.9017 +[4] magrittr_2.0.3 formatters_0.5.5.9018 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/efficacy/aovt01.html b/development/tables/efficacy/aovt01.html index 790e11c85b..335c267311 100644 --- a/development/tables/efficacy/aovt01.html +++ b/development/tables/efficacy/aovt01.html @@ -1622,7 +1622,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:36:20 UTC"
+
[1] "2024-04-03 17:40:39 UTC"

Session Info

@@ -1653,11 +1653,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/efficacy/aovt01_files/figure-html/teal-1.png b/development/tables/efficacy/aovt01_files/figure-html/teal-1.png index b739ea883f..8ba1fbae37 100644 Binary files a/development/tables/efficacy/aovt01_files/figure-html/teal-1.png and b/development/tables/efficacy/aovt01_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/aovt02.html b/development/tables/efficacy/aovt02.html index f193d51136..1706a19d9b 100644 --- a/development/tables/efficacy/aovt02.html +++ b/development/tables/efficacy/aovt02.html @@ -1605,7 +1605,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:36:36 UTC"
+
[1] "2024-04-03 17:40:12 UTC"

Session Info

@@ -1636,11 +1636,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/efficacy/aovt02_files/figure-html/teal-1.png b/development/tables/efficacy/aovt02_files/figure-html/teal-1.png index ae495d6951..bdbf315b03 100644 Binary files a/development/tables/efficacy/aovt02_files/figure-html/teal-1.png and b/development/tables/efficacy/aovt02_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/aovt03.html b/development/tables/efficacy/aovt03.html index ccbdb910f2..2377ef6859 100644 --- a/development/tables/efficacy/aovt03.html +++ b/development/tables/efficacy/aovt03.html @@ -1564,7 +1564,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:35:40 UTC"
+
[1] "2024-04-03 17:40:22 UTC"

Session Info

@@ -1595,7 +1595,7 @@ other attached packages: [1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 -[4] magrittr_2.0.3 formatters_0.5.5.9016 scda_0.1.6.9017 +[4] magrittr_2.0.3 formatters_0.5.5.9018 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] sandwich_3.1-0 utf8_1.2.4 generics_0.1.3 tidyr_1.3.1 diff --git a/development/tables/efficacy/cfbt01.html b/development/tables/efficacy/cfbt01.html index a3b90f3fca..de5bc6a1e9 100644 --- a/development/tables/efficacy/cfbt01.html +++ b/development/tables/efficacy/cfbt01.html @@ -1647,7 +1647,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:36:52 UTC"
+
[1] "2024-04-03 17:38:45 UTC"

Session Info

@@ -1678,11 +1678,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/efficacy/cfbt01_files/figure-html/teal-1.png b/development/tables/efficacy/cfbt01_files/figure-html/teal-1.png index fb0a95667d..8c8313f1ca 100644 Binary files a/development/tables/efficacy/cfbt01_files/figure-html/teal-1.png and b/development/tables/efficacy/cfbt01_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/cmht01.html b/development/tables/efficacy/cmht01.html index 2a7a095f2a..3d85d369f2 100644 --- a/development/tables/efficacy/cmht01.html +++ b/development/tables/efficacy/cmht01.html @@ -1728,7 +1728,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:34:50 UTC"
+
[1] "2024-04-03 17:37:35 UTC"

Session Info

@@ -1759,12 +1759,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/efficacy/cmht01_files/figure-html/teal-1.png b/development/tables/efficacy/cmht01_files/figure-html/teal-1.png index fee9b9888d..abc9e3af92 100644 Binary files a/development/tables/efficacy/cmht01_files/figure-html/teal-1.png and b/development/tables/efficacy/cmht01_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/coxt01.html b/development/tables/efficacy/coxt01.html index 526da691a1..a432504651 100644 --- a/development/tables/efficacy/coxt01.html +++ b/development/tables/efficacy/coxt01.html @@ -1717,7 +1717,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:37:20 UTC"
+
[1] "2024-04-03 17:37:52 UTC"

Session Info

@@ -1748,11 +1748,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 dplyr_1.1.4 +[11] formatters_0.5.5.9018 dplyr_1.1.4 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/efficacy/coxt01_files/figure-html/teal-1.png b/development/tables/efficacy/coxt01_files/figure-html/teal-1.png index d03db0d0af..ea3de61a50 100644 Binary files a/development/tables/efficacy/coxt01_files/figure-html/teal-1.png and b/development/tables/efficacy/coxt01_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/coxt02.html b/development/tables/efficacy/coxt02.html index fd597bca2d..3c9a786742 100644 --- a/development/tables/efficacy/coxt02.html +++ b/development/tables/efficacy/coxt02.html @@ -1647,7 +1647,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:36:01 UTC"
+
[1] "2024-04-03 17:39:55 UTC"

Session Info

@@ -1678,11 +1678,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 broom_1.0.5 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/efficacy/coxt02_files/figure-html/teal-1.png b/development/tables/efficacy/coxt02_files/figure-html/teal-1.png index e689eb93d2..d444330d6a 100644 Binary files a/development/tables/efficacy/coxt02_files/figure-html/teal-1.png and b/development/tables/efficacy/coxt02_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/dort01.html b/development/tables/efficacy/dort01.html index c8668633d2..e134fdf8bf 100644 --- a/development/tables/efficacy/dort01.html +++ b/development/tables/efficacy/dort01.html @@ -1860,7 +1860,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:38:19 UTC"
+
[1] "2024-04-03 17:38:11 UTC"

Session Info

@@ -1891,11 +1891,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/efficacy/dort01_files/figure-html/teal-1.png b/development/tables/efficacy/dort01_files/figure-html/teal-1.png index 4f797c30c0..9a7b5db3fd 100644 Binary files a/development/tables/efficacy/dort01_files/figure-html/teal-1.png and b/development/tables/efficacy/dort01_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/lgrt02.html b/development/tables/efficacy/lgrt02.html index 7195f0e8fc..fde45bf8fc 100644 --- a/development/tables/efficacy/lgrt02.html +++ b/development/tables/efficacy/lgrt02.html @@ -1750,7 +1750,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:34:28 UTC"
+
[1] "2024-04-03 17:40:57 UTC"

Session Info

@@ -1781,11 +1781,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 dplyr_1.1.4 +[11] formatters_0.5.5.9018 dplyr_1.1.4 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/efficacy/lgrt02_files/figure-html/teal-1.png b/development/tables/efficacy/lgrt02_files/figure-html/teal-1.png index 3682a99f52..afeec4bbe2 100644 Binary files a/development/tables/efficacy/lgrt02_files/figure-html/teal-1.png and b/development/tables/efficacy/lgrt02_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/mmrmt01.html b/development/tables/efficacy/mmrmt01.html index 7cf6a58fc1..4d3fc9d6f2 100644 --- a/development/tables/efficacy/mmrmt01.html +++ b/development/tables/efficacy/mmrmt01.html @@ -1953,7 +1953,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:35:30 UTC"
+
[1] "2024-04-03 17:39:39 UTC"

Session Info

@@ -1984,12 +1984,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 broom_1.0.5 [9] scda_0.1.6.9017 tern.mmrm_0.3.0.9005 [11] tern_0.9.3.9028 rtables_0.6.6.9011 -[13] magrittr_2.0.3 formatters_0.5.5.9016 +[13] magrittr_2.0.3 formatters_0.5.5.9018 [15] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/efficacy/mmrmt01_files/figure-html/teal-1.png b/development/tables/efficacy/mmrmt01_files/figure-html/teal-1.png index f18986b20c..e9b63b77c4 100644 Binary files a/development/tables/efficacy/mmrmt01_files/figure-html/teal-1.png and b/development/tables/efficacy/mmrmt01_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/onct05.html b/development/tables/efficacy/onct05.html index b3362ca247..747890ee46 100644 --- a/development/tables/efficacy/onct05.html +++ b/development/tables/efficacy/onct05.html @@ -1705,7 +1705,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:35:07 UTC"
+
[1] "2024-04-03 17:38:28 UTC"

Session Info

@@ -1736,12 +1736,12 @@ other attached packages: [1] forcats_1.0.0 teal.modules.clinical_0.9.0.9014 - [3] teal.transform_0.5.0.9004 teal_0.15.2.9019 + [3] teal.transform_0.5.0.9004 teal_0.15.2.9020 [5] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 [7] teal.code_0.5.0.9004 shiny_1.8.0 [9] scda_0.1.6.9017 dplyr_1.1.4 [11] tern_0.9.3.9028 rtables_0.6.6.9011 -[13] magrittr_2.0.3 formatters_0.5.5.9016 +[13] magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 diff --git a/development/tables/efficacy/onct05_files/figure-html/teal-1.png b/development/tables/efficacy/onct05_files/figure-html/teal-1.png index da144ca434..c1bd8ec91c 100644 Binary files a/development/tables/efficacy/onct05_files/figure-html/teal-1.png and b/development/tables/efficacy/onct05_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/ratet01.html b/development/tables/efficacy/ratet01.html index d2749d816d..8c0a6e0570 100644 --- a/development/tables/efficacy/ratet01.html +++ b/development/tables/efficacy/ratet01.html @@ -1570,7 +1570,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:35:47 UTC"
+
[1] "2024-04-03 17:41:04 UTC"

Session Info

@@ -1601,7 +1601,7 @@ other attached packages: [1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 -[4] magrittr_2.0.3 formatters_0.5.5.9016 scda_0.1.6.9017 +[4] magrittr_2.0.3 formatters_0.5.5.9018 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] sandwich_3.1-0 utf8_1.2.4 generics_0.1.3 tidyr_1.3.1 diff --git a/development/tables/efficacy/rbmit01.html b/development/tables/efficacy/rbmit01.html index 48e7083d72..b1f1045db6 100644 --- a/development/tables/efficacy/rbmit01.html +++ b/development/tables/efficacy/rbmit01.html @@ -1555,8 +1555,8 @@

 SAMPLING FOR MODEL 'MMRM' NOW (CHAIN 1).
 Chain 1: 
-Chain 1: Gradient evaluation took 0.000348 seconds
-Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 3.48 seconds.
+Chain 1: Gradient evaluation took 0.00037 seconds
+Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 3.7 seconds.
 Chain 1: Adjust your expectations accordingly!
 Chain 1: 
 Chain 1: 
@@ -1574,8 +1574,8 @@
 Chain 1: Iteration: 1200 / 1200 [100%]  (Sampling)
 Chain 1: 
 Chain 1:  Elapsed Time: 0.555 seconds (Warm-up)
-Chain 1:                1.764 seconds (Sampling)
-Chain 1:                2.319 seconds (Total)
+Chain 1:                1.769 seconds (Sampling)
+Chain 1:                2.324 seconds (Total)
 Chain 1: 
@@ -1713,7 +1713,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:37:02 UTC"
+
[1] "2024-04-03 17:38:56 UTC"

Session Info

@@ -1745,7 +1745,7 @@ other attached packages: [1] broom_1.0.5 dplyr_1.1.4 tern.rbmi_0.1.2.9013 [4] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[7] formatters_0.5.5.9016 rbmi_1.2.6 +[7] formatters_0.5.5.9018 rbmi_1.2.6 loaded via a namespace (and not attached): [1] gtable_0.3.4 TMB_1.9.10 xfun_0.42 ggplot2_3.5.0 diff --git a/development/tables/efficacy/rspt01.html b/development/tables/efficacy/rspt01.html index 143314e601..a99d0c5575 100644 --- a/development/tables/efficacy/rspt01.html +++ b/development/tables/efficacy/rspt01.html @@ -1883,7 +1883,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:37:38 UTC"
+
[1] "2024-04-03 17:39:16 UTC"

Session Info

@@ -1914,11 +1914,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/efficacy/rspt01_files/figure-html/teal-1.png b/development/tables/efficacy/rspt01_files/figure-html/teal-1.png index 51fb8b0342..7533889a15 100644 Binary files a/development/tables/efficacy/rspt01_files/figure-html/teal-1.png and b/development/tables/efficacy/rspt01_files/figure-html/teal-1.png differ diff --git a/development/tables/efficacy/ttet01.html b/development/tables/efficacy/ttet01.html index 173844c2d2..b52e5b8307 100644 --- a/development/tables/efficacy/ttet01.html +++ b/development/tables/efficacy/ttet01.html @@ -2098,7 +2098,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:38:01 UTC"
+
[1] "2024-04-03 17:37:13 UTC"

Session Info

@@ -2129,12 +2129,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/efficacy/ttet01_files/figure-html/teal-1.png b/development/tables/efficacy/ttet01_files/figure-html/teal-1.png index 5cee0a8b3f..6b6c15f12e 100644 Binary files a/development/tables/efficacy/ttet01_files/figure-html/teal-1.png and b/development/tables/efficacy/ttet01_files/figure-html/teal-1.png differ diff --git a/development/tables/exposure/ext01.html b/development/tables/exposure/ext01.html index cc0428b239..7666e32934 100644 --- a/development/tables/exposure/ext01.html +++ b/development/tables/exposure/ext01.html @@ -1884,7 +1884,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:34:11 UTC"
+
[1] "2024-04-03 17:56:48 UTC"

Session Info

@@ -1915,12 +1915,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tidyr_1.3.1 [9] dplyr_1.1.4 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 scda_0.1.6.9017 +[13] formatters_0.5.5.9018 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 diff --git a/development/tables/exposure/ext01_files/figure-html/teal-1.png b/development/tables/exposure/ext01_files/figure-html/teal-1.png index 5192ec503e..d2b9a4cbb5 100644 Binary files a/development/tables/exposure/ext01_files/figure-html/teal-1.png and b/development/tables/exposure/ext01_files/figure-html/teal-1.png differ diff --git a/development/tables/lab-results/lbt01.html b/development/tables/lab-results/lbt01.html index 2294357326..7f9220e22c 100644 --- a/development/tables/lab-results/lbt01.html +++ b/development/tables/lab-results/lbt01.html @@ -1641,7 +1641,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:50:14 UTC"
+
[1] "2024-04-03 17:53:39 UTC"

Session Info

@@ -1672,11 +1672,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/lab-results/lbt01_files/figure-html/teal-1.png b/development/tables/lab-results/lbt01_files/figure-html/teal-1.png index 43809ffc1f..1d571f8de9 100644 Binary files a/development/tables/lab-results/lbt01_files/figure-html/teal-1.png and b/development/tables/lab-results/lbt01_files/figure-html/teal-1.png differ diff --git a/development/tables/lab-results/lbt02.html b/development/tables/lab-results/lbt02.html index 3cfcf0896c..799c5850d5 100644 --- a/development/tables/lab-results/lbt02.html +++ b/development/tables/lab-results/lbt02.html @@ -1612,7 +1612,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:49:08 UTC"
+
[1] "2024-04-03 17:56:08 UTC"

Session Info

@@ -1643,11 +1643,11 @@ other attached packages: [1] dplyr_1.1.4 teal.modules.clinical_0.9.0.9014 - [3] teal.transform_0.5.0.9004 teal_0.15.2.9019 + [3] teal.transform_0.5.0.9004 teal_0.15.2.9020 [5] teal.slice_0.5.0.9009 teal.data_0.5.0.9005 [7] teal.code_0.5.0.9004 shiny_1.8.0 [9] tern_0.9.3.9028 rtables_0.6.6.9011 -[11] magrittr_2.0.3 formatters_0.5.5.9016 +[11] magrittr_2.0.3 formatters_0.5.5.9018 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/lab-results/lbt02_files/figure-html/teal-1.png b/development/tables/lab-results/lbt02_files/figure-html/teal-1.png index 9e68b44b54..b0c478da56 100644 Binary files a/development/tables/lab-results/lbt02_files/figure-html/teal-1.png and b/development/tables/lab-results/lbt02_files/figure-html/teal-1.png differ diff --git a/development/tables/lab-results/lbt03.html b/development/tables/lab-results/lbt03.html index 77cf5d1211..8ee3eaac8b 100644 --- a/development/tables/lab-results/lbt03.html +++ b/development/tables/lab-results/lbt03.html @@ -1713,7 +1713,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:49:53 UTC"
+
[1] "2024-04-03 17:54:39 UTC"

Session Info

@@ -1744,11 +1744,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 dplyr_1.1.4 +[11] formatters_0.5.5.9018 dplyr_1.1.4 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/lab-results/lbt03_files/figure-html/teal-1.png b/development/tables/lab-results/lbt03_files/figure-html/teal-1.png index e578bfc916..9314f8a9c6 100644 Binary files a/development/tables/lab-results/lbt03_files/figure-html/teal-1.png and b/development/tables/lab-results/lbt03_files/figure-html/teal-1.png differ diff --git a/development/tables/lab-results/lbt04.html b/development/tables/lab-results/lbt04.html index e893b38e45..cd62db6468 100644 --- a/development/tables/lab-results/lbt04.html +++ b/development/tables/lab-results/lbt04.html @@ -1575,7 +1575,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:48:36 UTC"
+
[1] "2024-04-03 17:56:23 UTC"

Session Info

@@ -1606,11 +1606,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 dplyr_1.1.4 +[11] formatters_0.5.5.9018 dplyr_1.1.4 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/lab-results/lbt04_files/figure-html/teal-1.png b/development/tables/lab-results/lbt04_files/figure-html/teal-1.png index e6d91186ce..2482c09cb7 100644 Binary files a/development/tables/lab-results/lbt04_files/figure-html/teal-1.png and b/development/tables/lab-results/lbt04_files/figure-html/teal-1.png differ diff --git a/development/tables/lab-results/lbt05.html b/development/tables/lab-results/lbt05.html index b9b7b8be1c..30f4794fc7 100644 --- a/development/tables/lab-results/lbt05.html +++ b/development/tables/lab-results/lbt05.html @@ -1699,7 +1699,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:50:52 UTC"
+
[1] "2024-04-03 17:56:31 UTC"

Session Info

@@ -1730,7 +1730,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/lab-results/lbt06.html b/development/tables/lab-results/lbt06.html index 54b109df4e..b6f05da764 100644 --- a/development/tables/lab-results/lbt06.html +++ b/development/tables/lab-results/lbt06.html @@ -1731,7 +1731,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:49:39 UTC"
+
[1] "2024-04-03 17:54:23 UTC"

Session Info

@@ -1762,7 +1762,7 @@ other attached packages: [1] dplyr_1.1.4 tern_0.9.3.9028 rtables_0.6.6.9011 -[4] magrittr_2.0.3 formatters_0.5.5.9016 scda_0.1.6.9017 +[4] magrittr_2.0.3 formatters_0.5.5.9018 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/lab-results/lbt07.html b/development/tables/lab-results/lbt07.html index 7860673d06..3a6139638e 100644 --- a/development/tables/lab-results/lbt07.html +++ b/development/tables/lab-results/lbt07.html @@ -1642,7 +1642,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:48:15 UTC"
+
[1] "2024-04-03 17:53:10 UTC"

Session Info

@@ -1673,12 +1673,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 forcats_1.0.0 [9] dplyr_1.1.4 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 scda_0.1.6.9017 +[13] formatters_0.5.5.9018 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/lab-results/lbt07_files/figure-html/teal-1.png b/development/tables/lab-results/lbt07_files/figure-html/teal-1.png index 7d9a585ae3..3fbe283246 100644 Binary files a/development/tables/lab-results/lbt07_files/figure-html/teal-1.png and b/development/tables/lab-results/lbt07_files/figure-html/teal-1.png differ diff --git a/development/tables/lab-results/lbt08.html b/development/tables/lab-results/lbt08.html index 34248a19b6..82f4939317 100644 --- a/development/tables/lab-results/lbt08.html +++ b/development/tables/lab-results/lbt08.html @@ -1553,7 +1553,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:49:59 UTC"
+
[1] "2024-04-03 17:53:45 UTC"

Session Info

@@ -1584,7 +1584,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/lab-results/lbt09.html b/development/tables/lab-results/lbt09.html index 09b0d46cd1..39e655f608 100644 --- a/development/tables/lab-results/lbt09.html +++ b/development/tables/lab-results/lbt09.html @@ -1692,7 +1692,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:50:45 UTC"
+
[1] "2024-04-03 17:54:09 UTC"

Session Info

@@ -1723,7 +1723,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/lab-results/lbt10.html b/development/tables/lab-results/lbt10.html index 32e7ff81a0..16df6b4ccf 100644 --- a/development/tables/lab-results/lbt10.html +++ b/development/tables/lab-results/lbt10.html @@ -1563,7 +1563,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:51:18 UTC"
+
[1] "2024-04-03 17:55:25 UTC"

Session Info

@@ -1594,7 +1594,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/lab-results/lbt10_bl.html b/development/tables/lab-results/lbt10_bl.html index fabe4782ab..fae69e238c 100644 --- a/development/tables/lab-results/lbt10_bl.html +++ b/development/tables/lab-results/lbt10_bl.html @@ -1563,7 +1563,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:49:31 UTC"
+
[1] "2024-04-03 17:53:17 UTC"

Session Info

@@ -1594,7 +1594,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/lab-results/lbt11.html b/development/tables/lab-results/lbt11.html index b0199d65e8..bad6d69b1a 100644 --- a/development/tables/lab-results/lbt11.html +++ b/development/tables/lab-results/lbt11.html @@ -1714,7 +1714,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:49:24 UTC"
+
[1] "2024-04-03 17:54:01 UTC"

Session Info

@@ -1745,12 +1745,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/lab-results/lbt11_bl.html b/development/tables/lab-results/lbt11_bl.html index f6d7f0af1c..8530d7849a 100644 --- a/development/tables/lab-results/lbt11_bl.html +++ b/development/tables/lab-results/lbt11_bl.html @@ -1712,7 +1712,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:48:52 UTC"
+
[1] "2024-04-03 17:52:54 UTC"

Session Info

@@ -1743,12 +1743,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/lab-results/lbt11_bl_files/figure-html/teal-1.png b/development/tables/lab-results/lbt11_bl_files/figure-html/teal-1.png index b275ada8c7..373a46df85 100644 Binary files a/development/tables/lab-results/lbt11_bl_files/figure-html/teal-1.png and b/development/tables/lab-results/lbt11_bl_files/figure-html/teal-1.png differ diff --git a/development/tables/lab-results/lbt11_files/figure-html/teal-1.png b/development/tables/lab-results/lbt11_files/figure-html/teal-1.png index 1e32cda29d..abe15f0ad9 100644 Binary files a/development/tables/lab-results/lbt11_files/figure-html/teal-1.png and b/development/tables/lab-results/lbt11_files/figure-html/teal-1.png differ diff --git a/development/tables/lab-results/lbt12.html b/development/tables/lab-results/lbt12.html index 3d5529a5a3..cb4cb7a21f 100644 --- a/development/tables/lab-results/lbt12.html +++ b/development/tables/lab-results/lbt12.html @@ -1542,7 +1542,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:48:22 UTC"
+
[1] "2024-04-03 17:53:23 UTC"

Session Info

@@ -1573,7 +1573,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/lab-results/lbt12_bl.html b/development/tables/lab-results/lbt12_bl.html index 0040a26b93..a731c70202 100644 --- a/development/tables/lab-results/lbt12_bl.html +++ b/development/tables/lab-results/lbt12_bl.html @@ -1542,7 +1542,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:51:13 UTC"
+
[1] "2024-04-03 17:54:15 UTC"

Session Info

@@ -1573,7 +1573,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/lab-results/lbt13.html b/development/tables/lab-results/lbt13.html index f1f9d97392..781bd473fa 100644 --- a/development/tables/lab-results/lbt13.html +++ b/development/tables/lab-results/lbt13.html @@ -2608,7 +2608,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:47:59 UTC"
+
[1] "2024-04-03 17:55:51 UTC"

Session Info

@@ -2639,11 +2639,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 dplyr_1.1.4 +[11] formatters_0.5.5.9018 dplyr_1.1.4 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/lab-results/lbt13_files/figure-html/teal-1.png b/development/tables/lab-results/lbt13_files/figure-html/teal-1.png index fb14f18fb2..d268d5c970 100644 Binary files a/development/tables/lab-results/lbt13_files/figure-html/teal-1.png and b/development/tables/lab-results/lbt13_files/figure-html/teal-1.png differ diff --git a/development/tables/lab-results/lbt14.html b/development/tables/lab-results/lbt14.html index 70e424ed52..634ab1b185 100644 --- a/development/tables/lab-results/lbt14.html +++ b/development/tables/lab-results/lbt14.html @@ -2212,7 +2212,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:50:37 UTC"
+
[1] "2024-04-03 17:55:03 UTC"

Session Info

@@ -2243,11 +2243,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 dplyr_1.1.4 +[11] formatters_0.5.5.9018 dplyr_1.1.4 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/lab-results/lbt14_files/figure-html/teal-1.png b/development/tables/lab-results/lbt14_files/figure-html/teal-1.png index fb25678f1a..9cd3c7db8a 100644 Binary files a/development/tables/lab-results/lbt14_files/figure-html/teal-1.png and b/development/tables/lab-results/lbt14_files/figure-html/teal-1.png differ diff --git a/development/tables/lab-results/lbt15.html b/development/tables/lab-results/lbt15.html index fceb3aaa3e..9792beaa2e 100644 --- a/development/tables/lab-results/lbt15.html +++ b/development/tables/lab-results/lbt15.html @@ -1665,7 +1665,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:51:06 UTC"
+
[1] "2024-04-03 17:55:19 UTC"

Session Info

@@ -1696,12 +1696,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 forcats_1.0.0 [9] dplyr_1.1.4 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 scda_0.1.6.9017 +[13] formatters_0.5.5.9018 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/lab-results/lbt15_files/figure-html/teal-1.png b/development/tables/lab-results/lbt15_files/figure-html/teal-1.png index 6b7a3e2f67..9a52c07c08 100644 Binary files a/development/tables/lab-results/lbt15_files/figure-html/teal-1.png and b/development/tables/lab-results/lbt15_files/figure-html/teal-1.png differ diff --git a/development/tables/medical-history/mht01.html b/development/tables/medical-history/mht01.html index cc504b5c94..5ea83af57f 100644 --- a/development/tables/medical-history/mht01.html +++ b/development/tables/medical-history/mht01.html @@ -1752,7 +1752,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:47:33 UTC"
+
[1] "2024-04-03 17:41:20 UTC"

Session Info

@@ -1783,12 +1783,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 scda_0.1.6.9017 [9] dplyr_1.1.4 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/medical-history/mht01_files/figure-html/teal-1.png b/development/tables/medical-history/mht01_files/figure-html/teal-1.png index 7473728b28..5561407150 100644 Binary files a/development/tables/medical-history/mht01_files/figure-html/teal-1.png and b/development/tables/medical-history/mht01_files/figure-html/teal-1.png differ diff --git a/development/tables/pharmacokinetic/pkct01.html b/development/tables/pharmacokinetic/pkct01.html index 8678922b30..66ddaa4db5 100644 --- a/development/tables/pharmacokinetic/pkct01.html +++ b/development/tables/pharmacokinetic/pkct01.html @@ -1699,7 +1699,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:32:46 UTC"
+
[1] "2024-04-03 17:48:08 UTC"

Session Info

@@ -1730,7 +1730,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/pharmacokinetic/pkpt02.html b/development/tables/pharmacokinetic/pkpt02.html index 37d676582f..7d898e4baa 100644 --- a/development/tables/pharmacokinetic/pkpt02.html +++ b/development/tables/pharmacokinetic/pkpt02.html @@ -1602,7 +1602,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:33:03 UTC"
+
[1] "2024-04-03 17:47:54 UTC"

Session Info

@@ -1633,7 +1633,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/pharmacokinetic/pkpt03.html b/development/tables/pharmacokinetic/pkpt03.html index 01e948315b..65c5e18941 100644 --- a/development/tables/pharmacokinetic/pkpt03.html +++ b/development/tables/pharmacokinetic/pkpt03.html @@ -1714,7 +1714,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:32:38 UTC"
+
[1] "2024-04-03 17:47:48 UTC"

Session Info

@@ -1745,7 +1745,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/pharmacokinetic/pkpt04.html b/development/tables/pharmacokinetic/pkpt04.html index 3c407ceb52..d9a43be8f7 100644 --- a/development/tables/pharmacokinetic/pkpt04.html +++ b/development/tables/pharmacokinetic/pkpt04.html @@ -1618,7 +1618,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:32:25 UTC"
+
[1] "2024-04-03 17:48:14 UTC"

Session Info

@@ -1649,7 +1649,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/pharmacokinetic/pkpt05.html b/development/tables/pharmacokinetic/pkpt05.html index 263aa4706e..3f32008745 100644 --- a/development/tables/pharmacokinetic/pkpt05.html +++ b/development/tables/pharmacokinetic/pkpt05.html @@ -1590,7 +1590,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:32:19 UTC"
+
[1] "2024-04-03 17:47:35 UTC"

Session Info

@@ -1621,7 +1621,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/pharmacokinetic/pkpt06.html b/development/tables/pharmacokinetic/pkpt06.html index 61dd090af2..dbdc54bb62 100644 --- a/development/tables/pharmacokinetic/pkpt06.html +++ b/development/tables/pharmacokinetic/pkpt06.html @@ -1572,7 +1572,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:33:14 UTC"
+
[1] "2024-04-03 17:48:26 UTC"

Session Info

@@ -1603,7 +1603,7 @@ other attached packages: [1] stringr_1.5.1 tern_0.9.3.9028 rtables_0.6.6.9011 -[4] magrittr_2.0.3 formatters_0.5.5.9016 dplyr_1.1.4 +[4] magrittr_2.0.3 formatters_0.5.5.9018 dplyr_1.1.4 [7] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/pharmacokinetic/pkpt07.html b/development/tables/pharmacokinetic/pkpt07.html index 9a24f418df..824b64fd59 100644 --- a/development/tables/pharmacokinetic/pkpt07.html +++ b/development/tables/pharmacokinetic/pkpt07.html @@ -1583,7 +1583,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:33:09 UTC"
+
[1] "2024-04-03 17:48:00 UTC"

Session Info

@@ -1614,7 +1614,7 @@ other attached packages: [1] stringr_1.5.1 tern_0.9.3.9028 rtables_0.6.6.9011 -[4] magrittr_2.0.3 formatters_0.5.5.9016 dplyr_1.1.4 +[4] magrittr_2.0.3 formatters_0.5.5.9018 dplyr_1.1.4 [7] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/pharmacokinetic/pkpt08.html b/development/tables/pharmacokinetic/pkpt08.html index 0e02bcf786..ca58740731 100644 --- a/development/tables/pharmacokinetic/pkpt08.html +++ b/development/tables/pharmacokinetic/pkpt08.html @@ -1569,7 +1569,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:32:52 UTC"
+
[1] "2024-04-03 17:47:28 UTC"

Session Info

@@ -1600,7 +1600,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 scda_0.1.6.9017 dplyr_1.1.4 +[4] formatters_0.5.5.9018 scda_0.1.6.9017 dplyr_1.1.4 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/pharmacokinetic/pkpt11.html b/development/tables/pharmacokinetic/pkpt11.html index 40ea753b52..2a30614095 100644 --- a/development/tables/pharmacokinetic/pkpt11.html +++ b/development/tables/pharmacokinetic/pkpt11.html @@ -1628,7 +1628,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:32:57 UTC"
+
[1] "2024-04-03 17:48:20 UTC"

Session Info

@@ -1659,7 +1659,7 @@ other attached packages: [1] tern_0.9.3.9028 rtables_0.6.6.9011 magrittr_2.0.3 -[4] formatters_0.5.5.9016 dplyr_1.1.4 scda_0.1.6.9017 +[4] formatters_0.5.5.9018 dplyr_1.1.4 scda_0.1.6.9017 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/risk-management-plan/rmpt01.html b/development/tables/risk-management-plan/rmpt01.html index 43e0b8821a..099f8d577f 100644 --- a/development/tables/risk-management-plan/rmpt01.html +++ b/development/tables/risk-management-plan/rmpt01.html @@ -1625,7 +1625,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:51:48 UTC"
+
[1] "2024-04-03 17:50:48 UTC"

Session Info

@@ -1656,12 +1656,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/risk-management-plan/rmpt01_files/figure-html/teal-1.png b/development/tables/risk-management-plan/rmpt01_files/figure-html/teal-1.png index fc3efe8c0b..32aea745db 100644 Binary files a/development/tables/risk-management-plan/rmpt01_files/figure-html/teal-1.png and b/development/tables/risk-management-plan/rmpt01_files/figure-html/teal-1.png differ diff --git a/development/tables/risk-management-plan/rmpt03.html b/development/tables/risk-management-plan/rmpt03.html index f90aa9d602..f889f252c0 100644 --- a/development/tables/risk-management-plan/rmpt03.html +++ b/development/tables/risk-management-plan/rmpt03.html @@ -1684,7 +1684,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:51:33 UTC"
+
[1] "2024-04-03 17:50:18 UTC"

Session Info

@@ -1715,12 +1715,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/risk-management-plan/rmpt03_files/figure-html/teal-1.png b/development/tables/risk-management-plan/rmpt03_files/figure-html/teal-1.png index f14b1dd11a..c8f4f75362 100644 Binary files a/development/tables/risk-management-plan/rmpt03_files/figure-html/teal-1.png and b/development/tables/risk-management-plan/rmpt03_files/figure-html/teal-1.png differ diff --git a/development/tables/risk-management-plan/rmpt04.html b/development/tables/risk-management-plan/rmpt04.html index 8241af8f25..0034438074 100644 --- a/development/tables/risk-management-plan/rmpt04.html +++ b/development/tables/risk-management-plan/rmpt04.html @@ -1606,7 +1606,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:52:25 UTC"
+
[1] "2024-04-03 17:50:02 UTC"

Session Info

@@ -1637,12 +1637,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/risk-management-plan/rmpt04_files/figure-html/teal-1.png b/development/tables/risk-management-plan/rmpt04_files/figure-html/teal-1.png index 7e96e20254..0ef5359d47 100644 Binary files a/development/tables/risk-management-plan/rmpt04_files/figure-html/teal-1.png and b/development/tables/risk-management-plan/rmpt04_files/figure-html/teal-1.png differ diff --git a/development/tables/risk-management-plan/rmpt05.html b/development/tables/risk-management-plan/rmpt05.html index 56cc8df85b..c0daba251a 100644 --- a/development/tables/risk-management-plan/rmpt05.html +++ b/development/tables/risk-management-plan/rmpt05.html @@ -1612,7 +1612,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:52:03 UTC"
+
[1] "2024-04-03 17:50:32 UTC"

Session Info

@@ -1643,12 +1643,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] tidyselect_1.2.1 fastmap_1.1.1 TH.data_1.1-2 diff --git a/development/tables/risk-management-plan/rmpt05_files/figure-html/teal-1.png b/development/tables/risk-management-plan/rmpt05_files/figure-html/teal-1.png index 07caff1c25..6a82a6810d 100644 Binary files a/development/tables/risk-management-plan/rmpt05_files/figure-html/teal-1.png and b/development/tables/risk-management-plan/rmpt05_files/figure-html/teal-1.png differ diff --git a/development/tables/risk-management-plan/rmpt06.html b/development/tables/risk-management-plan/rmpt06.html index 2a565b06d5..9c1f96ef77 100644 --- a/development/tables/risk-management-plan/rmpt06.html +++ b/development/tables/risk-management-plan/rmpt06.html @@ -1853,7 +1853,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:52:11 UTC"
+
[1] "2024-04-03 17:49:48 UTC"

Session Info

@@ -1884,7 +1884,7 @@ other attached packages: [1] scda_0.1.6.9017 dplyr_1.1.4 tern_0.9.3.9028 -[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9016 +[4] rtables_0.6.6.9011 magrittr_2.0.3 formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Matrix_1.6-5 gtable_0.3.4 jsonlite_1.8.8 compiler_4.3.3 diff --git a/development/tables/safety/enrollment01.html b/development/tables/safety/enrollment01.html index 229b6bdcda..9e101583cb 100644 --- a/development/tables/safety/enrollment01.html +++ b/development/tables/safety/enrollment01.html @@ -2099,7 +2099,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:47:16 UTC"
+
[1] "2024-04-03 17:46:26 UTC"

Session Info

@@ -2130,11 +2130,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 scda_0.1.6.9017 +[11] formatters_0.5.5.9018 scda_0.1.6.9017 [13] forcats_1.0.0 dplyr_1.1.4 loaded via a namespace (and not attached): diff --git a/development/tables/safety/enrollment01_files/figure-html/teal-1.png b/development/tables/safety/enrollment01_files/figure-html/teal-1.png index 9c5899a7dc..b7a457b633 100644 Binary files a/development/tables/safety/enrollment01_files/figure-html/teal-1.png and b/development/tables/safety/enrollment01_files/figure-html/teal-1.png differ diff --git a/development/tables/vital-signs/vst01.html b/development/tables/vital-signs/vst01.html index 780e819096..d8a5533fa4 100644 --- a/development/tables/vital-signs/vst01.html +++ b/development/tables/vital-signs/vst01.html @@ -1733,7 +1733,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:46:31 UTC"
+
[1] "2024-04-03 17:52:30 UTC"

Session Info

@@ -1764,12 +1764,12 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 dplyr_1.1.4 [9] scda_0.1.6.9017 tern_0.9.3.9028 [11] rtables_0.6.6.9011 magrittr_2.0.3 -[13] formatters_0.5.5.9016 +[13] formatters_0.5.5.9018 loaded via a namespace (and not attached): [1] Rdpack_2.6 formatR_1.14 tern.gee_0.1.3.9004 diff --git a/development/tables/vital-signs/vst01_files/figure-html/teal-1.png b/development/tables/vital-signs/vst01_files/figure-html/teal-1.png index 014f8b7475..cfdf3b0842 100644 Binary files a/development/tables/vital-signs/vst01_files/figure-html/teal-1.png and b/development/tables/vital-signs/vst01_files/figure-html/teal-1.png differ diff --git a/development/tables/vital-signs/vst02.html b/development/tables/vital-signs/vst02.html index 45cd44ccc4..bdb9075a4b 100644 --- a/development/tables/vital-signs/vst02.html +++ b/development/tables/vital-signs/vst02.html @@ -1628,7 +1628,7 @@
Code
Sys.time()
-
[1] "2024-03-30 17:46:47 UTC"
+
[1] "2024-04-03 17:52:13 UTC"

Session Info

@@ -1659,11 +1659,11 @@ other attached packages: [1] teal.modules.clinical_0.9.0.9014 teal.transform_0.5.0.9004 - [3] teal_0.15.2.9019 teal.slice_0.5.0.9009 + [3] teal_0.15.2.9020 teal.slice_0.5.0.9009 [5] teal.data_0.5.0.9005 teal.code_0.5.0.9004 [7] shiny_1.8.0 tern_0.9.3.9028 [9] rtables_0.6.6.9011 magrittr_2.0.3 -[11] formatters_0.5.5.9016 dplyr_1.1.4 +[11] formatters_0.5.5.9018 dplyr_1.1.4 [13] scda_0.1.6.9017 loaded via a namespace (and not attached): diff --git a/development/tables/vital-signs/vst02_files/figure-html/teal-1.png b/development/tables/vital-signs/vst02_files/figure-html/teal-1.png index d159a4a8c3..c14dcad15d 100644 Binary files a/development/tables/vital-signs/vst02_files/figure-html/teal-1.png and b/development/tables/vital-signs/vst02_files/figure-html/teal-1.png differ