dplyr::mutate中使用R原生|>管道占位符报错原因
报错原因
R 原生管道|>的占位符_有严格的使用限制:占位符仅能出现在当前管道步骤顶层调用函数的命名参数位置,不允许出现在嵌套的子表达式、内层函数调用中。
- 直接在管道顶层调用
apply(X = _, 1, sum)时,_是顶层函数apply的直接参数,符合规则,因此可以正常运行。 - 把
apply写在mutate()的参数内部时,_属于嵌套在mutate参数里的内层函数参数,不在原生管道允许的占位符使用范围内,因此会抛出invalid use of pipe placeholder错误。
magrittr提供的%>%管道占位符.没有这个严格的作用域限制,它会在当前管道传入的整个表达式范围内逐层查找替换占位符,哪怕.写在嵌套的内层函数参数里也能被正确识别,因此相同写法用%>%不会报错。
可行的替代写法
- 优先用dplyr原生向量化函数实现行求和,运行效率远高于
apply按行循环:
library(dplyr) iris[,-5] |> mutate(Row_sum = rowSums(pick(everything())))
- 如果需要在嵌套子表达式中引用管道传入的完整对象,可以用R原生匿名函数显式传参,绕开占位符的作用域限制:
iris[,-5] |> (\(data) mutate(data, Row_sum = apply(X = data, 1, sum)))()
- 直接使用magrittr的
%>%管道,适配嵌套调用占位符的使用场景。
内容的提问来源于stack exchange,提问作者Gilles San Martin
相关产品推荐
相关产品推荐

