Задание пути для setwd() задерживается в цикле for/foreach

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

require("foreach")

# The following lines are generated by an external tool and stored in filePath.info 
# Loaded via source("filePaths.info")
result1 <- '/home/user/folder1' 
result2 <- '/home/user/folder2'
result3 <- '/home/user/folder3' 
number_results <- 3

# So I know that I have all in all 3 folders with results by number_results 
# and that the variable name that contains the path to the results is generic: 
# string "result" plus 1:number_results.

# Now I want to switch to each result path and do some computation within each folder
start_dir <- getwd()
print(paste0("start_dir: ",start_dir))

# For every result folder switch into the directory of the folder
foreach(i=1:number_results) %do% { 
# for (i in 1:number_results){ leads to the same output

    # Assign path in variable, not the variable name as string: current_variable <- result1 (not string "result1")
    current_variable <- eval(parse(text = paste0("result", i)))
    print(paste0(current_variable, " in interation_", i))
    # Set working directory to string in variable current_variable
    current_dir <- setwd(current_variable)
    print(paste0("current_dir: ",current_dir))

    # DO SOME OTHER STUFF WITH FILES IN THE CURRENT FOLDER
}

# Switch back into original directory
current_dir <- setwd(start_dir)
print(paste0("end_dir: ",current_dir))

Вывод следующий...

[1] "start_dir: /home/user"
[1] "/home/user/folder1 in interation_1"
[1] "current_dir: /home/user"
[1] "/home/user/folder2 in interation_2"
[1] "current_dir: /home/user/folder1"
[1] "/home/user/folder3 in interation_3"
[1] "current_dir: /home/user/folder2"
[1] "end_dir: /home/user/folder3"

... хотя я бы ожидал этого:

[1] "start_dir: /home/user"
[1] "/home/user/folder1 in interation_1"
[1] "current_dir: /home/user/folder1"
[1] "/home/user/folder2 in interation_2"
[1] "current_dir: /home/user/folder2"
[1] "/home/user/folder3 in interation_3"
[1] "current_dir: /home/user/folder3"
[1] "end_dir: /home/user/"

Так что получается, что путь, назначенный current_dir, несколько "позади"...

Почему это так? Поскольку я далек от того, чтобы быть экспертом по R, я понятия не имею, что вызывает это поведение, и самое важное, как получить желаемое поведение. Так что любая помощь, подсказка, исправление / оптимизация кода будут высоко оценены!

R version 3.3.1 (2016-06-21) -- "Bug in Your Hair"
Platform: x86_64-pc-linux-gnu (64-bit)

1 ответ

Решение

От ?setwd страница справки...

setwd возвращает текущий каталог до изменения, невидимо и с теми же соглашениями, что и getwd, Он выдаст ошибку, если не удастся (в том числе, если она не будет реализована).

Итак, когда вы делаете

current_dir <- setwd(current_variable)
print(paste0("current_dir: ",current_dir))

Вы не получаете "текущий" каталог, вы получаете предыдущий. Вы должны использовать getwd() чтобы получить текущий

setwd(current_variable)
current_dir <- getwd()
print(paste0("current_dir: ",current_dir))
Другие вопросы по тегам