如何将any(diff(vec) < 0)以管道(pipe)形式正确编写?
问题分析
你的管道写法出错是因为magrittr的管道默认会把前一步的输出作为下一个函数的第一个位置参数。当你写vec %>% diff() %>% any(. < 0)时,实际执行的是any(diff(vec), diff(vec) < 0)——any()的第一个参数是数值向量diff(vec),第二个参数是逻辑向量diff(vec)<0,any()会把第一个数值向量强制转为逻辑值(非零即TRUE),所以返回了错误的TRUE并抛出警告。
正确的管道写法
以下几种方式都可以正确实现any(diff(vec) < 0)的逻辑:
方式1:用大括号{}包裹表达式
大括号会改变管道的参数传递逻辑,让.代表前一步的输出,整个表达式作为函数的输入:
library(magrittr) vec <- c(1,4,5) vec %>% diff() %>% { any(. < 0) } # [1] FALSE
方式2:先计算逻辑向量,再传入any()
先对diff()的结果做<0判断,再把得到的逻辑向量传给any():
vec %>% diff() %>% `<`(0) %>% any() # 或者更直观的写法 vec %>% diff() %>% (function(x) x < 0) %>% any()
方式3:使用magrittr的辅助函数
可以用magrittr提供的less_than()函数替代<0的写法,更易读:
vec %>% diff() %>% less_than(0) %>% any()
验证结果
以上所有写法都会返回正确的FALSE,且没有警告信息。
内容的提问来源于stack exchange,提问作者LulY
相关产品推荐
相关产品推荐

