Dplyr's mutate
函數可以評估「鏈接」表達式,例如,如何實施mutate-like鏈評估?
library(dplyr)
data.frame(a = 1) %>%
mutate(b = a + 1, c = b * 2)
## a b c
## 1 1 2 4
這怎麼實現?在dplyr的源代碼快速瀏覽發現候補碼的基本結構:
library(lazyeval)
library(rlang)
compat_as_lazy <- function(quo) {
structure(class = "lazy", list(
expr = f_rhs(quo),
env = f_env(quo)
))
}
compat_as_lazy_dots <- function(...) {
structure(class = "lazy_dots", lapply(quos(...), compat_as_lazy))
}
my_mutate <- function(.data, ...) {
lazy_eval(compat_as_lazy_dots(...), data = .data)
}
data.frame(a = 1) %>%
my_mutate(b = a + 1, c = b * 2)
## Error in eval(x$expr, data, x$env) : object 'b' not found
...但這樣的「天真」的實施不工作,背後mutate_impl
的C++代碼是非常複雜的。我知道它不起作用,因爲"lazy_dots"
上的lazy_eval
使用lapply
,即每個表達式都彼此獨立評估,而我寧願需要鏈接評估並將結果返回到共享環境。如何使它工作?
哦,你正試圖做出自己的mutate函數.... – CPak