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
        }
}

对于上诉函数,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课褒贬不一,但是认真听下来,比自行看书要容易入门。

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

加油!

时间: 2024-11-23 18:54:30

Coursera系列-R Programming第三周-词法作用域的相关文章

Coursera系列-R Programming (John Hopkins University)-Programming Assignment 3

经过断断续续一个月的学习,R语言这门课也快接近尾声了.进入Week 4,作业对于我这个初学者来说感到越发困难起来.还好经过几天不断地摸索和试错,最终完整地解决了问题. 本周的作业Assignment 3是处理一个来自美国Department of Health and Human Services的一个文件,叫“outcome-of-care-measures.csv”.里面储存了美国50个州4000多家医院的几个常见疾病的死亡率.具体说来是30-day mortality and readmi

Coursera系列-R Programming (John Hopkins University)-课件案例

课件里介绍了一个很实用又能学到很多知识点的例子.并且Roger老师可是用了40分钟的视频亲力亲为.所以这里我把课件和视频知识整理一下会比较更清晰地解析这个案例. 视频链接: https://www.youtube.com/watch?v=VE-6bQvyfTQ&feature=youtu.be Data Analysis Case Study: Changes in Fine Particle Air Pollution in the U.S. Reading in the 1999 data

Coursera系列-R Programming-Final Week-Assignment3 &amp; 总结

经过周末一个半天的努力,终于把这次的Assignment3做出来,然后做完Quiz4,顺利结束R Programming这门课程. 对这门课的综合吐槽就是,Roger老师的github头像好帅,动态视频更帅,视频内容还算充足,但远远不足以应付assignment.Assignment设计一个比一个精巧,难度一个比一个大,没有足够的耐性以及一定的基础,还真的很难独自应付完R Programming这门课.如果不是我买了付费证书,以及工作中确实需要R,估计学着学着就废掉了吧…… 但是话说回来,这门课

第二三周学习总结

20182313 2019-2020-1 <数据结构与面向对象程序设计>第二周和第三周学习总结 教材学习内容总结 第二章: 加法及字符串的连接均用运算符"+"实现 不能将一个类型的值赋给与之不匹配的另一个类型的变量. Java中没有printf,只有print和println,二者的区别在于前者不会换行. 使用Scanner类时next后应该与数据类型int或是double对应起来. java中遵循严格定义的一组优先级规则,从而控制表达式中运算符的计算次序 第三章 一旦创建

马哥2016全新Linux+Python高端运维班第三周作业作答

                    马哥2016全新Linux+Python高端运维班第三周作业                                           1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可.     [[email protected] ~]# who | awk '{print $1 $NF}'| uniq -d     [[email protected] ~]# who     yicx     :0  

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4006009.html 联系方式:[email protected] [系列]Android系列之网络:(持续更新) Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) Android系列之网络(二)----HTTP请求头与响应头 Android

深入理解javascript作用域系列第二篇——词法作用域和动态作用域

× 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作模型导致的,作用域分为词法作用域和动态作用域,分清这两种作用域模型就能够对变量查找过程有清晰的认识.本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成

三周第三次课(12月27日) 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录

三周第三次课(12月27日)3.7 su命令3.8 sudo命令3.9 限制root远程登录 su命令: 用户和工作组管理: su命令用于切换当前用户身份到其他用户身份, 变更时须输入所要变更的用户帐号与密码. 语法: su(选项)(参数) 选项: -c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份: -f或--fast:适用于csh与tsch,使shell不用去读取启动文件: -l或--login:改变身份时,也同时变更工作目录,以及HOME,SHE

三周第五次课(12月29日) 4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间

三周第五次课(12月29日)4.5/4.6 磁盘格式化4.7/4.8 磁盘挂载4.9 手动增加swap空间 [[email protected] ~]# [[email protected] ~]# mke2fs命令文件系统管理mke2fs命令被用于创建磁盘分区上的"etc2/etc3"文件系统. 语法:mke2fs(选项)(参数) 选项:-b<区块大小>:指定区块大小,单位为字节:-c:检查是否有损坏的区块:-f<不连续区段大小>:指定不连续区段的大小,单位为