我正在使用 purrr 根据不同的 aoi 迭代地将函数应用于 sf 对象,并将输出存储在列表中,但是我无法将名称分配给嵌套列表的顶层。我认为 sf 对象与问题无关,但包括一个基于 sf 的示例以防万一。在我想要的输出中,我可以按区域名称查询列表,以提取区域和状态子列表以传递给其他映射函数,并且代码末尾的第二个 MapView 调用将产生与使用索引号进行调用相同的结果。相同的列表。
#set things up
library(spData)
library(sf)
library(tidyverse)
library(mapview)
STATES <- spData::us_states %>%
mutate(REGION=as.character(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()
##desired format but top level list not named
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)
})
##changes lower level names
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)
})
##alos changes lower level names
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)
})
##only changes one lower level names
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)
})
###in desired output these two functions woudl have same output
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")
如果输入向量被命名,则
map()
的输出将具有相同的名称。所以你可以用 purrr::set_names()
: 来命名你的区域向量
OUT_LIST <- map(set_names(REGION_NAMES), \(x){
REGION_LIST <- REGIONS[x] %>%
set_names(nm="Region")
STATE_LIST <- REGIONS_INTERSECT[x] %>%
set_names(nm="State")
c(REGION_LIST, STATE_LIST)
})
names(OUT_LIST)
# "South" "West" "Norteast" "Midwest"