用R中的“ paste”创建一个变量名?


86

见下文:

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

如果我要给赋值perf.a1怎么办?

我尝试了as.nameas.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


Answers:




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)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.