R'ye "yapıştır" ile bir değişken adı mı oluşturacaksınız?


89

Aşağıya bakınız:

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

Ya bir değer atamak istersem perf.a1?

Denedim as.name, as.symbolvb. Boşuna:

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


Yanıtlar:


129

Sen kullanabilirsiniz assign( doc perf.a1 değerini değiştirmek için):

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

3
Bunu bulmak neden bu kadar zordu!
lamecicle

25
assign(paste0("perf.a", "1"), 5)biraz temiz
Louis Maddox


9

Benim durumumda eval () işlevi çok iyi çalışıyor. Aşağıda 10 değişken oluşturuyorum ve onlara 10 değer atıyorum.

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

RHS karmaşık veya büyükse kullanılamaz. Dahası, basit durumlarda bile, bir miktar hassasiyet kaybı vardır: genellikle a <- rnorm(1); a - eval(parse(text=paste(a)))geri dönmez 0.

3

Benim durumumda, oluşturduğum sembollerin (Vergi1, Vergi2, vb.) Zaten değerleri vardı, ancak bir döngü kullanmak ve sembolleri başka bir değişkene atamak istedim. Yani yukarıdaki iki cevap bana bunu başarmam için bir yol verdi. Bir değerin atanması daha sonra herhangi bir zamanda gerçekleşebileceğinden, bu, sorunuzu yanıtlamanıza yardımcı olabilir.

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)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.