R - 防止lapply()停止空数据帧

时间:2014-10-07 01:17:16

标签: r lapply lm

我有以下代码创建一个包含多个图的PDF。在代码中,"文件"包含我在lapply()中循环的所有数据集的名称。

pdf(file="plot.pdf")
par(mfrow=c(3,3), oma=c(1,1,8,1))
Test <- lapply(1:length(files), function(x) {
a <- as.data.table(read.csv(files[x], header = TRUE))
plot(col 1 ~ col 2, a, main = paste("R=", summary(lm(col 1 ~ col 2, a))$adj.r.squared))
abline(lm(col 1 ~ col 2, a), col = "red")
})
dev.off()

如果所有数据集都有值,则此代码有效。遇到空数据集时,线性模型函数[lm()]会给出以下错误并停止循环。

Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  0 (non-NA) cases 

PDF将被导出但仅包含错误之前的图。有没有办法可以忽略错误,以便代码继续循环其余的数据集(可能实际上有数据)?

1 个答案:

答案 0 :(得分:2)

一个简单的方法是将有问题的代码包装在try语句中:

pdf(file="plot.pdf")
par(mfrow=c(3,3), oma=c(1,1,8,1))
Test <- lapply(1:length(files), function(x) {
  a <- as.data.table(read.csv(files[x], header = TRUE))
  try({
    plot(col 1 ~ col 2, a, main = paste("R=", summary(lm(col 1 ~ col 2, a))$adj.r.squared))
    abline(lm(col 1 ~ col 2, a), col = "red")
  }, silent = TRUE)
})
dev.off()

try将指示R运行表达式中详细说明的代码。 silent = TRUE参数将指示R禁止任何错误。