R:基本R函数的整洁评估?
我以前问过一个相关的问题,但我认为这是一个更有趣的框架 如果一个基R函数是泛型函数,并且有一个或多个参数使用“标准”非标准求值,那么提供一个“整洁”方法,使整洁求值技术可用于这些参数是否可行,如果可行,是否明智?我认为这是一个概念上的标准包装器,可以通过元编程技术针对每个单独的函数进行定制。它将仅适用于当前具有非标准评估的参数的评估,并且可能仅适用于那些具有引用类型的非标准评估的参数,因此,在通过NextMethod()进行参数匹配和构造后,或S4、S6等的任何等效方法后,所有当前方法都将保持可用 我问这个问题的原因是,我一直在缓慢而痛苦地将对tidy eval逐渐加深的理解塞进我的头脑中,如果我认为这些强大的方法最终会成为非标准评估的标准,我会感到高兴,与永远保持多个队列的古怪的非标准评估方法相反R:基本R函数的整洁评估?,r,methods,metaprogramming,tidyeval,non-standard-evaluation,R,Methods,Metaprogramming,Tidyeval,Non Standard Evaluation,我以前问过一个相关的问题,但我认为这是一个更有趣的框架 如果一个基R函数是泛型函数,并且有一个或多个参数使用“标准”非标准求值,那么提供一个“整洁”方法,使整洁求值技术可用于这些参数是否可行,如果可行,是否明智?我认为这是一个概念上的标准包装器,可以通过元编程技术针对每个单独的函数进行定制。它将仅适用于当前具有非标准评估的参数的评估,并且可能仅适用于那些具有引用类型的非标准评估的参数,因此,在通过NextMethod()进行参数匹配和构造后,或S4、S6等的任何等效方法后,所有当前方法都将保持可
当然,我仍然必须记住,原语可能会使用不同的非标准评估方法,而这些原语本身并不是某些泛型的方法。(我想我说得对,虽然泛型函数可以有原始方法,但原始函数不可能是泛型的,或者至少不是泛型的。是吗?), 我认为这将是非常不一致的 首先,如果您阅读
InternalMethods
的文档,您将看到以下内容:
以下原语和内部函数是泛型的,即您可以为它们编写方法
因此,可以使用泛型的基本函数
以下是我的一些测试,尽管我怀疑它们是否详尽
library(rlang)
setClass("Foo", list(x="numeric"))
foo <- new("Foo", x=0)
由于某种原因,我们定义的泛型会自动将名称
更改为字符,
但也许您可以简单地使用sym
,然后继续
然后我想看看包含省略号的泛型会发生什么:
setMethod("predict", signature(object="Foo"), function(object, ...) {
enquos(...)
})
predict(foo, bar, baz=bak)
<list_of<quosure>>
[[1]]
<quosure>
expr: ^bar
env: global
$baz
<quosure>
expr: ^bak
env: global
似乎和预期的一样,虽然我不确定如何利用空的quosure,
它的行为并不像一个遗漏的参数:
f <- function(x) {
print(missing(x))
ff <- function(xx) { missing(xx) }
eval_tidy(ff(!!enquo(x)))
}
f()
[1] TRUE
[1] FALSE
我不知道这种行为是一个bug还是一个功能或者其他什么。我做了一些测试,试图找出答案, 我认为这将是非常不一致的 首先,如果您阅读
InternalMethods
的文档,您将看到以下内容:
以下原语和内部函数是泛型的,即您可以为它们编写方法
因此,可以使用泛型的基本函数
以下是我的一些测试,尽管我怀疑它们是否详尽
library(rlang)
setClass("Foo", list(x="numeric"))
foo <- new("Foo", x=0)
由于某种原因,我们定义的泛型会自动将名称
更改为字符,
但也许您可以简单地使用sym
,然后继续
然后我想看看包含省略号的泛型会发生什么:
setMethod("predict", signature(object="Foo"), function(object, ...) {
enquos(...)
})
predict(foo, bar, baz=bak)
<list_of<quosure>>
[[1]]
<quosure>
expr: ^bar
env: global
$baz
<quosure>
expr: ^bak
env: global
似乎和预期的一样,虽然我不确定如何利用空的quosure,
它的行为并不像一个遗漏的参数:
f <- function(x) {
print(missing(x))
ff <- function(xx) { missing(xx) }
eval_tidy(ff(!!enquo(x)))
}
f()
[1] TRUE
[1] FALSE
我不知道这种行为是一个bug还是一个特性或者其他什么