#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. верно. Через некоторое время смысл предложения становится размытым.