использовать оператор трубы в mutate - PullRequest
2 голосов
/ 05 мая 2020

Мне интересно, что следующий код не работает. Поскольку канал несовместим с mutate?

tibble(x = c(1,2), y = c(3,4)) %>% 
mutate(z = {. %>% (function(tb) {tb$x + tb$y})})

Я знаю, что обходной путь:

tibble(x = c(1,2), y = c(3,4)) %>% 
    mutate(z = map_depth(., .depth = 0, function(tb) {tb$x + tb$y}))

или

tibble(x = c(1,2), y = c(3,4)) %>% 
    mutate(z = exec(function(tb) {tb$x + tb$y}, .))

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

Это работает так, как вы ожидаете:

tibble(x = c(1,2), y = c(3,4)) %>% 
  mutate(z = {(.) %>% (function(tb) {tb$x + tb$y})})

# # A tibble: 2 x 3
#       x     y     z
#   <dbl> <dbl> <dbl>
# 1     1     3     4
# 2     2     4     6

Проблема не в канале, а скорее в том, что ., кажется, интерпретируется как функция (которая сбрасывает канал).


Изменить:

@ Aramis7d предоставил ссылку на документацию для magrittr в комментарии. Соответствующая строка:

Использование подставки для точки как lhs

Когда точка используется как lhs, результатом будет функциональная последовательность, то есть функция, которая применяет вся цепочка правых частей по очереди к ее входу. См. Примеры.

Итак, в вашем примере вы пытались назначить целую функцию на z внутри mutate. Вы можете увидеть это на основе возвращенного сообщения об ошибке. Используя (.), мы принудительно оцениваем . и получаем ожидаемые результаты.

tibble(x = c(1,2), y = c(3,4)) %>% 
  mutate(z = {. %>% (function(tb) {tb$x + tb$y})})
# Error: Column `z` is of unsupported type function
1 голос
/ 06 мая 2020

Действительно интересный сценарий.

Без каких-либо дополнительных вариантов использования c, похоже, что оператор %>% вообще не требуется, даже если вы хотите использовать anonymous functions в mutate().

tibble(x = c(1,2), y = c(3,4)) %>% 
  mutate(z = {(function(tb){tb$x + tb$y})(.)})

возвращает:

# A tibble: 2 x 3
      x     y     z
  <dbl> <dbl> <dbl>
1     1     3     4
2     2     4     6
...