R Shiny:如何根据用户输入数据的位置过滤数据

R Shiny:如何根据用户输入数据的位置过滤数据,r,shiny,leaflet,ggmap,R,Shiny,Leaflet,Ggmap,我有一个闪亮的应用程序正在运行。它在一张传单互动地图上绘制了大约12000套公寓和房间供出租,并根据用户输入的地址在地图上添加了一个标记。这是我的建议。抱歉,如果没有很好的文档记录 有两个不同的数据框对象:一个用于公寓(df.apt),另一个用于房间(df.quartos) 但是,由于应用程序加载的数据量太大,速度有点慢。我想添加一个资源,该资源仅在用户插入地址并选择邻近范围(例如,仅显示距输入地址10公里内的公寓)后才会绘制数据。我该怎么做呢 library(leaflet) library(

我有一个闪亮的应用程序正在运行。它在一张传单互动地图上绘制了大约12000套公寓和房间供出租,并根据用户输入的地址在地图上添加了一个标记。这是我的建议。抱歉,如果没有很好的文档记录

有两个不同的数据框对象:一个用于公寓(
df.apt
),另一个用于房间(
df.quartos

但是,由于应用程序加载的数据量太大,速度有点慢。我想添加一个资源,该资源仅在用户插入地址并选择邻近范围(例如,仅显示距输入地址10公里内的公寓)后才会绘制数据。我该怎么做呢

library(leaflet)
library(shiny)
library(ggmap)


source("post4-prepararshiny.R") #loads data and helper functions


 ui = bootstrapPage(
   div(class = "outer",
       tags$head(
         # Include our custom CSS
         includeCSS("styles.css"),
         includeScript("gomap.js")
       ),

   tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
   leafletOutput("mymap", width = "100%", height = "100%"),

   absolutePanel(id = "controls",# class = "panel panel-default",
                 fixed = TRUE,
                 draggable = TRUE,
                 top = 60, left = "auto", right = 20, bottom = "auto",
                 width = 330, height = "auto",

                 h2("Buscador OLX"),
                 textInput(inputId = "userlocation",
                           label = "Digite um endereço\n com pelo menos rua, número, bairro e cidade",
                           value = ""),
                 helpText("Exemplo: Rua Dias da Rocha, 85 - Copacabana, Rio de Janeiro - RJ"),

                 sliderInput(inputId = "distancia", label = "Escolha a distância em km:",
                             min = 0, max = 30, value = 15),

                 actionButton("go", "Buscar"),
                 helpText("Encontre imóveis para alugar perto de onde você quiser!"),

                 helpText("Cada ponto no mapa representa um imóvel para alugar.",
                          "A cor de um ponto é determinada pelo valor do aluguel.",
                          "Clique em um ponto para ter mais informações sobre o imóvel."),

                 helpText("Mais informações sobre este app em sillasgonzaga.github.io")

                 )

   ),
   tags$div(id="cite",
            'Dados extraídos do OLX em 12/11/2016.', ' Contato: sillasgonzaga.github.io'
   )
)
服务器.R 但是,我如何以反应式的方式做到这一点,允许我在用户每次单击按钮时更改
距离
列,并更改用于指示接近范围的
滑块输入()

注:对不起,葡萄牙语的代码和注释

编辑:已解决 在@HubertL回复后,我找到了一个解决方案。以下是我在服务器上所做的工作:

  distance_apt_reactive <- eventReactive(input$go, { 
    address_latlon <- geocode(input$userlocation)
    dist <- distm(x = matrix(data = c(df.apt$lon, df.apt$lat), ncol = 2), 
                  y = c(lon = address_latlon$lon, lat = address_latlon$lat), 
                  fun = distVincentySphere)
    dist <- dist/1000

  })

  apt_reactive <- reactive({df.apt[distance_reactive() < input$distancia,]})

  output$mymap <- renderLeaflet({
    map <- leaflet() %>%
      addTiles() %>%
      addProviderTiles("OpenStreetMap.BlackAndWhite") %>%
      setView(lng = mean(df.apt$lon), lat = mean(df.apt$lat), zoom = 11) %>%
      addLegend(pal = vetorCoresApt, values = df.apt$preco,
                position = "bottomright",
                layerId = "legend")

  map  
  })

     observe({
       leafletProxy("mymap") %>%
         clearMarkers() %>%
         #addMarkers(lng = myadress()$lon, lat = myadress()$lat) %>%
         addCircleMarkers(data = apt_reactive(),
                          lng = ~lon, lat = ~lat,
                          color = ~vetorCoresQuarto(preco),
                          opacity = 1.5,
                          # adicionar popup
                          popup = textoPopup(apt_reactive(), "apartamento"),
                          group = "Apartamentos")
    })
distance\u apt\u reactive%
addCircleMarkers(数据=apt_reactive(),
液化天然气=~lon,lat=~lat,
颜色=~vetorCoresQuarto(preco),
不透明度=1.5,
#adicionar弹出窗口
popup=textoPopup(apt_reactive(),“Apartmento”),
group=“Apartmentos”)
})

