You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:33:17