R如何正确动态创建变量名,解决target of assignment expands to non-language object

在一个群里,看到一位朋友发了一堆代码,

错误代码

以及一个报错信息,Error in paste(.....) :could not find function "paste←" (还有一个target of assignment expands to non-language object)

他非常不理解,为什么,明明paste的用法没错,sum的操作也没有错,但是代码却出错了呢?

这个报错,在我刚学习R语言的时候,也遇到过。当时,我也想着手动构建一个变量名,然后给它赋值,方便后面调用,就跟我在shell脚本的操作一样。

但实际上,这在R里面是行不通的,因为这相当于让一个字符串充当变量名,最简单的报错就是 paste("a",1) <- sum(1:10)

其实,为一个值赋予一个名字,不是非得要变量名 = 变量值 这种形式,你可以用列表,数据框,命名向量。举个例子,你计算了一堆值,每个值对应一个基因,下面演示错误和正确的形式

# 错误形式
genename <- c("a","b","c","d", "f")

## 假设你计算的结果是x
x <- c(1:5)
for (i in seq(length(genename))){
   # 想为每个基因名创建一个变量名,是不可行的
   paste(genename[i]) <- x[i]
}

# 正确形式
genename <- c("a","b","c","d", "f")
x <- c(1:5)
x
for (i in seq(length(genename))){
  # 将基因名
  names(x)[i] <-  genename[I]
}
x

假如你计算的结果不是一个数值,而是一个数据框,那么我们可以用列表(list)来存放变量

genename <- c("a","b","c","d", "f")

result <- list()
for (i in seq(length(genename))){
  # 随便算一个data.frame
  df <- data.frame()
  # 列表复制
  result[[genename[i]]] <- df
}

result

即便最开始的代码可行,也是非常糟糕的,因为你很有可能生成大量你自己都不知晓的变量。

推荐阅读更多精彩内容

  • 前言 Google Play应用市场对于应用的targetSdkVersion有了更为严格的要求。从 2018 年...
    申国骏阅读 59,031评论 14 98
  • 《来,我们说说孤独》 1·他们都在写孤独 一个诗人 如果 不说说 内心的孤独 不将孤独 写进诗里 是不是很掉价呢 ...
    听太阳升起阅读 2,697评论 0 6
  • 自幼贫民窟长大的女子,侥幸多念了两本书,枉以为可以与人平起平坐。可是人生从来都是接力赛,我们却天真的当成了百米冲刺...
    Leeanran阅读 3,698评论 0 2
  • 云舒老师,姓甚名谁,男的女的,多大岁数,这些我全然不知。之所以要写写云舒老师,完全是因为他写的文章,如一个巨大的磁...
    数豆者m阅读 1,364评论 5 8
  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 603评论 0 4
  • 陈xox阅读 578评论 0 2
  • 《女人,斧头和狗》我在三伏天里发抖,只因怀里没了炉火所幸依偎着,拥有阳光的窗 可是,窗外还有那个女人晾上的白裙,挡...
    唐喧哗阅读 332评论 1 3
  • 我们都是软弱的人,所以才会说谎。我们都是胆小的人,所以才要武装。我们都是一群笨蛋,所以才会互相伤害。
    所罗门的伪证_dc0a阅读 474评论 0 2
  • 为了让我有一个更快速、更精彩、更辉煌的成长,我将开始这段刻骨铭心的自我蜕变之旅!从今天开始,我将每天坚持阅...
    李薇帆阅读 415评论 0 2
  • 似乎最近一直都在路上,每次出来走的时候感受都会很不一样。 1、感恩一直遇到好心人,很幸运。在路上总是...
    时间里的花Lily阅读 208评论 0 0