【问题标题】:ggplot2 prints twice when inside lapply() loopggplot2 在 lapply() 循环内打印两次
【发布时间】:2019-06-28 19:34:26
【问题描述】:

当创建一组两个图形时,在 lapply 循环内打印将在 RStudio Plots Panel 中打印两次。

x=1:7
y=1:7
df1 = data.frame(x=x,y=y)
x=10:70
y=10:70
df2 = data.frame(x=x,y=y)
db <- list(df1, df2)

# Given a data frame, the function below creates a graph
create.graph <- function (df){
  p <- ggplot(df,aes(x,y))+geom_point()
  # here goes other stuff, such as ggsave()
  return (p)
}

# collect.graph is a list of generated graphs
collect.graph <- lapply(db,create.graph)

# Finally, lapply prints the list of collected graphs
lapply(collect.graph,print)

代码工作正常,但它在 RStudio 中生成了两组图形,而不是只生成一组。

如何避免这种行为?

【问题讨论】:

  • 只要print(collect.graph)
  • Ronak,我想打印两个对象。但是,当我出于某种原因使用 lapply 时,它会打印两个对象两次。 @www 的建议解决了这个问题。但是我还是不明白为什么 lapply 不能正常工作...谢谢。

标签: r ggplot2 rstudio


【解决方案1】:

对象被打印两次是因为一个输出来自lapply,另一个来自print。检查

lapply(1:5, print)

#[1] 1
#[1] 2
#[1] 3
#[1] 4
#[1] 5
#[[1]]
#[1] 1

#[[2]]
#[1] 2

#[[3]]
#[1] 3

#[[4]]
#[1] 4

#[[5]]
#[1] 5

这里,1-5 的第一部分来自print,而列表中的 1-5 的下一部分来自lapply

来自?lapply

lapply 返回一个与 X 长度相同的列表,其中每个元素是对 X 的相应元素应用 FUN 的结果。

因此,当您应用lapply 时,它会返回显示的相同对象,并且由于FUN 参数是print,它会将该函数应用于lapply 中的每个对象,从而将其打印两次。

@www 建议的解决方法是在控制台中使用print(collect.graph) 或仅使用collect.graph 仅打印一次。

【讨论】:

  • 谢谢罗纳克。但是,如果您编码a &lt;- lapply (1:5,print)a 的输出将与lapply (1:5,print) 不同。奇怪....实际上,我注意到 lapply() 在分配时会回显一个向量,然后返回 FUN 的输出。
  • 是的,如果您执行a &lt;- lapply (1:5,print),它会在控制台中打印 1:5 并将列表中的 1:5 返回到 a。同样,如果您执行a &lt;- lapply(collect.graph,print),它将只打印两个对象一次,然后a 也将具有相同的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多