Измените названия списков сразу - PullRequest
1 голос
/ 04 марта 2020

У меня есть списки, и я хочу, чтобы их имена были строчными. Я не хочу использовать for-l oop, я хочу использовать функцию 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". Почему это не работает? Я явно использовал <<-, а не <-, но имена не меняются. Что я могу сделать?

Ответы [ 3 ]

2 голосов
/ 04 марта 2020

Почему бы и нет?

names(a) <- tolower(names(a))
names(b) <- tolower(names(b))
2 голосов
/ 04 марта 2020
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
0 голосов
/ 04 марта 2020

Если я вас правильно понимаю, вы хотите глобальное присваивание именам в нижнем регистре. Чтобы сделать это сразу для всех выделенных объектов 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)
...