Créer un nom de variable avec «coller» dans R?


87

Voir ci-dessous:

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

Et si je veux attribuer une valeur à perf.a1?

J'ai essayé as.name, as.symboletc., sans succès:

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


Réponses:


126

Vous pouvez utiliser assign( doc ) pour modifier la valeur de perf.a1:

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

3
Pourquoi était-ce si difficile à trouver!
lamecicle

25
assign(paste0("perf.a", "1"), 5)is a bit neater
Louis Maddox


9

Dans mon cas, la fonction eval () fonctionne très bien. Ci-dessous, je génère 10 variables et leur attribue 10 valeurs.

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

Non utilisable si le RHS est compliqué ou gros. De plus, même dans les cas simples, il y a une certaine perte de précision: a <- rnorm(1); a - eval(parse(text=paste(a)))ne revient 0généralement pas.

3

Dans mon cas, les symboles que je crée (Tax1, Tax2, etc.) avaient déjà des valeurs mais je voulais utiliser une boucle et assigner les symboles à une autre variable. Ainsi, les deux réponses ci-dessus m'ont donné un moyen d'accomplir cela. Cela peut être utile pour répondre à votre question car l'attribution d'une valeur peut avoir lieu à tout moment plus tard.

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)
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.