1.6 參數
如果我們把剛才構建的函數主體中的第一行代碼刪除,并將第二行代碼中的參數die改成bones,會出現什么情況呢?
roll2 <- function() { dice <- sample(bones, size = 2, replace = TRUE) sum(dice) }
現在運行這個新函數會導致R輸出一條錯誤信息。這個新函數在調用時會去尋找bones,而我們根本沒有定義過bones這個對象,于是導致錯誤的發生。
roll2() ## Error in sample(bones, size = 2, replace =TRUE) : ## object 'bones' not found
如果你將bones作為這個函數的一個參數名,就可以將bones再作為參數傳遞給sample函數。為此,我們在用function定義新函數roll2時,在其后的括號中鍵入bones作為該函數的參數。
roll2 <- function(bones) { dice <- sample(bones, size = 2, replace = TRUE) sum(dice) }
只要你在調用新函數時將bones提供給該函數,roll2就有效。這個函數的好處是,在每次調用roll2函數時可以擲不同類型的骰子。現在我們可以去玩《龍與地下城》了!
記住,我們擲的是成對的骰子。
roll2(bones = 1:4)
## 3
roll2(bones = 1:6) ## 10 roll2(1:20) ## 31
應該注意的是,如果你在調用roll2函數時不提供bones的值,那么roll2函數仍然會觸發錯誤信息。
roll2() ## Error in sample(bones, size = 2, replace = TRUE) : ## argument "bones" is missing, with no default
為了防止類似的錯誤發生,你可以指定一個初始默認值給bones。為此,只需在定義roll2函數時將bones與相應的默認值用等號連接即可。
roll2 <- function(bones = 1:6) { dice <- sample(bones, size = 2, replace = TRUE) sum(dice) }
對于現在這樣一個新的roll2函數來說,你可以按照需求指定一個新的值給bones,如果不指定,其值就是默認值1:6。
roll2()
## 9
你可以在自定義函數中設置任意數量的參數,只要在function后的括號中列出它們的名稱,并且用逗號隔開即可。函數運行時,R會將函數主體中的每個參數名稱替換為用戶為該參數提供的值。如果用戶沒有設置參數值,那么R會用該參數的默認值代替(前提是在定義函數時設置了該參數的默認值)。
總的來說,function函數可以幫助你構建自定義R函數。函數的主體是function后面大括號中的代碼。函數的參數在緊隨function后的小括號中定義,參數名是自定義的。最后,你通過將函數的輸出保存到某個R對象,給這個函數起一個名稱,如圖1-6所示。

圖1-6:R中的任何一個函數都必須包含這三個部分,你可以用function函數分別定義這三個部分
創建了自定義函數之后,R對待它的方式與R中其他函數沒有任何區別。你能想象這是多么有用嗎?你有沒有試過在Excel中編寫一個自定義選項并將其加入到微軟的菜單欄中?或者是在PowerPoint中添加一個新的動畫效果?當你使用程序語言時,可以實現類似的任務。學會R編程之后,你將能夠隨時創造出新的、定制化的并可重復使用的工具。第三部分將詳細介紹如何編寫R函數。
- Java異步編程實戰
- 程序員面試算法寶典
- Linux網絡程序設計:基于龍芯平臺
- 正則表達式經典實例(第2版)
- Visual FoxPro程序設計
- Creating Data Stories with Tableau Public
- ExtJS Web應用程序開發指南第2版
- Python預測分析與機器學習
- Python Machine Learning Cookbook
- 啊哈C語言!:邏輯的挑戰(修訂版)
- 軟技能2:軟件開發者職業生涯指南
- Mastering Data Analysis with R
- Learning Redis
- Learning Azure DocumentDB
- 3D Printing Designs:Fun and Functional Projects