R 中的 For 循环与 while 循环

2024-02-21

我在 R 工作时注意到一件奇怪的事情。 当我有一个使用 for 循环和 while 循环实现的计算从 1 到 N 的平方的简单程序时,行为并不相同。 (在这种情况下我不关心矢量化或应用函数)。

fn1 <- function (N) 
{
    for(i in 1:N) {
        y <- i*i
    }
}

AND

fn2 <- function (N) 
{
    i=1
    while(i <= N) {
        y <- i*i
        i <- i + 1
    }
}

结果是:

system.time(fn1(60000))
   user  system elapsed 
  2.500   0.012   2.493 
There were 50 or more warnings (use warnings() to see the first 50)
Warning messages:
1: In i * i : NAs produced by integer overflow
.
.
.

system.time(fn2(60000))
   user  system elapsed 
  0.138   0.000   0.137 

现在我们知道 for 循环更快,我的猜测是因为那里的预分配和优化。但为什么会溢出呢?

更新:所以现在尝试另一种使用向量的方法:

fn3 <- function (N) 
{
    i <- 1:N
    y <- i*i
}
system.time(fn3(60000))
   user  system elapsed 
  0.008   0.000   0.009 
Warning message:
In i * i : NAs produced by integer overflow

那么也许这是一个奇怪的内存问题?我在 OS X 上运行,内存为 4Gb,所有默认设置都在 R 中。这种情况发生在 32 位和 64 位版本中(除了时间更快)。

Alex


Because 1是数字,但不是整数(即它是浮点数),并且1:6000是数字和整数。

> print(class(1))
[1] "numeric"
> print(class(1:60000))
[1] "integer"

60000 的平方是 36 亿,这不能用有符号的 32 位整数表示,因此会出现溢出错误:

> as.integer(60000)*as.integer(60000)
[1] NA
Warning message:
In as.integer(60000) * as.integer(60000) : NAs produced by integer overflow

然而,36 亿很容易用浮点数表示:

> as.single(60000)*as.single(60000)
[1] 3.6e+09

要修复您的for代码,转换为浮点表示:

