哈佛R語言課程--3.函數(shù)、參數(shù)和R包

學(xué)習(xí)目標(biāo)

  • R語言函數(shù)的描述和應(yīng)用。
  • 使用參數(shù)修改R語言函數(shù)的默認(rèn)操作
  • 從R幫助文檔獲取有關(guān)函數(shù)的更多信息
  • 創(chuàng)建用戶自定義函數(shù)
  • 演示如何安裝外部包以擴(kuò)展R的功能伤极。
  • 查詢外部資料以
    (1)處理報錯
    (2)獲取有關(guān)函數(shù)和包的更多信息

1.函數(shù)及其參數(shù)

(1)什么是函數(shù)店茶?

函數(shù)是R語言的重要特征蜕便。函數(shù)是完成特定任務(wù)的“自包含”代碼模塊。函數(shù)通常是對某種數(shù)據(jù)結(jié)構(gòu)(值忽妒,向量玩裙,數(shù)據(jù)框等)進(jìn)行處理,并返回結(jié)果段直。

函數(shù)的一般用法是:函數(shù)名+括號

function_name(input)

input稱為參數(shù)吃溅,可包括:

  • 函數(shù)執(zhí)行任務(wù)的物理對象(任何數(shù)據(jù)結(jié)構(gòu))
  • 改變函數(shù)的運(yùn)作方式的規(guī)則(例如options)
    并非所有函數(shù)都帶參數(shù),例如:
getwd()

但大多數(shù)函數(shù)可采用多個參數(shù)鸯檬。在調(diào)用函數(shù)時未指定必需參數(shù)决侈,則會收到error,或者函數(shù)將采用默認(rèn)值

默認(rèn)值表示該函數(shù)的作者認(rèn)為“標(biāo)準(zhǔn)情況下足夠好”的標(biāo)準(zhǔn)值赖歌,比如在圖中使用哪種符號枉圃。但是,如果你想要自定義庐冯,就用你選擇的值更改參數(shù)孽亲。

(2)基礎(chǔ)函數(shù)

在前面的課程中使用過幾個基礎(chǔ)函數(shù),例如getwd()展父,c()factor()返劲,它們是R內(nèi)置函數(shù)的一部分,接下來探討這些內(nèi)置的基礎(chǔ)函數(shù)栖茉。

用戶還可以從外部包或庫中獲取函數(shù)(稍后討論)篮绿,甚至可以編寫自己的函數(shù)。

復(fù)習(xí)一下將數(shù)據(jù)組合到向量中的函數(shù)c()吕漂。它所采用的參數(shù)是數(shù)字亲配,字符或字符串的集合(以逗號分隔)。c()函數(shù)將數(shù)字或字符組合成單個向量惶凝。還可以用這個函數(shù)將元素添加到現(xiàn)有向量:

glengths <- c(glengths, 90) # adding at the end 
glengths <- c(30, glengths) # adding at the beginning

可以在原始向量glengths(包含三個元素)的開頭或結(jié)尾添加新對象吼虎。這個操作可以反復(fù)操作,以構(gòu)建向量或數(shù)據(jù)集梨睁。

R用于統(tǒng)計(jì)計(jì)算鲸睛,因此許多基礎(chǔ)函數(shù)涉及數(shù)學(xué)運(yùn)算。比如sqrt()函數(shù)坡贺。輸入/參數(shù)必須是數(shù)字官辈,輸出是該數(shù)字的平方根。比如81的平方根:

sqrt(81)

如果我們以數(shù)值向量代替單個數(shù)值作為輸入遍坟,調(diào)用函數(shù)(例如運(yùn)行函數(shù))會怎么樣拳亿?

sqrt(glengths)

R對glengths向量的每個值執(zhí)行了計(jì)算,并輸出結(jié)果愿伴。

再試試另一個函數(shù)肺魁,這次可以改變某些選項(xiàng)(改變函數(shù)行為的參數(shù)),例如round

round(3.14159)
#[1] 3

結(jié)果是3隔节。那是因?yàn)槟J(rèn)是舍入到最接近的整數(shù)鹅经。如果想要指定有效數(shù)字位數(shù)該怎么做?

(3)尋求函數(shù)的幫助信息

輸入?+函數(shù)名稱怎诫。執(zhí)行此操作將在RStudio右下方面板打開幫助文檔瘾晃,該文檔包括函數(shù)的功能、用法幻妓、參數(shù)蹦误、詳細(xì)信息和示例:

