当为数据框调用 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 管道运算符不会允许您多次传递相同的值,但我想我们必须看看最终版本会做什么。
考虑 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 管道运算符不会允许您多次传递相同的值,但我想我们必须看看最终版本会做什么。