R语言 如何参考本地和上级LHS

pdkcd3nj  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(91)

在下面,有没有一种方法可以在expr中同时引用expr1expr2

expr1 %>% {
  expr2 %>% expr
}

字符串
例如,这不起作用

mtcars %>% {
  mtcars[1:3] %>% mutate(disp2 = disp + hp)
}


另一个例子,有没有一种方法可以使输出为32 11 32 3,即使第一个.指向上一级LHS?

mtcars %>% {
  mtcars[1:3] %>% {cat(dim(.),dim(.))}
}


只是好奇!
谢谢你,
更新-
感谢您的意见和建议,@GregorThomas和@维克托!我的意图不是特别针对这两个例子,而是如何编写代码w/o打破管道,例如,我不想写这个使用xexpr中的上层LHS

expr1 %>% {
  x <- .
  expr2 %>% expr 
}

f8rj6qna

f8rj6qna1#

有一个办法:

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()

相关问题