?round

如果熟悉該函數(shù),只需要顯示參數(shù)名稱,用:

args(round)

example()函數(shù)更有用强胰。這將允許您運(yùn)行聯(lián)機(jī)幫助中的示例部分舱沧,以確切了解它在執(zhí)行命令時的工作方式。讓我們試試round()

example("round")

在我們的示例中偶洋,我們可以通過添加參數(shù)來更改返回的位數(shù)熟吏。我們可以輸入digits=2或者我們想要的許多東西:

round(3.14159, digits=2)

注意:按照函數(shù)定義的順序(幫助文檔中有)輸入?yún)?shù),可以省略參數(shù)名:

round(3.14159, 2)

但通常不推薦省略涡真,因?yàn)橛洃浟看蠓指4送馍隹穑÷詤?shù)名使代碼難于閱讀哆料,特別是包含不常用函數(shù)的時候。(當(dāng)然不包括沒有參數(shù)名的基礎(chǔ)函數(shù)吗铐,如mean东亦,min等)。寫上參數(shù)名就不用關(guān)心參數(shù)順序了唬渗,尤其適用于參數(shù)較多的函數(shù)典阵。


練習(xí)

  1. mean()也是個常用的基礎(chǔ)函數(shù)。使用此函數(shù)計(jì)算glengths向量的平均值镊逝。
  2. 從幫助文檔中學(xué)習(xí)mean()的其他參數(shù)壮啊。

缺失值

默認(rèn)情況下,包含缺失數(shù)據(jù)的向量運(yùn)行的所有R函數(shù)都將返回NA撑蒜。這樣能確保用戶知道他們?nèi)鄙贁?shù)據(jù)歹啼,并自行決定如何處理。當(dāng)處理像平均值這樣的簡單統(tǒng)計(jì)時座菠,忽略NA(缺失數(shù)據(jù))的最簡單的方法就是指定參數(shù)na.rm=TRUErm代表刪除)狸眼。

在某些特定情況下,有必要從向量中刪除缺失值浴滴。為此拓萌,na.omit函數(shù)可以移除向量中的NA。有的情況下需要保留所有觀察結(jié)果升略,也有的情況下需要刪除包含缺失值的整行結(jié)果微王。complete.cases()函數(shù)返回一個邏輯向量,指示哪些行沒有缺失值品嚣。


2.用戶定義的函數(shù)

允許用戶自定義函數(shù)是R語言的一大優(yōu)勢炕倘。有時你需要做一個小任務(wù)(或一系列任務(wù))翻默,發(fā)現(xiàn)必須多次重復(fù)某一操作婚夫。這種情況下,創(chuàng)建自定義函數(shù)就很有幫助尽超。函數(shù)的結(jié)構(gòu)如下

name_of_function <- function(argument1, argument2) {
    statements or code that does something
    return(something)
}

  • 首先為自己的函數(shù)命名。
  • 然后為它賦值瘸恼,這里的“值”就是函數(shù)具體內(nèi)容劣挫。

定義函數(shù)時,需要提供所需參數(shù)列表(用于修改函數(shù)行為的輸入和選項(xiàng))东帅,并在大括號中輸入執(zhí)行/使用這些參數(shù)的代碼压固。參數(shù)可以是任何類型的對象(如標(biāo)量,矩陣靠闭,數(shù)據(jù)集帐我,向量,邏輯值等)愧膀,并且不需要以任何方式聲明拦键。

最后,可以從函數(shù)中“return”對象的值檩淋,這意味著將其值傳遞到全局環(huán)境中芬为。在函數(shù)內(nèi)創(chuàng)建的對象是函數(shù)環(huán)境的局部對象,僅存在于函數(shù)內(nèi)部蟀悦,這是函數(shù)背后的一個重要思想媚朦。

注意:也可以定義一個不需要任何參數(shù)、也不返回任何結(jié)果的函數(shù)日戈。

嘗試創(chuàng)建一個簡單的示例函數(shù)询张。此函數(shù)將以一個數(shù)值作為輸入,返回它的平方值作為結(jié)果浙炼。

square_it <- function(x) {
    square <- x * x
    return(square)
}

現(xiàn)在可以使用該函數(shù)份氧,與使用任何其他函數(shù)的方法相同。函數(shù)的名稱+括號鼓拧,括號內(nèi)輸入數(shù)值x

square_it(5)

很簡單吧半火?在這種情況下,我們只運(yùn)行了一行代碼季俩,但從理論上講钮糖,您可以使用多行代碼來獲取要“返回”給用戶的最終結(jié)果。在創(chuàng)建函數(shù)方面酌住,只涉及到了一點(diǎn)皮毛店归!我們將在以后的課程中再次探討這一點(diǎn),如果有興趣酪我,也可以在R-bloggers網(wǎng)站上找到更多詳細(xì)信息消痛,這是square_it例子改編的來源。

3.包和庫

是R函數(shù)都哭,數(shù)據(jù)和編譯代碼的集合秩伞,以明確定義的格式創(chuàng)建逞带,以添加特定功能。已經(jīng)超過10,000個用戶貢獻(xiàn)了R包纱新,這個數(shù)量還在不斷增長展氓。

有一組標(biāo)準(zhǔn)(或基礎(chǔ))軟件包被視為R源代碼的一部分,隨R軟件安裝一起提供脸爱∮龉基礎(chǔ)包包含R的基本函數(shù),是R運(yùn)行所必須的簿废,并對數(shù)據(jù)集標(biāo)準(zhǔn)統(tǒng)計(jì)和繪圖的函數(shù); 到目前為止我們在示例中使用的所有函數(shù)都屬于基礎(chǔ)包空入。

R中存儲包的目錄稱為。術(shù)語有時用作同義詞族檬,社區(qū)中已有關(guān)于這個問題的討論歪赢。使用library()函數(shù)加載包有點(diǎn)不符合預(yù)期,可以看看為何會引起困惑导梆。

在控制臺中輸入以下代碼轨淌,來檢查當(dāng)前R會話中加載的庫:

sessionInfo() #輸入R的版本信息、系統(tǒng)看尼、attach或加載的R包

# OR

search() #Gives a list of attached packages

在本次課程中,我們向您介紹了標(biāo)準(zhǔn)基礎(chǔ)包的函數(shù)盟步。但是使用R的次數(shù)越多藏斩,就越會意識到R是個聚寶盆,收集了非常多R包却盘,提供了各種各樣的函數(shù)狰域。要使用其他軟件包,需要安裝黄橘≌桌溃可以從CRANBioconductor存儲庫安裝很多軟件包。

(1) 從CRAN安裝包

CRAN是一個存儲庫塞关,除了數(shù)千個不同用戶貢獻(xiàn)的R包的源代碼之外抬探,還提供了最新的R(和舊版本)的下載地址。

image

可以使用install.packages函數(shù)從CRAN安裝R包帆赢。此函數(shù)將從CRAN鏡像上下載源代碼小压,并在您的計(jì)算機(jī)上本地安裝軟件包(以及依賴項(xiàng))。

下面給出了稍后創(chuàng)建圖表所需的包ggplot2的示例椰于。運(yùn)行此代碼進(jìn)行安裝ggplot2怠益。

install.packages("ggplot2")

(2) 從Bioconductor安裝包裝

或者,也可以從Bioconductor安裝包瘾婿,Bioconductor是另一個R包存儲庫蜻牢,提供分析和理解高通量基因組數(shù)據(jù)的工具烤咧。這些包包括(但不限于)用于統(tǒng)計(jì)分析,注釋包和訪問公共數(shù)據(jù)集的工具抢呆。

許多軟件包從CRAN和Bioconductor中都可獲得髓削,也有的軟件包只存放于一個存儲庫《迫ⅲ可以通過Google搜索或反復(fù)嘗試來查找R包的來源信息立膛。

要從Bioconductor安裝R包,首先需要安裝BiocManager梯码。BiocManager只需要安裝一次宝泵。

# DO NOT RUN THIS!

install.packages("BiocManager")

然后,您可以通過在install()中輸入包名(注意加引號)來安裝包轩娶。在這里儿奶,我們通過Bioconductor 安裝和剛才一樣的ggplot2

# DO NOT RUN THIS!

library(BiocManager)
install("ggplot2")

(3)從源代碼安裝包

最后,R包也可以從源代碼安裝鳄抒。當(dāng)沒有Internet連接(并且在本地?fù)碛性次募r闯捎,這種方法很有用,因?yàn)槠渌麅煞N方法是從遠(yuǎn)程站點(diǎn)檢索源文件许溅。

