子集

时间:2016-09-20 17:56:41

标签: r shiny shiny-server

我正在尝试开发一个反应滑块,但我不明白为什么它不起作用并得到错误:"警告:[.data.frame:undefined中的错误列选择"。 任何帮助将不胜感激。

到目前为止,我已尝试使用uiOutput(" slider")从服务器调用该对象。

ui.r

    library(shiny)
    DF <- readRDS("data/SF.rds")
    shinyUI(fluidPage(
    titlePanel("Cartera Total - Bancos"),

   sidebarLayout(
   sidebarPanel(
   helpText("Evolución de la cartera total según entidad bancaria"),

  selectInput("var", 
    label = "Entidad Financiera",
    choices = c('B. AZTECA',
                'B. CENCOSUD PERU',
                'B. CONTINENTAL',
                'B. DE COMERCIO',
                'B. DE CREDITO DEL PERU',
                'B. FALABELLA PERU',
                'B. FINANCIERO',
                'B. GNB',
                'B. ICBC',
                'B. INTERAMERICANO DE FINANZAS',
                'B. RIPLEY',
                'B. SANTANDER PERU',
                'CITIBANK',
                'INTERBANK',
                'MIBANCO',
                'SCOTIABANK PERU'),
    selected = "BANCO AZTECA"),

    uiOutput("slider")

),

mainPanel(
    fluidRow(
        column(12,
            splitLayout(cellWidths = c("50%", "50%"),
                        plotlyOutput("deuda_dir"),
                        plotlyOutput("deuda_mora"))
        )
        ,
        column(10,
            tabsetPanel(id = 'Entidad',
                        DT::dataTableOutput("tabla")
        ))
    )
  )
 )
))

