Створити ім'я змінної з “вставити” в R?


87

Дивіться нижче:

paste("perf.a", "1", sep="")
# [1] "perf.a1"

Що робити, якщо я хочу призначити значення perf.a1?

Я спробував as.name, as.symbolі т.д., без толку:

as.name(paste("perf.a", "1", sep="")) = 5
# Error in as.name(paste("perf.a", "1", sep = "")) = 5 : 
#   target of assignment expands to non-language object
as.symbol(paste("perf.a", "1", sep="")) = 5
# Error in as.symbol(paste("perf.a", "1", sep = "")) = 5 : 
#   target of assignment expands to non-language object
noquote(paste("perf.a", "1", sep="")) = 5
# Error in noquote(paste("perf.a", "1", sep = "")) = 5 : 
#   target of assignment expands to non-language object


Відповіді:


126

Ви можете використовувати assign( doc ), щоб змінити значення perf.a1:

> assign(paste("perf.a", "1", sep=""),5)
> perf.a1
[1] 5

3
Чому це було так важко знайти!
lamecicle

25
assign(paste0("perf.a", "1"), 5)трохи акуратніше
Луїс Меддокс,


9

У моєму випадку функція eval () працює дуже добре. Нижче я генерую 10 змінних і присвоюю їм 10 значень.

lhs <- rnorm(10)
rhs <- paste("perf.a", 1:10, "<-", lhs, sep="")
eval(parse(text=rhs))

Не використовується, якщо RHS складний або великий. Більше того, навіть у простих випадках спостерігається деяка втрата точності: a <- rnorm(1); a - eval(parse(text=paste(a)))зазвичай не повертається 0.

3

У моєму випадку створені мною символи (Tax1, Tax2 тощо) вже мали значення, але я хотів використовувати цикл і призначити символи іншій змінній. Тож дві наведені вище відповіді дали мені спосіб цього досягти. Це може бути корисним для відповіді на ваше запитання, оскільки присвоєння значення може відбутися в будь-який час пізніше.

output=NULL
for(i in 1:8){
   Tax=eval(as.symbol(paste("Tax",i,sep="")))
   L_Data1=L_Data_all[which(L_Data_all$Taxon==Tax[1] | L_Data_all$Taxon==Tax[2] | L_Data_all$Taxon==Tax[3] | L_Data_all$Taxon==Tax[4] | L_Data_all$Taxon==Tax[5]),]
   L_Data=L_Data1$Length[which(L_Data1$Station==Plant[1] | L_Data1$Station==Plant[2])]
   h=hist(L_Data,breaks=breaks,plot=FALSE)
   output=cbind(output,h$counts)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.