【问题标题】:Change names of lists at once一次更改列表名称
【发布时间】:2020-03-04 12:28:09
【问题描述】:

我有列表,我希望他们的名字用小写字母。 我不想用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"。 为什么这不起作用?我明确使用了&lt;&lt;- 而不是&lt;-,但名称没有改变。我能做什么?

【问题讨论】:

  • 还是同样的问题。

标签: r list purrr stringr


【解决方案1】:

为什么不呢?

names(a) <- tolower(names(a))
names(b) <- tolower(names(b))

【讨论】:

    【解决方案2】:
    library(purrr)
    a <- list(Header = 1, Body = 1)
    b <- list(Header = 3, Body = 2)
    

    我猜你打算通过purrr::walk 更改全局变量。这是使符号 "&lt;&lt;-" 起作用的选择:

    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
    

    【讨论】:

      【解决方案3】:

      如果我理解正确,您希望全局分配小写名称。要同时对所有选定对象 c("a", "b") 执行此操作,您可以在函数中从全局环境中 get 它们,降低名称,并将转换后的对象 assign 转换为旧对象(覆盖)。

      lapply(c("a", "b"), function(x) {
        d <- get(x, envir=.GlobalEnv)
        names(d) <- tolower(names(d))
        assign(x, d, envir=.GlobalEnv)
      })
      
      names(a)
      # [1] "header" "body"  
      names(b)
      # [1] "header" "body"  
      

      数据

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多