setwd("Ruta/a/tu/proyecto/")
library(shiny)
library(DT) # Manejo de tablas en formato Data Frame
library(shinyjs)
# Cargar datos para alimentos individuales
1alimentos <- read.csv("alimentos.csv")
colnames(alimentos) <- c(
"COD", "NUM", "ALIMENTO", "ENERCKCAL", "ENERCKJ", "WATER", "PROCNT",
"FAT", "CHOCDF", "ZN", "K", "P", "FE", "VITA",
"ACFOLIC", "VITC", "NA"
)
alimentos <- alimentos[, c(
"COD", "NUM", "ALIMENTO", "ENERCKCAL", "ENERCKJ", "WATER", "PROCNT",
"FAT", "CHOCDF", "ZN", "K", "P", "FE", "VITA", "ACFOLIC", "VITC", "NA"
)]
# Cargar datos para alimentos compuestos
2platos <- read.csv("alimentosCompuestos.csv")
colnames(platos) <- c(
"COD", "NUM", "ALIMENTO", "ENERCKCAL", "ENERCKJ", "WATER", "PROCNT",
"FAT", "CHOCDF", "CHOAVL", "FIBTG", "ASH", "CA", "P", "ZN", "FE", "VITA", "THIA",
"RIBF", "NIA", "VITC", "ACFOLIC", "NA", "K", "ESTRATO"
)
platos <- platos[, c(
"COD", "NUM", "ALIMENTO", "ENERCKCAL", "ENERCKJ", "WATER", "PROCNT", "FAT", "CHOCDF",
"ZN", "K", "P", "FE", "VITA", "ACFOLIC", "VITC", "NA"
)]
# Creamos tablas de Anexo
3codigo <- c("A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "Q", "T", "U", "SE", "SS")
categoria <- c(
"Cereales y derivados", "Verduras, hortalizas y derivados", "Frutas y derivados",
"Grasas, aceites y oleaginosas", "Pescados y mariscos", "Carnes y derivados",
"Leche y derivados", "Bebidas (alcohólicas y analcohólicas)", "Huevos y derivados",
"Productos azucarados", "Misceláneos", "Alimentos infantiles", "Leguminosas y derivados",
"Tubérculos, raíces y derivados", "Alimentos preparados (entrada)",
"Alimentos preparados (segundo)"
)
codigoGrupo <- data.frame(codigo, categoria)
colnames(codigoGrupo) <- c("Código", "Categoría")
# Cargas coódigos de componentes - Anexo
4anexoCodigo <- read.csv("anexosCodigoComponentes.csv")
colnames(anexoCodigo) <- c("Componente", "Identificador INFOODS", "Unidad", "Comentario")
# Definir interfaz
5ui <- fluidPage(
6 includeCSS("styles.css"),
titlePanel("TABLAS PERUANAS DE COMPOSICIÓN DE ALIMENTOS - 2017"),
h2(tags$a("Fuente: Centro Nacional de Alimentación y Nutrición, 2017, Ministerio de Salud del Perú, Lima.",
href = "https://www.gob.pe/institucion/ins/informes-publicaciones/4231115-tablas-peruanas-de-composicion-de-alimentos"
)),
h3("Modificado para uso particular en planificación de dietas. Basado en la experiencia de Rosa Zavaleta Gavidia (Nutricionista CNP: 5681)."),
h3(class = "bold-text", "Nota: Composición en 100 g de alimento"),
7 numericInput("proportion", "Nueva composición (gramos)?", value = 100, min = 1, max = 500),
8 useShinyjs(),
9 tabsetPanel(
tabPanel(
"Alimentos individuales",
dataTableOutput("foodTable1"),
h4(class = "bold-text", "Componentes seleccionados:"),
tableOutput("selectedData1"),
actionButton("copyButton1", "Copiar datos seleccionados")
),
tabPanel(
"Alimentos en platos",
dataTableOutput("foodTable2"),
h4("Componentes seleccionados:"),
tableOutput("selectedData2"),
actionButton("copyButton2", "Copiar datos seleccionados")
),
tabPanel(
"Códigos y grupos",
tableOutput("codigoGrupos"),
tableOutput("codigoComponentes")
)
),
hr(),
10 tags$div(
class = "footer",
style = "text-align: center; background-color: #333; color: #fff; padding: 20px;",
tags$h4("¿Te ha gustado esta App?"),
tags$p(
"¡Esta aplicación ha sido desarrollada con ",
tags$a(
href = "https://shiny.rstudio.com/",
style = "color: #ffcc00; font-weight: bold;",
"R Shiny"
),
"!"
),
tags$p(
"Si quieres aprender más sobre Shiny y crear tus propias aplicaciones interactivas, ",
tags$a(
href = "https://shiny.rstudio.com/tutorial/",
style = "color: #ffcc00; font-weight: bold;",
"haz clic aquí"
),
" para acceder al tutorial oficial."
),
tags$p(
"¡Comienza a explorar el poder de Shiny hoy mismo!",
style = "font-weight: bold;"
)
)
)
# Definir server
server <- function(input, output, session) {
11 getComposition <- function(input_table) {
proportionConversion <- input$proportion
idx <- input[[input_table]]
selectedRow <- alimentos[idx, c("PROCNT", "FAT", "CHOCDF", "ZN", "K", "P", "FE", "VITA", "ACFOLIC", "VITC", "NA")]
selectedRow <- selectedRow * proportionConversion / 100
rownames(selectedRow) <- NULL
selectedRow
}
12 output$foodTable1 <- renderDataTable(
alimentos,
server = FALSE, selection = "single",
options = list(
pageLength = 15,
columnDefs = list(
list(
targets = "_all",
className = "dt-center"
)
)
)
)
13 output$selectedData1 <- renderTable({
getComposition("foodTable1_rows_selected")
})
output$foodTable2 <- renderDataTable(
platos,
server = FALSE, selection = "single",
options = list(
pageLength = 15,
columnDefs = list(
list(
targets = "_all",
className = "dt-center"
)
)
)
)
output$selectedData2 <- renderTable({
getComposition("foodTable2_rows_selected")
})
14 output$codigoGrupos <- renderTable(codigoGrupo)
output$codigoComponentes <- renderTable(anexoCodigo)
15 observeEvent(input$copyButton1, {
selectedData <- getComposition("foodTable1_rows_selected")
if (length(input$foodTable1_rows_selected) > 0) {
clipboard <- apply(selectedData, 2, paste, collapse = " ")
writeClipboard(clipboard)
shinyjs::alert("Datos copiados al portapapeles")
} else {
shinyjs::alert("Selecciona una fila para copiar los datos")
}
})
observeEvent(input$copyButton2, {
selectedData <- getComposition("foodTable2_rows_selected")
if (length(input$foodTable2_rows_selected) > 0) {
clipboard <- apply(selectedData, 2, paste, collapse = " ")
writeClipboard(clipboard)
shinyjs::alert("Datos copiados al portapapeles")
} else {
shinyjs::alert("Selecciona una fila para copiar los datos")
}
})
}
# Ejecutar la aplicación Shiny
16shinyApp(ui, server)