也许不是“优先”问题,而是解析问题。 (但仔细想想,这似乎是优先级,并且是由于需要完成 "[" 和 "]" 之间的所有参数的参数匹配。)在第一个实例中,解析树构造为:
`^`
/ \
a b
> substitute(a^b())[1]
`^`()
> substitute(a^b())[[1]]
`^`
> substitute(a^b())[[2]]
a
> substitute(a^b())[[3]]
b()
在第二种情况下,它被构造为
a[b]
/
NULL
但第一个元素也有一个结构:
`[`
/ \
a b
> substitute(a[b]())[[1]][[1]]
`[`
> substitute(a[b]())[[1]][[2]]
a
> substitute(a[b]())[[1]][[3]]
b
我认为由于两个函数(^ 和[)可能会出现歧义,只有后者可以实际提供函数,因此需要先对其进行处理。 a^b 的求值结果永远不可能是一个函数,所以将其处理为 ^(a, b() )
当真正让这样的东西真正起作用时,我认为第二个不是很有用。为了从工作区中提取和替换,您需要一个额外的提取步骤:
b <- list(mean)
> eval( substitute(a^b(1:10) , list(a=2) ))
Error in eval(expr, envir, enclos) : could not find function "b"
> eval( substitute(a^b[[1]](1:10) , list(a=2) ))
[1] 45.25483
按照@hadley 的建议,我从 pryr 复制了他的 ast 函数,它的配套函数 call_tree 位于 draw_tree.r 模块的 the pryr repository at github 中。我需要这样做,因为我在路上,我的笔记本电脑仍然停留在没有 pryr 二进制文件的过时 R 版本。还需要安装和加载 pkg:stringr 以获取str_c。
这样我们就可以看出区别了:
ast(a[b]())
\- ()
\- ()
\- `[
\- `a
\- `b
ast(a^b())
\- ()
\- `^
\- `a
\- ()
\- `b
漂亮的@hadley。