function (N)
{
    for(i in as.single(1:N)) {
        y <- i*i
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 中的 For 循环与 while 循环 的相关文章

随机推荐

  • C 与 C++ 中的 typedef 和 struct 命名空间

    我正在尝试在一些新的 C 中使用一些旧的 C 库 该库的头文件使用 D Hanson 的 C 接口和实现 https rads stackoverflow com amzn click com 0201498413隐藏实现的习惯用法 def
  • 将元素替换为outerHTML并立即访问新创建的元素

    我通过将 DOM 元素的内容替换为outerHTML 这个技巧有效 但我需要立即访问新创建的 DOM 元素 不幸的是元素的创建
  • 有没有办法只获取未命名的参数?

    在 JavaScript 函数中 arguments https developer mozilla org en US docs Web JavaScript Reference Functions and function scope
  • 为 ggplot2 中的两个构面组指定不同的 x-tick 标签

    我有代表两种方法结果的箱线图 每种方法都有两种验证方法和三种场景 使用 ggplot2 进行绘制 一切正常 但我想更改 x 轴刻度标签以区分每组中使用的技术类型 我使用了以下代码 data lt read csv results csv h
  • Laravel 和 Eloquent:检索相关项目时指定列

    这是以下帖子的后续帖子 Laravel 4 和 Eloquent 检索所有记录和所有相关记录 https stackoverflow com questions 21735011 laravel 4 and eloquent retriev
  • 从 iOS 服务检测屏幕开/关

    我正在开发一个作为服务在后台运行的网络监控应用程序 当屏幕打开或关闭时是否可以收到通知 来电 它通过使用以下代码存在于Android中 private void registerScreenOnOffReceiver IntentFilte
  • 使用nodejs进行heroku部署失败

    我正在尝试将本地文件推送到 heroku 并遇到以下错误 我的代码在github https github com asimkh apps tree haz 有人可以帮我吗 谢谢 heroku buildpacks set heroku n
  • 如何检测 STAMINA 模式?

    您能帮助我 如何以编程方式检测索尼设备上的 STAMINA 模式吗 我想通知用户 如果 STAMINA 打开 我的应用程序将无法正常工作 因为它阻止了 AlarmManager 并且设备在我需要时不会被唤醒 我也想知道这个 我想一个天真的方
  • Flask WTform 对多个字段进行验证

    根据两个或多个条目验证 WTform 的最佳方法是什么 IE 在下面的表格中 我想验证数据库中尚不存在具有所提供名称和地址的公司 class CompanyForm FlaskForm name StringField Company Na
  • 如何在bash中生成笛卡尔积?

    我想生成这样的文件 笛卡尔积 1 3 X 1 5 1 1 1 2 1 3 1 4 1 5 2 1 2 2 2 3 2 4 2 5 3 1 3 2 3 3 3 4 3 5 我可以使用嵌套循环来做到这一点 例如 for i in seq 3 d
  • 无法执行dex:Java堆空间 Java堆空间

    在 Eclipse IDE 中执行 Web 驱动程序脚本时 出现 Unable toexecute dex Java heap space Java heap space 错误 我已经使用 Android SDK 和 AVD Manager
  • Java 流压缩两个列表

    我有一个人员哈希集 一个人有名字 姓氏和年龄 例如 Person Hans Man 36 我的任务是获取 17 岁以上人员的列表 按年龄对他们进行排序 并将名字与姓氏连接起来 比如 汉斯 曼 另一个名字 另一个名字 我刚刚被允许导入 imp
  • 禁用 Reactjs 中的依赖下拉选项

    我正在制作一个简单的反应应用程序 其中有一些下拉列表 其中一个依赖于另一个 gt 这里下拉菜单 1 的值为游戏类型 例如Indoor and Outdoor gt 这里下拉菜单 2 的值为运动类型 例如Chess Tennis and Fo
  • “perf stat”输出是什么意思?

    I use perf stat 命令对一些事件进行统计 root root test perf stat a e r81d0 r82d0 v a r81d0 71800964 1269047979 1269006431 r82d0 2665
  • Graphics.Drawstring 在 PictureBox 中看起来不错,但在 Bitmap 中却很糟糕

    我正在尝试使用DrawString将文本写为图像 然后将其旋转 90 度 它无论是在位图上还是直接在 PictureBox 上都可以正常工作 但最大的区别在于质量 这PictureBox绘制的文本质量很好而且看起来很漂亮 当我把它画在图像上
  • 使用 jimp 在 Node.js 中调整图像大小并获取新图像的路径

    我正在使用 jimp 调整 node js 中的图像大小 我成功地降低了图像质量 但有点困惑如何获取新图像的路径 Jimp read test jpg function err test if err throw err test resi
  • 事件循环和Promise之间有什么关系[重复]

    这个问题在这里已经有答案了 我很好奇Event Loop和Promise之间的关系 演示暴露了这个问题 我预计p1 fulfilled出现在中间 因为它们将任务排队到同一个任务队列中并逐个执行 var p1 new Promise func
  • Fortran 中的断言

    Fortran 是否有与 C 等效的标准函数 关键字assert 我找不到assert我在 Fortran 2003 标准中提到过 我发现了几种使用预处理器的方法 但是在这个answer https stackoverflow com a
  • Sparklyr 处理分类变量

    Sparklyr 处理分类变量 我来自 R 背景 习惯于在后端处理分类变量 作为因子 对于 Sparklyr 来说 使用起来相当混乱string indexer or onehotencoder 例如 我有许多变量在原始数据集中被编码为数值
  • R 中的 For 循环与 while 循环

    我在 R 工作时注意到一件奇怪的事情 当我有一个使用 for 循环和 while 循环实现的计算从 1 到 N 的平方的简单程序时 行为并不相同 在这种情况下我不关心矢量化或应用函数 fn1 lt function N for i in 1