【问题标题】:How to "eval" results returned by "paste0"?如何“评估”“paste0”返回的结果?
【发布时间】:2014-10-13 23:20:18
【问题描述】:

似乎我永远无法得到 'paste0' 的返回值被评估,以及任何被引用的字符。我必须使用 'substr' 或 'gsub' 来删除这些引号吗?

eval(paste0('1','+','1')) 
[1] "1+1" 
eval(expression(paste0('1','+','1'))) 
[1] "1+1" 
eval(expression("1+1")) 
[1] "1+1" 
eval("1+1") 
[1] "1+1" 
eval(expression(1+1)) 
[1] 2 
eval(1+1) 
[1] 2

【问题讨论】:

  • eval(parse(text = paste0('1','+','1')))

标签: r expression eval paste bioconductor


【解决方案1】:

由字符串组成的表达式只是字符串,对字符串求值只返回字符串(如果在命令行中给 R 一个字符串,那么您将再次看到该字符串)。这就是为什么你的尝试都没有奏效(好吧,确实奏效了,他们只是没有做你想做的事)。引号不是字符串的一部分,只是它的显示方式,所以gsub 无济于事。

您需要将字符串解析为表达式,如注释所示,但请注意以下几点:

> library(fortunes)
> fortune(106)

If the answer is parse() you should usually rethink the question.
   -- Thomas Lumley
      R-help (February 2005)

> fortune(181)

Personally I have never regretted trying not to underestimate my own future
stupidity.
   -- Greg Snow (explaining why eval(parse(...)) is often suboptimal, answering
      a question triggered by the infamous fortune(106))
      R-help (January 2007)

人们尝试使用paste0parseeval 执行的大多数操作都可以使用其他工具更快、更简单地完成。构造一个字符串,解析和评估它有点像说你知道从波士顿到纽约的捷径,因此每次你想从城市 A 到城市 B 时,你首先从 A 到波士顿,使用你的捷径,然后从纽约到 B。如果你从罗德岛到新泽西,这可能没问题,但对于伦敦和巴黎之间的往返效率不高。解析构造的字符串也可能导致难以发现错误。

您可以考虑使用bquotesubstitute 之类的函数:

> eval( bquote( .(a) + .(b), list(a=1, b=2) ) )
[1] 3

或其他更直接的工具。如果您告诉我们您正在尝试做什么,那么我们可能会提出更好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2021-05-16
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多