I'm trying to build a shiny app that filters a data frame based on user entries, however, i'm struggling using a function I created to do this task, the error Problem with 'filter()' input '..1'. x Input '..1' must be of size 9 or 1, not size 0. keeps apperaring.
I found a similar issue here but the answer didn't help.
Here's my code. And also here are the xlsx and csv files with example data.
I appreciate a lot your help
library(shiny)
library(dplyr)
library(shinythemes)
library(shinydashboard)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
theme = shinytheme("flatly"),
tabsetPanel(
id = "tabs",
tabPanel("Portafolio",
sidebarLayout(
sidebarPanel(
titlePanel("Seleccione las variables deseadas"),
uiOutput('fondo'),
uiOutput('reg'),
uiOutput('seguro'),
uiOutput('prod_sap'),
hr(),
actionButton("addbutton","Añadir")
),
mainPanel(
titlePanel("Vista previa del portafolio"),
tableOutput('courseTable'),
actionButton(inputId = "continue", label = "Cotizar")
)
)
),
tabPanel("Cotización",
tableOutput('envio'))
)
)
server <- function(input, output, session) {
fondo_edo <- reactive ({
read.csv("E:/Input Fondo-Edo-Reg_example.csv")
})
output$fondo <- renderUI({
times <- input$addbutton
fondos_todos <- as.vector(unique(fondo_edo()$FONDO))
div(id= letters[(times %% length(letters)) + 1],
selectInput("fondo_selec","Fondo:", choices=fondos_todos,selectize = T))
})
fondo_edo1 <- reactive({
subset(fondo_edo(), FONDO %in% input$fondo_selec)
})
output$reg <- renderUI({
reg_todos <- as.vector( unique(fondo_edo1()$REGIÓN) )
selectInput("reg_selec","Región:", choices=reg_todos, selectize = F)
})
output$seguro <- renderUI({
times <- input$addbutton
div(id=letters[(times %% length(letters))+1],
selectInput("seguro_selec","Seguro agricultura protegida:", choices=c("","Cosecha_Esp", "Inversión", "Planta"), selectize = F))
})
output$prod_sap <- renderUI({
times <- input$addbutton
div(id=letters[(times %% length(letters))+1],
conditionalPanel("input.seguro_selec == 'Inversión'",
selectInput("prod_sap_selec","Nombre producto SAP:", choices= "Tradicional")),
conditionalPanel("input.seguro_selec != 'Inversión'",
selectInput("prod_sap_selec2","Nombre producto SAP:",choices = c("","Establecimiento", "Mantenimiento", "Producción"), selectize = F)))
})
values <- reactiveValues()
values$df <- data.frame("Fondo" = numeric(0), "Región"= numeric(0), "Tipo de práctica"= numeric(0),
"Seguro agricultura protegida"= numeric(0))
newEntry <- observe({
if(input$addbutton > 0) {
newLine <- isolate(c(input$fondo_selec, input$reg_selec,
"RIEGO",
ifelse(input$seguro_selec=="Planta", paste0(input$seguro_selec,"/",input$prod_sap_selec2),
input$seguro_selec)))
isolate(values$df[nrow(values$df) + 1,] <-newLine)
}
})
output$courseTable <- renderTable({values$df})
observeEvent(input$continue, {
updateTabsetPanel(session = session, inputId = "tabs", selected = "Cotización")
})
cotizacion <- reactive({
isolate(busca_folios(fondo_edo(),values$df$Fondo, values$df$Región,
values$df$Seguro.agricultura.protegida))
})
output$envio <- renderTable({cotizacion()})
# cotizacion <- reactiveValues()
# cotizacion$df <- busca_folios(fondo_edo(),values$df$Fondo, values$df$Región,
# values$df$Sistema.de.producción, values$df$Seguro.agricultura.protegida)
#
# output$envio <- renderTable({cotizacion$df})
}
runApp(shinyApp(ui,server))
#### Funciones ####
busca_folios <- function(tabla_fondos, fondo, reg, cultivo, seguro){
historico_folios <- readxl::read_xlsx("E:/historico_example.xlsx")
fn <- tabla_fondos[which(tabla_fondos$FONDO == fondo),]$`CLAVE FONDO`
fond <- ifelse(nchar(fn)==1,paste0("000",fn),ifelse(nchar(fn)==2, paste0("00",fn),
ifelse(nchar(fn)==3, paste0("0",fn),fn)))
rg <-tabla_fondos[which(tabla_fondos$REGIÓN == reg),]$CVE_REGION
region <- ifelse(nchar(rg)==1, paste0("00",rg),ifelse(nchar(rg)==2,paste0("0",rg),rg))
buscada <<- historico_folios %>%
dplyr::filter(Fondo==fond,
Región == region, Subramo == seguro)
}
