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()
{
    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出现了三个不同的输出值。


 

参考:

[1] Norman Matloff著,陈堰平等译.R语言编程艺术.机械工业出版社,2013-05

[2] http://www.r-project.org/index.html






  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
R语言中的summary函数是一个非常常用的函数,它可以提供有关给定数据的统计摘要信息。根据引用中的说明,虽然在R环境中有多个summary函数,但它们针对的是不同类型的数据结构,因此可以将它们视为同一个函数。我们可以使用summary函数来获得数据的最小值、最大值、中位数、均值以及四分位数等统计信息。通过这些信息,我们可以更好地了解数据的分布和特征。 根据引用中的建议,对于特定函数的用法,我们可以查看函数的帮助文档。这是一种正确学习R语言的方法。对于summary函数,我们可以通过输入"?summary"来查看其帮助文档,并了解其各种参数和用法示例。 总结来说,R语言中的summary函数可以提供给定数据的统计摘要信息,帮助我们更好地理解数据的特征和分布。可以通过查看函数的帮助文档来了解更多关于summary函数的用法和参数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [如何正确使用R语言函数——为什么有的模型结果不能使用summary函数查询?...](https://blog.csdn.net/weixin_54000907/article/details/126066802)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值