magrittr pipe 不评估在函数参数中传递给第二个管道的点

magrittr pipe not evaluating a dot passed a second pipe within a function argument

当第二次使用点重用管道左侧的数据时,将点传递给函数 . %>% f() 与将点放在函数括号内 f(.) 是不同的。这是为什么?

调试 %>% 运算符表明 . %>% identity() 求值为函数序列而不是字符向量,这导致 names<- 失败。我不知道如何强制评估这个。

# Error
c('a', 'b', 'c') %>% `names<-`(., . %>% identity())
# Works
c('a', 'b', 'c') %>% `names<-`(., identity(.))
c('a', 'b', 'c') %>% `names<-`(., . %>% identity())

Error in as.vector(x, "character") : cannot coerce type 'closure' to vector of type 'character'

c('a', 'b', 'c') %>% `names<-`(., identity(.))
# a   b   c 
#"a" "b" "c"

. 开头的管道生成一个函数。

例如,. %>% identity 等同于 function(.) identity(.)

因此,

# Error
c('a', 'b', 'c') %>% `names<-`(., . %>% identity())

被视为

c('a', 'b', 'c') %>% `names<-`(., function(.) identity(.))

这意味着 names<- 的第二个参数是函数,而不是字符向量。

这在 Using the dot-place holder as lhs 中有记录。

为了变通,尝试

c('a', 'b', 'c') %>% `names<-`(., (.) %>% identity())