如何参考本地和上级LHS

问题描述 投票:0回答:1

下面有没有办法同时引用

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 
}
r pipe
1个回答
0
投票

有一个办法:

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()
© www.soinside.com 2019 - 2024. All rights reserved.