组合管道和magrittr dot(.)占位符

Las*_*sen 6 r dplyr magrittr

我对R很新,我试图理解%>%运算符和" ."(点)占位符的用法.作为一个简单示例,以下代码有效

library(magrittr)
library(ensurer)
ensure_data.frame <- ensures_that(is.data.frame(.))
data.frame(x = 5) %>% ensure_data.frame
Run Code Online (Sandbox Code Playgroud)

但是,以下代码失败

ensure_data.frame <- ensures_that(. %>% is.data.frame)
data.frame(x = 5) %>% ensure_data.frame
Run Code Online (Sandbox Code Playgroud)

我现在将占位符管道到is.data.frame方法中.

我猜这是我对点占位符的限制/解释的理解是滞后的,但有人可以澄清一下吗?

Ste*_*fan 6

"问题"是magrittr对匿名函数有一个简写符号:

. %>% is.data.frame
Run Code Online (Sandbox Code Playgroud)

大致相同

function(.) is.data.frame(.)
Run Code Online (Sandbox Code Playgroud)

换句话说,当点是(最左侧)左侧时,管道具有特殊行为.

您可以通过几种方式逃避行为,例如

(.) %>% is.data.frame
Run Code Online (Sandbox Code Playgroud)

或者LHS不相同的任何其他方式. 在这个特定的例子中,这可能看起来是不受欢迎的行为,但通常在这样的例子中,实际上不需要管道第一个表达式,因此is.data.frame(.)具有表现力. %>% is.data.frame,以及像

data %>% 
some_action %>% 
lapply(. %>% some_other_action %>% final_action)
Run Code Online (Sandbox Code Playgroud)

可以说比清楚明白

data %>% 
some_action %>%
lapply(function(.) final_action(some_other_action(.)))
Run Code Online (Sandbox Code Playgroud)