必须强制列出对象才能键入“double”错误。奇怪的对象类行为

时间:2015-12-25 11:30:49

标签: r

我在下面有一些代码。它工作正常,除了一个奇怪的错误,如果我没有“重新加强”我的列表对象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)
}

1 个答案:

答案 0 :(得分:2)

在第一个lapply中调用的匿名函数有时会返回NULL(当股票代码不存在时)。然后你的df.list有数据框和NULL对象。因为nrow(NULL) = NULL你的sapply然后返回一个带有数字和NULL的对象,这不会转换为double。在其位置使用sapply(ldf.list, is.NULL)(或者,更好的是,在第一个lapply中修复函数以始终返回数据框)。