Порядок выполнения вложенных функций в трубе dplyr
Когда я использую вложенную функцию в шаге конвейера, порядок выполнения кажется не интуитивным.
df <- data.frame(a = c(1,NA,2), b = c(NA, NA, 1))
df %>% is.na %>% colSums # Produce correct count of missing values
df %>% colSums(is.na(.)) # Produce NA
Кто-нибудь может объяснить, почему вложенная функция в третьей строке не дает правильного результата?
1 ответ
Решение
Это потому что .
всегда передается в качестве первого аргумента следующей функции. Итак, во второй попытке colSums
, вы предполагаете, что вы проходите is.na(.)
в качестве первого аргумента colSums
, но вы на самом деле передаете его как второй, который является na.rm
параметр. Итак, как на самом деле выглядит ваш код df %>% colSums(x = ., na.rm = is.na(.))
, Вы можете предотвратить .
передается в качестве первого параметра с помощью {}
вокруг функции. df %>% {colSums(is.na(.))}