gpt4 book ai didi

r - 在 R 中使用 foreach() 来加速 ggplot2 的循环

转载 作者:行者123 更新时间:2023-12-02 21:20:55 25 4
gpt4 key购买 nike

我想创建一个 PDF 文件,其中包含按特定顺序排列的数百个图。

我的策略是使用 foreach() 并将每个 ggplot2 对象存储到输出列表中,然后将每个 ggplot2 对象打印到输出文件。

例如,我想绘制钻石数据集中每个因素“克拉”的价格直方图:

library(ggplot2)
library(plyr)
library(foreach) # for parallelization
library(doParallel) # for parallelization

#setup parallel backend to use 4 processors
cl<-makeCluster(4)
registerDoParallel(cl)

# use diamonds dataset
carats.summary <- ddply(diamonds, .(carat), summarise, count = length(carat))

m.list <- foreach(i = 1:length(carats.summary$carat),
.packages = "ggplot2") %dopar% {
jcarat = carats.summary$carat[i]
m <- ggplot(subset(diamonds, carat == jcarat), aes(x = price)) +
geom_histogram()
print(m)
}

使用这段代码,我希望创建一个 ggplot2 对象列表,然后我可以按顺序将其保存到单个 pdf 文件中(例如使用 pdf())(例如,克拉升序)。

但是,运行它会导致错误消息:

Error in serialize(data, node$con) : error writing to connection

我怀疑这是因为如果我尝试将 ggplot2 对象附加到列表中,我会收到如下警告消息:

lst <- vector(mode = "list")
lst[1] <- m


Warning message:
In lst[1] <- m :
number of items to replace is not a multiple of replacement length

尽管这纯粹是猜测,我可能是错的。

有没有人知道如何使用 foreach()ggplot2 对象保存到列表中?或者以某种方式并行化涉及 ggplot2for 循环?

提前致谢。

最佳答案

您不应该在循环内打印对象,只需创建 ggplot 对象即可。仅当您打开所需的图形设备时才打印。

m.list <- foreach(i = 1:length(carats.summary$carat),
.packages = "ggplot2") %dopar% {
jcarat = carats.summary$carat[i]
ggplot(subset(diamonds, carat == jcarat), aes(x = price)) +
geom_histogram()
}

然后你可以用

m.list[[1]]

等...

关于r - 在 R 中使用 foreach() 来加速 ggplot2 的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27787071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com