【发布时间】:2015-08-21 14:32:31
【问题描述】:
一个for循环的多个绘图
我正在开发一个绘图函数并编写了这些 for 循环。我一直在阅读 for 循环对 R 中的内存使用不利,我应该使用 apply 或其变体之一进行编程。 但我不明白应该将什么数据框或列表作为第一个参数传递。
我想将此代码替换为使用 apply 的代码:
BasicPlot(depth, var[,1], xtitle=xlab)
for(i in 2:ncol(var))
BasicPlot(depth, var[,i], add=TRUE, xtitle=xlab, ...)
如果您想知道我想要实现的目标,请查看我的DepthPlotter project on github。
编辑:在阅读this site 关于应用功能后,我找到了解决方案:
lapply(2:ncol(var), function(i) { BasicPlot(depth, var[,i], add=TRUE, xtitle=xlab, ...)})
这行得通,但给了我愚蠢的输出,在这种情况下是[[1]] NULL [[2]] NULL 等的列表,我可以通过用invisible(...) 包围代码来使其静音。
这实际上比以前的代码更好吗?它是 a) 更容易阅读和 b) 更快吗?
读取多个文件夹中的多个文件:双 for 循环
我正在尝试使用 apply 函数而不是我目前正在考虑的 for 循环来解决的第二个问题:
我想读取位于不同文件夹(命名为 959D22 到 959D41)中的多个光栅图像(命名为 1.png 到 8.png)。
我想根据文件夹和文件名将行名分配给列表项。这应该返回一个光栅图像列表,然后我可以以特定值将其添加到我的绘图中。
cores <- list.files("data/core_splitpics/") # folder names
pics <- list() # according to replies below, this is the sort of thing that makes for-loops bad in R, because I'm expanding a list step by step.
for(i in 1:length(cores)){ # loop over folders
imgs <- list.files(paste("data/core_splitpics/", cores[i]) # filenames in folder i
for(j in 1:length(imgs)){ # loop over files
pics[[i, j]] <- as.raster(readPNG(paste("data/core_splitpics",
cores[i], paste(j, ".png", sep=""), sep="/"))) # something like this
}
}
阅读后,我仍然不知道构建此列表的最佳方法是什么。也许通过首先创建列表名称然后将光栅图像添加到这些条目?因为我想返回一个值,所以 apply 的变体在这里更好吗?
【问题讨论】:
-
就其本身而言,
for循环在 R 中并不是“坏的”。 -
R 中的“坏”(= 慢)是在循环中增长对象。相反,您应该提前将它们分配到所需的大小。
-
感谢您的回复。我将阅读 for 循环有时变慢的原因(发现:adv-r.had.co.nz/Functionals.html#lapply)
-
您能否详细说明第二个 sn-p 应该做什么?在不知道这两个目录的内容的情况下想一想这个有点困难(为什么会有两个目录?)。
-
文件位于绝望的文件夹中,我将其加载为“核心”。我想阅读它们并将它们添加到名称为“文件夹名称文件名称”的命名列表中