我正在尝试修改我在网上找到的脚本。如果没有找到结果,我想让脚本跳过一个自动收报机,有点像Try ... Catch。现在,如果找不到代码,代码就会掉下来。我怎样才能让它跳过任何/所有缺失的代码并完成而不会崩溃?
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
}
}
setwd("C:/Users/rshuell001/Desktop/downloads/")
tickers <- c("OREX",
"OSIR",
"PACB",
"PCRX",
"PCYC",
"PDLI",
"PETX",
"PGNX",
"POZN",
"PRTA",
"PTCT",
"PTLA",
"PTX",
"QGEN",
"QLTI",
"RARE",
"RCPT",
"RDUS",
"REGN",
"RGEN",
"RGLS",
"RLYP",
"RPTP",
"RTRX",
"RVNC",
"SAGE")
stats <- ldply(tickers, getKeyStats_xpath)
rownames(stats) <- tickers
write.csv(t(stats), "FinancialStats_updated.csv",row.names=TRUE)
我大约一个星期前在这里发布了,有几个人建议我试试这个。
stats <- llply(tickers, function(t) tryCatch(getKeyStats_xpath(t), error=function(x) {cat("error occurred, skipping this ticker\n")}))
rownames(stats) <- tickers
write.csv(t(stats), "FinancialStats_updated.csv",row.names=TRUE)
从未奏效。我搞砸了一段时间,但无法将数据写入CSV文件。虽然,代码看起来非常接近我想要的。
有人可以帮助我理顺吗? 谢谢!
答案 0 :(得分:0)
以下是您的代码产生的错误:
FUN(X [[i]],...)中的错误:
没有循环中断/下一步,跳到顶级
让我们看一下help(break)
:
打破for,while或repeat循环;控制转移到最内层循环之外的第一个语句
所以,break()
只能在for,while或repeat循环中使用,并且你在if else语句中使用它...我们可以用getKeyStats_xpath
替换那个中断其他。再加上一些标记,表示没有找到符号。
...
} else {
cat("Could not find",symbol,"\n")
return(data.frame(NA))
}
...
现在工作正常。使用以下命令为统计信息指定名称后,可以删除所有NA的行:
stats <- stats[!rowSums(is.na(stats)) == length(stats),]