2014-07-24 2 views
0

아래에 주어진 urltry() 함수는 decode_short_url (twitteR 패키지) 및 get_url 가능한 오류.trycatch를 사용하여 R에서 네트워크 오류 잡기

#install.packages("twitteR") 
#install.packages("SocialMediaMineR") 
library(twitteR) 
library(SocialMediaMineR) 

urltry <- function(x) {  
    tryCatch(
     { x <- decode_short_url(x) }, 
     error = function(e) 
     { 
      x <- urltryfail(x) 
      return(x) 
     } 
    ) 
}  

urltryfail <- function(x) {  
    tryCatch(
    { 
    x <- get_url(x, sleep.time = 1, return.df = T) 
    x <- as.character(x$resolvedURL) }, 
    error = function(e) 
     { 
      return(x) 
     }, 
    finally ={ x } 
    ) 
} 

그러나 네트워크 오류로 인해 decode_short_url 및 get_url이 실패한 경우. 내가 반환 값을 함수

오류를 받고 있어요 (유형, MSG는 asError = TRUE)는 : 호스트 \ n을 함수 urltry에서

() 대신 잡기에 연결할 수 없습니다 오류 및 짧은 URL을 반환합니다. 누구든지이 문제를 해결할 수 있습니까? 미리 감사드립니다 :).

sample data

+1

사용중인 특수 패키지는 무엇입니까? 우리가 반대 할 수 있도록 실천 사례는 어떻습니까? –

+0

Hello @ RomanLuštrik, 귀하의 제안에 감사드립니다 위의 코드에서 필요한 패키지를 추가했습니다. 이제 함수를 실행할 수 있습니다. 다시 한 번 감사드립니다 :) –

답변

0

문제는 SocialMediaMineR 패키지의 GET_URL() 함수이다. URL을 해석 할 수없는 경우 내부적으로 httr 패키지에서 반환 될 때 오류가 발생합니다. 따라서 오류는 tryCatch 함수에 도달하지 않습니다. get_url은 항상 유효한 데이터 프레임을 반환합니다. URL이 유효하지 않은 경우에도 originalURLresolvedURL 열이 포함 된 데이터 프레임을 얻을 수 있지만 resolvedURL 열에는 오류 메시지가 포함됩니다.

+-------------+-----------------------------------------------------------------------------------+ 
| originalURL | resolvedURL                  | 
+-------------+-----------------------------------------------------------------------------------+ 
| sdgsdg  | Error in function (type, msg, asError = TRUE),: \n,Could not resolve host: http\n | 
+-------------+-----------------------------------------------------------------------------------+ 

그래서 당신은 기본적으로 옵션이 있습니다

1 : 반환 dataframe가 resolvedURL 열에 문구 "기능에서 오류"이 포함 된 경우 확인. 그리고 그렇다면 원본 URL을 사용하십시오.

2 : SocialMediaR에서 get_url() 함수의 코드를 복사하여 조금만 수정하십시오. HEAD (x) $ url 주위에서 try()를 제거하면됩니다. 이제 해석 할 수없는 URL로 get_url 함수를 호출하면 오류가 발생하고 tryCatch 함수가 실제로이를 인식하고 코드에서 정의한 오류 함수로 이동합니다.

get_url <- 
function(links, sleep.time=0, return.df=F){ 
    final_url <- function(x) HEAD(x)$url 
    final_url2 <- function(x) { 
     Sys.sleep(sleep.time) 
     cat(".") 
     final_url(x) 
    } 
    if(return.df==F) { 
     return(vapply(links, final_url2, character(1))) 
    } else { 
     temp <- vapply(links, final_url2, character(1)) 
     url.result <- data.frame(originalURL=names(temp), resolvedURL=as.character(temp)) 
     return(url.result) 
    } 
} 
+0

get_url 소스 코드를 확인 했어야합니다. 어쨌든 고마워. :) –