使用 ggplot2 仅针对特定变量创建箱线图循环

Creating a boxplot loop with ggplot2 for only certain variables

我有一个包含 99 个观察值的数据集,我需要为其中包含特定字符串的数据集创建箱线图。但是,当我 运行 这段代码时,我从原始函数而不是循环中得到了 57 个完全相同的图。我想知道如何防止绘图被覆盖但仍然创建所有 57 个。这是代码和绘图的图片。 谢谢!

Boxplot Format

    #starting boxplot function
     myboxplot <- function(mydata=ivf_dataset, myexposure = 
     "ART_CURRENT", myoutcome = "MEG3_DMR_mean")
     {bp <- ggplot(ivf_dataset, aes(ART_CURRENT, MEG3_DMR_mean)) 
     bp <- bp + geom_boxplot(aes(group =ART_CURRENT))
     }

     #pulling out variables needed for plots
     outcomes = names(ivf_dataset)[grep("_DMR_", names(ivf_dataset), 
     ignore.case = T)]

     #creating loop for 57 boxplots
     allplots <- list()
     for (i in seq_along(outcomes))
     {
     allplots[[i]]<- myboxplot (myexposure = "ART_CURRENT", myoutcome = 
     outcomes[i])  
     }
     allplots

我建议阅读有关标准和非标准评估以及它如何与 tidyverse 一起工作的内容。这里有一些链接

http://adv-r.had.co.nz/Functions.html#function-arguments

http://adv-r.had.co.nz/Computing-on-the-language.html

我也觉得这个有用

https://rstudio-pubs-static.s3.amazonaws.com/97970_465837f898094848b293e3988a1328c6.html

此外,您需要生成一个示例,以便可以重现您的问题。这是我创建的数据。

df <- data.frame(label = rep(c("a","b","c"), 5), 
                x = rnorm(15),
                y = rnorm(15),
                x2 = rnorm(15, 10),
                y2 = rnorm(15, 5))

我保持你的大部分代码不变,只改变了需要改变的地方。

myboxplot2 <- function(mydata = df, myexposure, myoutcome){
 bp <- ggplot(mydata, aes_(as.name(myexposure), as.name(myoutcome))) +
   geom_boxplot()
 print(bp)
}
myboxplot2(myexposure =  "label", myoutcome =  "y")

因为aes()使用了非标准评价,所以需要使用aes_()。再次阅读上面的链接。

我在这里获取所有以 x 开头的列。我假设您的代码获得了您想要的列。

outcomes <- names(df)[grep("^x", names(df), ignore.case = TRUE)]

这里我和你一样循环。不过,我只存储了绘图对象。

allplots <- list()
for (i in seq_along(outcomes)){
  allplots[[i]]<- myboxplot2(myexposure = "label", myoutcome = outcomes[i])$plot
}
allplots