【问题标题】:Use constant as a function argument in `purrr::map()`在 purrr::map() 中使用常量作为函数参数
【发布时间】:2021-06-09 20:21:48
【问题描述】:

考虑以下我想检查每行中的点是否在给定边界框中的代表。

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-03-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 日创建

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 2017-07-19
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2020-02-03
      相关资源
      最近更新 更多