2012-11-28 23 views
6

我需要做的是從幾百個鏈接中讀取數據,而其中一些鏈接不包含任何數據,因此,如下代碼:如何解決「輸入中沒有可用行」的R中的錯誤?

urls <-paste0("http://somelink.php?station=",station, "&start=", Year, "01-01&etc") 
myData <- lapply(urls, read.table, header = TRUE, sep = '|') 

錯誤彈出說「沒有可用的行在輸入「,我試過使用」嘗試「,但有相同的錯誤,請幫助,謝謝。

+0

最後一個問題中的評論是要求「urls」的內容,因爲我懷疑這是錯誤所在。你可以輸入'dput(urls)'並複製粘貼輸出到這裏。 –

+0

你有沒有試過@GSee的建議? –

+0

當你確切地看到''輸入中沒有可用的行「錯誤?在myData <-...'行之後?如果沒有,myData是否得到一些輸入,但不是正確的? (請參閱下面的答案,並讓我們知道它是否在正確的方向)。另外,當你嘗試GSee的建議時會發生什麼? –

回答

11

這裏有兩個可能的解決方案(未經測試,因爲你的例子是不可重現):

使用try

myData <- lapply(urls, function(x) { 
    tmp <- try(read.table(x, header = TRUE, sep = '|')) 
    if (!inherits(tmp, 'try-error')) tmp 
}) 

使用tryCatch

myData <- lapply(urls, function(x) { 
    tryCatch(read.table(x, header = TRUE, sep = '|'), error=function(e) NULL) 
}) 
+1

非常感謝,它非常完美! – Rosa

+0

@Rosa,你可以用'is.null'來清除列表中的空值:
'myData < - myData [!sapply(myData,is.null)]' –

+2

@Rosa,'Filter(NROW,myData) '只會保留至少有1行的組件。 – GSee

0

這是否幫助?

dims <- sapply(myData, dim)[2,] 
    bad_Ones <- myData[dims==1] 
    good_Ones <- myData[dims>1] 

如果myData仍然抓住的東西離站頁面,上面的代碼應該myData名單分成兩個不同的組。 good_Ones將是您想要使用的列表。 (當然假設上述準確的話)

+0

我不認爲你想在2之後得到這個逗號,但我不認爲你也想要'sapply'。也許'過濾器'會更好,但目前還不清楚我們要解決什麼問題。 ;) – GSee

+0

@Ricardo Saporta,GSee的答案得到了我想要的完全結果,我猜空數據導致了一個錯誤,因此停止了lapply函數,現在它向前移動,因爲我們將它設置爲NULL。無論如何,感謝您的幫助,感激! :) – Rosa

+0

@Gsee,離開評論中發佈的(非)表,'read.table'將整個內容作爲單個列引入,而正確的表包含多列。我使用dim來確定哪些列只有一列。 sapply把第一行作爲第一維,第二維作爲第二維等等。因此,逗號;) –

相關問題