server.r:

   library(shiny)
   library(plotly)
   library(ggplot2)
   library(scales)

    DF <- readRDS("data/SF.rds")

    ban_sit <- function(df){
    # Seleccionas y luego : Ctrl+R
   p <- ggplot(data = df, 
          aes(x = fec_cierre,
              y = TotalCreditosDirectos/1000)) +
geom_line(colour = "midnightblue")+
scale_y_continuous(labels = comma)+
xlab("Fecha de Cierre")+
ylab("Créditos Directos (En MM de Soles)")
gg <- ggplotly(p)
gg
}
ban_mora <- function(df){
p <- ggplot(data = df, 
          aes(x = fec_cierre,
              y = Deuda_Mora_porc)) +
geom_line(colour = "firebrick4")+
scale_y_continuous(labels = comma)+
xlab("Fecha de Cierre")+
ylab("Ratio de Mora (%)")
gg <- ggplotly(p)
gg
 }


  shinyServer(
  function(input, output) {
    tabla_seg <- reactive({
    args <- switch(input$var,
    'B. AZTECA'='B001', # Solo entidades activas
    'B. CENCOSUD PERU'='B002',
    'B. CONTINENTAL'='B003',
    'B. DE COMERCIO'='B004',
    'B. DE CREDITO DEL PERU'='B005',
    'B. FALABELLA PERU'='B007',
    'B. FINANCIERO'='B008',
    'B. GNB'='B009',
    'B. ICBC'='B010',
    'B. INTERAMERICANO DE FINANZAS'='B011',
    'B. RIPLEY'='B012',
    'B. SANTANDER PERU'='B014',
    'CITIBANK'='B020',
    'INTERBANK'='B023',
    'MIBANCO'='B024',
    'SCOTIABANK PERU'='B025')

  tabla_seg = DF[DF$cod_ent == args] 
})

output$slider <- renderUI({
    sliderInput("inslider","Slider", 
                min = min(tabla_seg()$fec_cierre), 
                max   = max(tabla_seg()$fec_cierre),
                value = c(min(tabla_seg()$fec_cierre),     
                          max(tabla_seg()$fec_cierre))
)})


tabla_fec <- reactive({

    tabla_fec = tabla_seg()[tabla_seg()$fec_cierre >=  input$inslider[1] &
                         tabla_seg()$fec_cierre <= input$inslider[2],]

    tabla_fec[order(tabla_fec$fec_cierre,
                              decreasing = TRUE),]


})

output$deuda_dir <- renderPlotly({
  ban_sit(tabla_fec())
})

output$deuda_mora <- renderPlotly({
  ban_mora(tabla_fec())
})

output$tabla <- DT::renderDataTable({
    tab = tabla_fec()
    row.names(tab) = NULL
    tab$TotalCreditosDirectos <- formatC(tab$TotalCreditosDirectos,
                                         format="d",
                                         big.mark=',')

    tab$Deuda_Mora_porc <- round(tab$Deuda_Mora_porc, 2)                                             

    tab <-  tab[,c("fec_cierre",
                   "TotalCreditosDirectos",
                   "Deuda_Mora_porc")]
    names(tab) <- c("Fecha de cierre",
                    "Deuda Directa (S/.)", 
                    "Mora (%)")            
    DT::datatable(tab)
})
  }

1 个答案:

答案 0 :(得分:0)

我检查了代码。您可以在下面看到修改后的代码。我认为问题是输入$ inslider在调用tabla_fec&lt; - reactive后呈现。修改后的代码应该处理它。 请注意,我在global.R中放置了DF&lt; - readRDS(&#34; ./ data / SF2.rds&#34;),以便在ui.R和server.R中都可以使用DF并读取它两次。

这是修改过的server.R

    library(shiny)
    library(plotly)
    library(ggplot2)
    library(scales)



    ban_sit <- function(df){
            # Seleccionas y luego : Ctrl+R
            p <- ggplot(data = df, 
                        aes(x = fec_cierre,
                            y = TotalCreditosDirectos/1000)) +
                    geom_line(colour = "midnightblue")+
                    scale_y_continuous(labels = comma)+
                    xlab("Fecha de Cierre")+
                    ylab("Créditos Directos (En MM de Soles)")
            gg <- ggplotly(p)
            gg
    }
    ban_mora <- function(df){
            p <- ggplot(data = df,
                        aes(x = fec_cierre,
                            y = Deuda_Mora_porc)) +
                    geom_line(colour = "firebrick4")+
                    scale_y_continuous(labels = comma)+
                    xlab("Fecha de Cierre")+
                    ylab("Ratio de Mora (%)")
            gg <- ggplotly(p)
            gg
    }


    shinyServer(
            function(input, output) {
                    tabla_seg <- reactive({
                            args <- switch(input$var,
                                           'B. AZTECA'='B001', # Solo entidades activas
                                           'B. CENCOSUD PERU'='B002',
                                           'B. CONTINENTAL'='B003',
                                           'B. DE COMERCIO'='B004',
                                           'B. DE CREDITO DEL PERU'='B005',
                                           'B. FALABELLA PERU'='B007',
                                           'B. FINANCIERO'='B008',
                                           'B. GNB'='B009',
                                           'B. ICBC'='B010',
                                           'B. INTERAMERICANO DE FINANZAS'='B011',
                                           'B. RIPLEY'='B012',
                                           'B. SANTANDER PERU'='B014',
                                           'CITIBANK'='B020',
                                           'INTERBANK'='B023',
                                           'MIBANCO'='B024',
                                           'SCOTIABANK PERU'='B025')

                            tabla_seg = DF[DF$cod_ent == args, , drop = FALSE] 
                    })

                    output$slider <- renderUI({
                            sliderInput("inslider","Slider", 
                                        min = min(tabla_seg()$fec_cierre), 
                                        max   = max(tabla_seg()$fec_cierre),
                                        value = c(min(tabla_seg()$fec_cierre),     
                                                  max(tabla_seg()$fec_cierre))
                            )})


                    tabla_fec <- reactive({

                            if (!is.null(input$inslider[1]) || !is.null(input$inslider[2])) {
                            tabla_fec = tabla_seg()[tabla_seg()$fec_cierre >=  input$inslider[1] &
                                                            tabla_seg()$fec_cierre <= input$inslider[2], ]
                            } else {
                                    tabla_fec <-  tabla_seg()        
                            }

                            tabla_fec[order(tabla_fec$fec_cierre,
                                            decreasing = TRUE), ]


                    })

                    output$deuda_dir <- renderPlotly({
                            ban_sit(tabla_fec())
                    })

                    output$deuda_mora <- renderPlotly({
                            ban_mora(tabla_fec())
                    })

                    output$tabla <- DT::renderDataTable({
                            tab = tabla_fec()
                            row.names(tab) = NULL
                            tab$TotalCreditosDirectos <- formatC(tab$TotalCreditosDirectos,
                                                                 format="d",
                                                                 big.mark=',')

                            tab$Deuda_Mora_porc <- round(tab$Deuda_Mora_porc, 2)

                            tab <-  tab[,c("fec_cierre",
                                           "TotalCreditosDirectos",
                                           "Deuda_Mora_porc")]
                            names(tab) <- c("Fecha de cierre",
                                            "Deuda Directa (S/.)",
                                            "Mora (%)")
                            DT::datatable(tab)
                    })
                    output$letsee <- renderText({
                            class(tabla_fec())
                    })
            })

如果有帮助,请告诉我。