For循环除最后一次外均返回0?R语言代码问题排查
R代码错误分析与修正
针对你提供的代码和出现的问题(Tmin全为0,Tmax仅最后一个值非0),核心错误如下:
1. 循环迭代范围完全错误
两个计算Tmin和Tmax的for循环,使用了for (i in length(M_values))的写法——length(M_values)返回的是单个数值(这里是1000),所以循环只会执行一次,仅对i=1000的位置赋值,其余位置保持初始的0值。
正确写法应该是遍历1到1000的所有索引:
for (i in 1:length(M_values)) # 或者更稳妥的写法(避免空向量问题): for (i in seq_along(M_values))
2. 样本数量不符合需求
gerar_intervalos函数中,生成样本时用了rnorm(1000, mean=M, sd=1),但需求是每个M对应生成100个样本,应改为:
amostras <- rnorm(100, mean=M, sd=1)
3. 区间界提取与计算逻辑错误
- 原代码用
sapply处理后,intervalos的结构混乱,导致inferiores和superiores提取的并非每个M对应的区间界集合,而是错误的全局列最小值/最大值。 - 内层循环既犯了循环范围错误,逻辑上也应该只处理当前M自己生成的100个区间界,而非所有M的区间界。
修正后的完整代码
n <- 1000 M_values <- sample(seq(-1, 1, length.out = n)) erro <- 0.01 # 生成每个M对应的100个区间(每行是一个区间的上下界) gerar_intervalos <- function(M) { amostras <- rnorm(100, mean = M, sd = 1) intervalos <- cbind(amostras - erro, amostras + erro) return(intervalos) } # 用lapply保存每个M对应的区间矩阵,结构更清晰 intervalos_list <- lapply(M_values, gerar_intervalos) # 提取每个M对应的下界和上界列表 inferiores_list <- lapply(intervalos_list, function(x) x[, 1]) superiores_list <- lapply(intervalos_list, function(x) x[, 2]) # 计算Tmin:每个M对应的下界与M的正差之和 Tmin <- numeric(n) for (i in seq_along(M_values)) { diffs <- inferiores_list[[i]] - M_values[i] Tmin[i] <- sum(diffs[diffs > 0]) } # 计算Tmax:每个M对应的上界与M的正差之和 Tmax <- numeric(n) for (i in seq_along(M_values)) { diffs <- superiores_list[[i]] - M_values[i] Tmax[i] <- sum(diffs[diffs > 0]) }
内容的提问来源于stack exchange,提问作者John hall
相关产品推荐
相关产品推荐

