官术网_书友最值得收藏!

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函數。

主站蜘蛛池模板: 安远县| 固阳县| 锦州市| 崇义县| 玛曲县| 沂源县| 泗阳县| 若羌县| 海门市| 哈巴河县| 雷山县| 永和县| 天门市| 鸡东县| 凌云县| 铜川市| 平顶山市| 惠安县| 天峨县| 富蕴县| 庐江县| 永城市| 建始县| 雷山县| 福贡县| 昂仁县| 罗城| 朝阳市| 宁安市| 固安县| 乐至县| 东兴市| 梁山县| 武定县| 吉首市| 商城县| 醴陵市| 桃园市| 凤庆县| 泸西县| 抚远县|