R - “$运算符对原子向量无效”错误消息

时间:2018-03-14 16:20:09

标签: r lm

我收到此错误:

  

$ operator对原子矢量无效

当我运行此脚本时:

require(coefplot)
filenames <- list.files(path = '/Documents/R/data/', pattern = "account_exp_10_sb_sql__[0-9]{2,3}-[0-9]{2,3}.csv", full.names = TRUE)


analyze <- function(filename){
  fm_1 <- NULL
  dx_1 <- NULL
  cat('reading: ', filename)
  dx_1 <- read.csv(filename)
  head(dx_1)

  fm_1 <- lm(default_perc ~ credit_score + email + credit_card_pmt, data = dx_1)



  return(fm_1)
}

cur_fm <- NULL
ct <- 1
fm_list <- list()
for (fn in filenames)
{
  #cat(ct, ' ', fn)
  cur_fm <- analyze(fn)

  summary(cur_fm)

  fm_list$ct <- cur_fm
  ct <- ct + 1
  #stop()
}

#fm_list
multiplot(plotlist = fm_list)

脚本应该读入12个csv文件,在每个文件上运行lm(),尝试将结果存储在列表中,然后在列表中进行多重绘制。

我尝试了fm_list$ctfm_list[[ct]],但我得到了同样的错误。

此外,摘要不会打印出来。我无法弄清楚它为什么不起作用。

1 个答案:

答案 0 :(得分:1)

您的代码有三个问题:

  1. 将函数返回值存储在列表中

  2. 调用multiplot函数的错误方式(没有plotlist参数 - 请参阅?multiplot

  3. summary仅在控制台外面打印出来 代码块(R是脚本语言)。如果您将其放入代码块(此处为for函数),则必须使用print

  4. 解决方案是:

    # ... your code as above
    
    cur_fm <- NULL
    ct <- 1
    fm_list <- list()
    for (fn in filenames)
    {
      cat(ct, ' ', fn)
      cur_fm <- analyze(fn)
    
      print(summary(cur_fm))  # 3. print required inside a code block
    
      fm_list[[fn]] <- cur_fm  # 1. use the file name as list item name
      ct <- ct + 1
      #stop()
    }
    
    # 2. Pass all lm results in the list in "..." argument of multiplot
    #    do.call requires named list elements since they are used to find
    #    the corresponding function arguments. If there is no match
    #    the list element is put into the "..." argument list
    do.call(multiplot, fm_list)
    

    请注意,该解决方案存在一些错误风险,例如: G。如果您的文件名与multiplot函数的正式参数的名称相同。

    你可以通过e来避免这种风险。 G。添加不属于任何参数名称的前缀:

    fm_list[[paste0("dot_dot_dot_", fn)]] <- cur_fm