避免冗余处理的 lapply() 和 mclapply() 版本
Versions of lapply() and mclapply() that avoid redundant processing
我正在寻找仅处理参数列表 X
的唯一元素的 lapply()
和 mclapply()
版本。这样的东西已经存在了吗?
编辑:换句话说,我希望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(任务,long_computation)
## A
## B
## [[1]]
## [1] "A"
##
## [[2]]
## [1] "B"
##
## [[3]]
## [1] "A"
##
## [[4]]
## [1] "B"
您可以尝试这样的操作:我创建了一个 map
对象,它在 long_computation
之后为每个唯一 'key' 存储结果。一旦遇到现有的 'key',它将从 map
returns 否则它会调用 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
}
}
})
这似乎有效:
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 中的东西会很好。
我正在寻找仅处理参数列表 X
的唯一元素的 lapply()
和 mclapply()
版本。这样的东西已经存在了吗?
编辑:换句话说,我希望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(任务,long_computation)
## A
## B
## [[1]]
## [1] "A"
##
## [[2]]
## [1] "B"
##
## [[3]]
## [1] "A"
##
## [[4]]
## [1] "B"
您可以尝试这样的操作:我创建了一个 map
对象,它在 long_computation
之后为每个唯一 'key' 存储结果。一旦遇到现有的 'key',它将从 map
returns 否则它会调用 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
}
}
})
这似乎有效:
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 中的东西会很好。