第三章:R语言编程 第五节:值传递&对象不变性

这篇具有很好参考价值的文章主要介绍了第三章:R语言编程 第五节:值传递&对象不变性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、值传递

在R语言中,一切皆为对象,同时在调用函数的时候也采用值传递的方式,即作为参数的对象会被复制,然后将副本传递给函数

例如:

> f<-function(df2){
+   df2$a<-c(1,2,3)
+ }
> df<-data.frame(a=c(4,5,6))
> f(df)
> df
  a
1 4
2 5
3 6

这里将数据框作为参数传递给函数的时候,函数内部的修改将不会影响原对象。这是因为调用f()函数时采用的时值传递的方法;df2中保持的不是指向原始数据df的引用,而是复制数据框df,df2指向的是副本数据框

如果我们想让函数内部的改动影响到函数外部,则需要在函数f()内部用返回值修改语句,然后再将函数的返回值的修改结果赋值给原来的变量

例如:

> f<-function(df2){
+   df2$a<-c(1,2,3)
+   return(df2)
+ }
> df<-data.frame(a=c(4,5,6))
> df<-f(df)
> df
  a
1 1
2 2
3 3

因此我们可以得出结论,除了特殊对象以外,对象状态不会被函数直接修改,无论哪种函数能能保证参数传递的对象不被修改

PS:这一部分我觉得结合C++中指针那一块的内容食用更佳

二、对象不变性

R中的对象通常是不变的,在编程中,值不变意味着数值不能被修改

例如:

> a<-list()
> a$b<-c(1,2,3)

这则代码实际上进行的步骤是先复制a,创建新对象a',然后向对象a'添加属性b,再将c(1,2,3)填充到b,最后让变量名指向a'。

第三章:R语言编程 第五节:值传递&对象不变性,某人的R语言学习笔记,r语言,开发语言,程序人生

而并非在a中直接开辟一个新属性b,让后将c(1,2,3)复制给b

我们利用对象复制追踪函数tracemem()进行查看

> a<-list()
> tracemem(a)
[1] "<000001D6746E3A80>"
> tracemem(a$b<-c(1,2,3))
[1] "<000001D6771B61E8>"

我们可以发现内存地址进行了更改,意味着其进行了复制导致内存地址增加

所以在R语言里使用循环语句是很不明智的,因为会导致内存占用不断增加吃掉太多资源,从而让效率降低,因此我们还是推荐使用向量来代替实现循环语句

例如我们要实现1~1000000全体加1文章来源地址https://www.toymoban.com/news/detail-838364.html

循环语句

> v<-1:1000000
> for(i in 1:1000000)
+   v[i]<-v[i]+1

执行完毕后会发现内存急速扩大

利用向量

> v<-1:1000000
> v<-v+1

这样会快很多,而且占用资源更低

到了这里,关于第三章:R语言编程 第五节:值传递&对象不变性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第三章 MATLAB的分支语句和编程设计

            在前面的章节中,我们开发了几个完全运转的 MATLAB 程序。但是这些程序都十分 简单,包括一系列的 MATLAB 语句,这些语句按照固定的顺序一个接一个的执行。像这 样的程序我们称之顺序结构程序。它首先读取输入,然后运算得到所需结果,打印出结 果,并退出。至

    2024年02月05日
    浏览(39)
  • 《Opencv3编程入门》学习笔记—第三章

    记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 一、图像的载入、显示和输出到文件 (一)OpenCV的命名空间 简单的OpenCV程序标配: (二)Mat类简析 表示从指定路径下把名为dota.jpg的图像载入到Mat类型的srcImage 变量中。 (三)图像的载入与显示概述

    2024年02月08日
    浏览(55)
  • CMD与DOS脚本编程【第三章】

    预计更新 第一章. 简介和基础命令 1.1 介绍cmd/dos脚本语言的概念和基本语法 1.2 讲解常用的基础命令和参数,如echo、dir、cd等 第二章. 变量和运算符 2.1 讲解变量和常量的定义和使用方法 2.2 介绍不同类型的运算符和运算规则 第三章. 控制流程和条件语句 3.1 介绍if、else、for、

    2024年02月06日
    浏览(47)
  • Qt编程基础 | 第三章-控件 | 3.3、对话框

    对话框:在主窗口中操作,有可能触发某一个行为动作,会弹出一个新的对话窗口,解决一个临时性的会话,在对话窗口中执行某一个功能。QDialog可以作为自定义对话框的基类,同时Qt也提供了一些标准对话框,例如:QFileDialog、QColorDialog等,下面是QDialog类的继承结构,如下

    2024年02月06日
    浏览(67)
  • c语言修炼第三章--结构体

    目录 前言 3.1结构体的含义以及语法 3.1.1结构体含义 3.1.2结构体语法形式 3.1.2结构体变量的创建和初始化 3.2结构体成员的类型 3.3结构体的成员访问 3.3.1.操作符 3.3.2-操作符 3.4结构体传参 小伙伴们大家好!欢迎继续和菜菜酱学习c语言呐!之前菜菜酱有事所以耽误啦,废话不多

    2024年02月16日
    浏览(39)
  • Windows原生蓝牙编程 第三章 配对后进行蓝牙通信【C++】

    蓝牙系列文章目录 第一章 获取本地蓝牙并扫描周围蓝牙信息并输出 第二章 选取设备输入配对码并配对 第三章 配对后进行蓝牙通信 接着第二章,我们已经配对完成,接下来就是通过winsock进行通信了。 我又加了个SOCKET全局变量来保存套接字和WSADATA wsaData用于初始化套接字库

    2024年02月08日
    浏览(45)
  • 南京邮电大学程序设计类教辅平台c++第三章作业编程题答案

    南京邮电大学程序设计类教辅平台c++第三章作业编程题答案 1.5.1构建一个类,含有三个数据成员,分别表示立方体的三条边长;含有构造函数(默认边长为3,2,1)和一个用来计算立方体体积的成员函数Compute()。 main()函数如下,请复制使用 代码: 2.设计一个Car类,它的数

    2023年04月20日
    浏览(49)
  • C++多线程编程(第三章 案例1,使用互斥锁+ list模拟线程通信)

    主线程和子线程进行list通信,要用到互斥锁,避免同时操作 1、封装线程基类XThread控制线程启动和停止; 2、模拟消息服务器线程,接收字符串消息,并模拟处理; 3、通过Unique_lock和mutex互斥方位list 消息队列 4、主线程定时发送消息给子线程; 代码包含了XThread类(基类)、

    2024年02月15日
    浏览(36)
  • 曲线艺术编程 coding curves 第三章 弧,圆,椭圆(ARCS, CIRCLES, ELLIPSES)

    原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二狗(sheldon) blog: http://cnblogs.com/willian/ 源码:github: https://github.com/willian12345/coding-curves 曲线艺术编程系列第三章 这一篇中我们将关注如何绘制圆弧,圆和椭圆。(结束前再聊聊正切相关的) 很可能你使用

    2024年02月07日
    浏览(46)
  • 【数据库系统概论】第三章关系数据库标准语言SQL

    1.数据查询: SELECT:用于选择需要查询的列和行。 FROM:用于指定要查询的表。 WHERE:用于指定查询条件。 GROUP BY:用于按照指定的列对结果进行分组。 HAVING:用于指定分组条件。 ORDER BY:用于指定查询结果的排序方式。 2.数据操纵: INSERT INTO:用于将数据插入表中。 UPDAT

    2024年02月08日
    浏览(122)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包