我很好奇R是否可以使用它的eval()函数来执行由字符串等提供的计算。
这是一个常见的情况:
eval("5+5")
然而,我得到的不是10:
[1] "5+5"
有解决方案吗?
我很好奇R是否可以使用它的eval()函数来执行由字符串等提供的计算。
这是一个常见的情况:
eval("5+5")
然而,我得到的不是10:
[1] "5+5"
有解决方案吗?
当前回答
类似地使用rlang:
eval(parse_expr("5+5"))
其他回答
可以使用parse()函数将字符转换为表达式。你需要指定输入为文本,因为parse默认期望一个文件:
eval(parse(text="5+5"))
类似地使用rlang:
eval(parse_expr("5+5"))
eval()函数计算一个表达式,但"5+5"是一个字符串,而不是表达式。使用parse() with text=<string>将字符串更改为表达式:
> 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。
不知道为什么没有人提到两个Base R函数专门做这件事:str2lang()和str2expression()。这些是parse()的变体,但似乎返回的表达式更清晰:
eval(str2lang("5+5"))
# > 10
eval(str2expression("5+5"))
# > 10
也想反驳那些海报上说的任何试图这样做的人都是错误的。我在R中读取作为文本存储在文件中的表达式,并试图计算它们。这些函数非常适合这个用例。
现在你也可以使用lazyeval包中的lazy_eval函数。
> lazyeval::lazy_eval("5+5")
[1] 10