【发布时间】:2019-04-20 05:03:52
【问题描述】:
在谷歌地图中,搜索输入框会在用户键入时自动完成地址。有没有办法在 R Shiny 中访问自动完成值以便与映射包一起使用?
有一个javascript方法here。我尝试在下面的代码中在 R Shiny 中使用此方法。 SymbolixAU 指出使用google_map( search_box = TRUE ) 这是一个简单的解决方案。不幸的是,它在我的代码中不起作用,而且我希望搜索框与地图分开。
下面的尝试在页面上按此顺序有一个文本输入my_address、文本输出copy_of_address 和一个googleway 地图my_map。
预期的行为是让用户在文本输入my_address 中输入文本,让它自动完成一个地址(这可行),地址将被复制到文本输出copy_of_address 中(这只显示输入的内容,不是自动完成的版本),最后地图将以该地址为中心。
看到输入框有自动完成地址,但是地址和地图的副本只使用用户输入的文本。
在下面的代码中,将 MyKey 替换为您的 google api 密钥(有时可以使用空字符串)。
library(shiny)
library(googleway)
key <- "MyKey"
set_key(key = key)
google_keys()
ui <- shiny::basicPage(
div(
textInput(inputId = "my_address", label = "")
,textOutput(outputId = "copy_of_address")
,HTML(paste0("
<script>
function initAutocomplete() {
new google.maps.places.Autocomplete(
(document.getElementById('my_address')),
{types: ['geocode']}
);
}
</script>
<script src='https://maps.googleapis.com/maps/api/js?key=", key,"&libraries=places&callback=initAutocomplete'
async defer></script>
"))
,google_mapOutput(outputId = "my_map")
)
)
server <- function(input, output) {
my_address <- reactive({
input$my_address
})
output$copy_of_address <- renderText({
my_address()
})
output$my_map <- renderGoogle_map({
my_address <- my_address()
validate(
need(my_address, "Address not available")
)
df <- google_geocode(address = my_address)
my_coords <- geocode_coordinates(df)
my_coords <- c(my_coords$lat[1], my_coords$lng[1])
google_map(
location = my_coords,
zoom = 12,
map_type_control = FALSE,
zoom_control = FALSE,
street_view_control = FALSE
)
})
}
shinyApp(ui, server)
【问题讨论】:
-
您是在地图上使用它,还是独立于地图(即单独的小部件)?
-
目前我在用于地址的文本框下方有一张地图 - 所以它不独立于地图。输入后地图会以地址为中心。
-
如果您使用
google_map( search_box = TRUE ),它将在地图上放置一个搜索框并自动完成 -
here's an example of a shiny,使用搜索框,观察用户搜索的结果。
-
有没有办法让搜索框在地图之外但仍然可以协同工作?用例是先输入地址,再显示地图。
标签: r autocomplete shiny r-leaflet googleway