2015-12-15 3 views
0

Je suis en cours d'exécution de cette fonction:L'utilisation TryCatch dans les plyr

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 
    } 
} 

Tant que la page existe, il fonctionne très bien. Cependant, si l'un de mes téléscripteurs ne dispose pas de données sur cette URL, il renvoie une erreur:

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

J'ai ajouté une trace aussi, et les choses se décomposent sur le numéro de ticker 3.

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

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

Je voudrais appeler la fonction comme ceci:

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

en fait, si un téléscripteur n'a pas de données, je veux sauter.

Quelqu'un peut-il m'aider s'il vous plaît pour que cela fonctionne?

+1

Ecrit un wrapper pour 'getKeyStats_xpath' qui l'enferme dans' tryCatch'. vous pouvez le faire dans 'ldply' avec une fonction anonyme, par exemple' ldply (tickers, fonction (t) tryCatch (getKeyStats_xpath (t), finally = {})) ' – jaimedash

+0

Copie possible de [Comment écrire trycatch dans R] (http://stackoverflow.com/questions/12193779/how-to-write-trycatch-in-r) – nrussell

Répondre

2

Expansion sur mon commentaire. Le problème ici est que vous avez joint la commande entière stats <- ldply(tickers, getKeyStats_xpath) dans un tryCatch. Cela signifie que R essaiera d'obtenir les statistiques clés de chaque ticker. Au lieu de cela, ce que vous voulez, c'est essayer chaque ticker.

Pour ce faire, écrivez un emballage pour getKeyStats_xpath qui l'entoure dans tryCatch. vous pouvez le faire dans ldply avec une fonction anonyme, par exemple ldply(tickers, function (t) tryCatch(getKeyStats_xpath(t), finally={})). Notez que finalement il s'exécute indépendamment de la condition de sortie, donc finalement = {} n'exécute rien. (Voir Advanced R ou How to write try catch in R de r-faq pour plus).

En cas d'erreur, tryCatch appelle la fonction fournie dans l'argument error. Tel quel, ce code n'aidera pas car l'erreur n'est pas gérée (merci à rawr de l'avoir signalé plus tôt). Il est également plus facile d'inspecter la sortie si vous utilisez llply à la place, puis

Donc, une réponse complète en utilisant cette approche, et avec la gestion des erreurs informatives, est ci-dessous. Pour l'instant, cela fonctionne pour moi, renvoyant des données pour tous les tickers sauf celui indiqué dans le bloc de code ci-dessus.

+0

Désolé, mais je suppose qu'il me manque quelque chose ici.J'ai essayé ceci: stats <- ldply (tickers, fonction (t) tryCatch (getKeyStats_xpath (t), erreur = fonction (x) {cat ("erreur apparue \ n")})) J'ai aussi essayé: statistiques <- ldply (tickers, fonction (t) TryCatch (getKeyStats_xpath (t))) les deux tentatives ont fini de la même façon: erreur dans getKeyStats_xpath (t): pas de boucle pour la pause/suivant, saut au niveau supérieur –

+0

I essayé: ldply (tickers, fonction (t) TryCatch (getKeyStats_xpath (t), enfin = {})) Je continue à obtenir cette erreur: erreur: Impossible de trouver la fonction "ldply" Le concept fait vraiment sens à moi, et J'ai utilisé TryCatch plusieurs fois en C# & SQL, mais je n'arrive pas à faire fonctionner cela en R. I gool –

+0

Je suppose que c'est le problème. Chose étrange, je l'ai juste installé, et j'ai eu la confirmation qu'il était bien installé. Mais je l'invoque et j'obtiens une erreur. require (plyr) Chargement de package requis: plyr message d'avertissement: Dans la bibliothèque (package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,: il n'y a pas appelé paquet ' plyr ' –