在 `purrr::map()` 中使用常量作为函数参数
Use constant as a function argument in `purrr::map()`
考虑以下表示,我想检查每行中的点是否在给定的边界框中。
library(purrr)
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
validate_lonlat <- function(lon, lat, bbox) {
if (is.na(lat) | is.na(lon)) {
return(FALSE)
}
if (lon <= bbox[["xmin"]] | lon >= bbox[["xmax"]]) {
return(FALSE)
}
if (lat <= bbox[["ymin"]] | lat >= bbox[["ymax"]]) {
return(FALSE)
}
return(TRUE)
}
lonlat_test <- data.frame(
lon = c(NA, NA, 100, 114, 114.3, 114.3),
lat = c(NA, 20, 20, 22.3, 22.5, 22.7)
)
BOUNDING_BOX <- c(xmin = 113.824223, ymin = 22.138010, xmax = 114.553484, ymax = 22.571833)
lonlat_test %>%
mutate(
bbox = list(BOUNDING_BOX)
) %>%
mutate(
is_valid_lonlat = pmap_lgl(list(lon, lat, bbox), validate_lonlat)
)
#> lon lat bbox is_valid_lonlat
#> 1 NA NA 113.82422, 22.13801, 114.55348, 22.57183 FALSE
#> 2 NA 20.0 113.82422, 22.13801, 114.55348, 22.57183 FALSE
#> 3 100.0 20.0 113.82422, 22.13801, 114.55348, 22.57183 FALSE
#> 4 114.0 22.3 113.82422, 22.13801, 114.55348, 22.57183 TRUE
#> 5 114.3 22.5 113.82422, 22.13801, 114.55348, 22.57183 TRUE
#> 6 114.3 22.7 113.82422, 22.13801, 114.55348, 22.57183 FALSE
由 reprex package (v0.3.0)
于 2021 年 3 月 12 日创建
代码有效。但是,我想知道是否可以在 map()
中使用常量作为参数?当我在map()
中直接使用常量BOUNDING_BOX
时,出现错误。
latlon_test %>%
mutate(
is_valid_lonlat = pmap_lgl(list(lon, lat, BOUNDING_BOX), validate_lonlat)
)
#> Error: Problem with `mutate()` input `is_valid_lonlat`.
#> x Element 3 of `.l` must have length 1 or 6, not 4
#> ℹ Input `is_valid_lonlat` is `pmap_lgl(list(lon, lat, BOUNDING_BOX), validate_lonlat)`.
由 reprex package (v0.3.0)
于 2021 年 3 月 12 日创建
将BOUNDING_BOX
包裹在list
中进行回收,因为'BOUNDING_BOX'是length
4的命名vector
,所以单位是每个'BOUNDING_BOX' 的元素。用 list
包裹,将单位从向量元素转移到 list
元素,后者被回收
lonlat_test %>%
mutate(
is_valid_lonlat = pmap_lgl(list(lon, lat, list(BOUNDING_BOX)),
validate_lonlat)
)
-输出
# lon lat is_valid_lonlat
#1 NA NA FALSE
#2 NA 20.0 FALSE
#3 100.0 20.0 FALSE
#4 114.0 22.3 TRUE
#5 114.3 22.5 TRUE
#6 114.3 22.7 FALSE
考虑以下表示,我想检查每行中的点是否在给定的边界框中。
library(purrr)
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
validate_lonlat <- function(lon, lat, bbox) {
if (is.na(lat) | is.na(lon)) {
return(FALSE)
}
if (lon <= bbox[["xmin"]] | lon >= bbox[["xmax"]]) {
return(FALSE)
}
if (lat <= bbox[["ymin"]] | lat >= bbox[["ymax"]]) {
return(FALSE)
}
return(TRUE)
}
lonlat_test <- data.frame(
lon = c(NA, NA, 100, 114, 114.3, 114.3),
lat = c(NA, 20, 20, 22.3, 22.5, 22.7)
)
BOUNDING_BOX <- c(xmin = 113.824223, ymin = 22.138010, xmax = 114.553484, ymax = 22.571833)
lonlat_test %>%
mutate(
bbox = list(BOUNDING_BOX)
) %>%
mutate(
is_valid_lonlat = pmap_lgl(list(lon, lat, bbox), validate_lonlat)
)
#> lon lat bbox is_valid_lonlat
#> 1 NA NA 113.82422, 22.13801, 114.55348, 22.57183 FALSE
#> 2 NA 20.0 113.82422, 22.13801, 114.55348, 22.57183 FALSE
#> 3 100.0 20.0 113.82422, 22.13801, 114.55348, 22.57183 FALSE
#> 4 114.0 22.3 113.82422, 22.13801, 114.55348, 22.57183 TRUE
#> 5 114.3 22.5 113.82422, 22.13801, 114.55348, 22.57183 TRUE
#> 6 114.3 22.7 113.82422, 22.13801, 114.55348, 22.57183 FALSE
由 reprex package (v0.3.0)
于 2021 年 3 月 12 日创建代码有效。但是,我想知道是否可以在 map()
中使用常量作为参数?当我在map()
中直接使用常量BOUNDING_BOX
时,出现错误。
latlon_test %>%
mutate(
is_valid_lonlat = pmap_lgl(list(lon, lat, BOUNDING_BOX), validate_lonlat)
)
#> Error: Problem with `mutate()` input `is_valid_lonlat`.
#> x Element 3 of `.l` must have length 1 or 6, not 4
#> ℹ Input `is_valid_lonlat` is `pmap_lgl(list(lon, lat, BOUNDING_BOX), validate_lonlat)`.
由 reprex package (v0.3.0)
于 2021 年 3 月 12 日创建将BOUNDING_BOX
包裹在list
中进行回收,因为'BOUNDING_BOX'是length
4的命名vector
,所以单位是每个'BOUNDING_BOX' 的元素。用 list
包裹,将单位从向量元素转移到 list
元素,后者被回收
lonlat_test %>%
mutate(
is_valid_lonlat = pmap_lgl(list(lon, lat, list(BOUNDING_BOX)),
validate_lonlat)
)
-输出
# lon lat is_valid_lonlat
#1 NA NA FALSE
#2 NA 20.0 FALSE
#3 100.0 20.0 FALSE
#4 114.0 22.3 TRUE
#5 114.3 22.5 TRUE
#6 114.3 22.7 FALSE