R中For Loop实现莱布尼茨公式求π,knit时报'closure'对象不可取子集错误
R莱布尼茨公式近似计算π代码knit运行报错修复
报错根因
报错核心原因是变量名与R内置函数冲突:
- R基础包自带名为
approx的插值函数,属于closure(函数)类型 - 控制台直接运行时,因为环境中已提前创建过名为
approx的向量变量,优先级高于内置函数,所以可以正常运行 - knit渲染时会初始化全新的干净运行环境,没有提前定义的
approx向量,此时直接执行approx[i] <- 4*s操作,R会默认匹配到内置的approx函数,函数类型对象不支持[]子集赋值操作,因此抛出该错误。
另外原有代码还存在隐藏问题:R的向量下标从1开始,循环中i从0起始时,approx[i]的0下标赋值会被忽略,导致最终向量第一个元素为空。
修复方案
选择两种方案任意一种即可:
- 提前初始化存储近似值的向量,明确变量类型,避免R匹配到内置函数
- 更换变量名,避开R内置函数名,比如将存储近似值的变量改为
pi_approx,语义更清晰也不会出现命名冲突
修正后可正常knit的代码
n <- 50 s <- 0 sign <- 1 # 初始化长度为n+1的空数值向量(i从0到n共n+1次迭代) pi_approx <- numeric(n + 1) for (i in 0:n){ s <- s + sign/(2*i + 1) sign <- -sign # R向量下标从1开始,i=0对应第一个存储位置 pi_approx[i + 1] <- 4 * s } pi_approx plot(pi_approx, type="l", col="blue", xlab="迭代次数", ylab="π近似值") abline(h=pi, lty=2, col="red") tail(pi_approx, 1)
内容的提问来源于stack exchange,提问作者Jess A
相关产品推荐
相关产品推荐

