想知道如何在 `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)
想知道如何以正确的方式组合 %>%
和 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)