Tạo một tên biến với "paste" trong R?


87

Xem bên dưới:

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

Điều gì sẽ xảy ra nếu tôi muốn gán một giá trị perf.a1?

Tôi đã thử as.name, as.symbolv.v., không có kết quả:

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


Câu trả lời:


126

Bạn có thể sử dụng assign( doc ) để thay đổi giá trị của perf.a1:

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

3
Tại sao điều này rất khó tìm thấy!
lamecicle

25
assign(paste0("perf.a", "1"), 5)gọn gàng hơn một chút
Louis Maddox,


9

Trong trường hợp của tôi, hàm eval () hoạt động rất tốt. Dưới đây, tôi tạo 10 biến và gán chúng 10 giá trị.

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

Không sử dụng được nếu RHS phức tạp hoặc lớn. Hơn nữa, ngay cả trong những trường hợp đơn giản, có một số mất độ chính xác: a <- rnorm(1); a - eval(parse(text=paste(a)))thường không trả về 0.

3

Trong trường hợp của tôi, các ký hiệu tôi tạo (Tax1, Tax2, v.v.) đã có giá trị nhưng tôi muốn sử dụng vòng lặp và gán các ký hiệu cho một biến khác. Vì vậy, hai câu trả lời trên đã cho tôi một cách để thực hiện điều này. Điều này có thể hữu ích trong việc trả lời câu hỏi của bạn vì việc gán giá trị có thể diễn ra bất cứ lúc nào sau đó.

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)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.