2014-02-15 12 views
0

我寫打開的所有文件的dir()的函數文件,做了一些計算和重排,然後再寫入(write.table)的每個文件的dir()寫作系列化與循環

dir() 
[1] "v2p1" "v2p10" "v2p11" "v2p12" "v2p2" "v2p3" "v2p4" "v2p5" "v2p6" "v2p7" 
[11] "v2p8" "v2p9" "v2r1" "v2r10" "v2r11" "v2r12" "v2r2" "v2r3" "v2r4" "v2r5" 
[21] "v2r6" "v2r7" "v2r8" "v2r9" "v2s1" "v2s10" "v2s11" "v2s12" "v2s2" "v2s3" 
[31] "v2s4" "v2s5" "v2s6" "v2s7" "v2s8" "v2s9" 

代碼看起來像這樣,除了循環無法正常工作以外,它的一切都很好。

mysub <- function(x) {sub(",",".",x)} 
abrir<-function(etapa){ 
### volnum c(1:10) indica en qué vol quiero, 
### etapa c("p","r","s") indica en qué etapa es del experimento 

i<-1 
for (i in dir()){ 

##### ABRIR ARCHIVOS DESDE DIR() ###### 
Archivo<-paste(getwd(),"/",i,sep="") 
r1<-read.table(Archivo,fill=T,sep=",") 

##### CALCULAR LA VELOCIDAD DE CADA CORRIDA ###### 
r11 <- (apply(r1, 2, mysub)) 
r1<- data.frame(apply(r11, 2, as.numeric)) ## ojo que pueden aparecer NA 
R1<-r1[1:3136,]  ### OJO, DEPENDE LA CORRIDA, SACA LOS VALORES DEL FINAL QUE NO SIRVEN 
V<-data.frame(rbind(c(0,0,0,0),(abs(diff(as.matrix(R1[,2:5])))))) 
Tiempo<-R1[,1] 
Velocidad<-data.frame(Tiempo,V) 

##### GUARDAR LAS VELOCIDADES QUE CORRESPONDEN ###### 

if (grep("p",i)==TRUE){ 
salida<-paste("VEL",i,".txt",sep="") 
write.table(Velocidad,salida,sep="\t",row.names=FALSE) 
} else if (grep("r",i)==TRUE){ 
salida<-paste("VEL",i,".txt",sep="") 
write.table(Velocidad,salida,sep="\t",row.names=FALSE) 
}else if(grep("s",i)==TRUE){ 
salida<-paste("VEL",i,".txt",sep="") 
write.table(Velocidad,salida,sep="\t",row.names=FALSE) 
}else stop("etapa inválida") 
i<-i+1 
} 
} 

abrir()爲我節省了正確的「VELv2p1.txt」並返回此錯誤 錯誤在我+ 1:非數值參數二元運算

我不知道怎麼解釋[R繼續第二個元素一旦完成i = 1我想我< -i + 1它不是這樣。我會很感激你的幫助。

回答

1

錯誤消息與您的循環中的icharacter對象而不是numeric有關。語法for(i in dir())會生成i中的實際文件,而不是索引。在使用for這樣的情況下,不需要將i設置爲下一項,for循環將採用該項。因此,只需刪除i <- i + 1即可解決您的問題。

關於你的代碼的一些言論:

  • 縮進將提高代碼的可讀性。如將添加空格。
  • 您可以將write.table的調用放在函數的最後,爲您節省三行相同的代碼。實際上,這組if聲明似乎都執行相同的代碼。
  • forfor循環通常不是R中的最佳選擇。Vectorized或基於apply的解決方案產量更短,有時代碼更快。

我粗略地採取以下措施:

list_of_files = list.files('.') 
do_some_calculations = function(file, output_name) { 
    output_name = sprintf('VEL%d.txt', list_of_files) 
    Archivo<-paste(getwd(), "/", i, sep = "") 
    r1<-read.table(Archivo,fill = T, sep = ",") 
    r11 <- (apply(r1, 2, mysub)) 
    r1<- data.frame(apply(r11, 2, as.numeric)) ## ojo que pueden aparecer NA 
    R1<-r1[1:3136,]  ### OJO, DEPENDE LA CORRIDA, SACA LOS VALORES DEL FINAL QUE NO SIRVEN 
    V <- data.frame(rbind(c(0,0,0,0), (abs(diff(as.matrix(R1[,2:5])))))) 
    Tiempo <- R1[,1] 
    Velocidad <- data.frame(Tiempo, V) 
    write.table(Velocidad, output_name,s ep="\t", row.names=FALSE) 
} 
+0

謝謝。我明白你的意思。我不喜歡for循環,但我認爲這是唯一的方法。現在循環遍歷整個v2pi並停止返回此錯誤錯誤if(grep(「p」,i)== TRUE){:參數的長度爲零。我使用了grep,因爲它的匹配包含一個字符,例如我的字符 –

+0

忘記它,我耗盡了if語句並且工作正常,謝謝! –