Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:基本R函数的整洁评估?_R_Methods_Metaprogramming_Tidyeval_Non Standard Evaluation - Fatal编程技术网

R:基本R函数的整洁评估?

R:基本R函数的整洁评估?,r,methods,metaprogramming,tidyeval,non-standard-evaluation,R,Methods,Metaprogramming,Tidyeval,Non Standard Evaluation,我以前问过一个相关的问题,但我认为这是一个更有趣的框架 如果一个基R函数是泛型函数,并且有一个或多个参数使用“标准”非标准求值,那么提供一个“整洁”方法,使整洁求值技术可用于这些参数是否可行,如果可行,是否明智?我认为这是一个概念上的标准包装器,可以通过元编程技术针对每个单独的函数进行定制。它将仅适用于当前具有非标准评估的参数的评估,并且可能仅适用于那些具有引用类型的非标准评估的参数,因此,在通过NextMethod()进行参数匹配和构造后,或S4、S6等的任何等效方法后,所有当前方法都将保持可

我以前问过一个相关的问题,但我认为这是一个更有趣的框架

如果一个基R函数是泛型函数,并且有一个或多个参数使用“标准”非标准求值,那么提供一个“整洁”方法,使整洁求值技术可用于这些参数是否可行,如果可行,是否明智?我认为这是一个概念上的标准包装器,可以通过元编程技术针对每个单独的函数进行定制。它将仅适用于当前具有非标准评估的参数的评估,并且可能仅适用于那些具有引用类型的非标准评估的参数,因此,在通过NextMethod()进行参数匹配和构造后,或S4、S6等的任何等效方法后,所有当前方法都将保持可用

我问这个问题的原因是,我一直在缓慢而痛苦地将对tidy eval逐渐加深的理解塞进我的头脑中,如果我认为这些强大的方法最终会成为非标准评估的标准,我会感到高兴,与永远保持多个队列的古怪的非标准评估方法相反


当然,我仍然必须记住,原语可能会使用不同的非标准评估方法,而这些原语本身并不是某些泛型的方法。(我想我说得对,虽然泛型函数可以有原始方法,但原始函数不可能是泛型的,或者至少不是泛型的。是吗?), 我认为这将是非常不一致的

首先,如果您阅读
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还是一个特性或者其他什么