dplyr中的函数和非标准评估

5
我刚刚完成了阅读'使用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)

你能提供答案吗?如果你能涉及以下概念,那就更好了。为什么上面的函数是非标准的,而下面的这个函数是标准的?我读过《Advanced R》关于函数和非标准评估的章节,但现在对我来说太难了。你能用通俗易懂的语言解释一下吗?对我来说,下面的函数很清晰简明,而上面的函数却很模糊。请注意保留HTML标签,不要进行解释。
rescale01 <- function(x) {
  rng <- range(x, na.rm = TRUE)
  (x - rng[1]) / (rng[2] - rng[1])
}
rescale01(c(0, 5, 10))
2个回答

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)

非标准求值基本上意味着您将参数作为表达式而不是值传递。quo和enquo还将评估环境与此表达式相关联。
Hadley Wickham在他的书中这样介绍它:
在大多数编程语言中,您只能访问函数参数的值。在R中,您还可以访问用于计算它们的代码。这使得以非标准方式评估代码成为可能:使用所谓的非标准求值(NSE)。对于进行交互式数据分析时的函数,NSE特别有用,因为它可以显著减少键入的数量。

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)

-输出

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接