R语言使用magrittr管道调用sqrt()返回非预期结果的原因
差异原因说明
核心原因是R中%>%管道运算符的优先级高于四则算术运算符,两种写法实际执行的运算顺序完全不同:
写法1的实际执行步骤
你写的写法1代码:
(a^2 %>% colSums())/5 %>% sqrt()
实际按以下顺序执行:
- 先执行括号内逻辑:
a^2 %>% colSums(),得到结果c(5, 50000),这一步和预期一致 - 由于
%>%优先级高于/,接下来不会先算c(5,50000)/5,而是优先执行5 %>% sqrt(),得到sqrt(5) ≈ 2.236068 - 最后执行第一步结果除以第二步结果:
c(5, 50000) / 2.236068,最终得到你看到的错误结果c(2.236068, 22360.68)
写法2正确的原因
写法2用括号明确指定了运算优先级:
sqrt((a^2 %>% colSums())/5)
执行顺序完全符合你的预期:
- 计算
a^2 %>% colSums()得到c(5,50000) - 除以5得到
c(1, 10000) - 对结果开平方得到
c(1,100)
正确的纯管道写法参考
如果希望全用管道实现逻辑,可以将除法操作也纳入管道链路,避免优先级问题:
# 方法1:用反引号包裹除法运算符作为管道调用函数 a^2 %>% colSums() %>% `/`(5) %>% sqrt() # 方法2:用magrittr提供的除法别名更易读 a^2 %>% colSums() %>% divide_by(5) %>% sqrt()
内容的提问来源于stack exchange,提问作者T X
相关产品推荐
相关产品推荐

