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

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

加油!

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

  1. Coursera系列-R Programming第二周

    博客总目录,记录学习R与数据分析的一切:http://www.cnblogs.com/weibaar/p/4507801.html  --- 好久没发博客 且容我大吼一句 终于做完这周R Progra ...

  2. Coursera系列-R Programming-Final Week-Assignment3 & 总结

    博客总目录,记录学习R与数据分析的一切:http://www.cnblogs.com/weibaar/p/4507801.html  ------- 经过周末一个半天的努力,终于把这次的Assignm ...

  3. 吴恩达课后习题第二课第三周:TensorFlow Introduction

    目录 第二课第三周:TensorFlow Introduction Introduction to TensorFlow 1 - Packages 1.1 - Checking TensorFlow ...

  4. 三周,用长轮询实现Chat并迁移到Azure测试

    公司的OA从零开始进行开发,继简单的单点登陆.角色与权限.消息中间件之后,轮到在线即时通信的模块需要我独立去完成.这三周除了逛网店见爱*看动漫接兼职,基本上都花在这上面了.简单地说就是用MVC4基于长 ...

  5. JAVA第三周作业(从键盘输入若干数求和)

    JAVA第三周作业(从键盘输入若干数求和) 在新的一周,我学习了JAVA的IO编程.下面的代码实现了从键盘输入若干数求和的目标.import java.util.Scanner; public cla ...

  6. 让reddit/r/programming炸锅的一个帖子,还是挺有意思的

    这是原帖 http://www.reddit.com/r/programming/comments/358tnp/five_programming_problems_every_software_en ...

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

    × 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极 ...

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

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  9. Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

随机推荐

  1. 【Windows编程】系列第九篇:剪贴板使用

    上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个 ...

  2. OAuth协议——PHP第三方登陆协议

    慕课网Badguy老师的良心课程! 总会有那种什么都不想干的时候,但现在的日子又不这么允许个人的放纵,我一般就只有这几个选择:看课程视频,看书,看小说..好像还是有可以做的事情.其中,看课程视频有点无 ...

  3. Linux下oracle环境变量无效问题

    今天在维护oracle数据库时,查看监听的状态,执行 #lsnrctl status 报错: -bash:lsnrctl:command not found.以前并不会这样,仔细想了一下,问题找到了, ...

  4. POJ1740A New Stone Game[组合游戏]

    A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5769   Accepted: 3158 ...

  5. weka

    第一次接触weka这个东西,貌似是数据挖掘用的比较多.接下来一个月里,希望能够对weka有更深一步的了解,并用博客记录下学习weka用法.原理.数据预处理的过程,与君分享,期待!

  6. [zz]如何在C语言程序中处理汉字

    学习过C语言的人也许有时会遇到这样一个问题:如何用变量存储汉字以及对这些变量进行操作.目前许多C语言参考书中都没涉及到这个问题,程序中多为处理英文变量和英文字符串,涉及到汉字的情况也大都是在print ...

  7. [No00006C]文件名复制,归档小助手【自己写的小工具,希望能帮助大家】

    特别补充一句:软件可以一次性复制多个文件的文件名. Windows 中的复制文件名实在是有些不方便 ,需要点右键 "重命名"之后再点右键选择"复制"才可复制文件 ...

  8. [转]Java线程安全总结

    最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: java线程安全,java垃圾收集,java并发包详细介绍,java profi ...

  9. HTML 转 PDF

    使用WkHtmlToXSharp,免费的软件,内集成了chrome 的内核,可以对CSS进行渲染,很好用 是需要传入 HTML 网页地址就可以转化为PDF文件,不过网页的编码要是 utf-8 Nuge ...

  10. Node+Socketio实现消息群发功能

    注:本博文是作者原创,转载请注明出处. 在项目中时常会使用到socketio,今天我们就来实现Node+socketio实现群发消息功能, 项目源码:https://github.com/zhangx ...