将列名称传递给ggplot2中的图形函数

时间:2016-01-08 21:23:37

标签: r function graph tidyr

我有一个包含多个因变量但只有两个独立变量的大型数据集(我将反复使用它来对许多因变量进行排序)。每个因变量在治疗前和治疗后测量两次。我想编写一个函数,允许我为这些多个因变量中的每一个获取一个图形,函数的参数作为我希望绘制的任何因变量的两个列名。

我已经生成了一个玩具数据集来说明我的问题。 't1DV1'和't1DV2'是因变量1的治疗前和治疗后评分。't1DV2'和't2DV2'是因变量2的治疗前和治疗后评分。'组'是自变量。

group <- factor(rep(c("A", "B"), 10))
t1DV1 <- runif(20, min = 0, max = 10)
t2DV1 <- runif(20, min = 0, max = 10)
t1DV2 <- runif(20, min = 0, max = 10)
t2DV2 <- runif(20, min = 0, max = 10)

df <- data.frame(group, t1DV1, t2DV1, t1DV2, t2DV2)

df

我尝试编写以下功能

DVGraph <- function (DV1, DV2) { 

require(tidyr)

dfLong <- gather(df, prePost, Score, DV1:DV1)

require(ggplot2)

barGraph <- ggplot(dfLong, aes(group, Score, fill = prePost)) + 
  geom_bar(stat = "identity", position = "dodge", size = 0.5) +
  scale_fill_manual(values = c("#999999", "#666666")) +
  xlab("") +
  ylab("Scores") +
  theme_bw()

return(barGraph)

}

然后尝试使用第一个重复测量变量调用它(我同样可以使用第二个,即t1DV2和t2DV2)

DVGraph(t1DV1, t2DV1)

但是我收到了一个错误。

我尝试使用这样的引号“

DVGraph("t1DV1", "t2DV1")

但是我得到了另一个(不同的)错误。

有谁知道我怎么会这样做?

1 个答案:

答案 0 :(得分:1)

gather来电更改为以下内容:

dfLong <- gather(df, prePost, Score, DV1, DV2)

然后,当您调用函数时,请使用列号而不是列名:

DVGraph(2, 3)

enter image description here

或者,您可以将gather()替换为melt() reshape2 substitute(),以便能够使用未加引号的变量调用该函数:

DVGraph <- function (DV1, DV2) { 

  require(tidyr)
  require(reshape2)

  dfLong <- melt(df,measure.vars = c(substitute(DV1),substitute(DV2)),
                 var="prePost",value.name ="Score")

  require(ggplot2)

  barGraph <- ggplot(dfLong, aes(group, Score, fill = prePost)) + 
    geom_bar(stat = "identity", position = "dodge", size = 0.5) +
    scale_fill_manual(values = c("#999999", "#666666")) +
    xlab("") +
    ylab("Scores") +
    theme_bw()

  return(barGraph)

}

DVGraph(t1DV2, t2DV1)

<强>更新

如果您想在评论中执行您提出的问题,一个快速解决方法是识别使用substitute()强制您的矢量成为一个列表,但您可以使用{{{{}}强制它成为一个字符1}}如下:

as.character(substitute())