Coursera系列-R Programming第三周-词法作用域
完成R Programming第三周
這周作業(yè)有點繞,更多地是通過一個緩存逆矩陣的案例,向我們示范【詞法作用域 Lexical Scopping】的功效。但是作業(yè)里給出的函數(shù)有點繞口,花費了我們蠻多心思。
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對于上訴函數(shù),make.power(3)生成的不是一個數(shù)值,而是生成了一個新的函數(shù)。由此,
cube<-make.power(3) square<-make.power(2)cube(3) ---> 27 square(3) ---->9make.power(3)生成了一個x^3的函數(shù),而make.power(2)生成了一個x^2的函數(shù)。這里的n只會在函數(shù)定義的范圍里去查找值,不會越過函數(shù)再繼續(xù)查找。內(nèi)置函數(shù)的Parent environment就是定義這個函數(shù)本身的函數(shù)。
據(jù)老師說,這樣子的詞法作用域,同時適用于python等較新潮的函數(shù)。或?qū)⒊蔀槲磥砭幊探绲闹髁鳌?#xff08;compared with dynamic scoping),不過有個問題就是……基于復(fù)雜的環(huán)境啊等等,這些一般都是作用于物理內(nèi)存里的,對內(nèi)存依賴度很高。
在這里有提及,對于這些復(fù)雜的繞來繞去的作用域,一個比較簡單的方法是:
Is(environment((cube)) >- n, pow (environment內(nèi)部有兩個對象) get("n",environment((cube)) 可以看到n定義為3以上兩個函數(shù)可以查看環(huán)境調(diào)用對象。適于檢查。
另外附上本次作業(yè),老師給出的示范例子,以及我個人加的備注項
makeVector<-function(x= numeric()){m<-NULL#把m賦值為nullset<-function(y){x<<-y #set(y)后,x=y,m=nullm<<-NULL}get <-function() x #把x賦值給getsetmean<-function(mean) m<<-mean #這里求均值,只是依然存疑,為什么這里要用function(mean)。。或者在本函數(shù)里,不會做mean相關(guān)的操作,真正的solve實在cachemean里執(zhí)行? getmean<-function() m #這里把m復(fù)制給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)}#出現(xiàn)緩存值data<-x$get()#把最開始的numberic向量賦值給datam<-mean(data, ...) x$setmean(m)緩存mm }以上
另外,本周還講了幾個有用的函數(shù)
lapply (對list)
sapply(lapply的簡化版,如果list內(nèi)均為單個數(shù)值,可以輸出向量vector,如果等長度,可輸出matrix,如果不同長度,輸出list)
apply(適用于數(shù)組,即都是數(shù)的矩陣等,與for相比,字段更少,代碼更加簡潔,舉例如apply(array,Margin,fun),里面margin,1為行row,2為列column
據(jù)說rowSums, rowMeans,colSums,colMeans效率更高,沒具體試過
mapply(生成list很方便),如下面兩行代碼,效率一致,適用于把一個fun應(yīng)用到不同參數(shù)里
mapply(rep,1:4,4:1) list(rep(1,4),rep(2,3),rep(3,2),rep(4,1))tapply(用于對向量的子集做循環(huán),用因子分組)
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對向量進(jìn)行分組,此法可行,但上述方法為何錯誤需要再看 library(datasets) data(mtcars)#以下為做某個題時的若干測試。以及試錯環(huán)節(jié)。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]]以上結(jié)束
總體感想,雖然mooc對JHU的coursera課褒貶不一,但是認(rèn)真聽下來,比自行看書要容易入門。
以及編程這種事,必須多寫,多交流,才能獲得好處。
加油!
轉(zhuǎn)載于:https://www.cnblogs.com/weibaar/p/4175742.html
總結(jié)
以上是生活随笔為你收集整理的Coursera系列-R Programming第三周-词法作用域的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “挨踢民工”的奇葩生活录
- 下一篇: oracle使用sqlplus创建表空间