Невозможно получить количество значений, присутствующих в переменной вinyApp. - PullRequest
0 голосов
/ 24 января 2019

Я строю блестящее приложение на данных mtcars. У меня проблема с подсчетом значений disp переменной . Когда all выбрано в кнопка карбоната , тогда disp показывает 0 count . Если в carb выбраны значения, отличные от all , тогда disp даст точное количество его значений. Может кто-нибудь, пожалуйста, посмотрите на мои коды. Буду очень признателен.

library(shiny)   
library(DT)     
library(dplyr) 
library(shinythemes) 
library(htmlwidgets) 
library(shinyWidgets) 
library(shinydashboard)


data_table<-mtcars    

#ui
ui = fluidPage( 
  sidebarLayout(
    sidebarPanel (

      uiOutput("vs_selector"),
      uiOutput("carb_selector"),
      uiOutput("disp_selector"),
      uiOutput("cyl_selector"),
      valueBoxOutput("count_disp"),
      valueBoxOutput("count_cyl")),


    mainPanel(

      DT::dataTableOutput('mytable') 

    )

  ))




#server
server = function(input, output, session) {

  output$vs_selector <- renderUI({

    selectInput(inputId = "vs",
                label = "vs:", multiple = TRUE,
                choices = c( unique(data_table$vs)),
                selected = c(0,1))

  })

  output$carb_selector <- renderUI({

    req(input$vs)

    available0 <- data_table[c(data_table$vs %in% input$vs ), "carb"]  

    selectInput(
      inputId = "carb", 
      label = "carb:",
      multiple = TRUE,
      choices = c('All',as.character(unique(available0))),
      selected = 'All')

  })


  output$disp_selector <- renderUI({
    req(input$vs, input$carb)

    available <- data_table[["disp"]][data_table$vs %in% input$vs]
    if(! "All" %in% input$carb){
      available <- available[data_table$carb %in% input$carb]
    }

    selectInput(
      inputId = "disp", 
      label = "disp:",
      multiple = TRUE,
      choices = c('All',as.character(unique(available))),
      selected = c(160,108, 258, 360))

  })



  output$cyl_selector <- renderUI({
    req(input$vs, input$carb, input$disp)

    available <- data_table[["cyl"]][data_table$vs %in% input$vs]
    if(! "All" %in% input$disp){
      available <- available[data_table$carb %in% input$carb    &    
data_table$disp %in% input$disp]
    }

    selectInput(
      inputId = "cyl", 
      label = "cyl:",
      multiple = TRUE,
      choices = c('All',as.character(unique(available))),
      selected = 'All')

  })





  output$count_disp <- renderValueBox({
    if("All" %in% input$carb) {
      available <- unique(data_table[['disp']][data_table$vs %in% input$vs] 
)
    } else{
      available <- unique(data_table[['disp']][data_table$carb %in% 
input$carb   &    
                                          data_table$vs %in% input$vs ]   )                                                        
    }

    valueBox(
      value = length(available) ,


      subtitle = sprintf("Number of disp values" ))   

  })




  output$count_cyl <- renderValueBox({
    if("All" %in% input$disp) {
      available <- unique(data_table[['cyl']][data_table$vs %in% input$vs] )
    } else{
      available <- unique(data_table[['cyl']][data_table$carb %in% 
input$carb   &    
                                                 data_table$vs %in% input$vs  
&    
                                                data_table$disp %in% 
input$disp ]   )                                                        
    }

    valueBox(
      value = length(available) ,


      subtitle = sprintf("Number of cyl values" ))   

  })







  thedata <- reactive({

    req(input$disp, input$vs, input$carb, input$cyl)

    data_table<-data_table[data_table$vs %in% input$vs,]

    if(! "All" %in% input$carb){
      data_table<-data_table[data_table$carb %in% input$carb,]
    }

    if(! "All" %in% input$disp){
      data_table<-data_table[data_table$disp %in% input$disp,]
    }


    if(! "All" %in% input$cyl){
      data_table<-data_table[data_table$cyl %in% input$cyl,]
    }


    data_table

  })


  output$mytable = DT::renderDataTable({

    DT::datatable( {     

      thedata()   # Call reactive thedata()

    })

  })

}  

shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 24 января 2019

В renderValueBox Вы пытаетесь установить подмножество data_table[['disp']][data_table$carb %in% input$carb & data_table$vs %in% input$vs] Но input$carb == "All", поэтому ваше подмножество возвращает число с длиной 0.

Редактирование на основе вашего первого комментария.Я добавил функцию, которая возвращает уникальные значения для вектора ("cyl", "carb" и т. Д.).Мы можем использовать эту функцию для заполнения A selectInput и B для возврата длины уникальных значений, основанных на том, что выбрано.

library(shiny)   
library(DT)     
library(dplyr) 
library(shinythemes) 
library(htmlwidgets) 
library(shinyWidgets) 
library(shinydashboard)

#Input data
data_table<-mtcars

#Function returning all choices for given selector
ReturnChoices <- function(data, xSelector){
  choices <- unique(data[[xSelector]])
  return(choices)
}

#ui
ui = fluidPage( 
  sidebarLayout(
    sidebarPanel (

      uiOutput("vs_selector"),
      uiOutput("carb_selector"),
      uiOutput("disp_selector"),
      uiOutput("cyl_selector"),
      valueBoxOutput("count_disp"),
      valueBoxOutput("count_cyl")),


    mainPanel(

      DT::dataTableOutput('mytable') 

    )

  ))




#server
server = function(input, output, session) {


  output$vs_selector <- renderUI({

    selectInput(inputId = "vs",
                label = "vs:", multiple = TRUE,
                choices = c( ReturnChoices(data_table, "vs")),
                selected = c(0,1))

  })

  output$carb_selector <- renderUI({

    selectInput(
      inputId = "carb", 
      label = "carb:",
      multiple = TRUE,
      choices = c('All',as.character( ReturnChoices(data_table, "carb"))),
      selected = 'All')

  })

  output$disp_selector <- renderUI({

    selectInput(
      inputId = "disp", 
      label = "disp:",
      multiple = TRUE,
      choices = c('All',as.character( ReturnChoices(data_table, "disp"))),
      selected = c(160,108, 258, 360))

  })

  output$cyl_selector <- renderUI({

    selectInput(
      inputId = "cyl", 
      label = "cyl:",
      multiple = TRUE,
      choices = c('All',as.character( ReturnChoices(data_table, "cyl"))),
      selected = 'All')

  })

  output$count_disp <- renderValueBox({

    valueBox(
      value = length( ReturnChoices(thedata(), "disp")) ,


      subtitle = sprintf("Number of disp values" ))   

  })


  output$count_cyl <- renderValueBox({

    valueBox(
      value = length( ReturnChoices(thedata(), "cyl")) ,


      subtitle = sprintf("Number of cyl values" ))   

  })

  thedata <- reactive({

    req(input$disp, input$vs, input$carb, input$cyl)

    if(! "All" %in% input$carb){
      data_table<-data_table[data_table$carb %in% input$carb,]
    }

    if(! "All" %in% input$disp){
      data_table<-data_table[data_table$disp %in% input$disp,]
    }

    if(! "All" %in% input$cyl){
      data_table<-data_table[data_table$cyl %in% input$cyl,]
    }

    data_table<-data_table[data_table$vs %in% input$vs,]

    data_table

  })


  output$mytable = DT::renderDataTable({

    DT::datatable( {     

      thedata()   # Call reactive thedata()

    })

  })

}  

shinyApp(ui = ui, server = server)

и дайте мне знать, если это решит это для вас

...