2014-10-07 66 views
1

我有以下代碼可以創建一個包含多個圖的PDF。在代碼中,「文件」包含我在lapply()中循環的所有數據集的名稱。R - 阻止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

'if(nrow(a)== 0)return()'? – jdharrison 2014-10-07 01:19:18

+0

if(nrow(a)== 0)return()不起作用。它返回了以下錯誤:xj [i]中的錯誤:無效的下標類型'closure' – ccheng 2014-10-07 01:30:21

+2

可能在'try({,silent = TRUE)中失敗的代碼' – jdharrison 2014-10-07 01:34:46

回答

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抑制任何錯誤。