【发布时间】:2017-04-15 09:07:27
【问题描述】:
我怎样才能把这个ggplot() 调用变成一个函数?我不知道如何让 R 识别我想传递给函数的列名。我遇到了几个类似的听起来问题,但我没有成功地调整想法。 substitute() 见 here。
# setup
library(dplyr)
library(ggplot2)
set.seed(205)
dat = data.frame(t=rep(1:2, each=10),
pairs=rep(1:10,2),
value=rnorm(20))
# working example
ggplot(dat %>% group_by(pairs) %>%
mutate(slope = (value[t==2] - value[t==1])/(2-1)),
aes(t, value, group=pairs, colour=slope > 0)) +
geom_point() +
geom_line() +
stat_summary(fun.y=mean,geom="line",lwd=2,aes(group=1))
# attempt at turning into a function
plotFun <- function(df, groupBy, dv, time) {
groupBy2 <- substitute(groupBy)
dv2 <- substitute(dv)
time2 <- substitute(time)
ggplot(df %>% group_by(groupBy2) %>%
mutate(slope = (dv2[time2==2] - dv2[time2==1])/(2-1)),
aes(time2, dv2, group=groupBy2, colour=slope > 0)) +
geom_point() +
geom_line() +
stat_summary(fun.y=mean,geom="line",lwd=2,aes(group=1))
}
# error time
plotFun(dat, pairs, value, t)
更新
我接受了@joran 的建议来查看这个答案,这就是我想出的:
library(dplyr)
library(ggplot2)
library(lazyeval)
plotFun <- function(df, groupBy, dv, time) {
ggplot(df %>% group_by_(groupBy) %>%
mutate_(slope = interp(~(dv2[time2==2] - dv2[time2==1])/(2-1),
dv2=as.name(dv),
time2=as.name(time))),
aes(time, dv, group=groupBy, colour=slope > 0)) +
geom_point() +
geom_line() +
stat_summary(fun.y=mean,geom="line",lwd=2,aes(group=1))
}
plotFun(dat, "pairs", "value", "t")
代码运行但绘图不正确:
geom_path:每个组仅包含一个观察值。你需要 调整群体审美?
【问题讨论】:
-
参见
group_by_和mutate_进行编程 - 获取字符串名称。 -
@MichaelGriffiths 是对的,你应该看看非标准评估 (cran.r-project.org/web/packages/dplyr/vignettes/nse.html)
-
谢谢,两位。这对我来说是一个新概念。我认为我不太了解结构。 SE 示例:
summarise_(mtcars, "mean(mpg)")。翻译成我的例子:mutate_("slope = (dv[time==2] - dv[time==1])/(2-1)")... -
@EricGreen 我发现 dplyr 的系统也非常令人困惑。 this question 有帮助吗?
-
整件事应该是
aes_string(time, dv, group = groupBy, colour = 'slope > 0'))。保持其他一切不变,它对我有用。