我的功能不会运行,但在通过调试时运行正常

时间:2014-03-19 13:55:50

标签: r debugging object

我写了以下功能。不幸的是,当我运行它,它运行大约2秒,然后绝对没有返回,但当我使用调试运行它似乎运行完美。该代码还返回精确读取的文件的头部,但它没有为对象分配任何内容,因此在运行该函数后,我可以再次键入文件的头部并返回错误。我有点难过,所以任何指针都会非常感激!

谢谢

 Extremes <- function (siteno){
# reads in the weather data for the specipied site
  Butterfly_data <- read.csv(paste("~/Project Data/Site Subsets/SITE", siteno, ".csv", sep = ""))
  Precip <- read.csv(paste("//ueahome5/ressci5/zuw13bqu/data/NTProfile/Desktop/EOBS European data/SiteWeather/rr/Weather.Site.", siteno, ".csv", sep = ""))
  Tmin <- read.csv(paste("//ueahome5/ressci5/zuw13bqu/data/NTProfile/Desktop/EOBS European data/SiteWeather/tn/Weather.Site.", siteno, ".csv", sep = ""))
  Tmax <- read.csv(paste("//ueahome5/ressci5/zuw13bqu/data/NTProfile/Desktop/EOBS European data/SiteWeather/tx/Weather.Site.", siteno, ".csv", sep = ""))

for (i in 1:length(Precip[,1])){ # turns missing values into NA values for precip, max and min temp

  if (Precip[i,1] < -900){
  Precip[i,1] <- NA
}}

for (i in 1:length(Tmax[,1])){
  if (Tmax[i,1] < -900){
    Tmax[i,1] <- NA
  }}
for (i in 1:length(Tmin[,1])){
  if (Tmin[i,1] < -900){
    Tmin[i,1] <- NA
  }}



ExtPrecip <- mean(Precip[,1], na.rm = TRUE) + sd(Precip[,1], na.rm = TRUE) # finds the extreme of each weather variable
ExtTmax <- mean(Tmax[,1], na.rm = TRUE) + sd(Tmax[,1], na.rm = TRUE)
ExtTmin <- mean(Tmin[,1], na.rm = TRUE) + sd(Tmin[,1], na.rm = TRUE)
return(c(head(Precip),head(Tmin),head(Tmax)))
}

1 个答案:

答案 0 :(得分:1)

我认为您正在尝试将各种对象分配给顶级环境。函数有自己的环境,因此只有在评估函数时才存在赋值(这就是为什么在debug ging时可以看到对象的原因)。一旦函数返回,函数体中的对象就不复存在了。

为了解决这个问题,您可以使用<<-(即Butterfly_data <<- read.csv(...)),以及在函数中修改这些对象的任何时间。

请注意,通常不鼓励使用<<-,并且除了使用<<-之外,几乎总是有更好的方法。

例如,在这种情况下,您可以返回包含所有对象的列表,并编写一个单独的函数,该函数在列表中运行并生成头:

Extremes <- function(siteno) {
  # bunch of stuff

  return(list(Precip=Precip, Tmax=Tmax, Tmin=Tmin))
}             
data.list <- Extremes("mysiteno")
lapply(data.list, head)  # view the heads
list2env(data.list)      # if you really want objects available at top level directly