2010-04-20 4 views
69

Возможно ли создать новые имена переменных на лету?Как назвать переменные «на лету»?

Я хотел бы прочитать кадры данных из списка в новые переменные с номерами в конце. Что-то вроде orca1, orca2, orca3 ...

Если я пытаюсь что-то вроде

paste("orca",i,sep="")=list_name[[i]] 

Я получаю эту ошибку

target of assignment expands to non-language object 

Есть еще один способ обойти это?

+7

Пока мы даем теги r-faq, давайте дадим ссылку (FAQ 7.21: http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I -turn-a-string-in-a-variable_003f) –

ответ

93

Использование правопреемником:

assign(paste("orca",i,sep=""), list_name[[i]]) 
+26

Вот как это сделать. Здесь есть мета-вопрос, который: «Должен ли я это сделать?» Ответ почти всегда «нет». Именованные элементы в списке почти всегда предпочтительны. –

+17

Ответ почти всегда «нет», за исключением случаев, когда это не так. – Shane

+8

Ну, конечно. Но большинство людей, которые ищут этот ответ, не делают этого с позиции отклонения списка для своего заявления. –

30

Мне кажется, что вы могли бы быть лучше со списком, а не с помощью orca1, orca2 и т.д., ... то это будет orca[1], orca[2] ...

Обычно вы делаете список переменных, дифференцированных ничем, кроме числа, потому что это число будет удобным способом доступа к ним позже.

orca <- list() 
orca[1] <- "Hi" 
orca[2] <- 59 

В противном случае assign - это именно то, что вы хотите.

+9

Согласен. Обычно, когда люди думают, что хотят называть переменные «на лету», то, что они действительно хотят, это другая структура данных. –

+8

+1 (FAQ 7.21: http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f) это прекрасно обсуждается –

0

Другим сложным решением является назвать элементы списка и attach оно:

list_name = list(
    head(iris), 
    head(swiss), 
    head(airquality) 
    ) 

names(list_name) <- paste("orca", seq_along(list_name), sep="") 
attach(list_name) 

orca1 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   5.1   3.5   1.4   0.2 setosa 
# 2   4.9   3.0   1.4   0.2 setosa 
# 3   4.7   3.2   1.3   0.2 setosa 
# 4   4.6   3.1   1.5   0.2 setosa 
# 5   5.0   3.6   1.4   0.2 setosa 
# 6   5.4   3.9   1.7   0.4 setosa 
+13

сложно, но не мудрый. если ответ «attach», вы обычно задаете неправильный вопрос ... –

9

Не делают кадры данных. Сохраните список, назовите его элементы, но не присоедините его.

Самой большой причиной этого является то, что если вы делаете переменные на ходу, почти всегда вам придется перебирать каждую из них, чтобы выполнить что-то полезное. Там вам снова придется перебирать каждое из имен, которые вы создали на лету.

Намного легче назвать элементы списка и перебрать имена.

Что касается приложения, то его плохая практика программирования в R и может привести к большим проблемам, если вы не будете осторожны.

-2

И этот вариант?

list_name<-list() 
for(i in 1:100){ 
    paste("orca",i,sep="")->list_name[[i]] 
} 

Он отлично работает. В приведенном примере первая строка отсутствует, а затем появляется сообщение об ошибке.

+3

Это не касается вопроса OP. У нас есть список с dataframes, и мы хотим назначить его на dataframes, называемые orca1, orca2 и т. Д. – zx8754

 Смежные вопросы

  • Нет связанных вопросов^_^