通过引用操作任务对象:这是如何工作的?

Manipulating task objects by reference: How does this work?

我很难理解如果我使用像 x <- task 这样的命令到底会发生什么。例如,这是我所做的:

  1. 我有一个任务、学习者和重采样的列表,我将它们结合起来进行基准测试。当我手动进行匹配时,我的任务列表包含同一任务的多次重复,例如我列表中的第二个和第三个条目是相同的。所以,我很容易理解以下几行中发生的事情:

这是可以理解的。由于我指的是同一个对象,我列表的第三个条目必须随着我操作第二个条目而改变(是的,它们是同一个对象)

  1. 现在,我使用此列表生成基准设计并执行重采样:
design = data.table(
  task = list_of_tasks,
  learner = list_of_learners,
  resampling = list_of_resamplings
)

bmr = benchmark(design) 

tab = bmr$aggregate(c(msr("classif.acc"))) 

结果 tab 有一列包含我可以检查和操作的重采样结果。这些重采样结果包括我的原始任务(至少这是我的理解)。操作“重采样结果中的任务”与步骤 1 完全相同,并且具有相同的效果(同样,毫不奇怪):

  1. 但是现在,这里发生了什么(我接下来执行以下几行)?似乎“重采样结果中的任务”对于第 2 行和第 3 行是相同的对象,但在原始列表中 not:

我好像漏掉了什么。但是我怎么理解呢?

调用 benchmark() 时克隆任务、学习器和重采样,即创建每个对象的副本。 designtab 中的条目不引用内存中的相同对象。因此,更改 tab$resample_result[[2]]$task 不会更改 list_of_tasks[[2]].