2016-09-11 3 views
3

У меня есть zip-файл, который я распаковываю, тогда я использую цикл for, чтобы пройти через каталоги в рабочем каталоге, а затем сменить рабочий каталог на новую папку, которую я только что распаковал , Однако, похоже, это не нравится.Рабочие каталоги в R, использующие для цикла

Ниже приведены два кода, которые я использовал, один из них заканчивается ошибкой, а второй - тем, что я не хочу делать. Я думаю, что я, возможно, смешиваю некоторую логику Python?

for (i in list.files("./")){ 
    if (endsWith(tolower(i),"zip")){ 
    unzip(i) 
    cat("Unzipped",i,"\n") 
    } 
} 

for (i in list.dirs(getwd())){ 
    cat("This is i",i,"\n") 
    Root <- setwd(i) 
    cat("This is ROOT",Root,"\n") 

} 

print(Root) 

В результате я получаю от выполнения кода выглядит следующим образом:

This is i F:/Testing with R 
This is ROOT F:/Testing with R 
This is i F:/Testing with R/ABC_Data 
This is ROOT F:/Testing with R 

Как вы можете видеть, я хотел бы, чтобы перебрать папки и сделать ABC_Data рабочий каталог, так что я может затем перебирать файлы, но ему это не нравится.

Второй код, который я попробовал, пройдя через несколько страниц Stackoverflow были внесены изменения с использованием paste0() до уровня ниже, который работал до определенного момента, но затем дал ошибку:

> for (i in list.files("./")){ 
+ if (endsWith(tolower(i),"zip")){ 
+  unzip(i) 
+  cat("Unzipped",i,"\n") 
+ } 
+ } 
Unzipped GVA_BillData.zip 
> 
> for (i in list.dirs(getwd())){ 
+  cat("This is i",i,"\n") 
+  Root <- paste0(path.expand(i),"/") 
+  cat("This is ROOT",Root,"\n") 
+ 
+ } 
This is i F:/Testing with R 
This is ROOT F:/Testing with R/ 
This is i F:/Testing with R/ABC_Data 
This is ROOT F:/Testing with R/ABC_Data/ 
> 
> print(Root) 
[1] "F:/Testing with R/ABC_Data/" 
> 
> File_count <- 0 
> for (a in list.files(Root)){ 
+ print(a) 
+ if (endsWith(tolower(a),"csv")){ 
+  if (length(grep("service file",tolower(a)) > 0)){ 
+  Import <- read.csv(a, header = TRUE) 
+  for (i in 1:nrow(Import)){ 
+   Import_Date <- Import[1,4] 
+   if (File_count == 0){ 
+   write.table(c(Import[i,],Import_Date,a),"Output.csv",append = TRUE,sep = ",",row.names = FALSE,col.names = TRUE) 
+   File_count <- File_count + 1 
+   } else (write.table(c(Import[i,],Import_Date,a),"Output.csv",append = TRUE,sep = ",",row.names = FALSE,col.names = FALSE)) 
+   } 
+   } 
+  } 
+ } 
[1] "1234_126311.csv" 
[1] "Service File.csv" 
Error in file(file, "rt") : cannot open the connection 
In addition: Warning message: 
In file(file, "rt") : 
    cannot open file 'Service File.csv': No such file or directory 
> print("Finished") 
[1] "Finished" 

Итак, как вы можете см. во втором коде, он перескакивает в папку, но выдает сообщение об ошибке. Я попытался использовать просто path.expand(i), но это не сработало.

ответ

2

Я думаю, что назначение при использовании setwd() вызывает проблему. Сначала вы настраиваете первый код:

for (i in list.dirs(getwd())){ 
    cat("This is i",i,"\n") 
    setwd(i) 
    Root <- getwd() 
    cat("This is ROOT",Root,"\n")  
} 

, похоже, работает на меня.

Проблема не в том, что setwd() не работает, это означает, что назначение возвращает старый рабочий каталог. Документы (?setwd) говорят: «setwd возвращает текущий каталог перед изменением». (Спасибо @Tensibai.) См. Следующий пример:

setwd("c:/") 
getwd() 
# [1] "c:/" 
z<-setwd("c:/Users/") 
z 
# [1] "c:/" 
getwd() 
# [1] "c:/Users" 
+0

Спасибо, бутон, это сработало и для меня. Любая причина, по которой это не позволяло мне сделать это в первую очередь? Я имею в виду, потому что я назначал значение, вызывая функцию? – AmarKahlon

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