5

如果我想明确地超出范围,我可以.data像这样使用代词

library(dplyr)

cyl <- 3
transmute(as_tibble(mtcars), cyl_plus_one = .data$cyl + 1)
#> # A tibble: 32 x 1
#>    cyl_plus_one
#>           <dbl>
#>  1            7
#>  2            7
#>  3            5
#>  4            7
#>  5            9
#>  6            7
#>  7            9
#>  8            5
#>  9            5
#> 10            7
#> # ... with 22 more rows

但是,相反的情况呢,即如果我想明确避免过度使用?在下面的示例中,我想添加一个包含值b(通过函数调用提供,而不是b数据中的)加 1 的新列,这显然不像现在所说的那样工作(因为范围过大)。

library(dplyr)
add_one <- function(data, b) {
  data %>%
    mutate(a = b + 1)
}
data <- data_frame(
  b  = 999
)
add_one(data, 3)
#> # A tibble: 1 x 2
#>       b     a
#>   <dbl> <dbl>
#> 1   999  1000

我还尝试在mutate()调用之外创建新值,但是我仍然需要依赖new_val不在数据中。

library(dplyr)
add_one <- function(data, b) {
  new_val <- b + 1
  data %>%
    mutate(a = new_val)
}
4

1 回答 1

7

只需取消引用!!即可在数据框范围上方查找具有该名称的变量:

library(tidyverse)

add_one <- function(data, b) {
    data %>% mutate(a = !!b + 1)
}

data <- data_frame(b  = 999)

add_one(data, 3)
#> # A tibble: 1 x 2
#>       b     a
#>   <dbl> <dbl>
#> 1   999  4.00
于 2018-01-12T18:41:52.610 回答