结合管道和magrittr的点(.)占位符

7

我是一名新手,正在学习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个回答

10
"问题"在于magrittr有一个匿名函数的简写符号:

. %>% is.data.frame

大致上与

function(.) is.data.frame(.)

换句话说,当点是最左侧的左手边时,管道符具有特殊行为。

您可以通过几种方式来避免这种行为,例如

(.) %>% is.data.frame

或者任何其他使左侧不等于 . 的方式。

在这个特定的例子中,这似乎是不良行为,但通常在像这样的示例中,没有必要将第一个表达式传递给管道运算符,因此 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(.)))

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. 

在我看来似乎是一个bug,但是专家可以发言。

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


感谢您澄清可能是dplyr中的不一致性,并提供解决方法! - Lasse Vilhelmsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接