我在使用具有独特功能的管道运算符 (%>%) 时遇到了一些麻烦。
df = data.frame(
a = c(1,2,3,1),
b = 'a')
unique(df$a) # no problem here
df %>% unique(.$a) # not working here
# I got "Error: argument 'incomparables != FALSE' is not used (yet)"
知道吗?
正如其他答案提到的:df %>% unique(.$a)
等同于df %>% unique(.,.$a)
。
要强制点明确,您可以执行以下操作:
df %>% {unique(.$a)}
# [1] 1 2 3
magrittr
的另一种选择
df %$% unique(a)
# [1] 1 2 3
或者可能陈述显而易见的事情:
df$a %>% unique()
# [1] 1 2 3
正在发生的事情是,默认情况下,%>%
获取左侧的对象并将其馈送到函数的第一个参数中,然后将按提供的方式输入其他参数。下面是一个示例:
df = data.frame(
a = c(1,2,3,1),
b = 'a')
MyFun<-function(x,y=FALSE){
return(match.call())
}
> df %>% MyFun(.$a)
MyFun(x = ., y = .$a)
正在发生的事情是,%>%
将df
与x
相匹配,.$a
与y
相匹配。
因此,unique
您的代码被解释为:
unique(x=df, incomparables=.$a)
这解释了错误。 对于您的情况,您需要在运行唯一之前拉出a
。如果你想保持%>%
你可以使用df %>% .$a %>% unique()
但显然还有很多其他方法可以做到这一点。