首页 > 解决方案 > 一次更改列表名称

问题描述

我有列表,我希望他们的名字用小写字母。我不想使用 for 循环,我想使用purrr

> library(purrr)
> a <- list(Header = 1, Body = 1)
> b <- list(Header = 3, Body = 2)
> list(a, b) %>%
+   walk(~ {names(.x) <<- str_to_lower(names(.x))})
> a
$Header
[1] 1

$Body
[1] 1

> b
$Header
[1] 3

$Body
[1] 2

名称应该是"header""body"。为什么这不起作用?我明确使用了<<-<-但名称没有改变。我能做些什么?

标签: rlistpurrrstringr

解决方案


library(purrr)
a <- list(Header = 1, Body = 1)
b <- list(Header = 3, Body = 2)

我猜您打算将全局变量更改为purrr::walk. 这是使符号"<<-"起作用的选择:

c("a", "b") %>%
  walk(~ eval(parse(text = paste0("names(", ., ")<<-tolower(names(", ., "))"))))

此外,您可以使用assign(..., pos = 1)来更改全局变量。

list(a = a, b = b) %>%
  iwalk(~ assign(.y, set_names(.x, tolower(names(.x))), pos = 1))

查看

a

# $header
# [1] 1
# 
# $body
# [1] 1

b

# $header
# [1] 3
# 
# $body
# [1] 2

推荐阅读