如何在R嵌套管道中同时引用本地及上层LHS对象?
在magrittr嵌套管道中同时引用多层LHS的实现方法
核心问题
在magrittr的嵌套管道结构中:
expr1 %>% { expr2 %>% expr }
能否在expr中同时引用外层的expr1和当前层的expr2,且无需提前将expr1赋值给临时变量?
解决方案:利用magrittr的..1占位符
magrittr提供了..n系列特殊占位符,用于引用管道链中前n个步骤的输入。在嵌套管道场景中,..1会指向外层花括号接收的输入(即expr1),而内层的.则指向当前管道的输入(即expr2),无需额外赋值操作。
示例1:实现目标输出32 11 32 3
原代码中两个.都指向内层的mtcars[1:3],无法区分外层输入。修改为用..1指代外层的mtcars:
mtcars %>% { mtcars[1:3] %>% {cat(dim(..1), dim(.))} }
执行后输出:32 11 32 3,其中dim(..1)对应外层mtcars的维度,dim(.)对应内层mtcars[1:3]的维度。
示例2:在mutate中同时调用多层数据
若需要在内层管道的mutate中同时使用外层expr1和内层expr2的数据,同样用..1引用外层输入:
mtcars %>% { mtcars[1:3] %>% mutate(disp2 = disp + ..1$hp) }
这里..1$hp调用的是外层mtcars的hp列,与当前层的disp列计算得到新列disp2。
说明
..1是magrittr内置的占位符,专门用于跨层级引用管道的前置输入,无需手动维护临时变量。- 若需要引用更早的步骤,可依次使用
..2、..3等占位符。
内容的提问来源于stack exchange,提问作者blueskyddd
相关产品推荐
相关产品推荐

