Избегайте переоборудования в рамках тидевал

Если я хочу сделать перебор явным, я могу использовать местоимение .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)
}

person Lorenz Walthert    schedule 12.01.2018    source источник
comment
Вы просто снимаете кавычки с выражения, которое хотите оценить, не маскируя данные.   -  person Lionel Henry    schedule 12.01.2018


Ответы (1)


Просто снимите кавычки с !!, чтобы найти переменную с таким именем над областью фрейма данных:

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
person alistaire    schedule 12.01.2018