似乎我永远无法得到'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
答案 0 :(得分:6)
由字符串组成的表达式只是字符串,评估字符串只返回字符串(如果在命令行给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)
人们尝试使用paste0
,parse
和eval
尝试做的大多数事情都可以使用其他工具更快更简单地完成。构建字符串,解析和评估它就像是说你知道从波士顿到纽约的快捷方式,因此每次你想从A市到B市,你首先从A到波士顿,使用你的快捷方式,然后从纽约前往B.如果您从罗德岛前往新泽西州,这可能会很好,但在伦敦和巴黎之间往返的效率不高。解析构造的字符串也可能导致难以发现错误。
您可以考虑使用bquote
或substitute
等函数:
> eval( bquote( .(a) + .(b), list(a=1, b=2) ) )
[1] 3
或其他更直接的工具。如果你告诉我们你想要做什么,那么我们可能会建议更好的方法。