如何在R中的异步期货中更改工作目录

时间:2018-07-18 18:27:46

标签: r future

我试图在将来的处理器中更改工作目录,执行一些操作,然后退出。问题是我无法设置工作目录。

以下玩具示例可以正常工作

library(future)
dirNames <- as.character(c(1:4))
sapply(dirNames, function(x) if(!dir.exists(x)) dir.create(x))
plan(multiprocess, workers=2)
b <- list()

for(i in seq_along(dirNames)){
  sleeptime <- 10
  if(i > 3) sleeptime <- 50
  a <- future({
    # setwd(dirNames[i])
    Sys.sleep(sleeptime)
    return(2)
  })
  print(i)
  b[[dirNames[i]]] <- a
}
lapply(b, resolved)
lapply(b[1:2], value)
lapply(b, value)

但是如果我取消注释第11行,则在运行代码时出现以下错误

  

setwd(dirNames [i])错误:无法更改工作目录

如何成功更改工作目录?

1 个答案:

答案 0 :(得分:0)

我在玩脚本时想出了一个解决方案。

library(future)
dirNames <- as.character(c(1:4))
sapply(dirNames, function(x) if(!dir.exists(x)) dir.create(x))
plan(multiprocess, workers=2)
b <- list()

for(i in seq_along(dirNames)){
  sleeptime <- 10
  if(i > 3) sleeptime <- 50
  a <- future({
    currDir <- getwd()
    on.exit(setwd(currDir))
    setwd(dirNames[i])
    Sys.sleep(sleeptime)
    return(2)
  })
  print(i)
  b[[dirNames[i]]] <- a
}
lapply(b, resolved)
lapply(b[1:2], value)
lapply(b, value)

我相信,在前几次迭代中设置的worker工作目录对于其余的迭代仍会永久设置为新目录,因此将来的路径(参考旧目录)将不起作用。