r - 将列名传递给函数

标签 r ggplot2 dplyr

如何将此 ggplot() 调用转换为函数?我不知道如何让 R 识别我想要传递给函数的列名称。我遇到过几个听起来类似的问题,但我没有成功地调整想法。请参阅here对于substitute()

# 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: Each group consists of only one observation. Do you need to adjust the group aesthetic?

最佳答案

以下是所有评论者告知的有效解决方案:

# setup
  library(dplyr)
  library(ggplot2)
  library(lazyeval)
  set.seed(205)
  dat = data.frame(t=rep(1:2, each=10), 
                   pairs=rep(1:10,2), 
                   value=rnorm(20))


# function
  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_string(time, dv, group = groupBy, 
                        colour = 'slope > 0')) +
        geom_point() +
        geom_line() +
        stat_summary(fun.y=mean,geom="line",lwd=2,aes(group=1))
  }

# plot
  plotFun(dat, "pairs", "value", "t")

关于r - 将列名传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40898596/

相关文章:

sql - 找出 dplyr 查询中有多少行的最快方法是什么?

r - 如何使用 gganimate 动画让 x 轴跨度移动?

r - ..level.. 在 ggplot2 等高线图中

r - 如何向 ggplot2 axis.text 添加下标

r - 将 slice() 应用于 tbl

r - 计算R中每列的负值、0值和正值的数量和百分比

r - R : weird behaviour at the end of time series中的带通滤波器

r - 在匹配后替换字符串的一部分

r - 如何根据ggplot中的第三个因子变量维护变量的顺序?

r - 通过自定义函数在循环中创建一个新的均值列