如何为purrr函数生成的嵌套列表顶层命名
为purrr生成的嵌套列表顶层分配名称问题
我正在使用purrr针对不同AOI迭代处理sf对象,并将输出存储为嵌套列表,但无法为列表的顶层分配名称。我认为sf对象与该问题无关,但仍附上基于sf的示例。期望输出可通过区域名称查询列表,提取区域和州子列表用于其他映射函数,且末尾两个mapview调用结果一致。
环境与数据准备
# 加载所需包 library(spData) library(sf) library(tidyverse) library(mapview) # 处理美国州数据,转换REGION为字符型 STATES <- spData::us_states %>% mutate(REGION=as.character(REGION)) # 按REGION分组并拆分,为列表命名 REGIONS <- STATES %>% group_by(REGION) %>% summarise() %>% group_by(REGION) %>% group_split(.keep = T) %>% set_names(., nm=map(., \(x) first(x$REGION))) # 计算每个区域与州的交集 REGIONS_INTERSECT <- REGIONS %>% map( \(x) st_intersection(STATES, x)) # 获取唯一的区域名称 REGION_NAMES <- as.character(STATES$REGION) %>% unique()
尝试的几种写法(均未达到预期)
写法1:格式符合要求,但顶层列表无名称
OUT_LIST <- map(REGION_NAMES, \(x){ REGION_LIST <- REGIONS[x] %>% set_names(nm="Region") STATE_LIST <- REGIONS_INTERSECT[x] %>% set_names(nm="State") OUTPUT <- c(REGION_LIST, STATE_LIST ) return(OUTPUT) })
写法2:修改了下层列表的名称,而非顶层
OUT_LIST <- map(REGION_NAMES, \(x){ REGION_LIST <- REGIONS[x] %>% set_names(nm="Region") STATE_LIST <- REGIONS_INTERSECT[x] %>% set_names(nm="State") OUTPUT <- c(REGION_LIST, STATE_LIST ) %>% set_names(., nm=x) return(OUTPUT) })
写法3:同样修改了下层列表名称
OUT_LIST <- map(REGION_NAMES, \(x){ REGION_LIST <- REGIONS[x] %>% set_names(nm="Region") STATE_LIST <- REGIONS_INTERSECT[x] %>% set_names(nm="State") x <- c(REGION_LIST, STATE_LIST ) return(OUTPUT) })
写法4:仅修改了一个下层列表的名称
OUT_LIST <- map(REGION_NAMES, \(x){ REGION_LIST <- REGIONS[x] %>% set_names(nm="Region") STATE_LIST <- REGIONS_INTERSECT[x] %>% set_names(nm="State") OUTPUT <- c(REGION_LIST, STATE_LIST ) names(OUTPUT)<-x return(OUTPUT) })
预期目标
在理想的输出中,以下两个mapview调用的结果完全一致:
mapview(OUT_LIST[[1]][[1]])+mapview(OUT_LIST[[1]][[2]], col.regions="red") mapview(OUT_LIST[["South"]][["Region"]])+mapview(OUT_LIST[["South"]][["State"]], col.regions="red")
内容的提问来源于stack exchange,提问作者BEVAN
相关产品推荐
相关产品推荐

