ช่วงการเลือกแบบมันเงาและตัวแปรตัวเลข (เป็นอินพุต) พร้อมแผ่นพับ

ฉันต้องการแสดงรายการตัวแปรตัวเลขและแถบสไลด์เพื่อให้ผู้ใช้สามารถเลือกตัวแปรตัวเลขและช่วงได้ จากนั้น การสังเกตที่ต่ำกว่าตัวเลขนั้นจะแสดงเป็นสีเขียว และการสังเกตระหว่างช่วงนั้นจะเป็นสีส้ม และการสังเกตที่อยู่เหนือช่วงนั้นจะเป็นสีแดง

รหัสด้านล่างทำงานได้ดีก่อนที่ฉันจะทำให้มันเงางาม แต่โค้ดแวววาวของฉันใช้งานไม่ได้และการสังเกตทั้งหมดเป็นสีแดง

library(Rcpp)
library(ggmap)
library(htmlwidgets)
library(leaflet)

crime2 <- crime[1:50,]

getColor <- function(crime2) {
 sapply(crime2$hour, function(hour) {
 if(hour< 1) {
   "green"
 } else if(hour <= 1) {
   "orange"
 } else {
   "red"
  } })
}

icons <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'black',
  library = 'ion',
  markerColor = getColor(crime2)
)

leaflet(crime2) %>%
  addTiles() %>%
  addAwesomeMarkers(~lon, ~lat, icon=icons)

นี่คือโค้ดเงาที่ใช้งานไม่ได้

ui <- fluidPage(
  titlePanel("Unusual Observations"),

  sidebarLayout(
    sidebarPanel(
      helpText("Create maps with 
        information from the Crime Data"),

      selectInput("var", 
                  label = "Choose a variable to display",
                  choices = c("Hour",
                              "Number"),
                  selected = "Hour"),

      sliderInput("range", 
                  label = "Range of interest:",
                  min = 0, max = 10, value = c(1, 2))
    ),

    mainPanel(leafletOutput("map"))
  )
)


server <- function(input, output) {
  output$map <- renderLeaflet({
    data <- switch(input$var,
                   "hour" = crime2$hour,
                   "number" = crime2$number)

    getColor <- function(data){sapply(data, function(var){
       if(input$var< input$range[1]) {
         "green"
       } else if(input$var <= input$range[2]) {
         "orange"
       } else {
         "red"
        } })
    }

  icons <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'black',
  library = 'ion',
  markerColor = getColor(crime2)
)

    leaflet(crime2) %>%
  addTiles() %>%
  addAwesomeMarkers(~lon, ~lat, icon=icons)

  })
}

shinyApp(ui=ui, server=server)

ไม่มีใครรู้วิธีแก้ไขปัญหา 'ทุกจุดที่แสดงเป็นสีแดง' หรือไม่?

ขอบคุณล่วงหน้า!


person glor    schedule 25.06.2018    source แหล่งที่มา
comment
คุณอาจต้องการแชร์ d1 เพื่อให้ทำซ้ำได้...   -  person Tonio Liebrand    schedule 29.06.2018
comment
@BigDataScientist ฉันได้อัปเดตรหัสเป็นตัวอย่างที่ทำซ้ำได้!   -  person glor    schedule 29.06.2018


คำตอบ (1)


การเปลี่ยนแปลงเล็กน้อย:

  1. เมื่อคุณสร้าง selectInput ตัวเลือก (และเลือก) จะต้องเป็นตัวพิมพ์เล็กเพื่อให้ตรงกับชื่อคอลัมน์ใน crime2

    selectInput("var", 
                  label = "Choose a variable to display",
                  choices = c("hour",
                              "number"),
                  selected = "hour"),
    
  2. ภายในฟังก์ชัน getColor คุณต้องการวนซ้ำค่าใน data ไม่ใช่ input$var ดังนั้นคุณควรเรียก var แทนที่จะเป็น input$var ภายในฟังก์ชัน lambda

    getColor <- function(data){sapply(data, function(var){
          if(var< input$range[1]) {
            "green"
          } else if(var <= input$range[2]) {
            "orange"
          } else {
            "red"
          } })
        }
    
  3. เมื่อคุณสร้างไอคอนจริงๆ คุณต้องการให้สร้างไอคอนตามค่าใน data ไม่ใช่ค่าในชุดข้อมูล crime2 ทั้งหมด

    icons <- awesomeIcons(
          icon = 'ios-close',
          iconColor = 'black',
          library = 'ion',
          markerColor = getColor(data)
        )
    

วางมันทั้งหมดเข้าด้วยกัน:

ui <- fluidPage(
  titlePanel("Unusual Observations"),

  sidebarLayout(
    sidebarPanel(
      helpText("Create maps with 
        information from the Crime Data"),

      selectInput("var", 
                  label = "Choose a variable to display",
                  choices = c("hour",
                              "number"),
                  selected = "hour"),

      sliderInput("range", 
                  label = "Range of interest:",
                  min = 0, max = 10, value = c(1, 2))
    ),

    mainPanel(leafletOutput("map"))
  )
)


server <- function(input, output) {
  output$map <- renderLeaflet({
    data <- switch(input$var,
                   "hour" = crime2$hour,
                   "number" = crime2$number)

    getColor <- function(data){sapply(data, function(var){
      if(var< input$range[1]) {
        "green"
      } else if(var <= input$range[2]) {
        "orange"
      } else {
        "red"
      } })
    }

    icons <- awesomeIcons(
      icon = 'ios-close',
      iconColor = 'black',
      library = 'ion',
      markerColor = getColor(data)
    )

    leaflet(crime2) %>%
      addTiles() %>%
      addAwesomeMarkers(~lon, ~lat, icon=icons)

  })
}

shinyApp(ui=ui, server=server)
person Wil    schedule 28.02.2019