表达式和调用之间有什么区别?
例如:
func <- expression(2*x*y + x^2)
funcDx <- D(func, 'x')
然后:
> class(func)
[1] "expression"
> class(funcDx)
[1] "call"
使用envir列表调用eval
对它们都有效。但我很好奇两个类之间有什么区别,在什么情况下我应该使用表达式还是调用。
答案 0 :(得分:4)
如果您希望其容量能够容纳多个表达式或调用,则应使用expression
。它确实返回了一个&#34;表达式列表&#34;。 R的临时用户的通常情况是形成用于绘制函数的参数,其中任务正在形成标签的符号表达式。 R表达式列表是可能包含许多项目的列表,而调用从不是这样。有趣的是,@ hadley的高级R编程建议&#34;你永远不需要使用[expression
功能]&#34;:http://adv-r.had.co.nz/Expressions.html。顺便提一下,bquote
函数非常有用,但是它的局限性在于它一次不会对多个表达式起作用。我最近破解了对解析表达式这样一个问题的回应并得到了检查,但我认为@ mnel的答案更好:R selectively style plot axis labels
将表达式传递给具有eval( expr, envir= < a named environment or list>)
的求值程序的策略本质上是function
正在做的另一条路径。 expression
和call
(函数)之间的一个很大区别是后者需要一个字符对象,并通过在符号表中查找命名函数来评估它。
当你说使用eval
&#34;处理两者时,你并不是说它会产生相同的结果,对吗? D
函数(调用)具有可替换的其他参数,并限制和修改结果。另一方面,expression
- 对象的评估将值替换为符号。
似乎有&#34;等级评估&#34;:
expression(mean(1:10))
# expression(mean(1:10))
call("mean" , (1:10))
# mean(1:10)
eval(expression(mean(1:10)))
# [1] 5.5
eval(call("mean" , (1:10)))
# [1] 5.5
有人可能期望eval(expression(mean(1:10)))
仅返回返回调用对象的下一级别,但它会继续解析表达式树并评估结果。为了获得对mean
的未评估函数调用,我需要插入quote
:
eval(expression(quote(mean(1:10))))
# mean(1:10)
答案 1 :(得分:2)
来自文档(?expression
):
...an R expression vector is a list of calls, symbols etc, for example as returned by parse.
注意:
R> class(func[[1]])
[1] "call"
当给出expression
时,D
会对第一个call
采取行动。如果func
只是call
,则D
的工作方式相同。
R> func2 <- substitute(2 * x * y + x^2)
R> class(func2)
[1] "call"
R> D(func2, 'x')
2 * y + 2 * x