dplyr 中的函数和非标准评估

sta*_*tor 5 r function dplyr

我刚刚读完“用 dplyr 编程”编程方式定义美学映射”,开始掌握非标准的函数评估。这个职位的具体问题是,“我如何直接写下面的代码使用的tidyverse(例如quo()!!等)”,而不是基础-R的方法eval()substituteetc.

library(tidyverse)
xy <- data.frame(xvar = 1:10, yvar = 11:20)

plotfunc <- function(data, x, y){
  y.sqr <- (eval(substitute(y), envir = data))^2
  print(
    ggplot(data, aes_q(x = substitute(x), y = substitute(y.sqr))) + 
      geom_line()
  )
}

plotfunc(xy, xvar, yvar)
Run Code Online (Sandbox Code Playgroud)

你能提供答案吗?如果您可以在以下概念中工作,那将是一个奖励,即为什么上面的函数是非标准的,而下面的另一个函数是标准的?我阅读了关于函数和非标准评估的高级 R章节,但此时它在我的脑海中。你能用通俗的语言解释一下吗?下面的函数清晰简洁(对我来说),而上面的函数是一团糟。

rescale01 <- function(x) {
  rng <- range(x, na.rm = TRUE)
  (x - rng[1]) / (rng[2] - rng[1])
}
rescale01(c(0, 5, 10))
Run Code Online (Sandbox Code Playgroud)

Moo*_*per 9

您可以执行以下操作:

library(tidyverse)
xy <- data.frame(xvar = 1:10, yvar = 11:20)

plotfunc <- function(data, x, y){
  x <- enquo(x)
  y <- enquo(y)
  print(
    ggplot(data, aes(x = !!x, y = (!!y)^2)) + 
      geom_line()
  )
}
plotfunc(xy, xvar, yvar)
Run Code Online (Sandbox Code Playgroud)

非标准评估基本上意味着您将参数作为表达式而不是值传递。quo并将enquo评估环境与此表达式相关联。

Hadley Wickham 在他的书中是这样介绍的:

在大多数编程语言中,您只能访问函数参数的值。在 R 中,您还可以访问用于计算它们的代码。这使得以非标准方式评估代码成为可能:使用所谓的非标准评估,或简称 NSE。NSE 在进行交互式数据分析时对函数特别有用,因为它可以显着减少输入量。


akr*_*run 5

通过rlang_0.4.0,我们可以使用整洁求值运算符 ( {{...}}) 或curly-curly将引用和取消引用抽象为单个插值步骤。这使得创建函数变得更容易

library(rlang)
library(ggplot2)
plotfunc <- function(data, x, y){

  print(
    ggplot(data, aes(x = {{x}}, y = {{y}}^2)) + 
      geom_line()
  )
}
plotfunc(xy, xvar, yvar)
Run Code Online (Sandbox Code Playgroud)

-输出

在此输入图像描述