Skip to content

Commit

Permalink
start add shinylive demo for remaining examples
Browse files Browse the repository at this point in the history
  • Loading branch information
DivadNojnarg committed Jul 15, 2024
1 parent a1522e0 commit b08f6f8
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 36 deletions.
82 changes: 46 additions & 36 deletions vignettes/blockr_examples.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -57,26 +57,7 @@ ui_input.slider_field <- function(x, id, name) {
#' @method validate_field slider_field
#' @export
validate_field.slider_field <- function(x) {
val <- value(x)
min <- value(x, "min")
max <- value(x, "max")
step <- value(x, "step")
validate_number(val)
if (length(min)) {
validate_number(min, "min")
}
if (length(max)) {
validate_number(max, "max")
}
if (length(step)) {
validate_number(step, "step")
}
NextMethod()
x
}
#' @method ui_update slider_field
Expand Down Expand Up @@ -145,13 +126,14 @@ blockr::register_block(

In this example, we'll create a pipeline that fetches recent stock data using the [quantmod package](https://github.com/joshuaulrich/quantmod), performs time series analysis, and forecasts future stock prices using the [Prophet model](https://github.com/facebook/prophet). We first design the `stock_data_block`, containing a field to select the stock items and generate the data. The `prophet_forecast_block` does all the modeling part.

```{r stock_example}
```{r stock_example, eval=FALSE}
# Does not run on shinylive as quantmod/prophet not available
library(blockr)
library(quantmod)
library(prophet)
# Custom block to fetch stock data
stock_data_block <- function(...) {
new_stock_data_block <- function(...) {
# stocks to pick (top 10)
pick_stock <- \() c("NVDA", "TSLA", "AAPL", "MSFT", "AVGO", "AMZN", "AMD", "PLTR", "TSM", "META")
Expand All @@ -171,7 +153,7 @@ stock_data_block <- function(...) {
}
# Custom block for Prophet forecasting
prophet_forecast_block <- function(columns = character(), ...) {
new_prophet_forecast_block <- function(columns = character(), ...) {
all_cols <- function(data) colnames(data)[2:length(colnames(data))]
Expand All @@ -198,15 +180,15 @@ prophet_forecast_block <- function(columns = character(), ...) {
# Register custom blocks
register_block(
stock_data_block,
new_stock_data_block,
name = "Stock Data",
description = "Fetch stock data",
classes = c("stock_data_block", "data_block"),
input = NA_character_,
output = "data.frame"
)
register_block(
prophet_forecast_block,
new_prophet_forecast_block,
name = "Prophet Forecast",
description = "Forecast using Prophet",
classes = c("prophet_forecast_block", "plot_block"),
Expand All @@ -216,24 +198,53 @@ register_block(
# Create the stack
stock_forecast_stack <- new_stack(
stock_data_block(),
prophet_forecast_block()
new_stock_data_block(),
new_prophet_forecast_block()
)
serve_stack(stock_forecast_stack)
```


```{r blockr-stock, echo=FALSE, fig.cap='Stock model demo', fig.align = 'center', out.width='100%'}
knitr::include_graphics("vignettes/figures/blockr-stock-demo.png")
```

### 2. Pharmaceutical: Clinical Trial Analysis

#### 2.1 AE Forest Plot

This forest plot visualizes the relative risk of adverse events between two treatment arms in a clinical trial. In this case, it compares "Xanomeline High Dose" to "Xanomeline Low Dose" starting from the [pharmaverseadam](https://github.com/pharmaverse/pharmaverseadam) `adae` dataset.

```{r ae_forest}
```{r, eval=TRUE, echo=FALSE}
card(
create_app_link(
"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-CiCCKmu6w1-qhGBtYuG3uagc2hqLcI9N70WDWATR0MA3BphgCkN1St7E0BaG3g0RwU0JaMWUeg1l8kUiVsTF7Ka6ClGVs2BAOAWg4DVp0D2iADg+AAA5B0wGHaxOgRAvbsBYAAL1JGoCdABmAArCOzU2bUCZlELUfYu6yZNqIDsHgIhnIBGnce3STQGDiA-XAAI+UQrRhfW+7ggGt2yVIGqlk1gq4ltQPbNVwsJHGqmghsoBExHjqUU1R4EgdJYd9KOvDiimpewBZh1BpHcMnvwzGtGVGoB0GBW4zQWBjr4iITILAHdYXoqIZw1lBieXsKyTAAV0G0ZHo4lNZOU7qANAwHJnEahzZKZU65KamnWJqpYERqaGgJ2XpqbITTMgAAsTGIrsSeFNe2WAACqNlK2PFIFhdjtDOPcYxaSfj7BxAASAlZBoxI6gyBsrjQTRLVnlFE5S3SsgmWSek91VMawo7GRndQTkPreSux4iCZs7wRR+T9BgDAVs4JwDywcHVtoR7HQaDpTYnBGsRTqllDadXRrHVApyNy3BtVBKEM5g6zmABCAApAAkgAEWpf0srDExSqy4JaZUxZvgbagLZzZC1vQsAuD+pEVkAAyB03NBI815sDB0QKnUW6ZPMBYhC5MrbaNKvW8uYUG81kbnW0ZCCsume2VksAAFllsIuFGtkge2tuah20Je0B2ClHceKdqa52rs3f6Xdn9Qh7bByevHO9+Z1hCt0Rj77U8z7XtUn1-76IhsteBxFUHNkFs2XTAAeSW3gIJq3RSI-R7mbgqOkdfaga+bH93kSXeu7L76DhFfc5kPbGo99KfvZpyc2XYyyp9YgPmGohn2dA6aQOoJMAIJqDMxUMdGmB3lnIIh8zt31fE7ABdX8-5AJa-OjXMsC26IXCgDsD7tORWVrEStKaTk-jrmtpspk9RWSAz1fSPbGkhwIQPsTY25F88QtL81P+DNTkRQjhjgg8ZBLGc0ESKEHJCaFc3gcRt9JitmBkxFKrYdaxZfOYiLj9haG9w-OoGU2J77d4gPISfPo+8SB1bl-Lwbe8HHhTt59YWIukmiyHJEPqZBxj+LDu03wmQnfWmB9MErCSJtpHyIPreSRkhi8QGAtGqz+yBxk45jyzX4N6xB1A6R1qf51CeJkCd48jd6sIMJFZIG2ZsCczqq-pqwYD3TXzX6cR6ADjPpPI04PgZjP4z6cAJidxojTqGbYxBwsDYzUESDNib6sHiAb59YwjqgNas7kBeRgYwhAYtpCyejeglJsBr5cG2ab456oEghMTpAPh1AMCxycEET0H1wiRMEsFcASDJBgARwhhAA", # nolint
"app",
mode = "editor"
),
full_screen = TRUE
)
```

<p class="text-center">
<a
class="btn btn-primary"
data-bs-toggle="collapse"
href="#forest-block"
role="button"
aria-expanded="false"
aria-controls="forest-block">
Toggle code
</a>
</p>

<div class="collapse" id="forest-block">

```r
library(dplyr)
library(tidyr)
library(forestplot)
library(blockr.pharmaverseadam)

# Function to create adverse event forest plot
create_ae_forest_plot <- function(data, usubjid_col, arm_col, aedecod_col, n_events) {
Expand Down Expand Up @@ -332,7 +343,7 @@ create_ae_forest_plot <- function(data, usubjid_col, arm_col, aedecod_col, n_eve
)
}

forest_plot_block <- function(...) {
new_forest_plot_block <- function(...) {
new_block(
fields = list(
usubjid_col = new_select_field(
Expand Down Expand Up @@ -369,7 +380,7 @@ forest_plot_block <- function(...) {

# Register the custom block
register_block(
forest_plot_block,
new_forest_plot_block,
name = "Adverse Event Forest Plot",
description = "Create a forest plot of adverse events comparing two treatment arms",
classes = c("adverse_event_plot_block", "plot_block"),
Expand All @@ -379,16 +390,15 @@ register_block(

# Create the stack
clinical_trial_stack <- new_stack(
new_dataset_block(
selected = "adae",
package = "pharmaverseadam"
),
new_adam_block(selected = "adae"),
# filter_in_block(),
forest_plot_block()
new_forest_plot_block()
)

serve_stack(clinical_trial_stack)
```
</div>

#### 2.2 Demographics Table

This demographics table is taken from the `cardinal` package of [FDA Safety Tables and Figures](https://github.com/pharmaverse/cardinal) and demonstrates `gt` and `rtables` outputs starting from the [pharmaverseadam](https://github.com/pharmaverse/pharmaverseadam) `adsl` dataset.
Expand Down
Binary file added vignettes/figures/blockr-stock-demo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit b08f6f8

Please sign in to comment.