Sorot poligon selebaran R yang ditunjuk oleh Item yang dipilih (tanpa mengkliknya)

Pada aplikasi R mengkilap, apakah mungkin untuk memiliki peta selebaran yang menyorot poligon yang ditunjuk oleh Item yang dipilih (seharusnya berfungsi hanya dengan memindahkan mouss ke atas daftar dan tanpa mengkliknya)?

Dalam contoh yang dapat direproduksi berikut, saya ingin aplikasi Shiny ini menyorot poligon yang sesuai dengan lokasi kursor mouse tetapi tanpa harus mengkliknya.

library(shiny)
library(shinyjs)
library(leaflet)
library(sf)

download.file(url = "http://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip", destfile = "TM_WORLD_BORDERS-0.3.zip")
unzip( zipfile = "TM_WORLD_BORDERS-0.3.zip" )

world.borders <-read_sf( dsn = getwd(), layer = "TM_WORLD_BORDERS-0.3" )
world.borders <- world.borders[world.borders$NAME %in% c("Australia","United States","Brazil","Ireland","India","Kenya"),]

server <- function(input, output, session) {

output$mymap <- renderLeaflet({
    leaflet(options = leafletOptions(maxZoom = 18)) %>% addTiles() %>%
       addPolygons( data = world.borders, fill =  "#D24618", color = "blue")
 }) 
}

 ui <- fluidPage(
     leafletOutput("mymap"),
     selectInput(inputId = "country_choice",label = "Select a country",choices = unique(world.borders$NAME))
)

shinyApp(ui, server)

Terima kasih banyak !


person JeanBertin    schedule 13.09.2018    source sumber


Jawaban (1)


Itu seharusnya berhasil:

library(shiny)
library(shinyjs)
library(leaflet)
library(sf)

### Note had to download by hand as this did not work
## download.file(url = "http://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip", 
##               destfile = "TM_WORLD_BORDERS-0.3.zip")
## unzip( zipfile = "TM_WORLD_BORDERS-0.3.zip" )

world.borders <- read_sf( dsn = getwd(), layer = "TM_WORLD_BORDERS-0.3" )
world.borders <- world.borders[world.borders$NAME %in% 
                               c("Australia", "United States", "Brazil", 
                                 "Ireland", "India", "Kenya"), ]

ui <- fluidPage(
  useShinyjs(),
  leafletOutput("mymap"),
  selectInput(inputId = "country_choice",
              label   = "Select a country",
              choices = c("Please Select..." = "", unique(world.borders$NAME)))
)

server <- function(input, output, session) {
runjs(glue::glue("$('.selectize-control').on('mouseenter', ",
                 "'.selectize-dropdown-content div', ",
                 "function() {{",
                 "    Shiny.setInputValue('selected', $(this).data('value'));}}); ",
                 "$('.selectize-control').on('mouseleave', ",
                 "'.selectize-dropdown-content div', ",
                 "function() {{",
                 "    Shiny.setInputValue('selected', null);}})"))

  output$mymap <- renderLeaflet({
    myBorders <- world.borders[world.borders$NAME == input$selected, ]
    leaflet(options = leafletOptions(maxZoom = 18)) %>% addTiles() %>%
      addPolygons(data = myBorders, fill =  "#D24618", color = "blue")
  }) 
}

shinyApp(ui, server)
person thothal    schedule 19.09.2018
comment
hanya sebuah pertanyaan kecil tentang jawaban hebat Anda: apakah mungkin untuk menginisialisasi ulang nilai selectInput ke NULL (itu berarti tidak ada poligon yang dipilih) ketika mouse pengguna keluar dari area pemilih? - person JeanBertin; 20.09.2018
comment
Memperbarui jawaban saya, Anda harus menggunakan acara mouseleave untuk menetapkan nilai abck ke null - person thothal; 20.09.2018
comment
kamu jenius! - person JeanBertin; 21.09.2018