簡體   English   中英

立即更改列表名稱

[英]Change names of lists at once

我有列表,我希望他們的名字用小寫字母。 我不想使用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" 為什么這不起作用? 我明確使用了<<-而不是<-但名稱沒有改變。 我能做什么?

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

為什么不?

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

如果我理解正確,您希望對小寫名稱進行全局分配。 要一次對所有選定的對象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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM