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
相关产品推荐
相关产品推荐

