Хотел бы знать, как правильно использовать `%>%` в `mapply`?

#r #mapply

#r #mapply

Вопрос:

Хотел бы знать, как правильно комбинировать %>% с. mapply вот образец игрушки

 A = data.table(a = letters[1:3], b = 3:1) 
mapply(function(x, y) str_c(x,"---", y), A$a, A$b) 
 

он дает именованный символьный вектор следующим образом

       a       b       c 
"a---3" "b---2" "c---1" 
 

Однако он генерирует новые переменные, которых я изо всех сил стараюсь избегать, и хотел бы сделать это в этой форме:

 A %>% mapply(function(x, y) str_c(x,"---", y), .$a, .$b)
 

но результат

   object '.' of mode 'function' was not found
 

Пожалуйста, посоветуйте, как я могу это сделать?

Комментарии:

1. Использовать A %>% {mapply(function(x, y) str_c(x,"---", y), .$a, .$b)} . То, что вы передаете, всегда будет передаваться первому параметру вызываемой вами функции, если у вас где-то нет одного. . Наличие .$a не изменит место передачи значения

2. @MrFlick Мне сказали, что точка (.) работает как заполнитель.

3. Точка работает как заполнитель только тогда, когда она одна. Когда он используется с функцией like $ , он не перенаправляет канал.

Ответ №1:

Чтобы объяснить, почему ваш код не работает, вам нужно знать, что запись obj %>% f(args) всегда вставляется obj в качестве первого аргумента при вызове to f , если только вы не используете . его самостоятельно в качестве другого аргумента. Другими словами, это эквивалентно

 obj %>% f(., args)
 

Поскольку вы не используете . его самостоятельно в качестве аргумента (даже если вы используете .$a and .%b ), ваш вызов эквивалентен

 A %>% mapply(., function(x, y) str_c(x,"---", y), .$a, .$b)
 

… который не работает, поскольку mapply ожидает, что его первым аргументом будет функция.

Как показывает ответ Ронака, чтобы обойти это, вы можете поместить f(args) в {…} :

 obj %>% {f(args)}
 

Эта синтаксическая форма явно отключает правило о вставке . , как объяснено выше. Это особый случай, определенный для этой цели.

В качестве альтернативы, вы могли бы использовать другой оператор канала из ‘magrittr’, канала экспозиции %$% . Это работает по-другому: оно извлекает именованные компоненты из левого выражения. Таким образом, вы могли бы написать

 A %$% mapply(function(x, y) str_c(x,"---", y), a, b)
 

Комментарии:

1. Привет, Конрад, ты предоставил гораздо больше, чем я мог ожидать. Я ожидал совета о том, как правильно поступать. Тем не менее, я научился правильно относиться к трубопроводу. %>% это больше похоже на передачу ссылки, а %$% это больше похоже на передачу сущности. Еще раз спасибо.

Ответ №2:

Похоже, это не подходящее место для использования %>% . Если вам это нужно для целей обучения, используйте :

 A %>% {mapply(function(x, y) stringr::str_c(x,"---", y), .$a, .$b)}
 

Комментарии:

1. большое спасибо! Хотел бы далее спросить, что вы посоветовали использовать это в учебных целях, почему так?

2. Я имел в виду, что не стал бы использовать `%>%` для таких случаев, потому что это скорее сбивает с толку, чем удобно.

3. верно. Через некоторое время смысл предложения становится размытым.