R语言模型配对比较的循环索引错误问题及改进方法咨询
问题原因分析
你的代码出现问题的核心是循环索引使用错误:
- 你创建的
list_comparison里的每个元素是模型索引对(比如c(1,2)),当你在循环中用comparison[i]赋值时,R会把i当成list的位置索引。 - 第一次循环
i=c(1,2),会给comparison的第1、2位都赋值为第一组比较结果; - 第二次循环
i=c(2,3),会给comparison的第2、3位赋值为第二组比较结果; - 第三次循环
i=c(3,4),会给comparison的第3、4位赋值为第三组比较结果; - 最终
comparison被扩展到长度4,且第3、4位都是第三组的结果。
索引优化方案
把循环的索引改成遍历list_comparison的序列位置,而不是直接用索引对:
comparison = vector('list', length = 3) list_comparison = list(c(1,2), c(2,3), c(3,4)) # 遍历序列索引,而非索引对 for (idx in seq_along(list_comparison)) { pair = list_comparison[[idx]] comparison[[idx]] = summary(compareFit(models[[pair[1]]], models[[pair[2]]])) }
这样每次循环只会给comparison的第idx位赋值,不会乱扩展list长度,最终length(comparison)会保持为3,每组结果对应正确位置。
替代方案(更简洁)
用R的lapply函数替代手动循环,无需提前初始化list,直接生成对应长度的结果:
list_comparison = list(c(1,2), c(2,3), c(3,4)) comparison <- lapply(list_comparison, function(pair) { summary(compareFit(models[[pair[1]]], models[[pair[2]]])) })
lapply会自动遍历list_comparison的每个元素,将处理结果按顺序存入新list,完全避免索引错误问题。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

