R 中的 For 循环返回错误“找不到对象”

2023-12-10

我正在学习 R 并编写了我的第一个 for 循环。对于 1000 次迭代,我创建了 4 个向量,每个向量的维度分别为 10、100、1000 和 10000 个元素。这些所谓的 theta1 值无法被识别。我当时尝试运行一个 theta1 并且它可以工作,但是运行所有 4 个会给出错误“未找到对象”。我不清楚这里出了什么问题,有人能解释一下吗?

k=1000

'Method1'

for(i in 1:k){
  N10=runif(10) 
  N100=runif(100)
  N1000=runif(1000)
  N10000=runif(10000)
  theta1_10[i]=(1/10)*4*sum(sqrt(1-N10^2))
  theta1_100[i]=(1/100)*4*sum(sqrt(1-N100^2))
  theta1_1000[i]=(1/1000)*4*sum(sqrt(1-N1000^2))
  theta1_10000[i]=(1/10000)*4*sum(sqrt(1-N10000^2))
}

'Result Method 1'
m_theta1_10 = mean(theta1_10)
sd_theta1_10 = sd(theta1_10)
m_theta1_100 = mean(theta1_100)
sd_theta1_100 = sd(theta1_100)
m_theta1_1000 = mean(theta1_1000)
sd_theta1_1000 = sd(theta1_1000)
m_theta1_10000 = mean(theta1_10000)
sd_theta1_10000 = sd(theta1_10000)

我写这个答案是因为问题和接受的答案(在编辑之前)都展示了 R 中糟糕的编程风格:他们正在 for 循环中生成一个向量. (See Circle 2 of 帕特里克·伯恩斯R地狱.)

通过一个简单的基准测试,效果就会变得很明显。任务是创建一个向量x其中将包含整数 1 到k:

k <- 10000L
microbenchmark::microbenchmark(
  grow = {
    x <- integer(0)
    for (i in seq.int(k)) x <- c(x, i)
    x
  },
  subscript = {
    x <- integer(k)
    for (i in seq.int(k)) x[i] <- i
    x
  },
  colon_operator = {
    x <- 1L:k
    x
  },
  times = 10L
)
#Unit: microseconds
#           expr       min        lq        mean    median        uq        max neval
#           grow 93491.676 96127.568 104219.0140 97123.627 99459.343 165545.063    10
#      subscript  9067.607  9215.996   9483.0962  9551.288  9771.795   9938.307    10
# colon_operator     5.664     7.552      7.9675     8.307     8.685      9.063    10

很明显,即使对于长度为 10000 个的小向量,附加元素也会比预先分配所需长度慢一个数量级。此处包含冒号运算符的计时是为了演示内置矢量化函数的优点。

所以有问题的代码和answer需要重新编写使用下标以提高效率。

# initialize the random number generator for reproducible results
set.seed(1234L)
# allocate memory for the vectors beforehand
theta1_10 = numeric(k)
theta1_100 = numeric(k)
theta1_1000 = numeric(k)
theta1_10000 = numeric(k)

# Method1
for(i in seq.int(k)){
  N10=runif(10) 
  N100=runif(100)
  N1000=runif(1000)
  N10000=runif(10000)
  # update by subscripting
  theta1_10[i] = (1/10)*4*sum(sqrt(1-N10^2))
  theta1_100[i] = (1/100)*4*sum(sqrt(1-N100^2))
  theta1_1000[i] = (1/1000)*4*sum(sqrt(1-N1000^2))
  theta1_10000[i] = (1/10000)*4*sum(sqrt(1-N10000^2))
}

然而,整个代码可以用更简洁的方式重写:

library(data.table)
set.seed(1234)
k <- 1000L
N <- 10^(1:4)
rbindlist(
  lapply(N, function(i) {
    theta1 <- replicate(k, 4 / i * sum(sqrt(1 - runif(i)^2)))
    data.table(N = i, mean = mean(theta1), sd = sd(theta1))
  }))
