我正在使用两个服务decode_short_url(twitteR包)和get_url(socialmediamineR包)来扩展R中的短网址。我在下面给出的函数urltry()尝试扩展url并捕获所有类型的可能错误。
#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因网络错误而失败时。我得到了一个返回值
函数错误(type,msg,asError = TRUE):无法连接 主机\ n
来自函数urltry(),而不是捕获错误并返回短URL。
答案 0 :(得分:0)
问题出在SocialMediaMineR包中的 get_url()函数中。如果URL无法解析,它会在内部从httr包返回时捕获错误。所以错误永远不会到达你的tryCatch函数。 get_url始终返回有效的数据帧。 因此,如果网址无效,您始终会获得包含 originalURL 和 resolvedURL 列的数据框,但resolveURL列包含错误消息。
+-------------+-----------------------------------------------------------------------------------+
| originalURL | resolvedURL |
+-------------+-----------------------------------------------------------------------------------+
| sdgsdg | Error in function (type, msg, asError = TRUE),: \n,Could not resolve host: http\n |
+-------------+-----------------------------------------------------------------------------------+
所以你基本上要选择:
1 :) 检查返回的数据帧是否包含短语&#34;功能错误&#34;在resolvedURL列中。如果是,您只需使用originalURL
2 :) 您从SocialMediaMineR中复制粘贴来自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)
}
}