【问题标题】:Create a variable name with "paste" in R?在R中用“粘贴”创建一个变量名?
【发布时间】:2011-04-01 08:40:41
【问题描述】:

见下文:

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

【问题讨论】:

标签: r


【解决方案1】:

你可以使用assign (doc) 来改变perf.a1的值:

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

【讨论】:

  • 为什么这么难找!
  • assign(paste0("perf.a", "1"), 5) 有点整洁
【解决方案2】:

?assign

> assign(paste("tra.", 1, sep = ""), 5)
> tra.1
  [1] 5

【讨论】:

    【解决方案3】:

    在我的例子中,函数 eval() 效果很好。下面我生成 10 个变量并为它们分配 10 个值。

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

    【讨论】:

    • 如果 RHS 复杂或大,则不可用。此外,即使在简单的情况下,也会有一些精度损失:a &lt;- rnorm(1); a - eval(parse(text=paste(a))) 通常不会返回 0
    【解决方案4】:

    在我的例子中,我创建的符号(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)
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多