【问题标题】:Using eval(parse()) with a multiple elements vector将 eval(parse()) 与多元素向量一起使用
【发布时间】:2021-01-29 05:09:10
【问题描述】:

我正在尝试从字符向量中 eval(parse()) 变量名,但 eval() 仅返回最后一个变量的内容: 我的代码:

c <- c(1,1)
a <- c(1,0)
t <- c(0,1)
g <- c(0,0)

sequence <- c("a", "t", "g", "t", "g", "t", "a", "c")
eval(parse(text=sequence))

它应该返回:

[1] 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1

但它只是返回与向量的最后一个元素对应的:“c”

[1] 1 1

【问题讨论】:

    标签: r parsing expression eval


    【解决方案1】:

    我们可以使用mget获取list中的所有对象值,然后unlistlist创建vector

    unlist(mget(sequence), use.names = FALSE)
    #[1] 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1
    

    对于eval(parse,它要求length 为1。我们可以遍历sequence 并执行eval(不推荐)

    c(sapply(sequence, function(x) eval(parse(text = x))))
    #[1] 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1
    

    【讨论】:

    • 我绝对喜欢第一种方式。我想我的问题(更多的是 OP,而不是你)是对象是否应该首先放在 list() 中。
    • @Adam OP 可能是R 的新手,而当您是新手时,很难理解list 的工作方式。因此,他们在全局环境中创建对象。
    • @akrun 绝对正确! ;) @Adam 对象是列表中的向量。它是 seqinr 包中函数 readfastaValue
    【解决方案2】:

    我意识到我可以做到:

    bin <- NULL
    for(n in 1:length(sequence)) {
      bin <- append(bin, eval(parse(text=sequence[n])))
      }
    

    但我想知道是否有没有 for 循环的更简单的方法。

    【讨论】:

      猜你喜欢
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多