# Cargar las librerias necesarias
library(shiny)
Warning: package ‘shiny’ was built under R version 4.3.3
library(readxl)
Warning: package ‘readxl’ was built under R version 4.3.3
library(markovchain)
Warning: package ‘markovchain’ was built under R version 4.3.3
Package: markovchain
Version: 0.9.5
Date: 2023-09-24 09:20:02 UTC
BugReport: https://github.com/spedygiorgio/markovchain/issues
library(fitdistrplus)
Loading required package: MASS
Loading required package: survival
library(plotly)
Warning: package ‘plotly’ was built under R version 4.3.3
Loading required package: ggplot2
Warning: package ‘ggplot2’ was built under R version 4.3.3
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
Attaching package: ‘plotly’
The following object is masked from ‘package:ggplot2’:
last_plot
The following object is masked from ‘package:MASS’:
select
The following object is masked from ‘package:stats’:
filter
The following object is masked from ‘package:graphics’:
layout
# Llamar al script
source("Funciones.R")
# Define UI for application that draws a histogram
ui <- fluidPage(
# titulo de la aplicación
titlePanel("Aplicación políticas de inventario - Parte II"),
# Definir el recuadro de la aplicación
sidebarLayout(
#agregar un panel lateral dentro del recuadro
sidebarPanel(
#crear objeto de entrada para cargar archivo
fileInput(inputId='ArchivoEntrada', label='Cargue el archivo de demanda histórica',accept=c(".xlsx")),
#crear un objeto de entrada para modificar el costo de inventario semanal
sliderInput(inputId="CostoInv",
label = "Costo unitario de inventario por semana",
min = 1000,
max = 7000,
value = 5000),
#crear un objeto de entrada en donde me especifique su deseo ver el p-value de mi prueba de bondad de ajuste
checkboxInput("show", "Show chisquare p-value", value = FALSE, width = NULL),
#panel condicional que se muestra o se escone dependiendo del valor de mi checkboxInput (arriba)
conditionalPanel("input.show", verbatimTextOutput("pvalue"))
),
# Crear el panel principal para mostrar las gráficas
mainPanel(
#imprimir gráfica de costos anuales
plotlyOutput(outputId="Graf_Cost"),
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
#1. Importar los datos de la demanda que estan en el excel
# la funcion eventReactive() se utiliza para crear elementos que dependan de un evento especifico,
# esto permite ejecutar el codigo solo cuando se produce el evento, en lugar de ejecutar el codigo
# cada vez que se actualiza algo.
datosDemanda = eventReactive(input$ArchivoEntrada,{
Archivo1 = input$ArchivoEntrada
# Evitar errores en caso de que el usuario no suba ningun archivo
if (is.null(Archivo1)) {
return(NULL)
}
# Leer el archivo
dataFile = read_excel(Archivo1$datapath, sheet = 1,
col_names = TRUE)
# Guardar la segunda columna que son las demandas
Demanda = dataFile[[2]]
})
#2. Prueba de bondad de ajuste
pruebaBondadAjuste = eventReactive(datosDemanda(),{
pruebaBondad(datosDemanda())
})
# Aspectos importantes, por que se usan las llaves {} dentro de un eventReactive
# Las llaves {} son necesarias en eventReactive() porque es una función que ejecuta
# un bloque de código cuando se dispara el evento.
#datosDemanda() es una expresión reactiva. En Shiny, los valores reactivos se
# manejan como funciones. Si solo escribieras datosDemanda (sin paréntesis),
# estarías refiriéndote al objeto reactivo en sí, no al valor que contiene.
#2.1 Extraer el p-value de la prueba
output$pvalue = renderText({
#Saca el pvalue de la prueba
estFit = gofstat(pruebaBondadAjuste())
round(estFit$chisqpvalue,2)
})
# Esta función crea un componente de salida en la interfaz que se actualiza de manera reactiva.
# Cada vez que cambian los datos de demanda o se actualiza la prueba de bondad de ajuste,
# este bloque de código se ejecuta.
#3. Grafica de costo total
output$Graf_Cost <- renderPlotly({
if (is.null(datosDemanda())) { return(NULL) }
Tasa<-pruebaBondadAjuste()$estimate
lista<-cadenas(Tasa)
data<-costos(lista,input$CostoInv)
#__________Generar gráfica de los costos anuales__________
plot_ly(data, x = ~vec_cost_Ord, y = ~CTotal_Actual, name = 'P Actual', type = 'scatter', mode = 'lines+markers')%>%
add_trace(y = ~CTotal_Nuevo, name = 'P nueva', mode = 'lines+markers')%>%
layout(title = "Costo anual por política",
xaxis = list(title = "Costo de ordenar un pedido"),
yaxis = list (title = "costo anual"))
#Cerrar la función renderPlotly
})
}
# Run the application
shinyApp(ui = ui, server = server)
Listening on http://127.0.0.1:6886
LS0tDQp0aXRsZTogIlNoaW55IElJIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQpgYGB7cn0NCg0KIyBDYXJnYXIgbGFzIGxpYnJlcmlhcyBuZWNlc2FyaWFzDQoNCmxpYnJhcnkoc2hpbnkpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobWFya292Y2hhaW4pDQpsaWJyYXJ5KGZpdGRpc3RycGx1cykNCmxpYnJhcnkocGxvdGx5KQ0KDQojIExsYW1hciBhbCBzY3JpcHQNCnNvdXJjZSgiRnVuY2lvbmVzLlIiKQ0KDQojIERlZmluZSBVSSBmb3IgYXBwbGljYXRpb24gdGhhdCBkcmF3cyBhIGhpc3RvZ3JhbQ0KdWkgPC0gZmx1aWRQYWdlKA0KICAjIHRpdHVsbyBkZSBsYSBhcGxpY2FjacOzbg0KICB0aXRsZVBhbmVsKCJBcGxpY2FjacOzbiBwb2zDrXRpY2FzIGRlIGludmVudGFyaW8gLSBQYXJ0ZSBJSSIpLA0KICANCiAgIyBEZWZpbmlyIGVsIHJlY3VhZHJvIGRlIGxhIGFwbGljYWNpw7NuIA0KICBzaWRlYmFyTGF5b3V0KA0KICAgIA0KICAgICNhZ3JlZ2FyIHVuIHBhbmVsIGxhdGVyYWwgZGVudHJvIGRlbCByZWN1YWRybw0KICAgIHNpZGViYXJQYW5lbCgNCiAgICAgIA0KICAgICAgI2NyZWFyIG9iamV0byBkZSBlbnRyYWRhIHBhcmEgY2FyZ2FyIGFyY2hpdm8NCiAgICAgIGZpbGVJbnB1dChpbnB1dElkPSdBcmNoaXZvRW50cmFkYScsIGxhYmVsPSdDYXJndWUgZWwgYXJjaGl2byBkZSBkZW1hbmRhIGhpc3TDs3JpY2EnLGFjY2VwdD1jKCIueGxzeCIpKSwNCiAgICAgIA0KICAgICAgI2NyZWFyIHVuIG9iamV0byBkZSBlbnRyYWRhIHBhcmEgbW9kaWZpY2FyIGVsIGNvc3RvIGRlIGludmVudGFyaW8gc2VtYW5hbA0KICAgICAgc2xpZGVySW5wdXQoaW5wdXRJZD0iQ29zdG9JbnYiLA0KICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiQ29zdG8gdW5pdGFyaW8gZGUgaW52ZW50YXJpbyBwb3Igc2VtYW5hIiwNCiAgICAgICAgICAgICAgICAgIG1pbiA9IDEwMDAsDQogICAgICAgICAgICAgICAgICBtYXggPSA3MDAwLA0KICAgICAgICAgICAgICAgICAgdmFsdWUgPSA1MDAwKSwNCiAgICAgIA0KICAgICAgI2NyZWFyIHVuIG9iamV0byBkZSBlbnRyYWRhIGVuIGRvbmRlIG1lIGVzcGVjaWZpcXVlIHN1IGRlc2VvIHZlciBlbCBwLXZhbHVlIGRlIG1pIHBydWViYSBkZSBib25kYWQgZGUgYWp1c3RlDQogICAgICBjaGVja2JveElucHV0KCJzaG93IiwgIlNob3cgY2hpc3F1YXJlIHAtdmFsdWUiLCB2YWx1ZSA9IEZBTFNFLCB3aWR0aCA9IE5VTEwpLA0KICAgICAgDQogICAgICAjcGFuZWwgY29uZGljaW9uYWwgcXVlIHNlIG11ZXN0cmEgbyBzZSBlc2NvbmUgZGVwZW5kaWVuZG8gZGVsIHZhbG9yIGRlIG1pIGNoZWNrYm94SW5wdXQgKGFycmliYSkNCiAgICAgIGNvbmRpdGlvbmFsUGFuZWwoImlucHV0LnNob3ciLCB2ZXJiYXRpbVRleHRPdXRwdXQoInB2YWx1ZSIpKQ0KICAgICksDQogICAgDQogICAgIyBDcmVhciBlbCBwYW5lbCBwcmluY2lwYWwgcGFyYSBtb3N0cmFyIGxhcyBncsOhZmljYXMgDQogICAgbWFpblBhbmVsKA0KICAgICAgI2ltcHJpbWlyIGdyw6FmaWNhIGRlIGNvc3RvcyBhbnVhbGVzDQogICAgICBwbG90bHlPdXRwdXQob3V0cHV0SWQ9IkdyYWZfQ29zdCIpLA0KICAgICkNCiAgKQ0KKQ0KDQojIERlZmluZSBzZXJ2ZXIgbG9naWMgcmVxdWlyZWQgdG8gZHJhdyBhIGhpc3RvZ3JhbQ0Kc2VydmVyIDwtIGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpIHsNCiAgDQogICMxLiBJbXBvcnRhciBsb3MgZGF0b3MgZGUgbGEgZGVtYW5kYSBxdWUgZXN0YW4gZW4gZWwgZXhjZWwNCiAgIyBsYSBmdW5jaW9uIGV2ZW50UmVhY3RpdmUoKSBzZSB1dGlsaXphIHBhcmEgY3JlYXIgZWxlbWVudG9zIHF1ZSBkZXBlbmRhbiBkZSB1biBldmVudG8gZXNwZWNpZmljbywgDQogICMgZXN0byBwZXJtaXRlIGVqZWN1dGFyIGVsIGNvZGlnbyBzb2xvIGN1YW5kbyBzZSBwcm9kdWNlIGVsIGV2ZW50bywgZW4gbHVnYXIgZGUgZWplY3V0YXIgZWwgY29kaWdvDQogICMgY2FkYSB2ZXogcXVlIHNlIGFjdHVhbGl6YSBhbGdvLg0KICANCiAgZGF0b3NEZW1hbmRhID0gZXZlbnRSZWFjdGl2ZShpbnB1dCRBcmNoaXZvRW50cmFkYSx7DQogICAgQXJjaGl2bzEgPSBpbnB1dCRBcmNoaXZvRW50cmFkYQ0KICAgIA0KICAgICMgRXZpdGFyIGVycm9yZXMgZW4gY2FzbyBkZSBxdWUgZWwgdXN1YXJpbyBubyBzdWJhIG5pbmd1biBhcmNoaXZvDQogICAgaWYgKGlzLm51bGwoQXJjaGl2bzEpKSB7DQogICAgICByZXR1cm4oTlVMTCkNCiAgICB9DQogICAgIyBMZWVyIGVsIGFyY2hpdm8NCiAgICBkYXRhRmlsZSA9IHJlYWRfZXhjZWwoQXJjaGl2bzEkZGF0YXBhdGgsIHNoZWV0ID0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IFRSVUUpDQogICAgDQogICAgIyBHdWFyZGFyIGxhIHNlZ3VuZGEgY29sdW1uYSBxdWUgc29uIGxhcyBkZW1hbmRhcw0KICAgIERlbWFuZGEgPSBkYXRhRmlsZVtbMl1dDQogIH0pDQogIA0KDQogIA0KICANCiAgIzIuIFBydWViYSBkZSBib25kYWQgZGUgYWp1c3RlIA0KICBwcnVlYmFCb25kYWRBanVzdGUgPSBldmVudFJlYWN0aXZlKGRhdG9zRGVtYW5kYSgpLHsNCiAgICBwcnVlYmFCb25kYWQoZGF0b3NEZW1hbmRhKCkpDQogIH0pDQogICMgQXNwZWN0b3MgaW1wb3J0YW50ZXMsIHBvciBxdWUgc2UgdXNhbiBsYXMgbGxhdmVzIHt9IGRlbnRybyBkZSB1biBldmVudFJlYWN0aXZlDQogICMgTGFzIGxsYXZlcyB7fSBzb24gbmVjZXNhcmlhcyBlbiBldmVudFJlYWN0aXZlKCkgcG9ycXVlIGVzIHVuYSBmdW5jacOzbiBxdWUgZWplY3V0YSANCiAgIyB1biBibG9xdWUgZGUgY8OzZGlnbyBjdWFuZG8gc2UgZGlzcGFyYSBlbCBldmVudG8uDQogIA0KICAjZGF0b3NEZW1hbmRhKCkgZXMgdW5hIGV4cHJlc2nDs24gcmVhY3RpdmEuIEVuIFNoaW55LCBsb3MgdmFsb3JlcyByZWFjdGl2b3Mgc2UgDQogICMgbWFuZWphbiBjb21vIGZ1bmNpb25lcy4gU2kgc29sbyBlc2NyaWJpZXJhcyBkYXRvc0RlbWFuZGEgKHNpbiBwYXLDqW50ZXNpcyksIA0KICAjIGVzdGFyw61hcyByZWZpcmnDqW5kb3RlIGFsIG9iamV0byByZWFjdGl2byBlbiBzw60sIG5vIGFsIHZhbG9yIHF1ZSBjb250aWVuZS4NCiAgDQogIA0KICAjMi4xIEV4dHJhZXIgZWwgcC12YWx1ZSBkZSBsYSBwcnVlYmENCiAgb3V0cHV0JHB2YWx1ZSA9IHJlbmRlclRleHQoew0KICAgICNTYWNhIGVsIHB2YWx1ZSBkZSBsYSBwcnVlYmENCiAgICBlc3RGaXQgPSBnb2ZzdGF0KHBydWViYUJvbmRhZEFqdXN0ZSgpKQ0KICAgIHJvdW5kKGVzdEZpdCRjaGlzcXB2YWx1ZSwyKQ0KICB9KQ0KICANCiAgIyBFc3RhIGZ1bmNpw7NuIGNyZWEgdW4gY29tcG9uZW50ZSBkZSBzYWxpZGEgZW4gbGEgaW50ZXJmYXogcXVlIHNlIGFjdHVhbGl6YSBkZSBtYW5lcmEgcmVhY3RpdmEuIA0KICAjIENhZGEgdmV6IHF1ZSBjYW1iaWFuIGxvcyBkYXRvcyBkZSBkZW1hbmRhIG8gc2UgYWN0dWFsaXphIGxhIHBydWViYSBkZSBib25kYWQgZGUgYWp1c3RlLCANCiAgIyBlc3RlIGJsb3F1ZSBkZSBjw7NkaWdvIHNlIGVqZWN1dGEuDQogIA0KICANCiAgDQogICMzLiBHcmFmaWNhIGRlIGNvc3RvIHRvdGFsDQogIG91dHB1dCRHcmFmX0Nvc3QgPC0gcmVuZGVyUGxvdGx5KHsNCiAgICBpZiAoaXMubnVsbChkYXRvc0RlbWFuZGEoKSkpIHsgcmV0dXJuKE5VTEwpIH0gIA0KICAgIA0KICAgIFRhc2E8LXBydWViYUJvbmRhZEFqdXN0ZSgpJGVzdGltYXRlDQogICAgbGlzdGE8LWNhZGVuYXMoVGFzYSkNCiAgICBkYXRhPC1jb3N0b3MobGlzdGEsaW5wdXQkQ29zdG9JbnYpDQogICAgDQogICAgI19fX19fX19fX19HZW5lcmFyIGdyw6FmaWNhIGRlIGxvcyBjb3N0b3MgYW51YWxlc19fX19fX19fX18NCiAgICBwbG90X2x5KGRhdGEsIHggPSB+dmVjX2Nvc3RfT3JkLCB5ID0gfkNUb3RhbF9BY3R1YWwsIG5hbWUgPSAnUCBBY3R1YWwnLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzK21hcmtlcnMnKSU+JQ0KICAgICAgYWRkX3RyYWNlKHkgPSB+Q1RvdGFsX051ZXZvLCBuYW1lID0gJ1AgbnVldmEnLCBtb2RlID0gJ2xpbmVzK21hcmtlcnMnKSU+JQ0KICAgICAgbGF5b3V0KHRpdGxlID0gIkNvc3RvIGFudWFsIHBvciBwb2zDrXRpY2EiLA0KICAgICAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJDb3N0byBkZSBvcmRlbmFyIHVuIHBlZGlkbyIpLA0KICAgICAgICAgICAgIHlheGlzID0gbGlzdCAodGl0bGUgPSAiY29zdG8gYW51YWwiKSkNCiAgICANCiAgICAjQ2VycmFyIGxhIGZ1bmNpw7NuIHJlbmRlclBsb3RseSAgICANCiAgfSkNCn0NCg0KIyBSdW4gdGhlIGFwcGxpY2F0aW9uIA0Kc2hpbnlBcHAodWkgPSB1aSwgc2VydmVyID0gc2VydmVyKQ0KDQpgYGANCg0K