首页 > 解决方案 > magrittr 管道未评估点在函数参数中传递了第二个管道

问题描述

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

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

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

as.vector(x, "character") 中的错误:无法将类型“闭包”强制转换为“字符”类型的向量

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

标签: rmagrittr

解决方案


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

例如,. %>% 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())

推荐阅读