第四天任務:
完成專案玩撲克牌後1/2,並通過專案學會以下技能:
1)從乙個資料集中抽取個別資料值。
2)在乙個資料集中改變個別資料的取值。
3)編寫邏輯測試程式。
4)使用r的缺失值符號na。
可以將該專案後1/2分成三個子任務:
1.編寫用來發牌和洗牌的函式。
2.改變點數系統以適應不同的撲克遊戲。
3.管理撲克牌桌的狀態。
玩撲克牌應該做撲克牌該做的事,比如洗牌和發牌(從撲克牌堆最上方拿牌)。而對資料進行值的選取,通常值是通過r的記號體系提取:deck[ , ](deck為要操作的資料框,逗號兩邊為索引引數,左行右列)。r的索引與線性代數的索引一樣,都是從1開始的,對r來說有六種索引方式,分別是:
1)正整數索引:deck[i ,j ]或deck[i ,c(1:3)]
r會將值儲存為原值的乙份副本,可以將副本賦值給物件。如果從資料框中提取兩列或兩列以上的資料,r會返回新的資料框,只提取一列,r會返回乙個向量,如果想讓向量變成資料框,需要新增引數drop=false:deck[1:2,1,drop=false]
2)負整數索引
與正整數索引正好相反,r會返回負整數索引對應的元素。
3)零索引
如果使用零索引,r不會提取任何資訊返回乙個空物件。
4)空格索引
使用空格索引提取資料框所有行或者所有列。
5)名稱索引
如果被索引的物件有名稱屬性,就可以使用名稱索引。
deck[1,c(「face」,」suit」,」value」)]
##face suit value
##king spades 13
要想提取資料框的某一列,使用$分隔符分開資料框的名稱和要提取的列的名稱,並將所有值作為向量返回,因此可以立即將返回結果作為輸入交給函式,其操作類似與在列表中使用雙中括號返回元素值而不是它的列表結構。
-------------------------物件改值--------------------------
就地改值
r的記號體系可以在r的物件內部改值,即可以將新值覆蓋舊值,也可增加新值,這使得可以為資料集新增新變數:
deck$new
deck[1, ]
##face suit value new
##kingspades 13 1
在war遊戲中,a(ace)的點數是最高的,想要玩war,就要把a的點數從1加到14。如果還沒有洗牌,可以知道每13張牌重複一次,因此可以:
deck$value[c(13,26,39,52)]
這些替換操作都是發生在資料集內部,不會產生deck的副本。
邏輯測試
在r中,有七種邏輯運算子,分別是 ,>= ,== ,!= ,%in%,其中%in%的用法是a%in%c(a,b,c),代表c(a,b,c)中是否含有a,而且它是唯一乙個不一一對比的運算子。所以上面的運算可以改為:
deck$value[deck$face==」ace」]
在hearts遊戲中,除了花色為紅桃和黑桃q的牌,其他點數都是0。
deck$value
deck$value[deck$suit==」hearts」]
deck$value[deck$suit==」spades」&deck$face==」queen」]
在r語言中,布林運算子有6種,& ,| ,xor(異或) ,! ,any ,all學會使用布林型別會對資料處理有很大的幫助。
缺失資訊
r中的特殊字元na代表不可用,可用於儲存缺失資訊。缺失資訊不等於0,它代表的是不確定屬性,可以將na看作是可能等於也可能不等於乙個數的值。比如1+na=na,na==1##na。大多數r函式都有乙個可選引數na.rm,當na.rm=true時r會在對函式求值時忽略na。
比如mean(c(na,1:50),na.rm=true)##25.5
is.na函式用來確定某個值是否是乙個缺失值:
vecis.na(vec)
##true falsefalse false
這樣我們玩blackjack到時候就可以將ace設定為na了。
-----------------------------函式設計-------------------------------
兩個函式都要求對deck資料框進行直接操作,且發牌函式(deal)要將牌堆上的第一張牌不放回的拿出來,洗牌則是對deck資料集直接打亂順序。
要想設計好兩個函式。就要對r中如何儲存,查詢和操作物件有所了解。r儲存物件時採用了和樹形檔案管理系統類似的層級系統結構,每乙個物件都儲存在乙個環境當中,每乙個環境都與乙個父環境相連,一層一層就構成了分層的環境系統。
可以通過devtools包中的parenvs函式檢視r中的環境系統。
parenvs(all=true)
r的環境儲存在ram記憶體中,擁有惟一乙個沒有父環境的頂級環境,且不支援自上而下的搜尋。r在每一次運性函式的時候都會建立乙個新的活動環境,函式是在新環境中執行的。類似與c++中每個函式都有自己的函式空間,在函式內新建的普通變數不能在函式外使用。每次執行乙個新的函式r就會建立乙個新的環境,最後將求的值返還給就環境中。r就是通過這種方法來確保不會覆已經存在的物件。所以r函式只會呼叫自己定義的函式。
發牌函式:
deal
閉包發牌和洗牌可以統一寫入函式setup:
新版本與舊版本相比有乙個重要的差別,新版本的原環境不再是全域性環境,而是r在執行setup函式時所建立的執行環境,這個環境也是r建立deal和shuffle的地方。這樣處理的方式叫做閉包,setup的執行環境將deal函式和shuffle函式包了起來,兩個函式可以直接呼叫包圍式環境的物件,但是其他外部的函式幾乎不能做到這一點。這樣做使得即使在活躍的全域性函式中deck被修改或者刪除,也不會影響函式的執行。
這個版本的setup函式不會更新全域性環境中的deck物件,只與其所處環境的父環境中的物件合作。
-----------------------------注-------------------------------
1.本學習記錄來自garrett grolemund先生所著《hands-on programming with r》(中文名r語言入門與實踐)一書。
2. 21點(blackjack)由2到6個人玩,使用除大小王之外的52張牌,遊戲者的目標是使手中的牌的點數之和不超過21點且盡量大。
《R語言入門與實踐》學習筆記五
第五天任務 完成專案模擬 並通過程式設計學會一下技能 1 運用實用策略設計程式。2 使用if和else語句告訴r在什麼時候做什麼事。3 通過建立查詢表的方法找到特定的數值。4 使用for,while和repeat迴圈語句使重複性操作自動完成。通過設計乙個r函式play 搭建乙個真正可以執行的 pla...
《R語言入門與實踐》第四章 R 的記號體系
這一章節將如何對 r 物件中的值進行選取,r 的符號規則有兩種方式進行查詢 第一種記號體系 索引 查詢索引語法 deck 使用中括號 其中 為索引,其中含有兩個索引引數,用 分隔 在 r 中,有六種方式建立並使用索引,分別為 正整數索引 負整數索引零空格 邏輯值名稱 第二種記號體系 和 格式 dec...
《R語言入門與實踐》第一章 R基礎
本章介紹了 r 語言的基礎知識 使用命令 r 進行命令列的實時編譯 用於儲存資料的,設定乙個名稱 a 1 6 規則1 不能以數字開頭 規則2 不能使用 等符號 命令 ls r語言以 element wise execution 按元素 的方式進行計算.舉例 對乙個數字集進行運算,對其中每乙個元素進行...