美文网首页
R如何正确动态创建变量名,解决target of assignm

R如何正确动态创建变量名,解决target of assignm

作者: xuzhougeng | 来源:发表于2022-11-02 11:11 被阅读0次

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

    错误代码

    以及一个报错信息,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
    
    

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

    相关文章

      网友评论

          本文标题:R如何正确动态创建变量名,解决target of assignm

          本文链接:https://www.haomeiwen.com/subject/xbtetdtx.html