2.2 從幫助頁面獲取幫助
R自帶的核心函數超過1000個,并且一直都有新成員加入其函數大家族。要想記住和學會所有函數幾乎是不可能的。但所幸每一個R函數都有自己的幫助頁面,你只需要鍵入問號加上一個函數的名稱即可查看該函數的幫助頁面。下面的代碼示例中,每一個命令都會打開相應函數的幫助頁面。這些幫助頁面會出現在RStudio右下面板的Help選項卡中。
?sqrt ?log10 ?sample
幫助頁面涵蓋了函數的主要功能和使用方法等諸多有用信息。幫助頁面同樣有代碼文檔的功能,因此讀起來可能是苦樂參半的。它們常??雌饋硎菍iT為已經對該函數有所理解,壓根用不著幫助的那群用戶所寫的。
但也不用灰心,即便如此,從一個函數的幫助頁面仍然能得到很多信息??梢灾魂P注其中能理解的部分,而比較晦澀難懂的部分可以一帶而過。這種做法必然會將你帶到每個幫助頁面中最有用的部分:最底部的代碼示例部分。在這個部分,幾乎每一個幫助頁面都會給出一些使用該函數的代碼示例。運行這些示例代碼,有助于快速掌握該函數的基本功能。
如果一個函數來自某個R包,而你并沒有安裝或者加載該包,那么在R的控制臺用問號加函數名的方式并不能調出該函數的幫助頁面。
2.2.1 幫助頁面的組成部分
每一個幫助頁面都被分成了數個部分。各個部分因函數而異,但通常來說你都可以看到以下幾個部分。
· 函數描述(Description)
一段簡短的有關該函數功能的描述。
· 使用方法(Usage)
告訴你應該如何鍵入該函數和相應的參數名。參數的排列順序應該符合R的預期,也就是該函數被定義時參數的排列順序(這里指的是沒有明確寫出參數名的情況)。
· 參數(Arguments)
列出該函數所包含的所有參數,它們所接受的賦值類型以及每個參數在函數中的作用。
· 相關細節(Details)
關于該函數工作原理的進一步描述。函數的作者通常會利用這個部分提出該函數使用時的一些注意事項,以引起用戶的注意。
· 返回值(Value)
一段關于該函數運行后的返回值的簡短描述。
· 另請參閱(See Also)
與該函數相關的函數列表。
· 代碼示例(Examples)
確保可以無錯運行的代碼示例。幫助頁面內的代碼示例通常會展示給用戶數種使用該函數的方法,這有助于用戶更好地了解該函數的作用。
如果不小心忘記了函數的確切名稱,但又想找到這個函數的幫助頁面,可以嘗試關鍵詞搜索。具體做法:進入R的命令行界面,在關鍵詞之前鍵入兩個問號再按回車鍵。R會列出所有與該關鍵詞有關的幫助頁面的超鏈接。你可以將此看作幫助頁面的幫助頁面。
?? log
讓我們仔細看看sample函數的幫助頁面。記?。何覀兿胝业疥P于如何改變抽樣過程中的抽樣概率的信息。這里沒有展示整個幫助頁面(而只是有選擇性地展示最相關的部分),你可以在自己的計算機上跟著下面的提示一步一步操作。
第一步,打開幫助頁面。在RStudio中,幫助頁面與繪圖頁面處于同一個面板中(但幫助頁面在Help選項卡中,而繪圖頁面在Plots選項卡中)。
?sample
你看到了什么呢?從上往下應該是這樣的信息。
Random Samples and Permutations(隨機抽樣與置換) Description(說明) sample takes a sample of the specified size from the elements of x using either with or without replacement.(sample函數從x中隨機抽取放回樣本或者不放回樣本,樣本的大 小由用戶設置。)
還不錯,我們都知道這些話代表什么意思。進入下一部分:Usage(使用方法)。這里包含了一個有價值的線索。它提到一個叫作prob的參數。
Usage sample(x, size, replace = FALSE, prob = NULL)
如果將幫助頁面下拉至參數部分,可以看到此處關于prob參數的描述看起來非常像我們需要的信息。
A vector of probability weights for obtaining the elements of the vector being sampled. (對于欲抽樣的向量中的元素,該參數是一個相同長度的向量,其元素對應被抽樣向量中相應元素 的抽樣權重。)
Details(相關細節)部分確認了我們剛才的判斷,并且包含了進一步的說明和指導。
The optional prob argument can be used to give a vector of weights for obtaining the elements of the vector being sampled. They need not sum to one, but they should be nonnegative and not all zero.(prob是一個可選參數,用于在抽樣時指定被抽樣向量中每個元 素的抽樣權重。該參數向量中的元素和可以不為1,但是必須保證每個元素都是非負值且不能同時 為0。)
雖然幫助頁面中沒有詳細說明,但有必要指出的是,這個參數向量中的元素與被抽樣向量中的元素是一一對應的。因此,prob的第一個元素對應的就是被抽樣向量中第一個元素的抽樣權重,第二個元素對應被抽樣向量中的第二個元素的抽樣權重,以此類推。這種元素對應的方式在R中是頗為常見的。
繼續閱讀幫助頁面,有下面一段文字。
If replace is true, Walker's alias method (Ripley, 1987) is used...(如果replace參數 為true,則會使用Walker的別名方法(Ripley,1987)……)
好了,讀到這樣的描述也就意味著接下來我們只需略讀即可。上面的信息已經足夠用來為我們的骰子添加權重了。
練習
重寫之前的擲骰子函數以實現一對有不同權重的骰子。
roll <- function() { die <-1:6 dice <- sample(die, size = 2, replace = TRUE) sum(dice) }
你應該在roll函數內部的sample函數中添加一個prob參數。這個參數應該能夠指示sample函數在抽樣時將1/8的抽樣權重交給從1到5的五個點數,而點數6的抽樣權重為3/8。
做完這個練習之后,看看下面的參考答案。
為了改變骰子的權重,需要在sample函數中設置prob參數,這個參數是一個包含權重值的向量,做法如下。
roll <- function() { die <-1:6 dice <- sample(die, size = 2, replace = TRUE, prob = c(1/8, 1/8, 1/8, 1/8, 1/8, 3/8)) sum(dice) }
該函數的效果就是在擲骰子時,點數1~5的權重僅為1/8,而點數6的權重為3/8。
用新函數覆蓋之前的roll函數(即將上面的參考答案代碼鍵入命令行中并運行),然后將新骰子的長期投擲結果繪制出來。圖2-5中右邊的圖就是新骰子投擲結果的直方圖,左邊是舊骰子投擲結果的直方圖。
rolls <- replicate(10000, roll()) qplot(rolls, binwidth = 1)

