【问题标题】:No output when run function运行函数时无输出
【发布时间】:2016-02-17 22:44:51
【问题描述】:

刚接触 R 和编程,我在此 Coursera 作业中查看了 SO 上所有可能的线程,但无法弄清楚问题所在。我知道这个功能可以使用 lapply 等等进行优化,但我想知道为什么这个特定的功能不起作用。我觉得关于这个功能的一些问题有点激怒了一些用户。老实说,我查看了相关的帖子,但我看不出我能对这个特定的错误做些什么。

    pollutantmean <- function (directory, pollutant, id) {
  #Create the data frame with the data from the 332 files

  files <- list.files(getwd())
  df <- data.frame()
  id <- 1:332

  for (i in 1:length(id)) {df <- rbind(df, read.csv(files[i]))

  if (pollutant=="nitrate"){ 

    #Create a subset for nitrate values of df
    df_nitrate <- df[df$ID==id[i], "nitrate"] 

    #Take mean of df_nitrate
    mean (df_nitrate, na.rm = TRUE)

    } else {
    #Create a subset for sulfate values of df
    df_sulfate <- df[df$ID==id[i],"sulfate"] 

   #Take mean of df_sulfate
     mean(df_sulfate, na.rm = TRUE)
     }
  }
} 

对于那些没有听说过这个赋值功能的人:我的工作目录中有 332 个 csv 文件(名为 001.csv、002.csv 等)。任务是将它们全部放在一个数据框中,并能够调用文件列的平均值(由与该文件对应的“id”变量给出)或跨多个文件(函数和输出的一些示例可以找到here)

我尝试调用回溯或调试函数来定位问题,但无济于事:

pollutantmean(getwd(), "nitrate", 23)
> traceback()
No traceback available 
> debug(pollutantmean)
> 

操作系统是 Windows 10。

欢迎任何建议或cmets。提前致谢。

【问题讨论】:

  • 到底是什么问题?错误信息是什么?
  • df[df$ID==id[i], "nitrate"],按id 过滤似乎是多余的,因为您正在加载指定id 的CSV 文件。我认为您需要在加载所有 CSV 文件后计算 for 循环之外的平均值。
  • @MaxPD 没有消息,就是这样。
  • @KotaMori id 用于特定文件。每个文件都有一个硝酸盐和硫酸盐柱。但是,当我按照您的建议将循环限制为 rbind 时,它只处理第一个文件。
  • 因为你有df$ID==id[i],它只返回i的平均值。如果要计算多个文件的平均值,请删除此部分

标签: r csv


【解决方案1】:

您的for 循环围绕着您的 if block。 R 函数在循环中不会返回值(除非您使用 return 函数,这不是您想要在此处执行的操作)。

  pollutantmean <- function (directory, pollutant, id) {
  #Create the data frame with the data from the 332 files

  files <- list.files(getwd())
  df <- data.frame()
  id <- 1:332

  for (i in 1:length(id)) {df <- rbind(df, read.csv(files[i]))
  # close for loop HERE
  }

  if (pollutant=="nitrate"){ 

    #Create a subset for nitrate values of df
    df_nitrate <- df[df$ID==id[i], "nitrate"] 

    #Take mean of df_nitrate
    mean (df_nitrate, na.rm = TRUE)

    } else {
    #Create a subset for sulfate values of df
    df_sulfate <- df[df$ID==id[i],"sulfate"] 

   #Take mean of df_sulfate
     mean(df_sulfate, na.rm = TRUE)
     }
  # not HERE
  #}
} 

【讨论】:

  • 事实上,这是我最初的看法,但它只返回第一个文件的方法。但现在至少我知道为什么没有输出了。谢谢你,亚当。
猜你喜欢
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多