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

时间:2016-04-19 11:12:42

标签: r dplyr magrittr

我是R的新手,我正在尝试了解%>%运算符以及“.”(点)占位符的用法。作为一个简单示例,以下代码可以正常工作

library(magrittr)
library(ensurer)
ensure_data.frame <- ensures_that(is.data.frame(.))
data.frame(x = 5) %>% ensure_data.frame

但是以下代码失败

ensure_data.frame <- ensures_that(. %>% is.data.frame)
data.frame(x = 5) %>% ensure_data.frame

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

我猜这是我对点占位符的限制/解释的理解是滞后的,但任何人都可以澄清这个吗?

2 个答案:

答案 0 :(得分:6)

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

. %>% is.data.frame

大致相同
function(.) is.data.frame(.)

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

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

(.) %>% is.data.frame

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

data %>% 
some_action %>% 
lapply(. %>% some_other_action %>% final_action)

可以被认为比

更清楚
data %>% 
some_action %>%
lapply(function(.) final_action(some_other_action(.)))

答案 1 :(得分:0)

这是问题所在:

. = data.frame(x = 5)
a = data.frame(x = 5)

a %>% is.data.frame
#[1] TRUE
. %>% is.data.frame
#Functional sequence with the following components:
#
# 1. is.data.frame(.)
#
#Use 'functions' to extract the individual functions. 

对我来说看起来像个错误,但是dplyr专家可以加入。

表达式中的一个简单解决方法是执行.[] %>% is.data.frame