R语言:for循环存储data.table到列表的引用重复问题
解决方案
问题出在data.table的引用语义::=是原地修改对象的操作,你当前的代码只是把同一个data.table的引用反复存入列表,最终所有元素都指向同一个对象,所以内容完全相同。
要存储25个独立的data.table,核心是每次循环时先创建上一个对象的独立副本,再修改副本,具体修改方式如下:
方法1:显式复制后修改
lst_assets[[1]] <- df_assets_loop_start for (i in 1:params$n_timesteps) { # 复制上一步的data.table,生成独立副本 new_dt <- copy(lst_assets[[i]]) # 在副本上原地修改age列 new_dt[, age := age + 1] # 将独立副本存入列表 lst_assets[[i+1]] <- new_dt }
方法2:链式复制+修改
可以把复制和修改合并成一行代码,更简洁:
lst_assets[[1]] <- df_assets_loop_start for (i in 1:params$n_timesteps) { lst_assets[[i+1]] <- copy(lst_assets[[i]])[, age := age + 1] }
原理说明
copy()函数会创建一个全新的data.table对象,与原对象完全独立(不共享内存)。之后对新副本使用:=修改,只会影响当前这个新对象,不会改变列表中之前存储的data.table内容,这样列表里的每个元素都是独立的年份数据。
内容的提问来源于stack exchange,提问作者H-Fort
相关产品推荐
相关产品推荐

