App de Amortización

Author

Yolanda Escobar Flores

app.R

library(shiny)
library(DT)

Attaching package: 'DT'
The following objects are masked from 'package:shiny':

    dataTableOutput, renderDataTable
library(ggplot2)

Funciones de amortización

amort_francesa <- function(P, i, n) {
  cuota <- P * (i * (1 + i)^n) / ((1 + i)^n - 1)
  saldo <- P
  tabla <- data.frame(Mes = 1:n, Cuota = NA, Interés = NA, Amortización = NA, Saldo = NA)
  
  for (mes in 1:n) {
    interes <- saldo * i
    amort <- cuota - interes
    saldo <- saldo - amort
    tabla[mes, ] <- c(mes, round(cuota, 2), round(interes, 2), round(amort, 2), round(saldo, 2))
  }
  return(tabla)
}

amort_constante <- function(P, i, n) {
  amort <- P / n
  saldo <- P
  tabla <- data.frame(Mes = 1:n, Cuota = NA, Interés = NA, Amortización = amort, Saldo = NA)
  
  for (mes in 1:n) {
    interes <- saldo * i
    cuota <- amort + interes
    saldo <- saldo - amort
    tabla[mes, ] <- c(mes, round(cuota, 2), round(interes, 2), round(amort, 2), round(saldo, 2))
  }
  return(tabla)
}

amort_gradual <- function(P, i, n) {
  cuota <- P * (i * (1 + i)^n) / ((1 + i)^n - 1)
  saldo <- P
  tabla <- data.frame(Mes = 1:n, Cuota = NA, Interés = NA, Amortización = NA, Saldo = NA)
  
  for (mes in 1:n) {
    interes <- saldo * i
    amort <- cuota - interes
    saldo <- saldo - amort
    tabla[mes, ] <- c(mes, round(cuota, 2), round(interes, 2), round(amort, 2), round(saldo, 2))
  }
  return(tabla)
}

UI

ui <- fluidPage(
  titlePanel("Calculadora de Amortizaciones"),
  sidebarLayout(
    sidebarPanel(
      numericInput("P", "Monto del préstamo ($)", value = 10000),
      numericInput("i", "Tasa de interés mensual (%)", value = 1),
      numericInput("n", "Número de pagos", value = 12),
      selectInput("tipo", "Tipo de amortización",
                  choices = c("Francesa", "Constante", "Gradual")),
      actionButton("calcular", "Calcular")
    ),
    mainPanel(
      DTOutput("tabla"),
      plotOutput("grafico")
    )
  )
)

Server

server <- function(input, output) {
  datos <- eventReactive(input$calcular, {
    P <- input$P
    i <- input$i / 100
    n <- input$n
    
    switch(input$tipo,
           "Francesa" = amort_francesa(P, i, n),
           "Constante" = amort_constante(P, i, n),
           "Gradual" = amort_gradual(P, i, n))
  })
  
  output$tabla <- renderDT({
    datatable(datos(), options = list(pageLength = 12))
  })
  
  output$grafico <- renderPlot({
    df <- datos()
    ggplot(df, aes(x = Mes)) +
      geom_line(aes(y = Cuota, color = "Cuota")) +
      geom_line(aes(y = Interés, color = "Interés")) +
      geom_line(aes(y = Amortización, color = "Amortización")) +
      scale_color_manual(values = c("Cuota" = "blue", "Interés" = "red", "Amortización" = "green")) +
      labs(title = "Componentes del Pago", y = "Monto ($)", color = "Leyenda") +
      theme_minimal()
  })
}

Lanzar app

shinyApp(ui, server)

Shiny applications not supported in static R Markdown documents