C语言assign方法,R语言中assign函数和get函数的用法-程序员宅基地

技术标签: C语言assign方法  

assign函数在循环时候,给变量赋值,算是比较方便

1、给变量赋值

for (i in 1:(length(rowSeq)-1)){

assign(paste("nginx_server_fields7_", i, sep = ""), nginx_server_fields7[(rowSeq[(i-1)+1]):(rowSeq[i+1]), ])

}

2、通过for循环给变量a1、a2、a3赋值

for (i in 1:3){

assign(paste("a", i, sep = ""), i:10)

}

ls()

[1] "a1" "a2" "a3" "i"

> a1

[1] 1 2 3 4 5 6 7 8 9 10

> a2

[1] 2 3 4 5 6 7 8 9 10

3、get和assign联合用法

rm(list = ls()) #这个命令千万慎重使用

for(i in 1:3){

assign(paste("p", i, sep=""), i)

tmp

print(tmp)

}

[1] 1

[1] 2

[1] 3

ls()

[1] "i" "p1" "p2" "p3" "tmp"

补充:R语言函数的简单理解

R语言结合了面向对象编程语言和函数式编程语言的特性,由于拥有函数式编程的特性,R的每一个运算符,实际上也是函数,同样,面向对象的特性决定了你接触到的R中所有东西(从数字到字符串到矩阵等)都是对象。

这些综合的特质决定了R这门语言的特殊性,最大的特点就是开源,R中有许多用户无私贡献的包,通过这些包,可以实现强大的功能,因此,在在的统计处理或者数据挖掘等数据处理相关工作中,R常常作为数据预处理和建立初步模型的强大工具,但作为一门解释型语言,R的运行效率比不上同等下的C等编译型语言,特别是在高性能计算中。

因此,个人认为未来或者是现在将流行这样一种数据处理方式:用R对数据进行预处理,同时通过R建立初步的数据处理模型,待对模型进行评估并确定如何实施之后通过更高效的语言(C语言等)来实现。

R中变量作用域的层次结构同C语言类似,但最大的不同在于,在R函数中可以创建新的函数,这样会增加新的层次。

R拥有函数式编程的特性,基于函数式编程语言的特征,函数不会修改非局部变量,在R中,函数几乎没有副作用,简单的理解为,函数的一般代码可以读但是不能写非全局变量(当然通过特定函数是可以修改全局变量的)。

一般代码表面上可以给全局变量重新赋值,但实际上这些操作只会修改全局变量在特定层次中的备份,而全局变量本身不会发生变化。如下面例子所示:

i

test

i

print(sprintf("the value from test(): %i", i))

}

test()

print(sprintf("the value from global:%i", i))

执行以上代码,结果如下所示:

9f216657bf72cc9a70a2b3c901cdfa52.png

在以上代码中,i是全局变量,顺序执行test()函数,在test中给i赋值为2,此时打印的结果是局部变量中的值。test()函数执行完之后再打印i的值,结果却仍然是1,说明test中的赋值并没有修改全局变量i。

一般情况下,使用R中的函数不会有副作用,可以有以下几点理解:

1)只引用而不改变全局变量,局部变量与全局变量共享内存空间,此时的值必然相同;

2)一旦函数对全局变量重新赋值,系统将会创建一个与全局变量同名的新变量,并为这个变量分配新的内存空间,但这个新变量只处在宿主函数这个层次中,根据变量的引用关系,优先引用离自己较近的本层或者上层环境中变量,所以在该函数中基本上只会用全局变量的同名局部变量了;

3)随着函数调用结束,系统会释放函数中的局部变量,新创建的全局变量的同名局部变量也将销毁,而全局变量的值并没有因为在函数中使用而发生变化。

当然,R中也提供了特定的函数来对函数的上级层次进行写操作,那就是<

1.超赋值运算符<

系统会从第一个上级层次开始,由低到高逐层进行查找,直到在某个层次中找到该变量,如果找不到该变量,系统会在顶层环境中创建一个新的变量。注意,超赋值运算符<

如下例所示:

A)

i

testA

{

i <

print(sprintf("the value from testA(): %i", i))

}

testA()

print(sprintf("the value from global:%i", i))

B)

testB

{

i<

print(sprintf("the value from testB(): %i", i))

}

testB()

print(sprintf("the value from global:%i", i))

结果如下:

A)

54bdc534c3fce42e98c83a3e84871825.png

B)

ca8581d939a3e80bd241ef4a64b76be7.png

两次运行的结果相同,在A)中,<

2.使用assign()函数来对非局部变量进行写操作

该函数的特性为:向指定层次(本级或上级)中的某个变量赋值,有则修改,无则创建。

如下代码所示:

test

{

i

innertest

{

i

assign("i",2*x,pos=.GlobalEnv)

print(sprintf("the value from innertest(): %i",i))

}

innertest(5)

print(sprintf("the value from test(): %i", i))

}

test()

print(sprintf("the value from global:%i", i))

结果为:

e2ad3b643cc95db80f618cca558b9100.png

由结果可知,在test()和innertest()中的i值都没有发生变化,而在最顶层的全局层次中没有定义i的值,结果显示该值为10。

原因在于,在函数test()内部定义的函数innertest()中执行了assign函数,该函数在最顶层全局层次中的变量i赋值10,但是该层中并没有该变量,于是就就在最顶层.GlobalEnv中创建了该变量i并给其赋值,这样在不同的函数层次中都有变量i,优先引用离自己最近的同级(已顺序执行)或者上级层次中的变量,所以i出现了三个不同的输出值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34236334/article/details/117190091

智能推荐

稀疏编码的数学基础与理论分析-程序员宅基地

