【问题标题】:Functions and non-standard evaluation in dplyrdplyr 中的函数和非标准评估
【发布时间】:2019-03-23 09:20:44
【问题描述】:

我刚读完'Programming with dplyr''Define aesthetic mappings programatically',开始了解函数的非标准评估。这篇文章的具体问题是,“如何使用tidyverse直接在下面编写代码(例如quo()!!等) " 而不是 base-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))

【问题讨论】:

    标签: r function dplyr


    【解决方案1】:

    使用 rlang_0.4.0,我们可以使用 tidy-evaluation 运算符 ({{...}}) 或 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)
    

    -输出

    【讨论】:

      【解决方案2】:

      您可以执行以下操作:

      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 在他的书中这样介绍它:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 2015-03-10
        • 2020-09-17
        相关资源
        最近更新 更多