首页 > 解决方案 > 有没有办法克隆由 simmer 创建的“包​​装”对象?

问题描述

我创建了 simmer 模拟的并行副本,与 simmer简介中的方式相同:

library(parallel)
library(simmer)

envs <- mclapply(1:100, function(i) {
  simmer("SuperDuperSim") %>%
    add_resource("nurse", 1) %>%
    add_resource("doctor", 2) %>%
    add_resource("administration", 1) %>%
    add_generator("patient", patient, function() rnorm(1, 10, 2)) %>%
    run(80) %>%
    wrap()
})

现在每个对象envs都不是一个simmer类,而是一个wrap类。我想在envs不修改原始对象的情况下修改每个对象的某些部分,但是属性的任何更改都会影响原始对象。

如何克隆wrap对象以对其属性进行一些更改并保持原始对象不变?

标签: r

解决方案


长期研究表明,没有明确的函数可以完全满足我对慢煮物体的需求。但是,我发现simmerwrap对象都是 type environment。这里明显的解决方案是克隆环境,这里回答了这个问题,并将相同的类分配给新创建的环境,以使其看起来像原始对象。

示例代码:

clonedEnvs <- lapply(envs, function(env) {
  result <- as.environment(as.list.environment(env, all.names = TRUE))
  structure(result, class = class(env))
})

推荐阅读