表达与呼叫

时间:2013-12-03 15:47:02

标签: r expression call

表达式和调用之间有什么区别?

例如:

func <- expression(2*x*y + x^2)
funcDx <- D(func, 'x')

然后:

> class(func)
[1] "expression"
> class(funcDx)
[1] "call"

使用envir列表调用eval对它们都有效。但我很好奇两个类之间有什么区别,在什么情况下我应该使用表达式还是调用。

2 个答案:

答案 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正在做的另一条路径。 expressioncall(函数)之间的一个很大区别是后者需要一个字符对象,并通过在符号表中查找命名函数来评估它。

当你说使用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