Buat nama variabel dengan "paste" di R?


89

Lihat di bawah:

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

Bagaimana jika saya ingin memberikan nilai perf.a1?

Saya mencoba as.name,, as.symboldll., Tetapi tidak berhasil:

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


Jawaban:


129

Anda dapat menggunakan assign( doc ) untuk mengubah nilai perf.a1:

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

3
Mengapa ini sangat sulit ditemukan!
lamecicle

25
assign(paste0("perf.a", "1"), 5)sedikit lebih rapi
Louis Maddox


9

Dalam kasus saya, fungsi eval () bekerja dengan sangat baik. Di bawah ini saya menghasilkan 10 variabel dan menugaskannya 10 nilai.

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

Tidak dapat digunakan jika RHS rumit atau besar. Selain itu, bahkan dalam kasus sederhana, ada beberapa kerugian presisi: biasanya a <- rnorm(1); a - eval(parse(text=paste(a)))tidak kembali 0.

3

Dalam kasus saya, simbol yang saya buat (Tax1, Tax2, dll.) Sudah memiliki nilai tetapi saya ingin menggunakan loop dan menetapkan simbol ke variabel lain. Jadi, dua jawaban di atas memberi saya cara untuk mencapai ini. Ini mungkin berguna dalam menjawab pertanyaan Anda karena penugasan nilai dapat dilakukan kapan saja nanti.

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)
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.