首页 > 解决方案 > 在 R 中调试返回 NA 的函数

问题描述

我正在尝试编写一个函数,它从给定目录中的不同文件中读取一些污染数据,每个文件对应于监视器的记录,并返回作为函数输入参数给出的污染物之一的平均值。

数据如下所示:

在此处输入图像描述

pollutantmean <- function(directory, pollutant, ID){
        pmean <- 0
        for (monitor in ID){
                filename <- paste("./W2/", directory,"/", monitor,'.csv', sep = "")
                print(filename)
                pollution <- read.csv(file = filename, header = TRUE, sep = ",")
                class(pollution)
                head(pollution, n = 3)
                pmean <- pmean + mean(pollution$pollutant, na.rm = TRUE)
        }
        return(pmean)
}

要运行我设置的功能:

pollutantmean("specdata", "sulfate", 110:112)

我收到以下输出和错误消息:

[1] "./W2/specdata/110.csv"
[1] NA
Warning message:
In mean.default(pollution$pollutant, na.rm = TRUE) :
  argument is not numeric or logical: returning NA 

我的问题是:

  1. 如何逐行运行代码,以便查看函数中局部变量的值如何变化?我查了 Youtube,但找不到相关的视频。
  2. 当我在控制台中复制粘贴并运行函数中的每一行代码时,我看到数据已正确存储在污染 data.frame 中。为什么我在控制台中看不到作为输出打印的类和 data.frame 的头部?相反,我只得到与 pmean 相关的 NA 我猜......
  3. 如何修复与此错误消息相关的错误?

标签: r

解决方案


好问题。如果您使用的是 RStudio,您可以使用该browser()命令将程序冻结在某个位置,以便查看环境。

请注意,每次您点击它都会停止,browser()因此您可能需要在运行之前放置一个 if 语句来检测警告。完成后不要忘记删除该语句。

pollutantmean <- function(directory, pollutant, ID){
  pmean <- 0
  for (monitor in ID){
    filename <- paste("./W2/", directory,"/", monitor,'.csv', sep = "")
    print(filename)
    pollution <- read.csv(file = filename, header = TRUE, sep = ",")
    class(pollution)
    head(pollution, n = 3)
    pmean <- pmean + mean(pollution$pollutant, na.rm = TRUE)
    # Stop here and view the current environment
    browser()
  }
  return(pmean)
}

推荐阅读