您可以添加一个
反应式
,它将根据到地址的距离过滤您的
数据。frame

apt_reactive <- reactive({ 
    address_latlon <- geocode(input$userlocation)
    dist <- distm(x = matrix(data = c(df.apt$lon, df.apt$lat), ncol = 2), 
                  y = c(lon = address_latlon$lon, lat = address_latlon$lat), 
                  fun = distVincentySphere)
    apt.df[dist < input$distancia,]
})


(对于
df.quartos
,对
quartos\u reactive
重复相同的过程)

您的解决方案非常好,但仍然存在问题。每次用户更改距离范围时,
renderLeaflet()
都会渲染一张新地图,这会减慢应用程序的速度。有没有办法让它更平滑?我想知道这是否与
proxy()
有关。是的,但是因为渲染点要少得多,所以渲染速度会非常快。但您是对的,可能可以使用
proxy
。我会看看这个(对我来说是新的)函数,所以,我在这里做了很多测试,似乎我想要的是根本不可能的。假设您选择3 km作为距离范围。它将仅绘制该范围内的数据。如果我使用滑块将此范围增加到10公里,它将绘制此新范围中包含的新数据。但是,问题是,如果我将其滑回3公里,10公里内的数据不会消失。相反,它将绘制已经绘制的数据。如果我不清楚,请告诉我。
  distance_apt_reactive <- eventReactive(input$go, { 
    address_latlon <- geocode(input$userlocation)
    dist <- distm(x = matrix(data = c(df.apt$lon, df.apt$lat), ncol = 2), 
                  y = c(lon = address_latlon$lon, lat = address_latlon$lat), 
                  fun = distVincentySphere)
    dist <- dist/1000

  })

  apt_reactive <- reactive({df.apt[distance_reactive() < input$distancia,]})

  output$mymap <- renderLeaflet({
    map <- leaflet() %>%
      addTiles() %>%
      addProviderTiles("OpenStreetMap.BlackAndWhite") %>%
      setView(lng = mean(df.apt$lon), lat = mean(df.apt$lat), zoom = 11) %>%
      addLegend(pal = vetorCoresApt, values = df.apt$preco,
                position = "bottomright",
                layerId = "legend")

  map  
  })

     observe({
       leafletProxy("mymap") %>%
         clearMarkers() %>%
         #addMarkers(lng = myadress()$lon, lat = myadress()$lat) %>%
         addCircleMarkers(data = apt_reactive(),
                          lng = ~lon, lat = ~lat,
                          color = ~vetorCoresQuarto(preco),
                          opacity = 1.5,
                          # adicionar popup
                          popup = textoPopup(apt_reactive(), "apartamento"),
                          group = "Apartamentos")
    })
apt_reactive <- reactive({ 
    address_latlon <- geocode(input$userlocation)
    dist <- distm(x = matrix(data = c(df.apt$lon, df.apt$lat), ncol = 2), 
                  y = c(lon = address_latlon$lon, lat = address_latlon$lat), 
                  fun = distVincentySphere)
    apt.df[dist < input$distancia,]
})
addCircleMarkers(data = df.apt
addCircleMarkers(data = apt_reactive()