我刚刚读完“用 dplyr 编程” https://dplyr.tidyverse.org/articles/programming.html and “以编程方式定义美学映射” https://ggplot2.tidyverse.org/reference/aes_.html开始掌握函数的非标准评估。这篇文章的具体问题是,“如何使用 tidyverse 直接在下面编写代码(例如quo()
, !!
, etc.)"而不是基本 R 方法eval()
, substitute
, etc.
.
library(tidyverse)
xy <- data.frame(xvar = 1:10, yvar = 11:20)
plotfunc <- function(data, x, y){
y.sqr <- (eval(substitute(y), envir = data))^2
print(
ggplot(data, aes_q(x = substitute(x), y = substitute(y.sqr))) +
geom_line()
)
}
plotfunc(xy, xvar, yvar)
你能提供答案吗?如果你能理解以下概念,那就太好了,为什么上面的函数是这样的非标准而下面的另一个功能是标准的?我读了高级R关于函数和非标准评估的章节,但目前这超出了我的能力范围。能用通俗的语言解释一下吗?下面的函数(对我来说)清晰简洁,而上面的函数却是一团模糊的混乱。
rescale01 <- function(x) {
rng <- range(x, na.rm = TRUE)
(x - rng[1]) / (rng[2] - rng[1])
}
rescale01(c(0, 5, 10))