2013-11-13 7 views
0

Я задал очень похожий вопрос раньше, но ответы, которые я получил, похоже, не применяются в этом случае. Цель моего кода - это, прежде всего, взять файл, обработать его и сохранить управляемый файл поверх старого файла. К сожалению, есть много файлов, поэтому я включил цикл for, но он останавливается после всего одного прогона цикла. Я думаю, что моя функция возврата находится в правильном месте, а мой оператор for работал в предыдущей немного другой версии скрипта. Вот мой код:Почему моя петля в r только работает?

AddLatLon<- function(num, condition){ 


#Set working directiory 
# num is the number of files needing extraction e.g (3:5) , c(2,7) 

connect <- file("./EOBS DATA/sources.txt", "r") 
locdata <- readLines(connect) 
close(connect) 

info <- locdata[24:length(locdata)] # removes non data before the data begins 



Infodata <- read.table(text = info, sep=',',fill=TRUE,colClasses='character',header ==TRUE) 
InfoTable <- read.csv("./EOBS DATA/sources.csv") 
InfoTable$STAID <- as.numeric(InfoTable$STAID) 



for(i in c(num)){ 
filename <-paste("./EOBS DATA/",condition, "_csv_data/", condition,i, ".csv", sep = "") 


#if(i <10){ 
    #filename <- paste("./EOBS DATA/ECA_blend_", condition, "/" ,CONDITION, "_STAID00000", i, ".txt", sep = "") 
#} 
#if(i >=10 & i < 100){ 
    #filename <- paste("./EOBS DATA/ECA_blend_", condition, "/" ,CONDITION, "_STAID0000", i, ".txt", sep = "") 
#} 

#if(i>= 100 & i <1000){ 
    #filename <- paste("./EOBS DATA/ECA_blend_", condition, "/" ,CONDITION, "_STAID000", i, ".txt", sep = "") 
#} 
#if(i>= 1000){ 
    #filename <- paste("./EOBS DATA/ECA_blend_", condition, "/" ,CONDITION, "_STAID00", i, ".txt", sep = "") 
#} 
if(file.exists(filename) == FALSE) { 
    next 
} 


#con <- file(filename, "r") 
#data <- readLines(con) 
#close(con) 
#q <- data[21:length(data)] # removes non data before the data begins 



#Impactdata <- read.table(text = q, sep=',',fill=TRUE,colClasses='character',header = TRUE) 


x <- read.csv(filename) 



point <- match(i, InfoTable$STAID) 
Lat <- InfoTable[point,5] 
Lon <- InfoTable[point,6] 

Lat <- as.character(Lat) 
Lon <- as.character(Lon) 


x$Lat <- Lat 
x$Lon <- Lon 



x$X <- NULL 
x$DATE<- as.Date(as.character(x$DATE), format='%Y%m%d') 

Savename <- paste("./EOBS DATA/",condition, "_csv_data/", condition,i, ".csv", sep = "") 

if(condition == "rr"){ 
    condition <- "Precipitation" 
} 
if(condition == "tn"){ 
    condition <- "Minimum Temperature" 
} 
if(condition == "tx"){ 
    condition <- "Maximum Temperature" 
} 

names(x)<- c("Station_ID", "Source_ID", "Date(yyyy-mm-dd)", condition, "Quality_code(0='valid'; 1='suspect')", "Latitude", "Longitude") 


write.csv(x, Savename) 


} 
return(head(x)) 
} 
+0

Если мои комментарии не ответили на ваш вопрос, пожалуйста, покажите нам, как вы вызвали 'AddLatLon', чтобы проверить его (точная команда). И что заставляет вас думать, что она провела только одну итерацию? – flodel

+0

Используйте 'debug'. Как указано в Flodel, вы можете не называть имена файлов, которые, по вашему мнению, вы есть. Кстати, я бы рекомендовал обратить вспять ваше 'if (file.exists (filename) == FALSE)' to '.... TRUE', тем самым устраняя необходимость в вызове' next' (когда FALSE остальная часть кода пропущен). –

ответ

4

num не определен, но от имени я уверен, что вы хотите быть зацикливание над 1:num, не c(num). Так просто заменить:

for(i in c(num)){ 

с

for(i in 1:num)){ 

или

for(i in seq_len(num)){ 

Почему seq_len? Это будет сделано правильно, если num равно нулю (без циклов) или отрицательным (выведите ошибку).

+1

+1 для 'seq_len'. – Roland

+0

К сожалению, это не решило мою проблему, и она все еще просто петли один раз. Мне также нравится c (num), поскольку он позволяет мне выбирать определенные файлы. – user2961410

+0

Тогда я не вижу ничего плохого в вашем коде. Вы можете поместить 'print (i)' в верхнюю часть вашего цикла, и вы увидите, что он действительно перебирает все значения. Вы также можете проверить, что он создает все файлы, которые вы ожидали. Что может быть «проблемой» с «return (head (x))': он вернет голову 'x' из последней итерации, заставив вас поверить, что она выполняла только одну итерацию. – flodel

Смежные вопросы