要從源代碼安裝瓤鼻,也是用install.packages函數(shù),但是添加了其他參數(shù):

# DO NOT RUN THIS!

install.packages("~/Downloads/ggplot2_1.0.1.tar.gz", type="source", repos=NULL)

(4)加載包

安裝軟件包后贤重,可以將包加載到R會話中茬祷,就可以使用該包中的任意函數(shù),就像用基礎(chǔ)函數(shù)一樣并蝗。請注意祭犯,此處不需要引號。

library(ggplot2)

sessionInfo()或檢查當(dāng)前環(huán)境中加載的內(nèi)容滚停,search()應(yīng)該看到您的包列為:

other attached packages:
[1] ggplot2_2.0.0

還有幾個其他包也隨ggplot2加載沃粗。

(5)查找某個包內(nèi)的函數(shù)

第一次使用ggplot2,如何知道從哪里開始键畴、可以使用哪些函數(shù)最盅?一種方法是使用RStudio中的選項(xiàng)卡Package。如果單擊選項(xiàng)卡镰吵,您將看到列出的所有已安裝的軟件包檩禾。對于已加載的包,您將在旁邊的框中看到藍(lán)色復(fù)選標(biāo)記疤祭。向下滾動到列表中的ggplot2

如果已成功加載盼产,將看到ggolot2前面的復(fù)選框,如上面的屏幕截圖所示∩坠荩現(xiàn)在戏售,如果您單擊ggplot2侨核,RStudio將打開幫助頁面,您可以滾動瀏覽灌灾。

另一種方法是在線查找?guī)椭謨源暌耄@種手冊有時更容易理解。例如锋喜,http://docs.ggplot2.org/current/是ggplot2更加全面的操作手冊些己,這是谷歌搜索的結(jié)果。許多Bioconductor軟件包有實(shí)用的圖文教程嘿般,還提供可用的示例數(shù)據(jù)段标。

(6)查找函數(shù)但不知道它是哪個包

如果您正在尋找執(zhí)行特定任務(wù)的函數(shù),您可以使用help.search()但只能搜索你已安裝的軟件包):

help.search("scatter")

如果找不到所需內(nèi)容炉奴,可以使用rdocumention.org網(wǎng)站搜索所有可用軟件包中的幫助文件逼庞。

(7)奇怪的報錯

很可能其他人已經(jīng)遇到過同樣的問題了!

  • 首先谷歌搜索報錯消息瞻赶。但不一定有用赛糟,因?yàn)橥ǔG闆r下,包開發(fā)人員直接使用R自帶的報錯方式砸逊。最終收到的報錯信息可能對診斷問題沒有多大幫助(例如“subscript out of bounds”) 璧南。

  • stackoverflow。使用[r]標(biāo)簽搜索痹兜。大多數(shù)問題能找到答案穆咐,但是要用對關(guān)鍵詞:http://stackoverflow.com/questions/tagged/r


練習(xí)

ggplot2軟件包是tidyverse集成軟件包套件的一部分,旨在協(xié)同工作字旭,使通用數(shù)據(jù)科學(xué)操作對用戶更加友好。我們將tidyverse在以后的課程中使用該套件崖叫,所以讓我們安裝它遗淳。注意:此套件僅存放于CRAN。


4.尋求幫助

要獲得某人幫助心傀,關(guān)鍵是讓對方迅速理解你的問題屈暗。應(yīng)該盡可能簡單明了地描述問題。

(1) 要使用正確的關(guān)鍵詞來描述你的問題脂男。例如养叛,包與庫不同。有的人能理解你的意思宰翅,也有人會覺得有歧義弃甥。關(guān)鍵是,試圖幫你的人可能看不懂汁讼。描述問題要盡可能精確淆攻。

(2) 始終包括sessionInfo()的輸出結(jié)果阔墩,因?yàn)樗峁┠愕钠脚_關(guān)鍵信息,R的版本瓶珊、正在使用的軟件包啸箫,以及其他有助于理解你的問題的信息。

sessionInfo()  #This time it is not interchangeable with search()

(3) 盡量用小的data.frame 重現(xiàn)并描述你的問題伞芹, 不要用原來成千上萬行列的數(shù)據(jù)忘苛。對你的問題進(jìn)行歸納總結(jié),有助于其他領(lǐng)域的人理解這個問題唱较。
* 要將對象共享給其他人扎唾,可以將原始文件(即CSV文件)和腳本一起提交上去(并刪除與問題無關(guān)的內(nèi)容)。如果你處理的不是data.frame绊汹,則可以將環(huán)境中的任何R數(shù)據(jù)結(jié)構(gòu)保存到文件中:

