当为数据框调用 with 时,我们如何在不使用其名称的情况下引用父数据框?

When with is called for a data frame, how can we refer to the parent data frame without using its name?

考虑 with(mtcars, split(mtcars,cyl == 8 & disp > 350))。在编写复杂代码时,尤其是比此示例更复杂的代码时,with 让我们大大减少了需要编写 mtcars 的次数。然而,即使在这个简单的例子中,我也不得不写两次 mtcars 。使用 with 时有什么办法解决这个问题吗?也许类似于 Recall()?我想要的是某种表达方式 with(data, foo(dataFrameThatMadeThisEnvironment(),partOfData)).

基本 R 中没有这样的功能。with 基本上只是一个方便的包装器,用于交互使用。您可以相当简单地编写自己的

withself <- function(data, expr) {
  env <- new.env(parent = parent.frame())
  env$self <- function() data
  eval(substitute(expr), data, enclos = env)
}
withself(mtcars, split(self(),cyl == 8 & disp > 350))

你们可以“破解”with 调用堆栈。例如

withdata <- function() parent.frame(3)$data
with(mtcars, split(withdata(),cyl == 8 & disp > 350))

但它真的不应该那样使用。

tidyverse 世界中,您避免使用管道进行重复

mtcars %>% 
  group_by(cyl == 8 & disp > 350) %>% 
  group_split()

或者只使用 matrittr::%>% 管道运算符

mtcars %>% with(., split(., cyl == 8 & disp > 350))

我认为即将推出的原生 R 管道运算符不会允许您多次传递相同的值,但我想我们必须看看最终版本会做什么。