#       N     mean         sd
#1:    10 3.144974 0.27238683
#2:   100 3.140716 0.09040696
#3:  1000 3.141791 0.02654225
#4: 10000 3.141585 0.00886737
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 中的 For 循环返回错误“找不到对象” 的相关文章

  • 如何在不指定数据集的情况下调整函数

    我有一个函数 基本上可以过滤SPV行 如下所示 请注意 我这样做return coef lt function df1 idd dmda CategoryChosse 然而 我不希望df1作为函数的参数 而是函数的属性df1数据集 在本例中
  • R、GeoJSON 和 Leaflet

    我最近从 R Bloggers com 的帖子中了解了 leafletjs com 我想要实现的一个此类教程是使用传单创建交互式分区统计图 http leafletjs com examples choropleth html http l
  • data.frame 按列分组[重复]

    这个问题在这里已经有答案了 我有一个数据框 DF 说 DF 是 A B 1 1 2 2 1 3 3 2 3 4 3 5 5 3 6 现在我想将 A 列的行组合在一起 并得到 B 列的总和 例如 A B 1 1 5 2 2 3 3 3 11
  • 评估 R 中字符串指向的函数

    假设我有以下内容 x lt 1 10 squared lt function x x 2 y lt squared 我希望能够使用 y 定义的字符串来评估该函数 像 eval y 这样的东西 我知道这是错误的 但会返回 1 1 4 9 16
  • 将线条剪裁到绘图区域并在绘图区域外显示文本

    我想限制绘图的可见 y 范围 为了保留超出此范围的值 我需要设置oob 出界 to rescale none这效果很好 不过 我还想在图外的页边空白处添加一些文本 为了做到这一点 我需要关闭剪辑 这会导致超出范围的值被绘制在绘图区域之外的边
  • 使用 geom_bar 和 stat="identity" 绘制平均值的 hline

    我有一个条形图 其中确切的条形高度位于数据框中 df lt data frame x LETTERS 1 6 y c 1 6 1 6 1 g rep x c a b each 6 ggplot df aes x x y y fill g g
  • 是否可以使用像“tz=NULL”这样的东西?...“as.POSIXct”默认为依赖于语言环境的时区(与“as.Date”不同),这会导致问题

    我知道这是一个长期存在 根深蒂固的问题 但这是我经常遇到的问题 而且我看到初学者R经常与此斗争 我希望有一个令人满意的解决方案 到目前为止 我的谷歌和 SO 搜索都是空的 但如果在其他地方重复 请指出正确的方向 TL DR 有没有办法使用类
  • 匹配向量内的向量

    I have vec1 lt c 0 0 0 1 1 0 1 1 1 0 0 1 vec2 lt c 1 1 我预计 magicFUN x vec1 y vec2 1 4 7 8 这意味着我想要一个完整向量在另一个向量内的位置 match
  • 为闪亮的应用程序创建桌面图标

    当我在基本 R 提示中提供以下代码时 我会在浏览器中打开一个闪亮的应用程序 shiny runApp C Myapp 我使用 Windows 7 我试图创建一个桌面图标 以避免我的客户每次想要使用该应用程序时都键入上述代码 我创建了一个桌面
  • corr.test 与 cor.test p 值

    我正在尝试使用 psych 包 psych 1 6 9 中的 corr test 但在使用 method spearman 时 它似乎给出了与 cor test 不同的 p 值 相关系数相同 但 p 值不同 我整理了一些示例代码和输出 如下
  • 哪种 LaTeX 包与 knit 一起使用以获得更多的表格控制?禁忌?

    我正在用 knitr 写一张更长的桌子xtable和tabular environment longtable 在 longtable 包中时print将它们纳入我的 Rnw file 问题是我对longtable环境控制不够 我有一些文本
  • 如何在闪亮的应用程序中显示矩阵,并用条件指定颜色?

    我有一个具有正值和负值的矩阵 M 我正在尝试使用 DT 包在闪亮的应用程序中显示为表格 我想用不同的颜色显示矩阵 红色的正数和负数 例如 到目前为止 我只能以一对一的方式添加颜色 但我想以这种方式添加颜色 如果matrix values g
  • ts(x) 中的错误:“ts”对象必须有一个或多个观察结果

    当我使用进行预测时forecast库 我注意到以下代码没有按预期运行 library forecast library dplyr df1 lt data frame gp gl 20 5 dt seq 1 100 get lt funct
  • 如何在shell脚本中运行R代码?

    我有一个 R 文件 myfile R 我想使用 shell 脚本来运行它 我怎样才能做到这一点 我试过这个 bin bash Rscript myfile R 但它给了我这个错误 Rscript 找不到命令 我也尝试过这个 bin bash
  • R 中整数向量的大小

    我原以为 R 有一个用于存储对象的标准开销 看起来是 24 字节 至少对于整数向量而言 但一个简单的测试表明它比我意识到的要复杂 例如 采用长度为 100 的整数向量 使用随机采样 希望避免任何可能存在的偷偷摸摸的序列压缩技巧 https
  • 如何在 ggplot2 中向 x 轴添加特定值?

    我正在尝试在 ggplot2 中绘制图表 我希望 x 轴显示 2 84 以及下面键入的序列 除了在 Breaks 中输入所有精确值之外 还有其他方法吗 我尝试了谷歌 但它没有解决我的问题 scale x continuous limits
  • 如何在 R 中使用 msgbox [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何在中显示消息框R 我正在寻找类似的东西msgbox在 VBA 中 因此我可以向用户发出有关问题的警报 此外 我想允许一些用户交互 例如
  • 根据第二个数据帧中的匹配创建新列

    如果有两个数据框 top3df http dpaste com 1709875 and qw qw lt structure list id structure 1 25 Label c w01 w02 w03 w04 w05 w06 w0
  • 在ggplot2中添加水平线到绘图和图例

    这段代码创建了一个漂亮的图 但我想在 y 50 处添加一条水平黑线 并让图例显示一条黑线 并在图例中显示文本 cutoff 但在图例中保留源点 我可以使用 geom line 添加该行 但无法在图例中获取该行 library ggplot2
  • 生成与现有变量具有预定义相关性的二进制变量

    对于模拟研究 我想生成一组随机变量 连续变量和二元变量 这些变量与已经存在的变量具有预定义的关联binary变量 此处表示为x 对于这篇文章 假设x是按照下面的代码生成的 但请记住 在现实生活中 x是一个已经存在的变量 set seed 1

随机推荐