¿Crear un nombre de variable con "pegar" en R?

87

Vea abajo:

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

¿Qué pasa si quiero asignar un valor a perf.a1?

Lo intenté as.name, as.symboletc., sin éxito:

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
qed
fuente

Respuestas:

126

Puede usar assign( doc ) para cambiar el valor de perf.a1:

> assign(paste("perf.a", "1", sep=""),5)
> perf.a1
[1] 5
lecodesportif
fuente
3
¿Por qué fue tan difícil de encontrar?
lamecicle
25
assign(paste0("perf.a", "1"), 5)es un poco más ordenado
Louis Maddox
15

Ver ?assign.

> assign(paste("tra.", 1, sep = ""), 5)
> tra.1
  [1] 5
Roman Luštrik
fuente
9

En mi caso, la función eval () funciona muy bien. A continuación, genero 10 variables y les asigno 10 valores.

lhs <- rnorm(10)
rhs <- paste("perf.a", 1:10, "<-", lhs, sep="")
eval(parse(text=rhs))
Miguel Romanov
fuente
No se puede utilizar si el RHS es complicado o grande. Además, incluso en casos simples, existe cierta pérdida de precisión: a <- rnorm(1); a - eval(parse(text=paste(a)))no 0suele regresar .
3

En mi caso, los símbolos que creo (Tax1, Tax2, etc.) ya tenían valores pero quería usar un bucle y asignar los símbolos a otra variable. Entonces, las dos respuestas anteriores me dieron una forma de lograr esto. Esto puede ser útil para responder a su pregunta, ya que la asignación de un valor puede tener lugar en cualquier momento posterior.

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)
}
John Hedgepeth
fuente