【问题标题】:Using tryCatch within plyr在 plyr 中使用 tryCatch
【发布时间】:2015-12-15 21:24:05
【问题描述】:

我正在运行这个函数:

require(XML)
require(plyr)


getKeyStats_xpath <- function(symbol) {
  yahoo.URL <- "http://finance.yahoo.com/q/ks?s="
  html_text <- htmlParse(paste(yahoo.URL, symbol, sep = ""), encoding="UTF-8")

  #search for <td> nodes anywhere that have class 'yfnc_tablehead1'
  nodes <- getNodeSet(html_text, "/*//td[@class='yfnc_tablehead1']")

  if(length(nodes) > 0 ) {
    measures <- sapply(nodes, xmlValue)

    #Clean up the column name
    measures <- gsub(" *[0-9]*:", "", gsub(" \\(.*?\\)[0-9]*:","", measures))   

    #Remove dups
    dups <- which(duplicated(measures))
    #print(dups) 
    for(i in 1:length(dups)) 
      measures[dups[i]] = paste(measures[dups[i]], i, sep=" ")

    #use siblings function to get value
    values <- sapply(nodes, function(x)  xmlValue(getSibling(x)))

    df <- data.frame(t(values))
    colnames(df) <- measures
    return(df)
  } else {
    break
  }
}

只要页面存在,它就可以正常工作。但是,如果我的其中一个代码在该 URL 上没有任何数据,则会引发错误:

Error in FUN(X[[3L]], ...) : no loop for break/next, jumping to top level 

我也添加了一条踪迹,但在代码 3 上出现故障。

tickers <- c("QLTI",
"RARE",
"RCPT",
"RDUS",
"REGN",
"RGEN",
"RGLS")

tryCatch({
stats <- ldply(tickers, getKeyStats_xpath)
}, finally={})

我想这样调用函数:

stats <- ldply(tickers, getKeyStats_xpath)
rownames(stats) <- tickers
write.csv(t(stats), "FinancialStats_updated.csv",row.names=TRUE)

基本上,如果代码没有数据,我想跳过它。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • getKeyStats_xpath 编写一个包装器,将其包含在tryCatch 中。您可以在 ldply 内使用匿名函数执行此操作,例如 ldply(tickers, function (t) tryCatch(getKeyStats_xpath(t), finally={}))

标签: r plyr


【解决方案1】:

扩展我的评论。这里的问题是您将整个命令 stats &lt;- ldply(tickers, getKeyStats_xpath) 包含在 tryCatch 中。这意味着 R 将尝试从每个股票代码中获取关键统计数据。

相反,您想要的是尝试每个代码。

为此,为getKeyStats_xpath 编写一个包装器,将其包含在tryCatch 中。您可以使用匿名函数在ldply 中执行此操作,例如ldply(tickers, function (t) tryCatch(getKeyStats_xpath(t), finally={}))。请注意,无论退出条件如何,finally 都会执行,因此 finally={} 什么也不执行。 (有关更多信息,请参阅 r-faq 中的 Advanced RHow to write try catch in R)。

出现错误时,tryCatch 调用参数error 中提供的函数。因此,由于错误未处理,此代码仍然无济于事(感谢 rawr 早先指出这一点)。如果您改用llply,则检查输出也更容易,然后

因此,下面是使用这种方法以及信息丰富的错误处理的完整答案。

stats <- llply(tickers, 
    function(t) tryCatch(getKeyStats_xpath(t), 
        error=function(x) {
            cat("error occurred for:\n", t, "\n...skipping this ticker\n")
        }
    )
)
names(stats) <- tickers
lapply(stats, length)
#<snip>
#$RCPT
#[1] 0
# </snip>

到目前为止,这对我有用,返回所有代码的数据,除了上面代码块中列出的代码。

【讨论】:

  • 抱歉,我想我在这里遗漏了一些东西。我试过这个:stats
  • 我试过这个:ldply(tickers, function (t) tryCatch(getKeyStats_xpath(t), finally={})) 我一直收到这个错误:错误:找不到函数“ldply”这个概念对我来说绝对有意义,我在 C# 和 SQL 中多次使用 TryCatch,但我似乎无法在 R 中使用它。我 gool
  • 我想这就是问题所在。奇怪的是,我刚刚安装了它,并确认它安装正常。但我调用它并得到一个错误。 require(plyr) 加载所需的包:plyr 警告消息:在库中(包,lib.loc = lib.loc,character.only = TRUE,logical.return = TRUE,:没有名为“plyr”的包
  • 抱歉拖了这么久大家。昨天“plyr”似乎有问题,但它今天可以工作。我刚试过这个: stats
猜你喜欢
  • 2013-02-11
  • 1970-01-01
  • 2014-09-08
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多