首页 > 解决方案 > 如何在 R 中的异步期货中更改工作目录

问题描述

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

以下玩具示例工作正常

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]) 中的错误:无法更改工作目录

如何成功更改工作目录?

标签: rfuture

解决方案


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

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)

我相信在前几次迭代中设置的工作目录仍然永久设置为新目录以进行剩余迭代,因此未来的路径(参考旧目录)不起作用。


推荐阅读