---
title: "Usage with shiny"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Usage with shiny}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", eval = FALSE)
```

# TL;DR

See a working application [here](https://djanderson07.shinyapps.io/equatiomatic-shiny/)

# More detail

The equatiomatic package exports `renderEq()` and `eqOutput()` functions to make it's usage with Shiny more straightforward.

Imagine, for example, that we wanted to have an app that showed us the coefficients of a model in a nice table. We could do that with something like:

```{r}
library(equatiomatic)
library(shiny)
library(shinyWidgets)
library(gtsummary)
library(gt)

data("penguins", package = "equatiomatic")

ui <- fluidPage(
  titlePanel("equatiomatic w/Shiny"),
  sidebarLayout(
    sidebarPanel(
      multiInput(
        inputId = "xvars", label = "Select predictor variables :",
        choices = names(penguins)[-3],
        selected = "island"
      )
    ),
    mainPanel(
      gt_output("tbl")
    )
  )
)

server <- function(input, output) {
  model <- reactive({
    form <- paste("bill_length_mm ~ ", paste(input$xvars, collapse = " + "))
    lm(as.formula(form), penguins)
  })
  
  output$tbl <- render_gt({
    as_gt(tbl_regression(model()))
  })
  
}

shinyApp(ui = ui, server = server)
```

But, naturally, we'd probably also want the equation rendered too. We can extend the above with {equatiomatic} as follows.

```{r}
library(equatiomatic)
library(shiny)
library(shinyWidgets)
library(gtsummary)
library(gt)

ui <- fluidPage(
  titlePanel("equatiomatic w/Shiny"),
  withMathJax(), # Initialize mathJax so the equation renders properly
  sidebarLayout(
    sidebarPanel(
      multiInput(
        inputId = "xvars", label = "Select predictor variables :",
        choices = names(penguins)[-3],
        selected = "island"
      )
    ),
    mainPanel(
      eqOutput("equation"),
      gt_output("tbl")
    )
  )
)

server <- function(input, output) {
  model <- reactive({
    form <- paste("bill_length_mm ~ ", paste(input$xvars, collapse = " + "))
    lm(as.formula(form), penguins)
  })
  
  output$equation <- renderEq(
    extract_eq(model())
  )
  
  output$tbl <- render_gt({
    as_gt(tbl_regression(model()))
  })
  
}

shinyApp(ui = ui, server = server)
```

Note that, beyond the `renderEq()` and `eqOutput()` function, we also have to initialize mathJax with the `shiny::withMathJax()` function somewhere in the UI. Without this line, you'll get the text version of the equation.

Finally, we can of course add additional arguments `extract_eq()`, and it all works as expected.

```{r}
library(equatiomatic)
library(shiny)
library(shinyWidgets)
library(gtsummary)
library(gt)

ui <- fluidPage(
  titlePanel("equatiomatic w/Shiny"),
  withMathJax(),
  sidebarLayout(
    sidebarPanel(
      multiInput(
        inputId = "xvars", 
        label = "Select predictor variables :",
        choices = names(penguins)[-3],
        selected = "island"
      )
    ),
    mainPanel(
      eqOutput("eq2"),
      eqOutput("equation"),
      gt_output("tbl")
    )
  )
)

server <- function(input, output) {
  model <- reactive({
    form <- paste("bill_length_mm ~ ", paste(input$xvars, collapse = " + "))
    lm(as.formula(form), penguins)
  })
  
  output$equation <- renderEq(
      extract_eq(
        model(), 
        wrap = TRUE,
        terms_per_line = 2,
        use_coefs = TRUE,
        font_size = "Huge"
    )
  )

  output$tbl <- render_gt({
    as_gt(tbl_regression(model()))
  })
  
}

shinyApp(ui = ui, server = server)
```

