R中并行包的竞争条件

R中并行包的竞争条件,r,parallel-processing,vectorization,race-condition,critical-section,R,Parallel Processing,Vectorization,Race Condition,Critical Section,我试图并行执行一个对向量有副作用的函数。例如,在下面的代码段中,add.entry具有修改master的副作用 library(parallel) master <- data.frame() add.entry <- function(x) { row <- data.frame(a = x, b = sin(x)) master <- rbind(master, row) } mclapply(1:42, add.entry) 库(并行) 主人 在循环

我试图并行执行一个对向量有副作用的函数。例如,在下面的代码段中,
add.entry
具有修改
master
的副作用

library(parallel)

master <- data.frame()

add.entry <- function(x) {
  row <- data.frame(a = x, b = sin(x))
  master <- rbind(master, row)
}

mclapply(1:42, add.entry)
库(并行)
主人
  • 在循环中生长对象非常缓慢(参见)
  • 当您使用并行时,您不会在全局环境中对
    master
    执行
    rbind()
    ,而是在不同的fork中执行它的一些副本(参见)
  • mclappy
    已经返回了一些内容(比如
    lappy
    你可以简单地做

    library(parallel)
    
    add.entry <- function(x) {
      data.frame(a = x, b = sin(x))
    }
    
    res_list <- mclapply(1:42, add.entry)
    master <- do.call("rbind", res_list)
    
    库(并行)
    
    add.entry您的函数不是在修改master。例如,尝试添加条目(1)
    ,然后打印母版。它不会被改变。@lmo这很有趣。。。但是,直接执行语句确实会向
    master
    添加一行。知道发生了什么吗?在函数式编程范例中,不鼓励通过副作用修改对象的函数。函数中的主对象是函数的局部对象。R确实提供了一个工具来使用
    @lmo实现这一点,我会接受你的建议。但是,
    sapply(1:4,add.entry)
    给出的结果是转置的,即
    a
    b
    是行,但我希望它们是列。也许我可以用
    t
    再次转置它。