代码之家  ›  专栏  ›  技术社区  ›  qwr

基于打印的ggplot列表值更改

  •  0
  • qwr  · 技术社区  · 5 年前

    以下是我遇到的问题的简化版本:

    grob.list <- vector("list", length = 2)
    for (i in 1:2) { 
      grob.list[[i]] <- qplot(1:5, 1:5 * (-1)^i)
    }
    
    grid.arrange(grobs = grob.list)
    

    我们得到两个相同的图( grob.list[[1]] 是错误的)。

    如果我们打印(甚至看不见)腹股沟是正确的。

    grob.list <- vector("list", length = 2)
    for (i in 1:2) { 
      grob.list[[i]] <- qplot(1:5, 1:5 * (-1)^i)
      invisible(print(grob.list[[i]]))
    }
    
    grid.arrange(grobs = grob.list)
    

    那么,打印是否会强制ggplot对象“确定”?打印ggplot对象实际上会改变什么?

    似乎与 Grid of multiple ggplot2 plots which have been made in a for loop 但不涉及打印的功能。

    0 回复  |  直到 5 年前
        1
  •  0
  •   joran    5 年前

    打印会强制参数i的求值,否则r的惰性求值会延迟查找该参数的值,直到绘图呈现时间,此时该值仅为2。

    一种选择是 force() 在函数中:

    plot.g <- function(i) {
        force(i)
        qplot(1:5, 1:5 * (-1)^i)
    }
    
    grob.list <- vector("list", length = 2)
    for (i in 1:2) { 
        grob.list[[i]] <- plot.g(i)
    }
    
    grid.arrange(grobs = grob.list)
    

    …或使用 lapply 在现代版本的r中,它将强制对论点进行评估 i :

    l <- lapply(1:2,function(i) qplot(1:5, 1:5 * (-1)^i))
    
    grid.arrange(grobs = l)