通过引用操作task对象的运行机制是怎样的?
问题解答
你观察到的现象是mlr3框架为了保障基准测试可复现性刻意设计的机制,核心逻辑如下:
- mlr3中的Task、Learner等核心对象都基于R6类实现,天然是引用语义:多个变量指向同一个R6引用时,修改任意一个变量对应的对象属性,所有指向该引用的变量都会同步生效,这就是你在步骤1、步骤2中观察到的现象。
benchmark()函数默认会对输入的所有Task、Learner、Resampling对象执行克隆操作:- 函数首先会对输入的对象做去重识别,你输入的
list_of_tasks中第2、3个是同一个引用,因此只会被克隆一次,克隆得到的新引用会同时赋值给基准测试结果中对应的两个条目,所以你修改结果中第2行的Task,第3行也会同步变更。 - 克隆操作会生成完全独立的新R6对象,和你最初传入的原始Task引用没有关联,因此你修改原始列表中的Task不会影响基准测试结果中的对象,反过来修改结果中的Task也不会影响你最初构造的列表。
- 函数首先会对输入的对象做去重识别,你输入的
如果确实需要让基准测试直接使用你传入的原始引用,可以在调用benchmark()时设置clone = FALSE,但该操作会破坏基准测试的独立性,不推荐常规场景使用。
内容的提问来源于stack exchange,提问作者ds_col
相关产品推荐
相关产品推荐

