在 R 中按值传递

seb*_*seb 5 r ggplot2

当尝试调用 grid.arrange 将多个图放在同一个 ggplot2 图上时,我首先构建了一个我想要的图的列表。然后我构建相应的参数列表来调用 grid.arrange,如上一个问题中所述。这是我的代码(我的数据框称为 manip):

args.list <- NULL;
plot.list <- NULL;
for (m in names(manip[2:10])) {
  plot.list <- c(plot.list, list(qplot(manip$side, y=manip[,m],ylab=m))
}
args.list <- c(plot.list, 1, 9)
names(args.list) <- c(names(manip)[2:10], list("nrow","ncol"))
do.call(grid.arrange, args.list)
Run Code Online (Sandbox Code Playgroud)

这是有效的,除了 9 个图是完全一样的!经查,数据始终是对应的那个m=10。所以我的猜测是m循环中没有分配的值,而是稍后评估。但是,标签ylab=m 正确分配,并且对于所有图形都不同。

所以我真的不明白有什么区别以及解释器如何选择何时评估 m 的情节。有人可以解释一下吗?

And*_*rie 3

我将首先回答您的问题,然后使用分面图展示替代方案。

已编辑

以下经过简化的代码似乎可以工作:

library(gridExtra)
manip <- mtcars
plot.list <- lapply(2:11, 
                    function(x)qplot(manip$mpg, y=manip[, x], 
                    ylab=names(manip)[x]))
do.call(grid.arrange, c(plot.list, nrow=10))
Run Code Online (Sandbox Code Playgroud)

它产生了这个丑陋的情节: 在此输入图像描述


我知道,在不了解自己的目标的情况下尝试提供建议是危险的。尽管如此,您是否考虑过在情节中使用多方面?

下面的代码要简单得多,执行 quiker 并生成一个更容易解释的图表:

library(reshape2)
manip <- mtcars
mmanip <- melt(manip, id.vars="mpg")
str(mmanip)
ggplot(mmanip, aes(x=mpg, y=value)) + 
    geom_point(stat="identity") + 
    facet_grid(.~variable, scales="free")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述