如何命名在 purr 函数中创建的最高级别的列表

问题描述 投票:0回答:1

我正在使用 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")
r purrr
1个回答
0
投票

如果输入向量被命名,则

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" 
© www.soinside.com 2019 - 2024. All rights reserved.