R-shinylive app

Demostración

Este es un ejemplo de una aplicación Shiny que visualiza datos de Gapminder, incluyendo un gráfico de expectativa de vida vs GDP y un mapa interactivo con información detallada de cada país.

Puedes seleccionar un continente en el menú desplegable para filtrar los datos y ver la visualización correspondiente con el botón Play. Además, puedes hacer clic en un país en el gráfico para ver su ubicación en el mapa.

NOTA: Espera ~ 1 minuto para que cargue la aplicación interactiva.

#| standalone: true
#| viewerHeight: 600
library(shiny)
library(plotly)
library(ggplot2)
library(gapminder)
library(leaflet)
library(RColorBrewer)
library(dplyr)
library(maps)

# Cargar los datos de Gapminder
data("gapminder")

# Obtener las coordenadas de los países usando maps
world_coords <- map_data("world") %>%
  group_by(region) %>%
  summarise(long = mean(long), lat = mean(lat))

# Renombrar la columna "region" a "country" para que coincida con gapminder
colnames(world_coords)[1] <- "country"

# Combinar los datos de gapminder con las coordenadas
gapminder_df <- gapminder %>%
  left_join(world_coords, by = "country")

# Definir la interfaz de usuario (UI)
ui <- fluidPage(
  titlePanel("Visualización de Datos Interactiva"),
  
  sidebarLayout(
    sidebarPanel(
      # Selector de continente
      selectInput("continent", "Selecciona el continente:", 
                  choices = unique(gapminder_df$continent)),
      
      # Selector de país para el mapa (comentado)
      # selectInput("country", "Selecciona un país para el mapa", 
      #             choices = unique(gapminder_df$country))
    ),
    
    mainPanel(
      # Gráfico de Expectativa de vida vs GDP
      plotlyOutput("lifeExp_vs_gdp"),
      
      # Mapa interactivo
      leafletOutput("map")
    )
  )
)

# Definir el servidor
server <- function(input, output) {
  
  # Filtrar los datos según el continente seleccionado
  filtered_data <- reactive({
    gapminder_df %>% filter(continent == input$continent)
  })
  
  # Gráfico de Expectativa de vida vs GDP
  output$lifeExp_vs_gdp <- renderPlotly({
    ggp_for_plotly <- ggplot(filtered_data(), aes(x = gdpPercap, y = lifeExp, color = continent)) +
      geom_point(alpha = 0.5, aes(
        size = pop,
        frame = year,
        ids = country
      )) +
      scale_x_log10(labels = scales::dollar_format()) +
      geom_smooth(method = NULL, se = TRUE) +
      labs(title = "Expectativa de vida vs GDP per cápita",
           x = "GDP per cápita (escala logarítmica)",
           y = "Expectativa de vida") +
      theme_minimal()
    
    ggplotly(ggp_for_plotly)
  })
  
  # Mapa interactivo
  output$map <- renderLeaflet({
    # Filtrar los datos del continente seleccionado
    country_data <- gapminder_df %>% filter(continent == input$continent)
    
    # Verificar si hay coordenadas disponibles
    if (nrow(country_data) == 0 || all(is.na(country_data$long)) || all(is.na(country_data$lat))) {
      # Si no hay coordenadas, mostrar un mensaje en el mapa
      leaflet() %>%
        addTiles() %>%
        addMarkers(lng = 0, lat = 0, popup = "Coordenadas no disponibles para este continente.")
    } else {
      # Si hay coordenadas, mostrar el continente en el mapa
      leaflet(country_data) %>%
        addTiles() %>%
        addMarkers(lng = ~long, lat = ~lat, 
                   popup = ~paste("País: ", country, "<br>",
                                  "Continente: ", continent, "<br>",
                                  "Expectativa de vida: ", lifeExp, "<br>",
                                  "GDP per cápita: ", gdpPercap))
    }
  })
}

# Ejecutar la aplicación Shiny
shinyApp(ui = ui, server = server)