學(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í)
-
mean()
也是個常用的基礎(chǔ)函數(shù)。使用此函數(shù)計(jì)算glengths
向量的平均值镊逝。 - 從幫助文檔中學(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=TRUE
(rm
代表刪除)狸眼。在某些特定情況下,有必要從向量中刪除缺失值浴滴。為此拓萌,
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ù)狰域。要使用其他軟件包,需要安裝黄橘≌桌溃可以從CRAN或Bioconductor存儲庫安裝很多軟件包。
(1) 從CRAN安裝包
CRAN是一個存儲庫塞关,除了數(shù)千個不同用戶貢獻(xiàn)的R包的源代碼之外抬探,還提供了最新的R(和舊版本)的下載地址。
可以使用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ā)送給包的作者。
還有一些特定于主題的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)擊查看??
想要參加我的線上線下課程烁登,也可加好友咨詢??
如果需要提問,請先看生信星球答疑公告