上一篇文章提供了一种在R中迭代存储图的解决方案:见... iteratively in R... 。我遇到了类似的问题,在阅读并实施了帖子提供的解决方案后,我仍无法解决问题。
上一篇文章提供了以下代码:
#创建一个列表来保存绘图对象。
pltList <- list()
for( i in 2:15 ){
#获取数据,执行分析等等。
#创建剧情名称
pltName <- paste( 'a', i, sep = '' )
#使用以下内容在列表中存储绘图 名称作为索引
pltList[[ pltName ]] <- plot()
}
以下是我的代码实现:
a <- list.files("F:.../4hrs", pattern='.csv')
pltList <- list()
i=1
for (x in a) {
myfiles <- read.csv(a, header=TRUE, as.is=TRUE, nrows=2500)
h <- hist(data, plot=F)
# perform analysis, ect.
pltName <- paste('a', formatC(i, width=2, flag='0'), sep='')
pltList[[ pltName ]] <- plot(h)
i <- i+1
}
pltName
会生成一个名称列表,但pltList
的长度为零。
我不确定为什么pltList
没有分配图
我最终想要做的是创建一个包含多个图的pltList
。然后以par(mfrow=c(2,1))
样式绘制这些图并导出为.pdf。
我应该提一下上面适用于
pltList[[ pltName ]] <- xyplot(h)
但是我无法以par(mfrow=c(2,1))
的风格绘制多个情节。
任何建议都表示赞赏。
答案 0 :(得分:1)
在您引用的原始问题和我对它的回答中,plot()
被用作绘图函数的抽象占位符,该函数返回一个对象,而不是对R函数plot
的文字调用。返回图形对象的大多数函数都基于'网格'包,例如来自网格包的xyplot
或来自ggplot2的qplot
。
对于这种困惑感到抱歉,我应该在答案中明确指出这一点,但我并没有因为问题的提问者已经意识到这一点。
基本图形函数(如hist
和plot
直接渲染到输出,并且不会返回任何可用于在以后重新创建绘图的对象,这就是为什么你最终会得到一个长度为零的清单。
为了使用这种方法,您必须交换hist
函数的用法,以返回返回对象的内容。使用ggplot2,您可以在循环中执行以下操作:
# Don't call your data variable 'data' or ggplot will confuse it with the
# `data` function and suffer an error.
h <- qplot(x = plot_data)
pltName <- paste('a', formatC(i, width=2, flag='0'), sep='')
pltList[[ pltName ]] <- h
我已经编辑了我对上一个问题的回答,以清楚地表明在我的示例中使用plot()
并不是对同名R函数的实际调用。
答案 1 :(得分:0)
你的代码使用我没有的文件,所以我无法复制它,我也不完全确定你要完成什么,但我确实在代码中看到了一些可能有助于修复它的问题:
a <- list.files("F:.../4hrs", pattern='.csv')
我不熟悉list.files
,这是否正确分配a
? .csv
似乎是个奇怪的模式。
pltList <- list()
i=1
for (x in a) {
myfiles <- read.csv(a, header=TRUE, as.is=TRUE, nrows=2500)
我认为a
是一个包含文件的向量吗?您为x
的每个值循环a
,但我没有看到x
返回代码中的任何位置。你也在这里阅读文件名向量。不应该是read.csv(x,...
,或者更好,循环for (i in 1:length(a))
和索引a[i]
。
h <- hist(data, plot=F)
我在任何地方都看不到对象data
。 h
是否已正确分配?
# perform analysis, ect.
pltName <- paste('a', formatC(i, width=2, flag='0'), sep='')
pltList[[ pltName ]] <- plot(h)
i <- i+1
}
我喜欢做的只是手动运行这样的循环,看看发生了什么。我认为分配myfiles
或h