R语⾔中assign函数和get函数的⽤法
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 <- get(paste("p", i, sep=""))
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 <- 1
test <- function(){
i <- 2
print(sprintf("the value from test(): %i", i))
}
test()
print(sprintf("the value from global:%i", i))
执⾏以上代码,结果如下所⽰:
在以上代码中,i是全局变量,顺序执⾏test()函数,在test中给i赋值为2,此时打印的结果是局部变量中的值。test()函数执⾏完之后再打印i的值,结果却仍然是1,说明test中的赋值并没有修改全局变量i。
⼀般情况下,使⽤R中的函数不会有副作⽤,可以有以下⼏点理解:
1)只引⽤⽽不改变全局变量,局部变量与全局变量共享内存空间,此时的值必然相同;
2)⼀旦函数对全局变量重新赋值,系统将会创建⼀个与全局变量同名的新变量,并为这个变量分配新的内存空间,但这个新变量只处在宿主函数这个层次中,根据变量的引⽤关系,优先引⽤离⾃⼰较近的本层或者上层环境中变量,所以在该函数中基本上只会⽤全局变量的同名局部变量了;
3)随着函数调⽤结束,系统会释放函数中的局部变量,新创建的全局变量的同名局部变量也将销毁,⽽全局变量的值并没有因为在函数中使⽤⽽发⽣变化。
当然,R中也提供了特定的函数来对函数的上级层次进⾏写操作,那就是<<-和assign()。
1.超赋值运算符<<-的机理为:使⽤<<-进⾏赋值操作
系统会从第⼀个上级层次开始,由低到⾼逐层进⾏查,直到在某个层次中到该变量,如果不到该变量,系统会在顶层环境中创建⼀个新的变量。注意,超赋值运算符<<-只查上级,不会对本级进⾏查。
如下例所⽰:
A)
i <- 1
testA <- function()
{
i <<- 2
print(sprintf("the value from testA(): %i", i))
}
testA()
print(sprintf("the value from global:%i", i))
B)
testB<-function()
{
i<<-2
print(sprintf("the value from testB(): %i", i))
}
testB()
print(sprintf("the value from global:%i", i))
结果如下:
A)
B)
两次运⾏的结果相同,在A)中,<<-修改了全局变量值i,在testA函数中引⽤了修改后的值,结果为2,在B)中,<<-向上查,
没有到名为i的全局变量,但是系统在全局环境中创建了名为i的全局变量并为其赋值为2。
2.使⽤assign()函数来对⾮局部变量进⾏写操作
该函数的特性为:向指定层次(本级或上级)中的某个变量赋值,有则修改,⽆则创建。
如下代码所⽰:
test <-function()c语言中的sprintf用法
{
i <- 1
innertest<-function(x)
{
i<-3
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))
结果为:
由结果可知,在test()和innertest()中的i值都没有发⽣变化,⽽在最顶层的全局层次中没有定义i的值,结果显⽰该值为10。
原因在于,在函数test()内部定义的函数innertest()中执⾏了assign函数,该函数在最顶层全局层次中的变量i赋值10,但是该层中并没有该变量,于是就就在最顶层.GlobalEnv中创建了该变量i并给其赋值,这样在不同的函数层次中都有变量i,优先引⽤离⾃⼰最近的同级(已顺序执⾏)或者上级层次中的变量,所以i出现了三个不同的输出值。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。如有错误或未考虑完全的地⽅,望不吝赐教。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论