Dplyrのmutate
関数は "連鎖"式を評価できます。どのようにmutateのようなチェーン評価を実装するには?
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_eval
の"lazy_dots"
にはlapply
が使用されています。つまり、それぞれの式は互いに独立して評価されますが、結果を共有環境に戻して連鎖的に評価する必要があります。それを動作させるには?
ああ、あなた自身の突然変異関数を作成しようとしています.... – CPak