欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

R語言中assign函數(shù)和get函數(shù)的用法

 更新時間:2021年04月22日 09:57:01   作者:alphabeta12345  
這篇文章主要介紹了R語言中assign函數(shù)和get函數(shù)的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

assign函數(shù)在循環(huán)時候,給變量賦值,算是比較方便

1、給變量賦值

for (i in 1:(length(rowSeq)-1)){
  assign(paste("nginx_server_fields7_", i, sep = ""), nginx_server_fields7[(rowSeq[(i-1)+1]):(rowSeq[i+1]), ])
}

2、通過for循環(huán)給變量a1、a2、a3賦值

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

3、get和assign聯(lián)合用法

rm(list = ls())  #這個命令千萬慎重使用
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語言函數(shù)的簡單理解

R語言結(jié)合了面向?qū)ο缶幊陶Z言和函數(shù)式編程語言的特性,由于擁有函數(shù)式編程的特性,R的每一個運(yùn)算符,實(shí)際上也是函數(shù),同樣,面向?qū)ο蟮奶匦詻Q定了你接觸到的R中所有東西(從數(shù)字到字符串到矩陣等)都是對象。

這些綜合的特質(zhì)決定了R這門語言的特殊性,最大的特點(diǎn)就是開源,R中有許多用戶無私貢獻(xiàn)的包,通過這些包,可以實(shí)現(xiàn)強(qiáng)大的功能,因此,在在的統(tǒng)計處理或者數(shù)據(jù)挖掘等數(shù)據(jù)處理相關(guān)工作中,R常常作為數(shù)據(jù)預(yù)處理和建立初步模型的強(qiáng)大工具,但作為一門解釋型語言,R的運(yùn)行效率比不上同等下的C等編譯型語言,特別是在高性能計算中。

因此,個人認(rèn)為未來或者是現(xiàn)在將流行這樣一種數(shù)據(jù)處理方式:用R對數(shù)據(jù)進(jìn)行預(yù)處理,同時通過R建立初步的數(shù)據(jù)處理模型,待對模型進(jìn)行評估并確定如何實(shí)施之后通過更高效的語言(C語言等)來實(shí)現(xiàn)。

R中變量作用域的層次結(jié)構(gòu)同C語言類似,但最大的不同在于,在R函數(shù)中可以創(chuàng)建新的函數(shù),這樣會增加新的層次。

R擁有函數(shù)式編程的特性,基于函數(shù)式編程語言的特征,函數(shù)不會修改非局部變量,在R中,函數(shù)幾乎沒有副作用,簡單的理解為,函數(shù)的一般代碼可以讀但是不能寫非全局變量(當(dāng)然通過特定函數(shù)是可以修改全局變量的)。

一般代碼表面上可以給全局變量重新賦值,但實(shí)際上這些操作只會修改全局變量在特定層次中的備份,而全局變量本身不會發(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,此時打印的結(jié)果是局部變量中的值。test()函數(shù)執(zhí)行完之后再打印i的值,結(jié)果卻仍然是1,說明test中的賦值并沒有修改全局變量i。

一般情況下,使用R中的函數(shù)不會有副作用,可以有以下幾點(diǎn)理解:

1)只引用而不改變?nèi)肿兞?,局部變量與全局變量共享內(nèi)存空間,此時的值必然相同;

2)一旦函數(shù)對全局變量重新賦值,系統(tǒng)將會創(chuàng)建一個與全局變量同名的新變量,并為這個變量分配新的內(nèi)存空間,但這個新變量只處在宿主函數(shù)這個層次中,根據(jù)變量的引用關(guān)系,優(yōu)先引用離自己較近的本層或者上層環(huán)境中變量,所以在該函數(shù)中基本上只會用全局變量的同名局部變量了;

3)隨著函數(shù)調(diào)用結(jié)束,系統(tǒng)會釋放函數(shù)中的局部變量,新創(chuàng)建的全局變量的同名局部變量也將銷毀,而全局變量的值并沒有因?yàn)樵诤瘮?shù)中使用而發(fā)生變化。

當(dāng)然,R中也提供了特定的函數(shù)來對函數(shù)的上級層次進(jìn)行寫操作,那就是<<-和assign()。

1.超賦值運(yùn)算符<<-的機(jī)理為:使用<<-進(jìn)行賦值操作

系統(tǒng)會從第一個上級層次開始,由低到高逐層進(jìn)行查找,直到在某個層次中找到該變量,如果找不到該變量,系統(tǒng)會在頂層環(huán)境中創(chuàng)建一個新的變量。注意,超賦值運(yùn)算符<<-只查上級,不會對本級進(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。

2.使用assign()函數(shù)來對非局部變量進(jìn)行寫操作

該函數(shù)的特性為:向指定層次(本級或上級)中的某個變量賦值,有則修改,無則創(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)先引用離自己最近的同級(已順序執(zhí)行)或者上級層次中的變量,所以i出現(xiàn)了三個不同的輸出值。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • R語言 實(shí)現(xiàn)多行注釋的方式

    R語言 實(shí)現(xiàn)多行注釋的方式

    這篇文章主要介紹了R語言 實(shí)現(xiàn)多行注釋的方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 利用R語言繪制時間序列圖的操作

    利用R語言繪制時間序列圖的操作

    這篇文章主要介紹了利用R語言繪制時間序列圖的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • R語言中循環(huán)的相關(guān)知識詳解

    R語言中循環(huán)的相關(guān)知識詳解

    這篇文章主要為大家詳細(xì)介紹了R語言中循環(huán)的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)R語言有一定的幫助,感興趣的可以了解一下
    2023-03-03
  • R語言:實(shí)現(xiàn)因子與字符串的互轉(zhuǎn)

    R語言:實(shí)現(xiàn)因子與字符串的互轉(zhuǎn)

    這篇文章主要介紹了R語言:實(shí)現(xiàn)因子與字符串的互轉(zhuǎn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • R語言 中文亂碼的解決方案

    R語言 中文亂碼的解決方案

    這篇文章主要介紹了R語言 中文亂碼的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • R語言時間序列中時間年、月、季、日的處理操作

    R語言時間序列中時間年、月、季、日的處理操作

    這篇文章主要介紹了R語言時間序列中時間年、月、季、日的處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • R語言學(xué)習(xí)Rcpp基礎(chǔ)知識全面整理

    R語言學(xué)習(xí)Rcpp基礎(chǔ)知識全面整理

    這篇文章主要介紹了R語言學(xué)習(xí)Rcpp知識的全面整理,包括相關(guān)配置說明,常用數(shù)據(jù)類型及建立等基礎(chǔ)知識的全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • R語言函數(shù)基礎(chǔ)知識點(diǎn)總結(jié)

    R語言函數(shù)基礎(chǔ)知識點(diǎn)總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于R語言函數(shù)基礎(chǔ)知識點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-04-04
  • R語言中cbind、rbind和merge函數(shù)的使用與區(qū)別

    R語言中cbind、rbind和merge函數(shù)的使用與區(qū)別

    這篇文章主要介紹了R語言中cbind、rbind和merge函數(shù)的使用與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • R語言開發(fā)之CSV文件的讀寫操作實(shí)現(xiàn)

    R語言開發(fā)之CSV文件的讀寫操作實(shí)現(xiàn)

    這篇文章主要介紹了R語言開發(fā)之CSV文件的讀寫操作實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論