【问题标题】:tidyeval difference between mutate `:=` and mutate `=`mutate `:=` 和 mutate `=` 之间的 tidyeval 区别
【发布时间】:2019-04-15 12:14:54
【问题描述】:

这两个代码块都可以工作,即使它们使用不同的等号,一个使用:=,另一个使用=。哪个是正确的,为什么?我认为 tidyeval 在使用 dplyr 函数时需要 :=,但很奇怪 = 在我的 mutate 调用中工作得很好。

1

library(tidyverse)
set.seed(1)
graph.data <- tibble(cal.date = as.Date(40100:40129, origin = "1899-12-30"), 
                     random_num = rnorm(30, 8, 5))

child_function <- function(df, variable, hor.line = 6) {  
  variable <- enquo(variable)
  df <- mutate(df, mutation := 2 * !! variable, horizontal.line := hor.line)
  df
}

child_function(graph.data, variable = random_num, hor.line=8)

2

library(tidyverse)
set.seed(1)
graph.data <- tibble(cal.date = as.Date(40100:40129, origin = "1899-12-30"), 
                     random_num = rnorm(30, 8, 5))

child_function <- function(df, variable, hor.line = 6) {  
  variable <- enquo(variable)
  df <- mutate(df, mutation = 2 * !! variable, horizontal.line = hor.line)
  df
}

child_function(graph.data, variable = random_num, hor.line=8)

【问题讨论】:

    标签: r function dplyr


    【解决方案1】:

    在这种情况下,没有义务输入:=

    当您想做以下事情时,它变得强制性:

    child_function <- function(df, variable, hor.line = 6, mt_name = "mutation") {  
    
      variable <- enquo(variable)
    
      df <- mutate(df, !! mt_name := 2 * !! variable, horizontal.line = hor.line)
    
    }
    

    【讨论】:

      【解决方案2】:

      有点难以追踪,但来自?quasiquotation

      不幸的是,R 对支持的表达式类型非常严格 在 = 的 LHS 上。这就是为什么我们做了更灵活的:= 运算符 = 的别名。您可以使用它来提供名称,例如a := b 是 等价于 a = b。由于它的语法更灵活,您可以取消引用 在 LHS 上:

      【讨论】:

        【解决方案3】:

        := 运算符的目的是允许您在方程的 LHS(左侧)上动态设置变量的名称,您在这里没有这样做。

        在许多情况下,包括这一次,我们只关心操纵 RHS。如果您想控制“变异”变量的名称,:= 会派上用场。

        https://dplyr.tidyverse.org/articles/programming.html#setting-variable-names

        【讨论】:

          猜你喜欢
          • 2015-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-08
          • 2021-12-15
          • 1970-01-01
          • 2022-11-08
          • 2018-03-09
          相关资源
          最近更新 更多