想知道如何在 `mapply` 中正确使用 `%>%` 吗?

Would like to know how to properly use `%>%` in `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

请告诉我怎么做?

这里似乎不适合使用 %>%。如果您出于学习目的需要它,请使用:

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

要解释为什么您的代码不起作用,您需要知道编写 obj %>% f(args) always 会将 obj 作为调用中的第一个参数插入到 f,除非您单独使用 . 作为另一个参数。换句话说,它相当于

obj %>% f(., args)

因为您不单独使用 . 作为参数(即使您使用 .$a.%b),您的调用等同于

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

… 这是行不通的,因为 mapply 期望它的第一个参数是一个函数。

正如 Ronak 的回答所示,要避免这种情况,您可以将 f(args) 放入 {…}:

obj %>% {f(args)}

这种句法形式明确地禁用了有关插入 . 的规则,如上文所述。这是为此目的定义的特例。

或者,您可以使用来自“magrittr”的另一个管道运算符,exposition pipe, %$%。这个的工作方式不同:它从左侧表达式中提取命名组件。这样,你可以写

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