通过列表循环 reverse_geo() 函数

loop reverse_geo() function through a list

我正在尝试通过列表循环 tidygeocoder 包中的 reverse_geo() 函数。

当我将函数应用于单个数据框时,它看起来像这样:

library(tidyverse, warn.conflicts = FALSE)
library(tidygeocoder)


num_coords <- 25 # number of coordinates
set.seed(103) # for reproducibility

# latitude and longitude bounds
lat_limits <- c(40.40857, 40.42585)
long_limits <- c(-3.72472, -3.66983)

# randomly sample latitudes and longitude values
random_lats <- runif(
  num_coords, 
  min = lat_limits[1], 
  max = lat_limits[2]
)

random_longs <- runif(
  num_coords, 
  min = long_limits[1], 
  max = long_limits[2]
)

# Reverse geocode the coordinates
# the speed of the query is limited to 1 coordinate per second to comply
# with Nominatim's usage policies
madrid <- reverse_geo(
  lat = random_lats, random_longs, 
  method = 'osm', full_results = TRUE,
  custom_query = list(extratags = 1, addressdetails = 1, namedetails = 1)
)

这有效并且 returns 结果。

现在,当我尝试使用 lapply 将它应用于列表的每个元素时:

#NOW try to use reverse_geo() looping through a list


df1<- data.frame(random_lats,random_longs)
df2<- data.frame(random_lats,random_longs) 
list <- list(df1, df2)

data_frame_list = lapply(list, function(x) reverse_geo (lat = x[["random_lats"]], long = x[["random_longs"]], "osm", 
                                                        TRUE, list(extratags = 1, addressdetails = 1, namedetails = 1)))

我得到错误:错误:limit must be NULL or >= 1. See ?reverse_geo

我认为是因为 reverse_geo() 没有正确看到纬度和经度向量 bc 我没有正确传递到 lapply()。

关于如何使用 lappyly 或 purrr::map() 解决此问题的任何建议?我对使用其中一个没有偏好——只是想避免使用 for 循环。

您没有遇到 latlon 的问题,您正在做的是将未命名的参数传递给 reverse_geo(),但这些参数的位置不正确。如果您确定它们将处于正确的位置,您应该只按位置传递参数。

你有:

data_frame_list = lapply(list, function(x) reverse_geo (
  lat = x[["random_lats"]],
  long = x[["random_longs"]],
  "osm", 
  TRUE,
  list(extratags = 1, addressdetails = 1, namedetails = 1)))

因此,"osm"TRUE 和您的 list(...) 将传递给 latlong 之后的 3 个参数。它们是:

  1. method:它确实接受 "osm",所以没问题。
  2. address:要输出的地址列的名称,我很确定你不想调用 TRUE
  3. limit:必须是数字,每个坐标的结果限制。然而你传递的是 list(...)

显然,您的错误陈述突出了问题:

#> Error: limit must be NULL or >= 1. See ?reverse_geo

您需要使用适合的参数名称显式传递这些参数。我不确切知道您想将 TRUElist(...) 传递给哪个参数,但下面的代码运行。

data_frame_list = lapply(list, function(x) reverse_geo (
  lat = x[["random_lats"]],
  long = x[["random_longs"]],
  method = "osm", 
  flatten = TRUE,
  custom_query = list(extratags = 1, addressdetails = 1, namedetails = 1)))