Блестящая листовка easyButton срабатывает только один раз - PullRequest
1 голос
/ 07 февраля 2020

Я хочу, чтобы приложение Shiny + Leaflet переключалось между глобальным и национальным масштабами. Нажатие на символы страны приводит к тому масштабу, который предназначен. Чтобы вернуться из страны в глобальный вид, я добавил easyButton. Он работает по первому клику, но когда пользователь снова уходит в любую страну и щелкает, чтобы снова вернуться к глобальному представлению, ничего не происходит. Воспроизводимый скрипт:

require(shiny)
require(dplyr)
require(leaflet)

d = tibble(country = c(rep('China', 3), rep('Brazil', 3), rep('Canada', 3)),
           name = paste(country, rep(1:3,3)), count = sample(30:100,9),
           lon = c(105, 112, 110, -52, -54, -51, -95, -100, -93),
           lat = c(35, 33, 25, -10, -11, -12, 60, 63, 61))

dSum = d %>% group_by(country) %>% summarise(lon = mean(lon), lat = mean(lat), count = sum(count)) %>% rename(name = country)

renderMap = function(x){
  renderLeaflet({
    leaflet(x) %>% 
      addCircleMarkers(layerId = ~name, lng = ~lon, lat = ~lat, label = ~ name, radius = ~ pmax(3, 100 * sqrt(count/max(count)))) %>% 
      addProviderTiles(providers$Stamen.TonerLite, options = providerTileOptions(noWrap = TRUE, minZoom=2, maxZoom=18)
      ) %>% 
      addEasyButton(easyButton(
        icon="fa-backward", title="Refresh map", id = "refresh-map", 
        onClick = JS(" function(btn, map) { Shiny.onInputChange('my_easy_button', 'refresh'); }")))
  })
}

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

  output$mymap <- renderMap(dSum)

  # click on country
  observeEvent(input$mymap_marker_click, {
    countryname = input$mymap_marker_click$id
    message(countryname)
    output$mymap = renderMap(filter(d, country == countryname))
  })

  # click on refresh button
  observeEvent(input$my_easy_button, { output$mymap = renderMap(dSum) })
}


ui <- fluidPage(
  tags$head( tags$style(HTML("#mymap { position: fixed; left: 0; top: 0; width: 100vw; height: 100vh !important; }
                             .container-fluid { margin:0; padding:0; } ")) ),
  leafletOutput("mymap")
)


shinyApp(ui, server)

Эффект также виден при симуляции клика с помощью jQuery - например, $('.easy-button-button').click().

Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 08 февраля 2020

Согласно комментарию Бена:

<leaflet_obj>  %>% 
      addEasyButton(easyButton(states = list(
        easyButtonState(stateName = 'onestate', 
                        icon="fa-backward", title="Refresh map", #id = "refresh-map", 
                        onClick = JS(" function(btn, map) { Shiny.onInputChange('my_easy_button', 'refresh'); Shiny.onInputChange('my_easy_button', 'free'); }"))
        )
      ))
  })
}

Не знаю, почему это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...