r也屬於一種物件導向語言,萬物皆為物件,只是它畢竟最初設計不是為了面向工程,而是面向科學研究,故而它比較奇葩,與我們大多數主流語言的物件導向設計有所不同,它是以一種名為s3系統來作物件導向架構設計,幾個基礎的r包都是基於s3系統設計,很多第三方包也基於s3物件系統。(s4,rc, r6這些更高階的系統這裡不做討論了)
print
# function (x, ...)
# usemethod("print")
# #
這裡以最常用的函式print為例子,在控制台中列印函式原碼,原碼並沒有顯示,顯示出的是乙個泛型函式,泛型函式可以理解為某相同功能函式的泛化彙總,比如做飛機,做火車,做汽車,本質都是交通活動,這種泛化的設計的好處就在於需要呼叫函式時不需要知道具體的函式名,只需要明確要做什麼操作即可。
methods(print)
# [1] print.aareg*
# [2] print.acf*
# [3] print.aes*
# [4] print.aggregation*
# [5] print.all_vars*
# [6] print.annotatedplaintextdocument*
# [7] print.annotation*
# [8] print.annotator*
# [9] print.annotator_pipeline*
# [10] print.anova*
# ......
length(methods(print))
# [1] 450
使用函式methods 列印出print 泛型函式的部分實現函式,其實現函式有450個之多,由此可見這種泛型的定義多麼重要,不需要記住那麼多函式名,當然如果你記憶力驚人的化也無不可。
s3系統具體應用不做討論,所有基礎包都是基於這個系統設計,說到物件導向只是為了引出乙個被忽略的物件賦值問題。
###
# 建立函式,<- 函式內部建立物件
f <- function(x)x<-1
# 呼叫函式
f(1)
查詢物件x
x# 錯誤: 找不到物件'x'
## 原因: 函式呼叫結束後,其中內部物件被釋放
#### 建立函式,<<- 函式內部建立物件
sf <- function(x)x<<-1
# 呼叫函式
sf(1)
查詢物件x
x# [1] 1
## 原因: <<- 會在全域性環境建立物件,故物件在全域性環境中,未被釋放
這裡我一直以為<<- 賦值是將會建立物件在上層環境,後來在發現我錯了,它會建立物件到全域性環境。這時候assign 就發揮出它的作用了。
# 建立函式sf
sf <- function(x)x<<-2*x
# 建立函式g,其內部呼叫函式sf
g <- function(x)
# 呼叫函式g
g(1)
# [1] "x"
# [1] 1
# 檢視全域性是否有x物件
x# [1] 2
解析: 這裡發現g函式內部呼叫sf函式時,其中內部的物件實際是傳入的引數x,因為sf函式定義是改變上層環境的值,可是列印出的x依然等於傳入的引數值,再檢視全域性環境,發現存在物件x,並且符合sf函式的計算規則,x等於2,故而發現<<-並未能改變其上層環境的值,而是直接跳到全域性環境。
# 建立函式nsf
nsf <- function
(x)assign
("x", 2 * x, envir = parent.frame())
# 建立函式ng
ng<- function
(x)# 呼叫函式ng
ng(1)
# [1] "x"
# [1] 2
# 檢視全域性是否有x物件
x# 錯誤: 找不到物件'x'
解析: 這裡在使用assign 函式賦值時,使用envir引數設定了一下父類環境,其建立的物件就在上層環境當中了。 Nios Flash程式設計技術
1.1 altera支援cfi flash程式設計 1.3 非支援cfi程式設計 由於我所用的nor flash晶元是am29lv320db,不再nios支援的列表,自己編輯了override檔案,但還是無法正確program進去,決定用列表支援的sst39vf800試一試,引腳相容,容量為1 4,...
DLL程式設計技術
一 dll原理 dll dynamic link library 也就是 動態鏈結庫 是乙個可以被其它應用程式共享的程式模組,其中封裝了一些可以被共享的程式或資源。它雖然包含了可執行 卻不能單獨執行,而應由相應的應用程式直接或間接呼叫。在 windows 32 中,可以將 dll 標記為共享以導致相...
多道程式設計技術
讓多個計算機問題同時裝入乙個計算機系統的主儲存器的併發執行,這種設計技術稱為 多道程式設計 這種計算機系統稱為 多道程式設計系統 或簡稱 多道系統 多道程式設計概念 所謂多道程式設計是指允許乙個計算機系統的主儲存器同時容納多個使用者程式,這些程式在計算機系統中可以併發執行。設有兩道程式a與b要在同乙...