Creare un nome di variabile con "incolla" in R?


89

Vedi sotto:

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

E se desidero assegnare un valore a perf.a1?

Ho provato as.name, as.symbolecc., Senza alcun risultato:

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


Risposte:


129

Puoi usare assign( doc ) per modificare il valore di perf.a1:

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

3
Perché era così difficile da trovare!
lamecicle

25
assign(paste0("perf.a", "1"), 5)è un po 'più ordinato
Louis Maddox


9

Nel mio caso la funzione eval () funziona molto bene. Di seguito genero 10 variabili e assegno loro 10 valori.

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

Non utilizzabile se l'RHS è complicato o grande. Inoltre, anche in casi semplici, c'è qualche perdita di precisione: normalmente a <- rnorm(1); a - eval(parse(text=paste(a)))non ritorna 0.

3

Nel mio caso i simboli che creo (Tax1, Tax2, ecc.) Avevano già dei valori ma volevo utilizzare un loop e assegnare i simboli ad un'altra variabile. Quindi le due risposte precedenti mi hanno dato un modo per ottenere questo risultato. Questo può essere utile per rispondere alla tua domanda poiché l'assegnazione di un valore può avvenire in qualsiasi momento successivo.

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)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.