Возвращает элементы списка как независимые объекты в глобальную среду

#r #dataframe #vector #split

#r #среды

Вопрос:

У меня есть список, и я хотел бы разбить элементы списка на отдельные объекты в глобальной среде.

Например, я хотел бы, чтобы список:

 obj <- list(a=1:5, b=2:10, c=-5:5)
  

должно быть три отдельных объекта a , b и c .

Я пытался добиться этого с:

 lapply(obj, FUN = function(x) names(x)[1] <<- x[1])
  

Но это не удалось, с Error in names(x)[1] <<- x[1] : object 'x' not found .

Как я могу достичь своей цели?

Ответ №1:

Существует специальная функция для сопоставления списка со средой:

 > obj <- list(a=1:5, b=2:10, c=-5:5)
> ls()
[1] "obj"
> list2env(obj,globalenv())
<environment: R_GlobalEnv>
> ls()
[1] "a"   "b"   "c"   "obj"
  

P. S. Это мой комментарий, предоставленный в качестве ответа

Ответ №2:

Это также сработало бы:

 lapply(seq_along(obj), function(i) assign(names(obj)[i], obj[[i]], envir = .GlobalEnv))
  

Комментарии:

1. Возможно, вы захотите obj[[i]] вместо этого назначить векторы, а не списки одного элемента.

2. Пожалуйста, не Dason’s делает то, что вы хотите, с меньшей головной болью.

3. @ricardo, пожалуйста, взгляните на комментарий Грегори к вашему вопросу. — (другой)

4. Я никогда не люблю прикреплять данные. Есть ли веская причина нарушать это правило?

5. ответ @ ricardo Gregory не используется attach (что является плохой идеей и почему я ее не рекомендую). Опять же, если вам не нравится прикреплять данные, почему вы делаете то, что хотите сделать в вопросе, вместо того, чтобы работать непосредственно с самим списком?

Ответ №3:

В случае, если список еще не является именованным списком, нам нужно сначала задать имена, например, с увеличивающимися буквами.

 obj2 <- list(1:5, 2:10, -5:5)

list2env(setNames(obj2, letters[seq(obj2)]), envir=.GlobalEnv)
ls()
# [1] "a"    "b"    "c"    "obj2"
  

Ответ №4:

Я не рекомендую это, но вы могли бы использовать attach

 > obj <- list(a=1:5, b=2:10, c=-5:5)
> attach(obj)
> a
[1] 1 2 3 4 5
> b
[1]  2  3  4  5  6  7  8  9 10
> c
 [1] -5 -4 -3 -2 -1  0  1  2  3  4  5
  

Комментарии:

1. Это не то, о чем просил OP, он просто присоединяет объект obj к пути поиска. Это не означает, что вы назначаете элементы списка независимым объектам в глобальной среде. У Грегори правильный ответ.

2. @JorisMeys Конечно, но они никогда не говорили, почему они тоже хотели это сделать. attach позволяет вам притворяться, что они являются частью глобальной среды (по крайней мере, в простых случаях) с очень небольшим количеством работы. С учетом сказанного я определенно думаю, что ответ Грегори является лучшим из приведенных ответов.

3. Я понимаю, почему вы упомянули об этом, но использование attach создает гораздо больше проблем, чем решает, и не в последнюю очередь, когда вы пытаетесь изменить один из элементов в списке. Как сказано в Руководстве по стилю R : возможности для создания ошибок при использовании attach многочисленны. Избегайте этого.

4. @JorisMeys я согласен. Вот почему я не рекомендую это. Мне также не очень нравится вся идея, опубликованная в вопросе. Также существуют опасности, связанные с ответом Грегори