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

R语言循环给向量z赋值时报object 'z' not found错误如何解决

报错原因

R 无法对不存在的对象直接执行索引赋值操作。你的for循环第一次运行z[i] = ...语句时,全局环境中没有定义名为z的对象,因此触发Error: object 'z' not found报错。
逐元素索引赋值的语法本身没有问题,只需要在赋值前先初始化目标向量即可。

修正方案

方案1:保留原有循环逻辑,提前预分配向量

已知循环总次数等于矩阵x的列数(即10000次),在进入循环前先创建对应长度的数值型向量z即可。这种预分配内存的写法性能最好,是R语言写循环的标准规范:

set.seed(1)
# simulate throwing 100 dice 10000 times
n <- 100
x <- replicate(10000,sample(1:6, n, replace=TRUE))
# calculate the scaled probability of throwing a 6
p <- 1/6
# 提前初始化长度匹配的数值向量
z <- numeric(length = ncol(x))
for (i in 1:ncol(x)) {
    # 原代码x[,c(i)]里的c()无实际作用,直接索引即可
    z[i] <- (mean(x[, i] == 6)  - p) / sqrt(p*(1-p)/n)
}

注意:不要用z <- c()初始化空向量再在循环中逐次拼接结果,循环次数较大时这种写法会反复触发内存重分配,运行效率远低于预分配固定长度向量的方案。

方案2:向量化实现(更符合R编程习惯,无需手写循环)

R内置的按列计算函数可以直接完成批量计算,完全不需要写for循环,代码更简洁、运行速度更快:

set.seed(1)
n <- 100
x <- replicate(10000,sample(1:6, n, replace=TRUE))
p <- 1/6
# colMeans直接计算每列中6点出现的频率,一次性完成标准化计算
z <- (colMeans(x == 6) - p) / sqrt(p*(1-p)/n)

两种方案得到的计算结果完全一致。


内容的提问来源于stack exchange,提问作者Bert Onstott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:27:35