下面有没有办法同时引用
expr1
中的expr2
和expr
?
expr1 %>% {
expr2 %>% expr
}
例如,这行不通
mtcars %>% {
mtcars[1:3] %>% mutate(disp2 = disp + hp)
}
再举个例子,有没有办法让输出为
32 11 32 3
,即让第一个.
指向上一级LHS?
mtcars %>% {
mtcars[1:3] %>% {cat(dim(.),dim(.))}
}
只是好奇!
谢谢,
更新----------
感谢@GregorThomas 和@Victor 的评论和建议!我的目的并不是专门针对这两个示例,而是如何编写代码而不破坏管道,例如我不想写这个来使用
x
作为 expr
中的上层 LHS
expr1 %>% {
x <- .
expr2 %>% expr
}
有一个办法:
library(dplyr)
mtcars %>% {
mtcars[1:3] %>% {cat(dim(parent.env(environment())$.), dim(.))}
}
这将打印
32 11 32 3
environment()
返回当前环境和 parent.env
调用堆栈中上一层的环境,然后您可以使用美元运算符访问该环境以获取点的值。
为了使您的第一个示例正常工作,请使用 bang-bang 运算符强制进行早期评估:
library(rlang)
mtcars %>% {
mtcars[1:3] %>% mutate(disp2 = disp + !!parent.env(environment())$.$hp)
}
我发现查看调用堆栈很有帮助,这可以通过运行来完成
mtcars %>% {
mtcars[1:3] %>% {lobstr::cst()}
}
输出:
▆
1. ├─mtcars %>% ...
2. ├─mtcars[1:3] %>% ...
3. └─lobstr::cst()