lapply()和mclapply()的版本,可避免冗余处理

时间:2017-10-31 14:08:57

标签: r lapply mclapply

我正在寻找只处理参数列表lapply()的唯一元素的mclapply()X版本。这样的事情是否已经存在?

编辑:换句话说,我希望lapply()不要处理重复项,但我希望length(lapply(X, ...))等于length(X),而不是length(unique(X)) (和匹配的适当值)。另外,我假设X的每个元素都相当小,所以采用唯一值不应该太麻烦。

当前行为:

long_computation <- function(task){
  cat(task, "\n")
# Sys.sleep(1000) # 
  return(task)
}
tasks <- rep(LETTERS[1:2], 2)
lapply(tasks, long_computation)

## A
## B
## A
## B
## [[1]]
## [1] "A"
## 
## [[2]]
## [1] "B"
## 
## [[3]]
## [1] "A"
## 
## [[4]]
## [1] "B"

期望的行为:

lapply(tasks,long_computation)

## A
## B
## [[1]]
## [1] "A"
## 
## [[2]]
## [1] "B"
## 
## [[3]]
## [1] "A"
## 
## [[4]]
## [1] "B"

你可以find the intended use case here

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:我创建了一个map对象,该对象会在long_computation之后为每个唯一的键&#39;存储结果。一旦现有的关键&#39;遇到,它从map返回,否则它调用long_computation函数并将结果存储在map中以备将来使用。不确定它是否是理想的方式,但它有效。

tasks <- rep(letters[1:2], 2)
map=list()

lapply(tasks,function(t){if(t %in% names(.GlobalEnv$map)){
    return(.GlobalEnv$map[[t]])
}else{
    result=toupper(t)
        if(!t %in% names(.GlobalEnv$map)){
            .GlobalEnv$map[[t]]=result
        }
    }
})

答案 1 :(得分:0)

这实际上似乎有效:

lightly_parallelize_atomic <- function(X, FUN, jobs = 1, ...){
  keys <- unique(X)
  index <- match(X, keys)
  values <- mclapply(X = keys, FUN = FUN, mc.cores = jobs, ...)
  values[index]
}

就我而言,X是原子的,没关系。

但是找到已经内置于包或R本身的东西是很好的。