diff --git a/R/getSymbols.R b/R/getSymbols.R index 04b9cca4..f9631863 100644 --- a/R/getSymbols.R +++ b/R/getSymbols.R @@ -1440,12 +1440,26 @@ getSymbols.av <- function(Symbols, env, api.key, return(mat) } - matrices <- lapply(Symbols, FUN=downloadOne, - default.return.class=default.return.class, - default.periodicity=default.periodicity) - + returnSym <- Symbols + noDataSym <- NULL + matrices <- list() + + for(i in seq_along(Symbols)) { + test <- try({ + matrices[[i]] <- downloadOne(Symbols[[i]], + default.return.class = default.return.class, + default.periodicity = default.periodicity) + }, silent = TRUE) + if (inherits(test, "try-error")) { + msg <- attr(test, "condition")$message + warning("Unable to import ", dQuote(returnSym[[i]]), ".\n", + msg, call. = FALSE, immediate. = TRUE) + noDataSym <- c(noDataSym, returnSym[[i]]) + } + } + if (auto.assign) { - return(Symbols) + return(setdiff(returnSym, noDataSym)) } else { return(matrices[[1]]) } @@ -1562,12 +1576,26 @@ getSymbols.tiingo <- function(Symbols, env, api.key, return(xts.data) } - matrices <- lapply(Symbols, FUN=downloadOne, - default.return.class=default.return.class, - default.periodicity=default.periodicity) + returnSym <- Symbols + noDataSym <- NULL + matrices <- list() + + for(i in seq_along(Symbols)) { + test <- try({ + matrices[[i]] <- downloadOne(Symbols[[i]], + default.return.class = default.return.class, + default.periodicity = default.periodicity) + }, silent = TRUE) + if (inherits(test, "try-error")) { + msg <- attr(test, "condition")$message + warning("Unable to import ", dQuote(returnSym[[i]]), ".\n", + msg, call. = FALSE, immediate. = TRUE) + noDataSym <- c(noDataSym, returnSym[[i]]) + } + } if (auto.assign) { - return(Symbols) + return(setdiff(returnSym, noDataSym)) } else { return(matrices[[1]]) } diff --git a/tests/test_getSymbols.R b/tests/test_getSymbols.R index 58c9a91b..ba734035 100644 --- a/tests/test_getSymbols.R +++ b/tests/test_getSymbols.R @@ -21,3 +21,54 @@ if (apikey != "") { adjusted = TRUE, periodicity = "monthly", auto.assign = FALSE) stopifnot(has.Ad(ibm_monthly_adj)) } + +# Checks to ensure caught errors do not prevent other symbols from loading. +# Use one symbol that always works (e.g. from disk) and another that fails. +data(sample_matrix, package = "xts") +IBM <- as.xts(sample_matrix) +cn <- c("Open", "High", "Low", "Close") + +td <- tempdir() +tf <- file.path(td, "IBM.rda") +save(IBM, file = tf) +tf <- file.path(td, "IBM.csv") +write.zoo(IBM, file = tf, sep = ",") +rm(IBM) + +e <- new.env() + +x <- try({ + getSymbols("IBM;WYSIWYG", env = e, src = "csv", dir = td, col.names = cn) +}, silent = TRUE) +stopifnot(exists("IBM", e)) +rm(IBM, pos = e) + +x <- try({ + getSymbols("IBM;WYSIWYG", env = e, src = "rda", dir = td, col.names = cn) +}, silent = TRUE) +stopifnot(exists("IBM", e)) +rm(IBM, pos = e) + +x <- try({ + getSymbols("IBM;WYSIWYG", env = e, src = "yahoo") +}, silent = TRUE) +stopifnot(exists("IBM", e)) +rm(IBM, pos = e) + +x <- try({ + getSymbols("IBM;WYSIWYG", env = e, src = "av", api.key = apikey) +}, silent = TRUE) +stopifnot(exists("IBM", e)) +rm(IBM, pos = e) + +x <- try({ + getSymbols("DGS10;WYSIWYG", env = e, src = "FRED") +}, silent = TRUE) +stopifnot(exists("DGS10", e)) +rm(DGS10, pos = e) + +x <- try({ + getSymbols("EUR/USD;WYSIWYG", env = e, src = "oanda") +}, silent = TRUE) +stopifnot(exists("EURUSD", e)) +rm(EURUSD, pos = e)