• Coursera系列-R Programming第三周-词法作用域


    完成R Programming第三周

    这周作业有点绕,更多地是通过一个缓存逆矩阵的案例,向我们示范【词法作用域 Lexical Scopping】的功效。但是作业里给出的函数有点绕口,花费了我们蛮多心思。

    Lexical Scopping:

    The value of free variables are searched for in the environment where the function was defined。

    因此

    make.power<-function(n){
            pow<-function(x) {
                    x^n
            }
    }
    View Code

    对于上诉函数,make.power(3)生成的不是一个数值,而是生成了一个新的函数。由此,

    cube<-make.power(3)
    square<-make.power(2)
    
    cube(3)  ---> 27
    square(3)  ---->9

    make.power(3)生成了一个x^3的函数,而make.power(2)生成了一个x^2的函数。这里的n只会在函数定义的范围里去查找值,不会越过函数再继续查找。内置函数的Parent environment就是定义这个函数本身的函数。

    据老师说,这样子的词法作用域,同时适用于python等较新潮的函数。或将成为未来编程界的主流。(compared with dynamic scoping),不过有个问题就是……基于复杂的环境啊等等,这些一般都是作用于物理内存里的,对内存依赖度很高。

    在这里有提及,对于这些复杂的绕来绕去的作用域,一个比较简单的方法是:

    Is(environment((cube))
    >- n, pow (environment内部有两个对象)
    get("n",environment((cube))
    可以看到n定义为3

    以上两个函数可以查看环境调用对象。适于检查。

    另外附上本次作业,老师给出的示范例子,以及我个人加的备注项

    makeVector<-function(x= numeric()){
            m<-NULL#把m赋值为null
            set<-function(y){
                    x<<-y #set(y)后,x=y,m=null
                    m<<-NULL
            }
            get <-function() x #把x赋值给get
            setmean<-function(mean) m<<-mean #这里求均值,只是依然存疑,为什么这里要用function(mean)。。或者在本函数里,不会做mean相关的操作,真正的solve实在cachemean里执行?
    getmean<-function() m #这里把m复制给getmean(NULL)
            list(set=set,get=get,
                 setmean=setmean,
                 getmean=getmean)
    }
    cachemean<-function(x, ...){
            m<-x$getmean() #首先把getmean赋值给m,如果m不是NULL的话弹出下列提示
            if(!is.null(m)){
                    message("getting cached data")
                    return(m)
            }#出现缓存值
            data<-x$get()#把最开始的numberic向量赋值给data
            m<-mean(data, ...) 
            x$setmean(m)缓存m
            m
    }

    以上

    另外,本周还讲了几个有用的函数

    lapply (对list)

    sapply(lapply的简化版,如果list内均为单个数值,可以输出向量vector,如果等长度,可输出matrix,如果不同长度,输出list)

    apply(适用于数组,即都是数的矩阵等,与for相比,字段更少,代码更加简洁,举例如apply(array,Margin,fun),里面margin,1为行row,2为列column

      据说rowSums, rowMeans,colSums,colMeans效率更高,没具体试过

    mapply(生成list很方便),如下面两行代码,效率一致,适用于把一个fun应用到不同参数里  

    mapply(rep,1:4,4:1)
    list(rep(1,4),rep(2,3),rep(3,2),rep(4,1))

    tapply(用于对向量的子集做循环,用因子分组)

    split(用因子向量对x分组)

    library(datasets)
    data(iris)
    
    #探索性分析
    names(iris)
    head(iris)
    #以下尝试取virginica,speal.Length的方法均错误
    iris[,2]
    iris[iris$Species=="virginica",2]
    mean(iris[iris$Species=="virginica",2])
    ##the above is error,not correct##
    
    tapply(test$Sepal.Length,test$Species,mean)
    #用species.mean对向量进行分组,此法可行,但上述方法为何错误需要再看
    library(datasets)
    data(mtcars)
    
    #以下为做某个题时的若干测试。以及试错环节。lapply, tapply,split的用途,以及[[1]]怎么用
    #count mpg via cyl
    d<-tapply(mtcars$mpg,mtcars$cyl,mean) 
    
    #split out the mtcars, get a list
    split(mtcars,mtcars$cyl)
    
    #get every mtcars mean
    lapply(mtcars,mean)
    #error in match fun.(Fun), mtcars$cyl should be numberic or charter
    sapply(mtcars,mtcars$cyl,mean)
    
    ##test 4##
    #the below is uncorrect#
    #对于tapply出来的向量,可用[[1]]来取值
    d[[1]]-d[[3]]
    
    library(datasets)
    head(mtcars)
    ?mtcars
    d<-tapply(mtcars$hp,mtcars$cyl,mean)
    d[[1]]-d[[3]]

    以上结束

    总体感想,虽然mooc对JHU的coursera课褒贬不一,但是认真听下来,比自行看书要容易入门。

    以及编程这种事,必须多写,多交流,才能获得好处。

    加油!

  • 相关阅读:
    精简shell基础
    Centos7.4下安装Jumpserver 1.0.0(支持windows组件)
    二.Flask 学习模板
    一、Flask路由介绍
    web爬虫,BeautifulSoup
    web爬虫,requests请求
    django之Form组件补充
    中间件和Django缓存
    django之Form组件
    django from表单验证
  • 原文地址:https://www.cnblogs.com/weibaar/p/4175742.html
Copyright © 2020-2023  润新知