表达式和调用有什么区别?
例如:
func <- expression(2*x*y + x^2)
funcDx <- D(func, 'x')
Run Code Online (Sandbox Code Playgroud)
然后:
> class(func)
[1] "expression"
> class(funcDx)
[1] "call"
Run Code Online (Sandbox Code Playgroud)
eval使用环境列表调用对它们都有效。但是我很好奇这两个类有什么区别,在什么情况下我应该使用表达式或调用。
expression当您希望其容量容纳多个表达式或调用时,您应该使用。它真的返回一个“表达式列表”。R 的临时用户通常的情况是形成绘图函数的参数,其中任务是形成标签的符号表达式。R 表达式列表是可能有很多项目的列表,而调用从来不是这样的。有趣的是,@hadley 的 Advanced R Programming 建议“您永远不需要使用 [expression函数]”:http : //adv-r.had.co.nz/Expressions.html。顺便说一句,该bquote函数非常有用,但有一个限制,即它一次不能作用于多个表达式。我最近黑了一个关于解析表达式的问题的回应并得到了检查,但我认为@mnel'R 有选择地样式绘图轴标签
将表达式传递给评估器的策略eval( expr, envir= < a named environment or list>)本质上function是执行操作的另一条途径。expression和call(函数)之间的一个很大区别是后者需要一个字符对象,并将通过在符号表中查找命名函数来评估它。
当你说用eval“作品”处理两者时,你不是说它产生相同的结果,对吧?的D功能(呼叫)具有得到取代的和限制和修改结果的附加参数。另一方面,对expression-object 的评估将值替换为符号。
似乎有“评估级别”:
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
Run Code Online (Sandbox Code Playgroud)
人们可能期望eval(expression(mean(1:10)))只返回返回调用对象的下一级,但它会继续解析表达式树并评估结果。为了获得对 的未评估函数调用mean,我需要插入一个quote:
eval(expression(quote(mean(1:10))))
# mean(1:10)
Run Code Online (Sandbox Code Playgroud)