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

Jawaban:

129

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

> assign(paste("perf.a", "1", sep=""),5)
> perf.a1
[1] 5
lecodesportif.dll
sumber
3
Mengapa ini sangat sulit ditemukan!
lamecicle
25
assign(paste0("perf.a", "1"), 5)sedikit lebih rapi
Louis Maddox
15

Lihat ?assign.

> assign(paste("tra.", 1, sep = ""), 5)
> tra.1
  [1] 5
Roman Luštrik
sumber
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))
Michael Romanov
sumber
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)
}
John Hedgepeth
sumber