应用嵌套列表名称:嵌套列表名称中的子输出字符

Tyl*_*ker 7 recursion r list

我有一个未知结构的列表(嵌套)总是以命名向量终止.我想用列表中的所有句点或原子向量名替换下划线.有rapply申请functios列出的元素,但如何申请在列表/原子向量的名字?我是基于R的解决方案,但请为其他人分享所有解决方案.

MWE

x <- list(
    urban = list(
        cars = c('volvo', 'ford'),
        food.dining = list(
            local.business = c('carls'),
            chain.business = c('dennys', 'panera')
        )
    ),
    rural = list(
        land.use = list(
            farming =list(
                dairy = c('cows'),
                vegie.plan = c('carrots')
            )
        ),
        social.rec = list(
            community.center = c('town.square')
        ),
        people.type = c('good', 'bad', 'in.between')
    ),
    other.locales = c('suburban'),
    missing = list(
        unknown = c(),
        known = c()
    ),
    end = c('wow')
)
Run Code Online (Sandbox Code Playgroud)

期望的结果

## $urban
## $urban$cars
## [1] "volvo" "ford" 
## 
## $urban$food_dining
## $urban$food_dining$local_business
## [1] "carls"
## 
## $urban$food_dining$chain_business
## [1] "dennys" "panera"
## 
## 
## 
## $rural
## $rural$land_use
## $rural$land_use$farming
## $rural$land_use$farming$dairy
## [1] "cows"
## 
## $rural$land_use$farming$vegie_plan
## [1] "carrots"
## 
## 
## 
## $rural$social_rec
## $rural$social_rec$community_center
## [1] "town.square"
## 
## 
## $rural$people_type
## [1] "good"       "bad"        "in.between"
## 
## 
## $other_locales
## [1] "suburban"
## 
## $missing
## $missing$unknown
## NULL
## 
## $missing$known
## NULL
## 
## 
## $end
## [1] "wow"
Run Code Online (Sandbox Code Playgroud)

Flo*_*ian 5

这是一个递归函数的想法.它首先用下划线替换名称中的句点.然后它检查元素的类list是否是,如果是,则它将该函数应用于该元素.否则,如果类是character,则用其下划线替换其元素中的句点.请注意,如果data.frames在列表中有例如必须是函数中定义的扩展名,则这将不起作用.希望这可以帮助!

功能:

my_func <- function(x)
{
    names(x) <- gsub('\\.','_',names(x) )
    for(i in 1:length(x))
    {
      if(any(class(x[[i]])=='list'))
      {
        x[[i]] <- my_func(x[[i]])
      }
    }
    return(x)
}
y <- my_func(x)
Run Code Online (Sandbox Code Playgroud)

数据:

x <- list(
  urban = list(
    cars = c('volvo', 'ford'),
    food.dining = list(
      local.business = c('carls'),
      chain.business = c('dennys', 'panera')
    )
  ),
  rural = list(
    land.use = list(
      farming =list(
        dairy = c('cows'),
        vegie.plan = c('carrots')
      )
    ),
    social.rec = list(
      community.center = c('town.square')
    ),
    people.type = c('good', 'bad', 'in.between')
  ),
  other.locales = c('suburban'),
  missing = list(
    unknown = c(),
    known = c()
  ),
  end = c('wow')
)
Run Code Online (Sandbox Code Playgroud)

输出:

 str(y)

List of 5
 $ urban        :List of 2
  ..$ cars       : chr [1:2] "volvo" "ford"
  ..$ food_dining:List of 2
  .. ..$ local_business: chr "carls"
  .. ..$ chain_business: chr [1:2] "dennys" "panera"
 $ rural        :List of 3
  ..$ land_use   :List of 1
  .. ..$ farming:List of 2
  .. .. ..$ dairy     : chr "cows"
  .. .. ..$ vegie_plan: chr "carrots"
  ..$ social_rec :List of 1
  .. ..$ community_center: chr "town.square"
  ..$ people_type: chr [1:3] "good" "bad" "in.between"
 $ other_locales: chr "suburban"
 $ missing      :List of 2
  ..$ unknown: NULL
  ..$ known  : NULL
 $ end          : chr "wow"
Run Code Online (Sandbox Code Playgroud)