【发布时间】:2019-03-23 09:20:44
【问题描述】:
我刚读完'Programming with dplyr' 和'Define aesthetic mappings programatically',开始了解函数的非标准评估。这篇文章的具体问题是,“如何使用tidyverse直接在下面编写代码(例如quo()、!!等) " 而不是 base-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)
你能提供答案吗?如果你能在以下概念中工作,那将是一个额外的好处,即为什么上面的函数非标准而另一个下面的功能是标准的吗?我阅读了关于函数和非标准评估的 Advanced R 章节,但此时它超出了我的想象。你能用外行的话解释一下吗?下面的函数清晰简洁(对我来说),而上面的函数是一团糟。
rescale01 <- function(x) {
rng <- range(x, na.rm = TRUE)
(x - rng[1]) / (rng[2] - rng[1])
}
rescale01(c(0, 5, 10))
【问题讨论】: