R语言普通写法与%>%管道符写法返回结果不一致原因求解
R语言两条命令返回结果差异原因说明
核心问题根因
结果差异来源于magrittr包%>%管道运算符的默认参数传递规则,你对管道的理解误区在于:%>%默认会将左侧表达式的返回值,作为右侧函数的第一个位置参数自动注入。哪怕你在右侧函数中使用了占位符.,只要没有显式阻止该行为,注入逻辑仍然会生效。
你写的管道代码:
sample(0:1, 50, replace = TRUE, prob = c(0.5, 0.5)) %>% sum(.==1)
实际等价于执行以下代码:
temp <- sample(0:1, 50, replace = TRUE, prob = c(0.5, 0.5)) sum(temp, temp == 1)
sum()函数支持传入任意多个数值参数统一求和,上述代码的最终结果是两部分的加总:
- 第一部分是
temp本身50个元素的和,也就是抽样得到1的个数,约25左右 - 第二部分是
temp==1转换为数值后的和,同样是抽样得到1的个数,约25左右
两部分加总后结果约为50,和你观察到的返回值偏高的现象完全吻合。
正确写法修正
要让管道仅通过.传递值,阻止默认的第一个参数注入,最常用的方案是用大括号包裹右侧表达式,大括号会中断默认的参数注入逻辑,仅将左侧结果赋值给占位符.:
sample(0:1, 50, replace = TRUE, prob = c(0.5, 0.5)) %>% {sum(. == 1)}
内容的提问来源于stack exchange,提问作者Dave Twickenham
相关产品推荐
相关产品推荐

