Erstellen Sie einen Variablennamen mit "Einfügen" in R?


86

Siehe unten:

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

Was ist, wenn ich einen Wert zuweisen möchte perf.a1?

Ich habe versucht as.name, as.symboletc., ohne Erfolg:

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


Antworten:


125

Mit assign( doc ) können Sie den Wert von perf.a1 ändern:

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

3
Warum war das so schwer zu finden!
Lamecicle

25
assign(paste0("perf.a", "1"), 5)ist ein bisschen ordentlicher
Louis Maddox


9

In meinem Fall funktioniert die Funktion eval () sehr gut. Unten generiere ich 10 Variablen und weise ihnen 10 Werte zu.

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

Nicht verwendbar, wenn die RHS kompliziert oder groß ist. Darüber hinaus gibt es auch in einfachen Fällen einen gewissen Präzisionsverlust: a <- rnorm(1); a - eval(parse(text=paste(a)))kehrt 0normalerweise nicht zurück .

3

In meinem Fall hatten die von mir erstellten Symbole (Tax1, Tax2 usw.) bereits Werte, aber ich wollte eine Schleife verwenden und die Symbole einer anderen Variablen zuweisen. Die beiden obigen Antworten gaben mir einen Weg, dies zu erreichen. Dies kann bei der Beantwortung Ihrer Frage hilfreich sein, da die Zuweisung eines Werts jederzeit später erfolgen kann.

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)
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.