代码之家  ›  专栏  ›  技术社区  ›  stackinator Brenton Wiernik

dplyr的功能与非标准评价

  •  1
  • stackinator Brenton Wiernik  · 技术社区  · 6 年前

    'Programming with dplyr' 'Define aesthetic mappings programatically' 开始掌握函数的非标准评估。这个职位的具体问题是, “如何使用tidyverse(例如 quo() , !! 而不是base-R方法 eval() , substitute , etc.

    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)
    

    你能提供答案吗? 如果你能在下面的概念中工作,那就是,为什么上面的函数是 而下面的其他功能是标准的?我看了报纸 高级R 关于功能和非标准评估的章节,但在这一点上,这超出了我的理解。你能用外行的语言解释吗?下面的函数(对我来说)是清晰而简洁的,而上面的函数是一团模糊的混乱。

    rescale01 <- function(x) {
      rng <- range(x, na.rm = TRUE)
      (x - rng[1]) / (rng[2] - rng[1])
    }
    rescale01(c(0, 5, 10))
    
    1 回复  |  直到 6 年前
        1
  •  8
  •   moodymudskipper    6 年前

    您可以执行以下操作:

    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 还将求值环境与此表达式关联。

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

        2
  •  2
  •   akrun    5 年前

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