library(shiny)
## Warning: package 'shiny' was built under R version 4.2.3
library(DT)
## Warning: package 'DT' was built under R version 4.2.3
## 
## Attaching package: 'DT'
## The following objects are masked from 'package:shiny':
## 
##     dataTableOutput, renderDataTable
# Datos iniciales
initial_data = data.frame(
  Nombre = character(),
  Cedula = character(),
  Temperatura = numeric(),
  Sintomas = logical(),
  Contacto = logical(),
  Viaje = logical(),
  stringsAsFactors = FALSE
)

# Funciones para guardar y cargar datos
save_data = function(data) {
  tryCatch({
    write.csv(data, "data.csv", row.names = FALSE)
    message("Datos guardados exitosamente en data.csv")
  }, error = function(e) {
    message("Error al guardar datos: ", e$message)
  })
}

load_data = function() {
  if (file.exists("data.csv")) {
    tryCatch({
      data = read.csv("data.csv", stringsAsFactors = FALSE)
      message("Datos cargados exitosamente desde data.csv")
      return(data)
    }, error = function(e) {
      message("Error al cargar datos: ", e$message)
      return(initial_data)
    })
  } else {
    message("El archivo data.csv no existe, utilizando datos iniciales.")
    return(initial_data)
  }
}

# Cargar datos al inicio
data = reactiveVal(load_data())
## Datos cargados exitosamente desde data.csv
# UI
ui = fluidPage(
  titlePanel("Registro de Ingreso"),
  sidebarLayout(
    sidebarPanel(
      textInput("nombre", "Nombre:"),
      textInput("cedula", "Cédula:"),
      numericInput("temperatura", "Temperatura:", value = 36.5, min = 35, max = 40, step = 0.1),
      checkboxInput("sintomas", "Síntomas:", value = FALSE),
      checkboxInput("contacto", "Contacto con positivos:", value = FALSE),
      checkboxInput("viaje", "Viaje reciente:", value = FALSE),
      actionButton("agregar", "Agregar/Actualizar"),
      actionButton("borrar", "Borrar"),
      downloadButton("descargarPDF", "Descargar PDF")
    ),
    mainPanel(
      DTOutput("tabla")
    )
  )
)

# Server
server = function(input, output, session) {
  observeEvent(input$agregar, {
    new_row = data.frame(
      Nombre = input$nombre,
      Cedula = input$cedula,
      Temperatura = input$temperatura,
      Sintomas = input$sintomas,
      Contacto = input$contacto,
      Viaje = input$viaje,
      stringsAsFactors = FALSE
    )
    
    existing_row = which(data()$Cedula == input$cedula | data()$Nombre == input$nombre)
    if (length(existing_row) == 0) {
      data(rbind(data(), new_row))
    } else {
      updated_data = data()
      updated_data[existing_row, ] = new_row
      data(updated_data)
    }
    
    save_data(data())
  })
  
  observeEvent(input$borrar, {
    existing_row = which(data()$Cedula == input$cedula | data()$Nombre == input$nombre)
    if (length(existing_row) > 0) {
      updated_data = data()
      updated_data = updated_data[-existing_row, ]
      data(updated_data)
      
      save_data(data())
    }
  })
  
  output$tabla = renderDT({
    datatable(data(), options = list(autoWidth = TRUE, scrollX = TRUE))
  })
  
  output$descargarPDF = downloadHandler(
    filename = function() {
      paste("Listado_Personas_", Sys.Date(), ".pdf", sep = "")
    },
    content = function(file) {
      tempData = data()
      write.csv(tempData, file, row.names = FALSE)
    }
  )
}

# Inicia la aplicación Shiny
shinyApp(ui, server)
Shiny applications not supported in static R Markdown documents