文章浏览阅读290次,点赞8次,收藏10次。1.背景介绍稀疏编码是一种用于处理稀疏数据的编码技术,其主要应用于信息传输、存储和处理等领域。稀疏数据是指数据中大部分元素为零或近似于零的数据,例如文本、图像、音频、视频等。稀疏编码的核心思想是将稀疏数据表示为非零元素和它们对应的位置信息,从而减少存储空间和计算复杂度。稀疏编码的研究起源于1990年代,随着大数据时代的到来,稀疏编码技术的应用范围和影响力不断扩大。目前,稀疏编码已经成为计算...

EasyGBS国标流媒体服务器GB28181国标方案安装使用文档-程序员宅基地

文章浏览阅读217次。EasyGBS - GB28181 国标方案安装使用文档下载安装包下载,正式使用需商业授权, 功能一致在线演示在线API架构图EasySIPCMSSIP 中心信令服务, 单节点, 自带一个 Redis Server, 随 EasySIPCMS 自启动, 不需要手动运行EasySIPSMSSIP 流媒体服务, 根..._easygbs-windows-2.6.0-23042316使用文档

【Web】记录巅峰极客2023 BabyURL题目复现——Jackson原生链_原生jackson 反序列化链子-程序员宅基地

文章浏览阅读1.2k次,点赞27次,收藏7次。2023巅峰极客 BabyURL之前AliyunCTF Bypassit I这题考查了这样一条链子:其实就是Jackson的原生反序列化利用今天复现的这题也是大同小异,一起来整一下。_原生jackson 反序列化链子

一文搞懂SpringCloud,详解干货,做好笔记_spring cloud-程序员宅基地

文章浏览阅读734次,点赞9次,收藏7次。微服务架构简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目。这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除])这么多小服务,他们之间如何通讯?这么多小服务,客户端怎么访问他们?(网关)这么多小服务,一旦出现问题了,应该如何自处理?(容错)这么多小服务,一旦出现问题了,应该如何排错?(链路追踪)对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决它们。_spring cloud

Js实现图片点击切换与轮播-程序员宅基地

文章浏览阅读5.9k次,点赞6次,收藏20次。Js实现图片点击切换与轮播图片点击切换<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/ja..._点击图片进行轮播图切换

tensorflow-gpu版本安装教程(过程详细)_tensorflow gpu版本安装-程序员宅基地

文章浏览阅读10w+次,点赞245次,收藏1.5k次。在开始安装前,如果你的电脑装过tensorflow,请先把他们卸载干净,包括依赖的包(tensorflow-estimator、tensorboard、tensorflow、keras-applications、keras-preprocessing),不然后续安装了tensorflow-gpu可能会出现找不到cuda的问题。cuda、cudnn。..._tensorflow gpu版本安装

随便推点

物联网时代 权限滥用漏洞的攻击及防御-程序员宅基地

文章浏览阅读243次。0x00 简介权限滥用漏洞一般归类于逻辑问题,是指服务端功能开放过多或权限限制不严格,导致攻击者可以通过直接或间接调用的方式达到攻击效果。随着物联网时代的到来,这种漏洞已经屡见不鲜,各种漏洞组合利用也是千奇百怪、五花八门,这里总结漏洞是为了更好地应对和预防,如有不妥之处还请业内人士多多指教。0x01 背景2014年4月,在比特币飞涨的时代某网站曾经..._使用物联网漏洞的使用者

Visual Odometry and Depth Calculation--Epipolar Geometry--Direct Method--PnP_normalized plane coordinates-程序员宅基地

文章浏览阅读786次。A. Epipolar geometry and triangulationThe epipolar geometry mainly adopts the feature point method, such as SIFT, SURF and ORB, etc. to obtain the feature points corresponding to two frames of images. As shown in Figure 1, let the first image be ​ and th_normalized plane coordinates

开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先抽取关系)_语义角色增强的关系抽取-程序员宅基地

文章浏览阅读708次,点赞2次,收藏3次。开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先关系再实体)一.第二代开放信息抽取系统背景​ 第一代开放信息抽取系统(Open Information Extraction, OIE, learning-based, 自学习, 先抽取实体)通常抽取大量冗余信息,为了消除这些冗余信息,诞生了第二代开放信息抽取系统。二.第二代开放信息抽取系统历史第二代开放信息抽取系统着眼于解决第一代系统的三大问题: 大量非信息性提取(即省略关键信息的提取)、_语义角色增强的关系抽取

10个顶尖响应式HTML5网页_html欢迎页面-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏51次。快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力为了寻找一个优质的网页模板,网页设计师和开发者往往可能会花上大半天的时间。不过幸运的是,现在的网页设计师和开发人员已经开始共享HTML5,Bootstrap和CSS3中的免费网页模板资源。鉴于网站模板的灵活性和强大的功能,现在广大设计师和开发者对html5网站的实际需求日益增长。为了造福大众,Mockplus的小伙伴整理了2018年最..._html欢迎页面

计算机二级 考试科目,2018全国计算机等级考试调整,一、二级都增加了考试科目...-程序员宅基地

文章浏览阅读282次。原标题:2018全国计算机等级考试调整,一、二级都增加了考试科目全国计算机等级考试将于9月15-17日举行。在备考的最后冲刺阶段,小编为大家整理了今年新公布的全国计算机等级考试调整方案,希望对备考的小伙伴有所帮助,快随小编往下看吧!从2018年3月开始,全国计算机等级考试实施2018版考试大纲,并按新体系开考各个考试级别。具体调整内容如下:一、考试级别及科目1.一级新增“网络安全素质教育”科目(代..._计算机二级增报科目什么意思

conan简单使用_apt install conan-程序员宅基地

文章浏览阅读240次。conan简单使用。_apt install conan