tidy eval, например, с помощью mtcars%>% mutate (цель: = журнал (цель)) - PullRequest
1 голос
/ 04 февраля 2020

Я понял это, когда набирал вопрос, но хотел бы посмотреть, есть ли более чистый и менее кодовый способ делать то, что я хочу.

например, блок кода:

target <- "mpg"

# want
mtcars %>% 
  mutate(target := log(target))

Я хотел бы обновить mpg до журнала mpg, основанного на переменной target.

Похоже, я получил эту работу с:

mtcars %>% 
  mutate(!! rlang::sym(target) := log(!! rlang::sym(target)))

Это выглядит как довольно повторяющееся. Есть ли «чище», меньше кода для достижения того же результата?

Мне нравятся двойные фигурные скобки {{var}}, нет причин, они просто приятнее читать imho, но я не смог при попытке получить те же результаты:

mtcars %>% 
  mutate(!! rlang::sym(target) := log({{target}}))

Какими различными способами я могу использовать tidyeval для изменения поля с помощью преобразования, основанного на предварительно определенной переменной, чтобы определить, какое поле следует преобразовать, в этом случае переменная 'target'?

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

1) Использование mutate_at

library(dplyr)
mtcars %>% mutate_at(target, log)

2) Мы можем использовать оператор magrittr %<>%:

library(magrittr)
mtcars[[target]] %<>% log

3) Конечно, это тривиально в базе R:

mtcars[[target]] <- log(mtcars[[target]])
1 голос
/ 04 февраля 2020

На lhs из := строка может быть оценена с помощью !!, тогда как для rhs это значение, которое нам нужно, поэтому мы преобразуем в символ и вычисляем (!!)

library(dplyr)
mtcars %>% 
     mutate(!!target := log(!! rlang::sym(target)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...