Shinylive-r

r
2023
shiny
Author

José Luis Cañadas Reche

Published

December 16, 2023

Modified

December 16, 2023

Están saliendo cosas como webr que permiten ejecutar R en el navegador que junto con shinylive nos van a permitir hacer aplicaciones de Shiny (en R y en Python) que sean serverless. Es decir, el código se ejecuta en el navegador del usuario, no en un servidor.

Un post dónde probé con shinylive en python. Shinylive en python

Cosas que hay que hacer para que funcione en mi documento de quarto, que es con lo que hago el blog

  • Instalar la librería de python shinylive pip install shinylive
  • Instalar las extensiones de quarto para shinylive quarto add quarto-ext/shinylive
  • Instalar la librería de shinylive de https://github.com/posit-dev/r-shinylive

El chunk se especifica poniendo shinylive-r y se ponen algunas opciones como estas

#| standalone: true
#| viewerHeight: 600
#| components: [editor, viewer]

Estas librerías aún están en fase temprana de desarrollo y por ejemplo no está resuelto como leer un fichero que tengas en local y que ese fichero se suba al sitio web estático y se pueda leer con read.csv . Pero podemos hacer una ñapa como he hecho en el ejemplo, que es subir el fichero de datos a github y leer de la url dónde lo he subido.


mpgData <- read.csv("https://raw.githubusercontent.com/joscani/blog_quarto/master/mtcars.csv")

Se abre el camino pues para tener pequeñas aplicaciones shiny que no necesiten de servidor.

#| standalone: true
#| viewerHeight: 800
#| components: [editor, viewer]

library(shiny)
library(datasets)

# Data pre-processing ----
# Tweak the "am" variable to have nicer factor labels -- since this
# doesn't rely on any user inputs, we can do this once at startup
# and then use the value throughout the lifetime of the app
mpgData <- read.csv("https://raw.githubusercontent.com/joscani/blog_quarto/master/mtcars.csv")
mpgData$am <- factor(mpgData$am, labels = c("Automatic", "Manual"))


# Define UI for miles per gallon app ----
ui <- fluidPage(

  # App title ----
  titlePanel("Miles Per Gallon"),

  # Sidebar layout with input and output definitions ----
  sidebarLayout(

    # Sidebar panel for inputs ----
    sidebarPanel(

      # Input: Selector for variable to plot against mpg ----
      selectInput("variable", "Elige la variable:",
                  c("Cylinders" = "cyl",
                    "Transmission" = "am",
                    "Gears" = "gear")),

      # Input: Checkbox for whether outliers should be included ----
      checkboxInput("outliers", "Show outliers", TRUE)

    ),

    # Main panel for displaying outputs ----
    mainPanel(

      # Output: Formatted text for caption ----
      h3(textOutput("caption")),

      # Output: Plot of the requested variable against mpg ----
      plotOutput("mpgPlot")

    )
  )
)

# Define server logic to plot various variables against mpg ----
server <- function(input, output) {

  # Compute the formula text ----
  # This is in a reactive expression since it is shared by the
  # output$caption and output$mpgPlot functions
  formulaText <- reactive({
    paste("mpg ~", input$variable)
  })

  # Return the formula text for printing as a caption ----
  output$caption <- renderText({
    formulaText()
  })

  # Generate a plot of the requested variable against mpg ----
  # and only exclude outliers if requested
  output$mpgPlot <- renderPlot({
    boxplot(as.formula(formulaText()),
            data = mpgData,
            outline = input$outliers,
            col = "#75AADB", pch = 19)
  })

}

# Create Shiny app ----
shinyApp(ui, server)