magrittr管道不评估点,而在函数参数中传递了第二个管道

时间:2019-07-25 06:28:38

标签: r 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”)中的错误:     无法将类型'closure'强制转换为类型'character'的向量

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

1 个答案:

答案 0 :(得分:6)

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

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