评估以stringforms给出的expression式
我很想知道R是否可以使用它的eval()
函数来执行由string提供的计算。
这是一个常见的情况:
eval("5+5")
但是,而不是10我得到:
[1] "5+5"
任何解决scheme
eval()
函数计算expression式,但"5+5"
是一个string,而不是一个expression式。 使用parse()
和text=<string>
将string更改为expression式:
> eval(parse(text="5+5")) [1] 10 > class("5+5") [1] "character" > class(parse(text="5+5")) [1] "expression"
调用eval()
调用很多行为,有些并不明显:
> class(eval(parse(text="5+5"))) [1] "numeric" > class(eval(parse(text="gray"))) [1] "function" > class(eval(parse(text="blue"))) Error in eval(expr, envir, enclos) : object 'blue' not found
另请参见tryCatch 。
您可以使用parse()
函数将字符转换为expression式。 您需要指定input是文本,因为parse默认情况下需要一个文件:
eval(parse(text="5+5"))
对不起,但我不明白为什么很多人甚至认为string是可以评估的东西。 你必须改变你的想法。 忘记所有string之间的连接和expression式,调用,另一边的评估。
(可能)唯一的连接是通过parse(text = ....)
,所有优秀的R程序员应该知道这是很less有效或安全的方式来构buildexpression式(或调用)。 而是更多地了解有关substitute()
, quote()
以及可能使用do.call(substitute, ......)
R> fortunes :: fortune(“answer is parse”)
如果答案是parse(),你通常应该重新思考这个问题。 – Thomas Lumley R-help(2005年2月)
R>
或者,您可以使用我的evals
软件包中的evals
来捕获输出以及所有警告,错误和其他消息以及原始结果:
> pander::evals("5+5") [[1]] $src [1] "5 + 5" $result [1] 10 $output [1] "[1] 10" $type [1] "numeric" $msg $msg$messages NULL $msg$warnings NULL $msg$errors NULL $stdout NULL attr(,"class") [1] "evals"