Это какая-то функция, посвященная побочным эффектам с тиблом и облицовкой? - PullRequest
0 голосов
/ 15 января 2019

Мне интересно, могу ли я использовать некоторые функции, такие как dplyr :: select, dplyr :: mutate или dplyr :: transmute, для вызова функций побочных эффектов? Я гуляю, но это не из одной семьи.

tibble::as.tibble(mtcars) %>%
  dplyr::transmute(colA = cyl * hp, colB = mpg * wt) %>%
  dplyr::mutate(., (function(.data, colA, colB){
    print(colA)
    print(colB)
    # invisible(.data)
    return(.data)
  })(.data = ., colA, colB))

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

1 Ответ

0 голосов
/ 15 января 2019

base::with дает вам доступ к нужным вам столбцам-переменным, а magrittr::%T>% позволяет запустить ряд побочных эффектов и при этом передать весь фрейм данных по конвейеру. Простой пример:

library(dplyr)
library(magrittr)

mtcars %>% slice(1:3) %T>%
  with({print(mpg)
        print(cyl)}) %>%
  summarize_all(mean)
# [1] 21.0 21.0 22.8
# [1] 6 6 4
#    mpg      cyl     disp       hp     drat    wt     qsec        vs am gear carb
# 1 21.6 5.333333 142.6667 104.3333 3.883333 2.605 17.36333 0.3333333  1    4    3

Упрощенная версия вашего примера:

mtcars %>%
  transmute(colA = cyl * hp, colB = mpg * wt) %T>%
  with({
    print(colA)
    print(colB)
  }) %>%
  head
#  [1]  660  660  372  660 1400  630 1960  248  380  738  738 1440 1440 1440 1640 1720 1840  264  208
# [20]  260  388 1200 1200 1960 1400  264  364  452 2112 1050 2680  436
#  [1] 55.0200 60.3750 52.8960 68.8010 64.3280 62.6260 51.0510 77.8360 71.8200 66.0480 61.2320
# [12] 66.7480 64.5290 57.4560 54.6000 56.4096 78.5715 71.2800 49.0960 62.2065 52.9975 54.5600
# [23] 52.2120 51.0720 73.8240 52.8255 55.6400 45.9952 50.0860 54.5690 53.5500 59.4920
#   colA   colB
# 1  660 55.020
# 2  660 60.375
# 3  372 52.896
# 4  660 68.801
# 5 1400 64.328
# 6  630 62.626

Обратите внимание, что with принимает только один аргумент expr, поэтому для выполнения нескольких операций в одном with вам нужно будет использовать {} для включения операторов.

...