我很想知道R是否可以使用它的eval()功能来执行例如字符串提供的计算.
这是一个常见的情况:
eval("5+5")
Run Code Online (Sandbox Code Playgroud)
但是,而不是10我得到:
[1] "5+5"
Run Code Online (Sandbox Code Playgroud)
有解决方案吗
Har*_*lan 392
该eval()函数计算表达式,但它"5+5"是一个字符串,而不是表达式.使用parse()带有text=<string>字符串变成一个表达式:
> eval(parse(text="5+5"))
[1] 10
> class("5+5")
[1] "character"
> class(parse(text="5+5"))
[1] "expression"
Run Code Online (Sandbox Code Playgroud)
调用会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
Run Code Online (Sandbox Code Playgroud)
另请参见tryCatch.
Sha*_*ane 93
您可以使用该parse()函数将字符转换为表达式.您需要指定输入是文本,因为默认情况下parse需要一个文件:
eval(parse(text="5+5"))
Run Code Online (Sandbox Code Playgroud)
Mar*_*ler 46
抱歉,但我不明白为什么有太多人甚至认为字符串是可以评估的东西.你必须改变你的心态.忘记一边的字符串和表达式,调用,另一边的评估之间的所有连接.
(可能)唯一的连接是通过,parse(text = ....)并且所有优秀的R程序员应该知道这很少是构造表达式(或调用)的有效或安全的方法.而是要了解更多关于substitute(),quote()以及可能的使用的力量do.call(substitute, ......).
fortunes::fortune("answer is parse")
# If the answer is parse() you should usually rethink the question.
# -- Thomas Lumley
# R-help (February 2005)
Run Code Online (Sandbox Code Playgroud)
Dec.2017:好的,这是一个例子(在评论中,没有很好的格式):
q5 <- quote(5+5)
str(q5)
# language 5 + 5
e5 <- expression(5+5)
str(e5)
# expression(5 + 5)
Run Code Online (Sandbox Code Playgroud)
如果你获得更多的经验,会发现q5是一个"call",而e5为"expression",甚至认为e5[[1]]是相同的q5:
identical(q5, e5[[1]])
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
dar*_*zig 18
或者,您可以evals从我的pander包中使用捕获输出和所有警告,错误和其他消息以及原始结果:
> 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"
Run Code Online (Sandbox Code Playgroud)
Paw*_*zko 13
现在你也可以使用包中的lazy_eval功能lazyeval.
> lazyeval::lazy_eval("5+5")
[1] 10
Run Code Online (Sandbox Code Playgroud)
小智 11
类似地使用rlang:
eval(parse_expr("5+5"))
Run Code Online (Sandbox Code Playgroud)
不知道为什么没有人专门提到两个 Base R 函数来执行此操作: str2lang()和str2expression(). 这些是 的变体parse(),但似乎更干净地返回表达式:
eval(str2lang("5+5"))
# > 10
eval(str2expression("5+5"))
# > 10
Run Code Online (Sandbox Code Playgroud)
还想反击海报说任何试图这样做的人都是错误的。我正在阅读以文本形式存储在文件中的 R 表达式并尝试评估它们。这些功能非常适合此用例。
| 归档时间: |
|
| 查看次数: |
165690 次 |
| 最近记录: |