圖2-5:右圖顯示,新骰子的投擲點數明顯更加傾向于大點數組合,因為大點數組合出現的頻率要遠高于小點數組合出現的頻率
該圖說明我們剛才的新骰子函數有效地給點數設置了不同的權重。大點數組合出現的頻率要遠高于小點數組合出現的頻率。但值得注意的是只有觀測長期頻率才能看到如此明顯的效果。單次投擲的骰子點數看似仍是隨機的。如果你在玩《卡坦島移民者》這樣的游戲,這可能是個好消息(你可以告訴朋友你丟了骰子)。但是如果你在分析數據,這種情況就會變得十分惱人,因為這意味著如果骰子被做過手腳,在短期內很難發現。
2.2.2 獲取更多幫助
R的用戶社區非常活躍,你可以通過R幫助郵件列表(https://stat.ethz.ch/mailman/listinfo/r-help)得到更多幫助。你可以在郵件列表中提問,但是很可能你所要提的問題已經存在并已經被解答了。為了避免重復提問,建議在提問之前先在已提問題存檔(http://tolstoy. newcastle.edu.au/R/)中搜索確認一下。
相比R郵件列表,Stack Overflow(http://stackoverflow.com)的幫助模式更好。在這個網站上,程序員們會在線回答各種各樣的問題,而答案的排序是由用戶的打分值決定的,打分值越高代表答案越有用,其排序也就越高。我個人更喜歡Stack Overflow的幫助模式,其用戶體驗相比R郵件列表更加友好(回答問題的人相對來說也更加友善)。在Stack Overflow上,你可以上傳自己的問題或者搜索已經提過的與R相關的問題?,F在上面有3萬多條與R相關的提問。
無論是使用R郵件列表還是Stack Overflow,如果提問時提供的實例代碼具有良好的可重現性,那么得到有用回答的概率就會更大一些??芍噩F性是指他人在復制粘貼你所提供的代碼并運行之后,可以得到與你預想的或碰到的問題一樣的信息或者錯誤提示。
- C程序設計簡明教程(第二版)
- Java入門經典(第6版)
- Mastering Selenium WebDriver
- JavaFX Essentials
- Visual Basic程序設計習題解答與上機指導
- Big Data Analytics
- Mastering ServiceNow(Second Edition)
- Express Web Application Development
- Raspberry Pi Home Automation with Arduino(Second Edition)
- Getting Started with React Native
- PHP 8從入門到精通(視頻教學版)
- SFML Game Development
- Python數據預處理技術與實踐
- MATLAB語言及編程實踐:生物數學模型應用
- Web應用程序設計:ASP