我在下面有一些代码。它工作正常,除了一个奇怪的错误,如果我没有“重新加强”我的列表对象data.frame
的(参见代码中的注释)。当我尝试过滤掉空列表对象时发生错误。
如果我不“重新加强”(df.list <- lapply(df.list, as.data.frame)
),我会收到错误:
Error in LoadData(LCap.small) :
(list) object cannot be coerced to type 'double'
您可以通过输入带有代码的任何向量来尝试代码。例如LoadData(c('YHOO', 'GOOG', 'FALSEGOOG'))
。请注意,当我过滤掉Yahoo数据库中不存在的代码时,会发生错误。
原因是什么以及如何解决?
代码
LoadData <- function(x) {
if(is.atomic(x) != TRUE & is.data.frame(x) != TRUE) stop('x must be either a data.frame or an atomic object')
if(is.data.frame(x) == TRUE) x <- as.character(x[,1])
df.list <- lapply(x, function(x) {
poss.error <- tryCatch(
{
quantmod::getSymbols(x, env = NULL, return.class = 'data.frame') # quantmod returns data.frame class object
},
error = function(e) {
message(cat(x, "could not be retrieved"))
return(e)
})
if(!inherits(poss.error, 'error')) {
x <- poss.error %>% setNames(gsub(pattern = '^(.*)[.]', replacement = "", colnames(poss.error))) %>%
mutate(Index = as.Date(rownames(poss.error))) %>%
rename(Adj.Close = Adjusted) %>%
select(Index, Open:Adj.Close)
return(x)
}
})
# add names
names(df.list) <- x
# make list to data.frame
df.list <- lapply(df.list, as.data.frame) # bypass error (list) object cannot be coerced to type 'double'
# filter out empty data frames, error occurs here if previous line of code is not present
df.list <- df.list[sapply(df.list, nrow) > 0]
return(df.list)
}
答案 0 :(得分:2)
在第一个lapply中调用的匿名函数有时会返回NULL
(当股票代码不存在时)。然后你的df.list
有数据框和NULL对象。因为nrow(NULL) = NULL
你的sapply然后返回一个带有数字和NULL的对象,这不会转换为double。在其位置使用sapply(ldf.list, is.NULL)
(或者,更好的是,在第一个lapply中修复函数以始终返回数据框)。