尽管使用并行化R似乎可以复制从子进程返回的所有内容,即使对象未更改也是如此。特别是,请考虑以下示例:
env1 <- new.env()
envs2 <- lapply(1:4, function(x) env1)
cl<-makeCluster(2, type="FORK")
envs3 <- parLapply(cl, 1:4, function(x) env1)
envs4 <- parLapply(cl, 1:4, function(x) capture.output(str(env1)))
stopCluster(cl)
env1
envs2
envs3
envs4
首先,我创建一个环境(env1
)。然后使用非并行lapply
得到一个列表(envs2
),其中所有条目都包含指向env1
的指针。现在,当使用并行parLapply
时,我得到的列表中的条目(envs3
)包含指向不同对象的指针,这些对象应该是env1
的克隆(还要注意,前两个条目包含与最后两个指针相同;据推测是因为我使用2个子节点进行长度为4的循环)。当子节点将其结果返回给主节点时,似乎发生了这种克隆。为此,我在子节点中将env1
的指针保存到列表envs4
。
为什么在返回原始环境时会对其进行克隆?并且有办法使R不能克隆未更改的环境吗?