我写了以下功能。不幸的是,当我运行它,它运行大约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)))
}
答案 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