2012-11-28 15 views
6

Co muszę zrobić, aby odczytać dane z setek linków, a wśród nich niektóre linki nie zawiera żadnych danych, dlatego, jak kody tutaj:Jak naprawić błąd w R "brak linii dostępnych na wejściu"?

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

błąd wyskakuje mówiąc: „nie ma kolejek dostępny na wejściu ", próbowałem użyć" spróbuj ", ale z tym samym błędem, proszę o pomoc, dziękuję.

+0

komentarz w ostatnim pytaniu dotyczył treści "adresów URL", ponieważ podejrzewam, że jest tam, gdzie leży błąd. Czy możesz wpisać 'dput (urls)' i skopiuj + wklej dane wyjściowe tutaj. –

+0

Czy próbowałeś sugestii @ GSee? –

+0

kiedy dokładnie widzisz "brak linii dostępnych na wejściu" 'błąd? Zaraz po linii 'myData <-...'? Jeśli nie, czy myData dostaje jakieś dane wejściowe, ale nie te prawidłowe? (zapoznaj się z moją odpowiedzią poniżej i daj nam znać, czy jest we właściwym kierunku). Co konkretnie dzieje się, gdy wypróbujesz sugestię GSee? –

Odpowiedz

11

Oto 2 możliwe rozwiązania (niesprawdzone ponieważ przykład nie jest powtarzalna):

Korzystanie try:

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

Korzystanie tryCatch:

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

Dzięki Tobie, działa idealnie! – Rosa

+0

@Rosa, możesz pozbyć się wartości null na liście używając 'is.null':
' myData <- myData [! Sapply (myData, is.null)] ' –

+2

@Rosa,' Filter (NROW, myData) 'zachowa tylko komponenty, które mają co najmniej 1 wiersz. – GSee

0

Czy to pomoże?

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

Jeśli myData nadal chwyta coś od strony stacji, powyższy kod powinien rozdzielić listę myData na dwie odrębne grupy. good_Ones byłaby listą, z którą chciałbyś pracować. (zakładając, że powyższe jest poprawne, oczywiście)

+0

Nie sądzę, że chcesz tego przecinka po 2, ale nie sądzę, że chcesz "sapply" albo. Może "Filtr" będzie lepszy, ale nie jest jasne, jaki problem próbujemy rozwiązać. ;) – GSee

+0

@Ricardo Saporta, odpowiedź GSee uzyskała dokładnie takie wyniki, jak chcę, domyślam się, że puste dane spowodowały błąd i tym samym zatrzymały funkcję lapply, a teraz przesunęły się do przodu, kiedy ustawiliśmy ją na NULL. W każdym razie, dzięki za pomoc, doceniamy! :) – Rosa

+0

@Gsee, wychodząc z (nie) tabeli, która została zamieszczona w komentarzach, 'read.table' wprowadzał całą zawartość jako pojedynczą kolumnę, podczas gdy poprawne tabele mają kilka kolumn. Używałem dim, aby zidentyfikować, które mają tylko jedną kolumnę. sapply stawia pierwszy wiersz jako pierwszy wymiar dim, drugiego rzędu jako 2. wymiar, itd. Stąd przecinek;) –

Powiązane problemy