我正在尝试创建一份股票清单的资产负债表,损益表和现金流量的数据框。但是,有些股票没有财务报表。我需要继续遍历拥有财务报表的股票并创建三个数据框,而不是删除股票。我需要这样做,因为我有超过一千只股票。我环顾了一下这个网站。我发现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')}))
答案 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
,这很奇怪。