setwd() 的路径分配在 for/foreach 循环中延迟

Path assignment to setwd() is delayed in for/foreach loop

objective 是在 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的路径有点"behind" ...

为什么会这样? 由于我离成为 R 专家还很远,所以我不知道是什么导致了这种行为,也不知道最重要的是如何获得所需的行为。 因此,任何帮助、提示、代码 correction/optimization 将不胜感激!

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

来自 ?setwd 帮助页面...

setwd returns the current directory before the change, invisibly and with the same conventions as getwd. It will give an error if it does not succeed (including if it is not implemented).

所以当你

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

您获取的不是 "current" 目录,您获取的是前一个目录。您应该使用 getwd() 来获取当前的

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