# DO NOT RUN THIS!

save(iris, file="/tmp/iris.RData")

.RData文件不能直接讀取稽屏,無法直接在stackoverflow上發(fā)布。但可以通過電子郵件發(fā)送給你要求助的人:

# DO NOT RUN THIS!

some_data <- load(file="~/Downloads/iris.RData")

在哪里尋求幫助西乖?

  • 友好的同事:你認(rèn)識的比你經(jīng)驗(yàn)豐富的人狐榔,可能并愿意幫助你。

  • Stackoverflow:如果問不到答案获雕,就精心組織你的問題發(fā)到Stackoverflow薄腻,很可能不到5分鐘就得到答案。

  • R-help:很多人(包括R核心團(tuán)隊(duì)的大部分人)會閱讀届案、發(fā)布庵楷,但相當(dāng)“干”(干貨的干),新手不一定能看懂楣颠。如果你的問題是有效的尽纽,你可能會很快得到一個答案,但你還是不一定能看懂??童漩。此外弄贿,這里更強(qiáng)調(diào)措辭正確(否則很可能被指出措辭不當(dāng),而非得到問題答案)矫膨。如果問題是關(guān)于base包差凹,會收到比擴(kuò)展包問題更多的回復(fù)。

  • Bioconductor的支持網(wǎng)站侧馅。非常有用危尿,如果你的帖子加上標(biāo)簽,很可能收到開發(fā)者給的答案馁痴!

  • 如果你的問題是關(guān)于擴(kuò)展包的谊娇,可以先看這個包有沒有mailing list。通常包含在包的DESCRIPTION文件中弥搞,用packageDescription("name-of-package")函數(shù)可以獲取邮绿∏裕可以嘗試直接通過電子郵件發(fā)送給包的作者

    希望Y叔不要打我

  • 還有一些特定于主題的mailing list(GIS船逮,系統(tǒng)發(fā)育等)顾腊,完整列表在http://www.r-project.org/mail.html

*本課程由Harvard Chan Bioinformatics Core (HBC)
的教學(xué)團(tuán)隊(duì)成員開發(fā)挖胃,中文版由簡書ID@小潔忘了怎么分身(公眾號@生信星球)整理杂靶。
(抱歉昨天對生物信息中心的中文翻譯有誤,公眾號無法修改酱鸭,但簡書中修改了吗垮。)
微信公眾號生信星球同步更新我的文章,歡迎大家掃碼關(guān)注凹髓!


我們有為生信初學(xué)者準(zhǔn)備的學(xué)習(xí)小組,點(diǎn)擊查看??
想要參加我的線上線下課程烁登,也可加好友咨詢??
如果需要提問,請先看生信星球答疑公告

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔚舀,一起剝皮案震驚了整個濱河市饵沧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赌躺,老刑警劉巖狼牺,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異礼患,居然都是意外死亡是钥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門缅叠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悄泥,“玉大人,你說我怎么就攤上這事肤粱÷肱ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵狼犯,是天一觀的道長。 經(jīng)常有香客問我领铐,道長悯森,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任绪撵,我火速辦了婚禮瓢姻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘音诈。我一直安慰自己幻碱,他們只是感情好绎狭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布褥傍。 她就那樣靜靜地躺著儡嘶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恍风。 梳的紋絲不亂的頭發(fā)上蹦狂,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機(jī)與錄音朋贬,去河邊找鬼凯楔。 笑死,一個胖子當(dāng)著我的面吹牛锦募,可吹牛的內(nèi)容都是我干的摆屯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼糠亩,長吁一口氣:“原來是場噩夢啊……” “哼虐骑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起削解,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤富弦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后氛驮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腕柜,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年矫废,在試婚紗的時候發(fā)現(xiàn)自己被綠了盏缤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蓖扑,死狀恐怖唉铜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情律杠,我是刑警寧澤潭流,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站柜去,受9級特大地震影響灰嫉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗓奢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一讼撒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦根盒、人聲如沸钳幅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敢艰。三九已至,卻和暖如春厂榛,著一層夾襖步出監(jiān)牢的瞬間盖矫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工击奶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辈双,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓柜砾,卻偏偏與公主長得像湃望,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痰驱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345