在不显式引用原始数据帧的情况下在 mutate 中使用整洁的评估函数

Using tidy evaluation function inside mutate without explicit reference to original dataframe

我想创建一个在 mutate 内部运行的函数。作为一个简单的例子,我可以让它工作:

library(tidyverse)

# Toy Data
df <- tibble::tribble(
  ~id, ~first_name, ~gender, ~height,
  1,   "john",      "m",     71,
  2,   "jane",      "f",     64,
  3,   "sally",     "f",     65
)

double_it <- function(df, x) {
  x <- enquo(x)
  pull(df, !!x) * 2
}

df %>% mutate(height_2 = double_it(., height))

# A tibble: 3 x 5
     id first_name gender height height_2
  <dbl> <chr>      <chr>   <dbl>    <dbl>
1     1 john       m          71      142
2     2 jane       f          64      128
3     3 sally      f          65      130

但是,我想说的是:

double_it <- function(x) {
  ???
}

df1 %>% mutate(height_2 = double_it(height))

# A tibble: 3 x 5
     id first_name gender height height_2
  <dbl> <chr>      <chr>   <dbl>    <dbl>
1     1 john       m          71      142
2     2 jane       f          64      128
3     3 sally      f          65      130

您可以使用 .data$ 作为前缀:

library(tidyverse)

# Toy Data
df1 <- tibble::tribble(
  ~id, ~first_name, ~gender, ~height,
  1,   "john",      "m",     71,
  2,   "jane",      "f",     64,
  3,   "sally",     "f",     65
)

double_it <- function(x) {
  x * 2
}

df1 %>% mutate(height_2 = double_it(.data$height))
#> # A tibble: 3 x 5
#>      id first_name gender height height_2
#>   <dbl> <chr>      <chr>   <dbl>    <dbl>
#> 1     1 john       m          71      142
#> 2     2 jane       f          64      128
#> 3     3 sally      f          65      130

或者直接使用height:

double_it <- function(x) {
  x * 2
}

df1 %>% mutate(height_2 = double_it(height))
#> # A tibble: 3 x 5
#>      id first_name gender height height_2
#>   <dbl> <chr>      <chr>   <dbl>    <dbl>
#> 1     1 john       m          71      142
#> 2     2 jane       f          64      128
#> 3     3 sally      f          65      130