สร้างชื่อตัวแปรด้วย "วาง" ใน R?


89

ดูด้านล่าง:

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

จะเกิดอะไรขึ้นถ้าฉันต้องการกำหนดค่าให้perf.a1?

ฉันพยายามas.name, as.symbolและอื่น ๆ ที่มีประโยชน์:

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


คำตอบ:


129

คุณสามารถใช้assign( doc ) เพื่อเปลี่ยนค่าของ perf.a1:

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

3
ทำไมหายากจัง!
lamecicle

25
assign(paste0("perf.a", "1"), 5)ค่อนข้างเรียบง่าย
Louis Maddox


9

ในกรณีของฉันฟังก์ชัน eval () ทำงานได้ดีมาก ด้านล่างฉันสร้างตัวแปร 10 ตัวและกำหนดค่า 10 ค่า

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

ไม่สามารถใช้งานได้หาก RHS มีความซับซ้อนหรือใหญ่โต ยิ่งไปกว่านั้นแม้ในกรณีง่ายๆก็มีการสูญเสียความแม่นยำบางอย่าง: a <- rnorm(1); a - eval(parse(text=paste(a)))ไม่ได้กลับมาตาม0ปกติ

3

ในกรณีของฉันสัญลักษณ์ที่ฉันสร้าง (Tax1, Tax2 ฯลฯ ) มีค่าอยู่แล้ว แต่ฉันต้องการใช้การวนซ้ำและกำหนดสัญลักษณ์ให้กับตัวแปรอื่น ดังนั้นคำตอบสองข้อข้างต้นทำให้ฉันมีวิธีทำสิ่งนี้ให้สำเร็จ สิ่งนี้อาจเป็นประโยชน์ในการตอบคำถามของคุณเนื่องจากการกำหนดค่าสามารถเกิดขึ้นได้ทุกเมื่อในภายหลัง

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)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.