您好,登錄后才能下訂單哦!
這篇文章主要介紹了R語(yǔ)言中assign函數(shù)和get函數(shù)怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
R語(yǔ)言是用于統(tǒng)計(jì)分析、繪圖的語(yǔ)言和操作環(huán)境,屬于GNU系統(tǒng)的一個(gè)自由、免費(fèi)、源代碼開放的軟件,它是一個(gè)用于統(tǒng)計(jì)計(jì)算和統(tǒng)計(jì)制圖的優(yōu)秀工具。
assign函數(shù)在循環(huán)時(shí)候,給變量賦值,算是比較方便
for (i in 1:(length(rowSeq)-1)){ assign(paste("nginx_server_fields7_", i, sep = ""), nginx_server_fields7[(rowSeq[(i-1)+1]):(rowSeq[i+1]), ]) }
for (i in 1:3){ assign(paste("a", i, sep = ""), i:10) } ls() [1] "a1" "a2" "a3" "i" > a1 [1] 1 2 3 4 5 6 7 8 9 10 > a2 [1] 2 3 4 5 6 7 8 9 10
rm(list = ls()) #這個(gè)命令千萬(wàn)慎重使用 for(i in 1:3){ assign(paste("p", i, sep=""), i) tmp <- get(paste("p", i, sep="")) print(tmp) } [1] 1 [1] 2 [1] 3 ls() [1] "i" "p1" "p2" "p3" "tmp"
補(bǔ)充:R語(yǔ)言函數(shù)的簡(jiǎn)單理解
R語(yǔ)言結(jié)合了面向?qū)ο缶幊陶Z(yǔ)言和函數(shù)式編程語(yǔ)言的特性,由于擁有函數(shù)式編程的特性,R的每一個(gè)運(yùn)算符,實(shí)際上也是函數(shù),同樣,面向?qū)ο蟮奶匦詻Q定了你接觸到的R中所有東西(從數(shù)字到字符串到矩陣等)都是對(duì)象。
這些綜合的特質(zhì)決定了R這門語(yǔ)言的特殊性,最大的特點(diǎn)就是開源,R中有許多用戶無(wú)私貢獻(xiàn)的包,通過這些包,可以實(shí)現(xiàn)強(qiáng)大的功能,因此,在在的統(tǒng)計(jì)處理或者數(shù)據(jù)挖掘等數(shù)據(jù)處理相關(guān)工作中,R常常作為數(shù)據(jù)預(yù)處理和建立初步模型的強(qiáng)大工具,但作為一門解釋型語(yǔ)言,R的運(yùn)行效率比不上同等下的C等編譯型語(yǔ)言,特別是在高性能計(jì)算中。
因此,個(gè)人認(rèn)為未來(lái)或者是現(xiàn)在將流行這樣一種數(shù)據(jù)處理方式:用R對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,同時(shí)通過R建立初步的數(shù)據(jù)處理模型,待對(duì)模型進(jìn)行評(píng)估并確定如何實(shí)施之后通過更高效的語(yǔ)言(C語(yǔ)言等)來(lái)實(shí)現(xiàn)。
R中變量作用域的層次結(jié)構(gòu)同C語(yǔ)言類似,但最大的不同在于,在R函數(shù)中可以創(chuàng)建新的函數(shù),這樣會(huì)增加新的層次。
R擁有函數(shù)式編程的特性,基于函數(shù)式編程語(yǔ)言的特征,函數(shù)不會(huì)修改非局部變量,在R中,函數(shù)幾乎沒有副作用,簡(jiǎn)單的理解為,函數(shù)的一般代碼可以讀但是不能寫非全局變量(當(dāng)然通過特定函數(shù)是可以修改全局變量的)。
一般代碼表面上可以給全局變量重新賦值,但實(shí)際上這些操作只會(huì)修改全局變量在特定層次中的備份,而全局變量本身不會(huì)發(fā)生變化。如下面例子所示:
i <- 1 test <- function(){ i <- 2 print(sprintf("the value from test(): %i", i)) } test() print(sprintf("the value from global:%i", i))
執(zhí)行以上代碼,結(jié)果如下所示:
在以上代碼中,i是全局變量,順序執(zhí)行test()函數(shù),在test中給i賦值為2,此時(shí)打印的結(jié)果是局部變量中的值。test()函數(shù)執(zhí)行完之后再打印i的值,結(jié)果卻仍然是1,說(shuō)明test中的賦值并沒有修改全局變量i。
1)只引用而不改變?nèi)肿兞?,局部變量與全局變量共享內(nèi)存空間,此時(shí)的值必然相同;
2)一旦函數(shù)對(duì)全局變量重新賦值,系統(tǒng)將會(huì)創(chuàng)建一個(gè)與全局變量同名的新變量,并為這個(gè)變量分配新的內(nèi)存空間,但這個(gè)新變量只處在宿主函數(shù)這個(gè)層次中,根據(jù)變量的引用關(guān)系,優(yōu)先引用離自己較近的本層或者上層環(huán)境中變量,所以在該函數(shù)中基本上只會(huì)用全局變量的同名局部變量了;
3)隨著函數(shù)調(diào)用結(jié)束,系統(tǒng)會(huì)釋放函數(shù)中的局部變量,新創(chuàng)建的全局變量的同名局部變量也將銷毀,而全局變量的值并沒有因?yàn)樵诤瘮?shù)中使用而發(fā)生變化。
當(dāng)然,R中也提供了特定的函數(shù)來(lái)對(duì)函數(shù)的上級(jí)層次進(jìn)行寫操作,那就是<<-和assign()。
系統(tǒng)會(huì)從第一個(gè)上級(jí)層次開始,由低到高逐層進(jìn)行查找,直到在某個(gè)層次中找到該變量,如果找不到該變量,系統(tǒng)會(huì)在頂層環(huán)境中創(chuàng)建一個(gè)新的變量。注意,超賦值運(yùn)算符<<-只查上級(jí),不會(huì)對(duì)本級(jí)進(jìn)行查找。
如下例所示:
A)
i <- 1 testA <- function() { i <<- 2 print(sprintf("the value from testA(): %i", i)) } testA() print(sprintf("the value from global:%i", i))
B)
testB<-function() { i<<-2 print(sprintf("the value from testB(): %i", i)) } testB() print(sprintf("the value from global:%i", i))
結(jié)果如下:
A)
B)
兩次運(yùn)行的結(jié)果相同,在A)中,<<-修改了全局變量值i,在testA函數(shù)中引用了修改后的值,結(jié)果為2,在B)中,<<-向上查找,沒有找到名為i的全局變量,但是系統(tǒng)在全局環(huán)境中創(chuàng)建了名為i的全局變量并為其賦值為2。
該函數(shù)的特性為:向指定層次(本級(jí)或上級(jí))中的某個(gè)變量賦值,有則修改,無(wú)則創(chuàng)建。
如下代碼所示:
test <-function() { i <- 1 innertest<-function(x) { i<-3 assign("i",2*x,pos=.GlobalEnv) print(sprintf("the value from innertest(): %i",i)) } innertest(5) print(sprintf("the value from test(): %i", i)) } test() print(sprintf("the value from global:%i", i))
結(jié)果為:
由結(jié)果可知,在test()和innertest()中的i值都沒有發(fā)生變化,而在最頂層的全局層次中沒有定義i的值,結(jié)果顯示該值為10。
原因在于,在函數(shù)test()內(nèi)部定義的函數(shù)innertest()中執(zhí)行了assign函數(shù),該函數(shù)在最頂層全局層次中的變量i賦值10,但是該層中并沒有該變量,于是就就在最頂層.GlobalEnv中創(chuàng)建了該變量i并給其賦值,這樣在不同的函數(shù)層次中都有變量i,優(yōu)先引用離自己最近的同級(jí)(已順序執(zhí)行)或者上級(jí)層次中的變量,所以i出現(xiàn)了三個(gè)不同的輸出值。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“R語(yǔ)言中assign函數(shù)和get函數(shù)怎么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。