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())
当第二次使用点重用管道左侧的数据时,将点传递给函数 . %>% 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())