Прежде всего, благодарю Шри, который очистил и сделал мой предыдущий код более производительным здесь

Во всяком случае, у меня есть код, который позволяет пользователю выбрать один или несколько видов (из selectizeInput). Приложение показывает распределение видов на карте.

Теперь я озадачен, потому что я не могу отменить выбор видов? После того, как распределения нанесены на карту, они остаются на карте, и я больше не могу их удалить ... Я тщательно искал, но не смог этого увидеть ... Я новичок в shiny ... так что, вероятно, легкая ошибка?

Весь код ниже, спасибо !!! Йонас

DATAFRAME

df<- data.frame(
  Number_Total = sample(c("5", "6", "1", "3")),
  Species = sample(c("Ilione trifaria", "Pherbellia argyrotarsis", 
"Euthycera seguyi", "Ilione trifaria")),
  X= sample(c("37", "28", "21", "30")),
  Y= sample(c("-5", "-16", "-10", "-15"))
)

UI

ui <- (fluidPage(titlePanel("Species Checker"),  
                 sidebarLayout(
                   sidebarPanel(
                      selectizeInput('species', 'Choose species', 
choices = df$Species, multiple = TRUE, 
options = list(placeholder = 'select species'))
                     ),
                   mainPanel(
                     leafletOutput("CountryMap", width = 600, height = 600))
                 )
))

SERVER

server <- function(input, output, session) {
  map_data <- reactive({
    #req(input$species)
    df[df$Species %in% input$species, ]
  })

  output$CountryMap <- renderLeaflet({
    leaflet() %>% addTiles() %>% 
      setView(lng = 20, lat = 40, zoom = 2)
  })

  map_proxy <- leafletProxy("CountryMap")

  observe({
    md <- map_data()
    map_proxy %>%
      addCircles(lng = md$Y, lat = md$X, weight = 10, 
                 radius = sqrt(md$Number_Total)*15000, popup = md$Species)
  })
}

Запустить приложение

shinyApp(ui = ui, server = server)
r
3
jonas 9 Ноя 2018 в 14:28

1 ответ

Лучший ответ

Попробуйте следующее (я не заключил кавычки для некоторых переменных в df, иначе приложение выйдет из строя):

library(tidyverse)
library(shiny)
library(leaflet)

df <- data.frame(
  Number_Total = sample(c(5, 6, 1, 3)),
  Species = sample(c("Ilione trifaria", "Pherbellia argyrotarsis", 
                     "Euthycera seguyi", "Ilione trifaria")),
  X= sample(c(37, 28, 21, 30)),
  Y= sample(c(-5, -16, -10, -15))
)

ui <- (fluidPage(titlePanel("Species Checker"),  
                 sidebarLayout(
                   sidebarPanel(
                     selectizeInput('species', 'Choose species', 
                                    choices = df$Species, multiple = TRUE, 
                                    options = list(placeholder = 'select species'))
                   ),
                   mainPanel(
                     leafletOutput("CountryMap", width = 600, height = 600))
                 )
))

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

  map_data <- reactive({
    #req(input$species)
    df[df$Species %in% input$species, ]
  })

  output$CountryMap <- renderLeaflet({

    leaflet() %>% addTiles() %>% 
      setView(lng = 20, lat = 40, zoom = 2) %>%
      addCircles(lng = map_data() %>% pull(Y), lat = map_data() %>% pull(X), weight = 10, 
                 radius = sqrt(map_data() %>% pull(Number_Total))*15000, 
                 popup = map_data() %>% pull(Species))

    })

}

shinyApp(ui = ui, server = server)

Вам нужно получить значения непосредственно из контекста reactive; Я также предлагаю сделать это в одном заявлении, а не распространять его по всему миру.

P.S. Если ваш исходный фрейм данных действительно содержит все переменные в формате character, вы можете на всякий случай добавить оператор mutate_at в части map_data, например:

map_data <- reactive({
    #req(input$species)
    df[df$Species %in% input$species, ] %>%
      mutate_at(vars(c("Number_Total", "X", "Y")), funs(as.numeric))

Затем скрипт работает также с вашим исходным фреймом данных, предоставленным здесь, без ручных изменений.

0
arg0naut91 10 Ноя 2018 в 18:21