Как назвать переменные на лету? - PullRequest
85 голосов
/ 21 апреля 2010

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

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

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

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

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

target of assignment expands to non-language object

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

Ответы [ 6 ]

107 голосов
/ 21 апреля 2010

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

assign(paste("orca", i, sep = ""), list_name[[i]])
32 голосов
/ 21 апреля 2010

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

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

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

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

9 голосов
/ 07 октября 2013

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

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

Гораздо проще называть элементы списка и перебирать имена.

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

2 голосов
/ 05 апреля 2018

FAQ говорит:

Если у вас есть

varname <- c("a", "b", "d")

вы можете сделать

get(varname[1]) + 2

для

a + 2

или

assign(varname[1], 2 + 2)

для

a <- 2 + 2

Так что похоже, что вы используете GET, когда вы хотите оценить формулу, которая использует переменную (например, конкатенацию), и ASSIGN, когда вы хотите присвоить значение предварительно объявленной переменной.

Синтаксис для присвоения: назначить (х, значение)

x: имя переменной, заданной в виде строки символов. Принуждение не выполняется, и будет использоваться первый элемент вектора символов, длина которого больше единицы, с предупреждением.

значение: значение, которое будет присвоено x.

0 голосов
/ 27 октября 2016

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

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

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

0 голосов
/ 21 апреля 2010

Другое хитрое решение - назвать элементы списка и 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...