dplyr中的功能和非标准评估

时间:2018-10-18 14:20:50

标签: r function dplyr

我刚读完'Programming with dplyr''Define aesthetic mappings programatically',就可以开始对函数的非标准评估。这篇文章的具体问题是,“如何使用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 章节,但目前为止,这已经超出了我的理解范围。你能用外行的方式解释吗?下面的功能(对我而言)简洁明了,而上面的功能则是一片混乱。

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

2 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

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)

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

Hadley Wickham在他的书中对此进行了介绍:

  

在大多数编程语言中,您只能访问a的值   函数的参数。在R中,您还可以访问用于   计算它们。这样就可以评估非标准代码   方式:使用所谓的非标准评估或NSE   短。当进行交互时,NSE对功能特别有用   数据分析,因为它可以大大减少打字量。

答案 1 :(得分:0)

借助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