Как назвать переменные "на лету"?

Можно ли создавать новые имена переменных на лету?

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

Если я попробую что-то вроде

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

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

target of assignment expands to non-language object

Есть ли другой способ?

Ответ 1

Использовать назначение:

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Еще одно сложное решение - назвать элементы списка и attach it:

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

Ответ 5

И эта опция?

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

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