【问题标题】:Use variable name as plot title with lapply使用变量名称作为绘图标题与 lapply
【发布时间】:2014-05-09 23:03:41
【问题描述】:

我需要显示 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)

我不确定完成我在这里尝试做的事情的最佳方法。 感谢您的帮助。

【问题讨论】:

    标签: r lapply


    【解决方案1】:

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

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

    这给出了想要的结果。

    【讨论】:

    • 太棒了!我发誓我每天都在学习一个新功能,我不敢相信它这么容易:)
    • @user3564760 和Map 基本上是mapply 默认不简化结果。所以它与lapply 密切相关,它只允许您迭代多个参数以传递给函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多