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


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

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

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

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

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

target of assignment expands to non-language object

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

6 76

6 ответов:

использовать assign:

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

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

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

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

иначе assign - это именно то, что вы хотите.

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

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

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

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

еще одно хитрое решение-назвать элементы списка и 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

FAQ говорит:

если у вас

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

можно сделать

get(varname[1]) + 2

на

a + 2

или

assign(varname[1], 2 + 2)

на

a <- 2 + 2

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

синтаксис назначение: назначить(х, значение)

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

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

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

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

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