使用变量名称作为情节标题与lapply

时间:2014-05-09 23:03:42

标签: r lapply

我需要在1-3个图表之间显示,我希望图表的标题基于使用的变量名称。

我可以在下面找到我想要的工作:

library(grid)
library(ggplot2)
library(gridExtra)

a1 <- sample(1:100)
a2 <- sample(1:100)
a3 <- sample(1:100)

make_graph <- function(x, y=deparse(substitute(x))){
        time <- 1:100
        dfp <- data.frame(time, x)
        ggplot(dfp, aes(x=time, y=x)) + geom_point() +
        ggtitle(y)
}

g1 <- make_graph(a1)
g2 <- make_graph(a2)
g3 <- make_graph(a3)
grid.arrange(g1,g2,g3)

但如果只需要1个或2个样本(即只有a1或a1和a2),则需要包含条件语句时效率会降低。

除了正确的标题外,我已经完成了以下工作:

library(grid)
library(ggplot2)
library(gridExtra)

a1 <- sample(1:100)
a2 <- sample(1:100)
a3 <- sample(1:100)

sample_list <- paste0("a", seq_len(3))

make_graph <- function(x, y=deparse(substitute(x))){
        time <- 1:100
        dfp <- data.frame(time, x)
        ggplot(dfp, aes(x=time, y=x)) + geom_point() +
        ggtitle(y)
}

graphs_list <- lapply(mget(sample_list), make_graph)
do.call("grid.arrange", graphs_list)

使用上面的代码我得到了正确的功能,但make_graph()中的deparse()似乎有一些问题,我假设是由于使用lapply调用。因此,而不是我在初始示例中的标题(“a1”,“a2”,“a3”),而是获得“X [[1L]]”,“X [[2L]]”,“X [[ 3L]]”。

我也试过改变lapply函数,但这只给了我列表中的第一个“标题”:

sample_list <- paste0("a", seq_len(3))

make_graph <- function(x, y){
        time <- 1:100
        dfp <- data.frame(time, x)
        ggplot(dfp, aes(x=time, y=x)) + geom_point() +
        ggtitle(y)
}

graphs_list <- lapply(mget(sample_list), make_graph, y=sample_list)
do.call("grid.arrange", graphs_list)

我不确定完成我在这里要做的事情的最佳方法。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

您对来自lapply的变量名称是正确的。因此deparse策略在这种情况下不是一个好的策略。但是,由于您可以非常轻松地传递标题,因此您可以使用Map而不是lapply

graphs_list <- Map(make_graph, mget(sample_list), sample_list)
do.call("grid.arrange", graphs_list)

这给出了期望的结果。

sample plot