再现性数据
.i <- tibble(a=2*1:4+1, b=2*1:4)
该函数应该将其数据和其他参数作为不带引号的名称,在数据中找到这些名称,并使用它们添加一列并过滤掉第一行。这没用。变异说找不到了。
t1 <- function(.j=.i, X=a, Y=b){
e_X <- enquo(X)
e_Y <- enquo(Y)
mutate(.data=.j, pass=UQ(e_X)+1) %>%
filter(UQ(e_Y) > 3) -> out
out
}
t1(a,b)
这个函数,我是通过拼写错误找到的——注意 mutate 语句中的 .i 而不是 .j ——完成了前一个函数应该做的事情。我不知道为什么。我认为它正在跳过函数参数并在全局环境中查找 .i 。或者也许它正在使用一个ouiji板。
t2 <- function(.j=.i, X=a, Y=b){
e_X <- enquo(X)
e_Y <- enquo(Y)
mutate(.data=.i, pass=UQ(e_X)+1) %>%
filter(UQ(e_Y) > 3) -> out
out
}
t1(a,b)
由于 mutate 在以通常的 R 方式传递给它时找不到 .j,因此可能需要以 rlang 样式的 quosure 传递,就像形式 X 和 Y 一样。这个函数也不起作用,UQ in mutate 说它找不到了。与上面的第一个函数一样,如果将 mutate 中的 .j 替换为 .i,它就会起作用。(似乎应该有一个平行现状的“enquos”)。
t3 <- function(.j=.i, X=a, Y=b){
e_j <- enquo(.j)
e_X <- enquo(X)
e_Y <- enquo(Y)
mutate(.data=UQ(.j), pass=UQ(e_X)+1) %>%
filter(UQ(e_Y) > 3) -> out
out
}
t1(a,b)
最后,似乎一旦在 mutate 中进行了 .i 替换,t4() 就不再需要数据参数了。见下文,我将其替换为 bop_foo_foo。但是,如果您将 bop_foo_foo 全部替换为数据名称 .i, (t5()),则 UQ 再次无法找到 a。
bop_foo_foo <- 0
t4 <- function(bop_foo_foo, X=a, Y=b){
e_j <- enquo(bop_foo_foo)
e_X <- enquo(X)
e_Y <- enquo(Y)
mutate(.data=UQ(.i), pass=UQ(e_X)+1) %>%
filter(UQ(e_Y) > 3) -> out
out
}
t1(a,b)
在我看来,上面的函数似乎是单个函数的相对较小的变体。我又跑了几十次,虽然我观察到了一些模式,并且阅读了不知道多少遍的 enquo 和 UQ 帮助文件,但我仍然无法真正理解。
我想知道为什么上面那些不起作用的功能不起作用,以及为什么起作用的功能起作用。我不一定需要一个功能一个功能的批评。如果您能陈述体现所需理解的一般原则,那将是令人愉快的。而且绰绰有余。