通过列表循环 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 循环。
您没有遇到 lat
或 lon
的问题,您正在做的是将未命名的参数传递给 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(...)
将传递给 lat
和 long
之后的 3 个参数。它们是:
method
:它确实接受 "osm"
,所以没问题。
address
:要输出的地址列的名称,我很确定你不想调用 TRUE
limit
:必须是数字,每个坐标的结果限制。然而你传递的是 list(...)
显然,您的错误陈述突出了问题:
#> Error: limit must be NULL or >= 1. See ?reverse_geo
您需要使用适合的参数名称显式传递这些参数。我不确切知道您想将 TRUE
或 list(...)
传递给哪个参数,但下面的代码运行。
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)))
我正在尝试通过列表循环 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 循环。
您没有遇到 lat
或 lon
的问题,您正在做的是将未命名的参数传递给 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(...)
将传递给 lat
和 long
之后的 3 个参数。它们是:
method
:它确实接受"osm"
,所以没问题。address
:要输出的地址列的名称,我很确定你不想调用TRUE
limit
:必须是数字,每个坐标的结果限制。然而你传递的是list(...)
显然,您的错误陈述突出了问题:
#> Error: limit must be NULL or >= 1. See ?reverse_geo
您需要使用适合的参数名称显式传递这些参数。我不确切知道您想将 TRUE
或 list(...)
传递给哪个参数,但下面的代码运行。
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)))