R语言replicate函数迭代时向量无法保留追加值的问题求助
问题原因与解决方案
你的问题核心是replicate的每次迭代都在独立的执行环境中运行,内部对z的修改不会影响外部全局环境的z对象。每次迭代开始时,代码里的z都会重新绑定到外部的空向量,导致之前追加的值无法保留。
另外你的代码还有两个小问题需要先修复:
- 未定义
theta变量,runif(1000, 0, theta)会直接报错,需要先给theta赋值(比如theta <- 3) - 如果循环中始终没触发
thetamax >= 2.9的条件,num会未定义,需要提前初始化
推荐解决方案(函数式风格,R最佳实践)
不要手动修改外部向量,让replicate直接返回每次迭代的num值,它会自动将这些值组合成向量:
theta <- 3 # 先定义theta n <- 1000 # replicate会把每次迭代的返回值收集成向量 z <- replicate(3, { stop <- FALSE plot(NULL, xlim=c(0.001,1000), ylim=c(0.001,4), ylab="unif value", xlab="n=1000") y <- runif(n, 0, theta) num <- n # 初始化默认值,防止未触发条件时变量不存在 for (i in 1:n) { thetamax <- max(y[1:i]) points(i, thetamax) if (thetamax >= 2.9 && !stop) { num <- i stop <- TRUE } } num # 最后返回当前迭代的num }) # 计算均值 mean(z)
备选方案(修改全局变量,不推荐)
如果一定要通过修改外部向量实现,可以使用<<-操作符强制修改全局环境的z,但这种方式容易引发副作用,不建议在复杂代码中使用:
z <- vector() theta <- 3 n <- 1000 replicate(3, { stop <- FALSE plot(NULL, xlim=c(0.001,1000), ylim=c(0.001,4), ylab="unif value", xlab="n=1000") y <- runif(n, 0, theta) num <- n for (i in 1:n) { thetamax <- max(y[1:i]) points(i, thetamax) if (thetamax >= 2.9 && !stop) { num <- i stop <- TRUE } } z <<- append(z, num) # 修改全局环境的z }) mean(z)
内容的提问来源于stack exchange,提问作者goldfishgamerhd
相关产品推荐
相关产品推荐

