循环使用getFinancials并为跳过错误创建viewFinancials的数据框

时间:2015-06-28 03:18:26

标签: r error-handling try-catch quantmod yahoo-finance

我正在尝试创建一份股票清单的资产负债表,损益表和现金流量的数据框。但是,有些股票没有财务报表。我需要继续遍历拥有财务报表的股票并创建三个数据框,而不是删除股票。我需要这样做,因为我有超过一千只股票。我环顾了一下这个网站。我发现tryCatch在这个场景中比try(expr, silent = TRUE)要好得多。

当代码的“Stocklist”都有财务报表时,BS,IS和CF数据帧在其数据框中包含多个行和列。但是,下面的代码只有空数据帧,包含0行和0列。请帮忙,谢谢!

StockList <- c("AAIT", "AAL",  "AAME", "AAOI", "AAON", "AAPC", "AAPL", "AAVL", "AAWW", "AAXJ")
for(i in 1:length(StockList)){
    print(i)
    get_fin<-tryCatch(lapply(StockList, 
                             function(x) 
                                 getFinancials(x, auto.assign = FALSE)), 
                      error=function(e) NULL)                          
    if(!is.null(get_fin)){
        BS <- data.frame(lapply(get_fin, function(x) {viewFinancials(x, type= 'BS', period = 'A')}))
        IS <- data.frame(lapply(get_fin, function(x) {viewFinancials(x, type= 'IS', period = 'A')}))
        CF <- data.frame(lapply(get_fin, function(x) {viewFinancials(x, type= 'CF', period = 'A')}))
    }
    else {
        print("Error: NULL")
    }
}

这是我得到的输出,但是我将StockList作为从getSymbols获取的字符向量:

[1] 1
[1] "Error: NULL"
[1] 2
Annual Balance Sheet for AAL
Annual Income Statement for AAL
Annual Cash Flow Statement for AAL
[1] 3
Annual Balance Sheet for AAME
Annual Income Statement for AAME
Annual Cash Flow Statement for AAME
[1] 4
Annual Balance Sheet for AAOI
Annual Income Statement for AAOI
Annual Cash Flow Statement for AAOI
[1] 5
Annual Balance Sheet for AAON
Annual Income Statement for AAON
Annual Cash Flow Statement for AAON
[1] 6
[1] "Error: NULL"
[1] 7
Annual Balance Sheet for AAPL
Annual Income Statement for AAPL
Annual Cash Flow Statement for AAPL
[1] 8
Annual Balance Sheet for AAVL
Annual Income Statement for AAVL
Annual Cash Flow Statement for AAVL
[1] 9
Annual Balance Sheet for AAWW
Annual Income Statement for AAWW
Annual Cash Flow Statement for AAWW
[1] 10
Annual Balance Sheet for AAXJ
Annual Income Statement for AAXJ
Annual Cash Flow Statement for AAXJ

但是,我仍然无法获得数据帧。这是一个有效的例子。

tickers <-new.env()
t <-c("AAL",  "AAME", "AAOI")
lapply(t, getFinancials, env=tickers)
BS <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'BS', period = 'A')}))
IS <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'IS', period = 'A')}))
CF <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'CF', period = 'A')}))

以下是AAIT的非工作示例

tickers <-new.env()
t <-c("AAIT",  "AAME", "AAOI")
lapply(t, getFinancials, env=tickers)
BS <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'BS', period = 'A')}))
IS <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'IS', period = 'A')}))
CF <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'CF', period = 'A')}))

1 个答案:

答案 0 :(得分:0)

next突破了内在的for循环,当身体只是一个声明时,你不需要括号。试试这个:

StockList <- c("AAIT", "AAL",  "AAME", "AAOI", "AAON", "AAPC", "AAPL", "AAVL", "AAWW", "AAXJ")
for(i in 1:length(StockList)){
    worked  <-  TRUE
    get_fin<-tryCatch(stuff that might fail, 
                      error=function(e)
                          # use the scoping assignment operator to change the value of `worked` 
                          worked  <<-  FALSE)                          
    if(!worked) 
        next 
    BS <- data.frame(lapply(get_fin, function(x) {viewFinancials(x, type= 'BS', period = 'A')}))
    IS <- data.frame(lapply(get_fin, function(x) {viewFinancials(x, type= 'IS', period = 'A')}))
    CF <- data.frame(lapply(get_fin, function(x) {viewFinancials(x, type= 'CF', period = 'A')}))
}

顺便说一句,我注意到你循环i in 1:length(stocklist),但你没有在你的for循环体中引用i,这很奇怪。