主要從以下三方面去學習R語言函數與R包:
1.R語言函數:
形式參數
實際參數
默認參數
了解函數的方式
2.R包:
- 什么是R包
- 設置鏡像
- R包安裝
- R包加載
3.常見問題以及解決辦法
1.函數與參數
函數是括號前的英文字母或是單詞,不可以亂改,都是別人寫好的,使用到一定程度可以用function函數去創造屬于自己的函數,函數都會有幫助文檔。形式參數也是作者的成果,不能亂改,大多數形式參數是可以省略。
1.1 形式參數與實際參數
=
前面為形式參數,函數作者設計的,熟練后不用寫。=
后面是實際參數,使用者可改的。
seq(from=3,to=20,by=3)
##括號前面為函數seq,括號前面的英文字母都是函數。from、to、by為形式參數。
seq(3,20,3)
##熟練后可以把形式參數省略
1.2 寫函數的函數
jimmy <- function(a,b,m=2){
(a+b)^m
}
##1.開發函數的觀摩過程:jimmy為函數名稱,括號前面的英文字母都是函數名,a,b,m=2為形式參數,function的固定寫法,后面一定要跟著一個小括號和花括號。小括號里面放的是參數,是函數jimmy的參數,a,b為形式參數,m=2,2為m的默認值,如head函數的n默認值為6;花括號里的是開發過程中對這些參數使用了什么代碼,在使用任何人的函數,沒什么特殊情況,不需要看內部的拆解,就是不需要看花括號里寫了什么內容,只需要了解使用和參數就可以。(a+b)^m,a,b,m都應該是數值,為編寫函數的代碼。
##head()的默認參數為n;rnorm()的默認參數為mean,sd;pheatmap()的默認參數為cluster_rows = 且只有兩個選項F或T。?head()去查看幫助文檔,了解默認參數的值。
##2.使用過程
jimmy(a=1,b=2)
#[1] 9,(1+2)^2
##括號前是函數,使用一定要加括號,才能放參數值。
jimmy(1,2)
#[1] 9
##把a,b形式參數省略
jimmy(3,6)
#[1] 81 ,(3+6)^2
jimmy(3,6,-2)
#[1] 0.01234568
##(3+6)^-2,把m=2改為m=-2,如果給字符型會報錯
m2d=function(x){
mean(x)+2*sd(x)
}
m2d(rnorm(10))
#[1] 2.265964
1.3 復習函數繪圖plot()
函數繪圖plot():凡是一個數值型向量
都可以進行plot繪圖,數值型向量作為圖的縱坐標,向量的下標作為圖的橫坐標。
par(mfrow = c(2,2))
#把畫板分成四塊,兩行兩列
x = c(2,5,6,2,9);plot(x)
x = seq(2,80,4);plot(x)
x = rnorm(10);plot(x)
x = iris$Sepal.Length;plot(x)
思考:plot畫iris的前四列?
##iris是R語言內置的一個數據集,前4列為數值型。
plot(iris[,1])
plot(iris[,2])
plot(iris[,3])
plot(iris[,4])
plot(iris[,1],col = iris[,5])
plot(iris[,2],col = iris[,5])
plot(iris[,3],col = iris[,5])
plot(iris[,4],col = iris[,5])
##col =為加顏色,iris[,5],5為iris的第5列,有3個品種,每個品種重復50次,有多少個品種就給多少種顏色,顏色配色是默認的,可以修改。
當一個代碼需要復制粘貼三次,就應該寫成函數或使用循環
jimmy <- function(i){
plot(iris[,i],col=iris[,5])
}
jimmy(1)
jimmy(2)
jimmy(3)
jimmy(4)
##代碼的唯一差別是[,1]里的列1,2,3,4。
1.4 默認參數
凡是沒有說明,但是在代碼有一個取值的。作者會設計很多參數,但是只有前1-n個是必須填的,其他的參數都必須有默認值。
g<-function(x,y=2,z=T){...}
##y=2,z=T為形式參數,自己不喜歡,可以指定。如rnorm有3個參數,只寫一個參數,可以跑起來,對結果不滿意可以修改默認值。
1.5 了解函數的方式
1.5.1 查看幫助文檔和運行示例:?函數名
?read.csv
在幫助文檔里,了解函數的用法以及參數的詳細介紹,通過示例來快速了解函數
1.5.2 直接運行函數
ggplot
在腳本編輯器或是控制臺運行函數名,不需要加括號,會顯示函數所在的包,代碼,有的包含作者等信息。
2.R包(R package)
2.1R包是什么?
R程序包是多個函數的集合,具有詳細的說明和例子。
有的R包只有數據,沒有函數(如gtf或是基因的文件,使用時加載就可以)。
包含R函數,數據,幫助文檔,描述文件等。
按照一定的規則,存放到網站。
2.2 為什么要安裝R包?
特定的分析功能,需要用相應的程序包實現。
例如:作圖包ggplot2,差異分析包limma等。
使用到哪個包就去安裝和加載,知道要用的函數以及簡單使用規律,查看幫助文檔入門,統計學學到一定的程度,不要默認值,去指定值,這個過程可以調試。
目的不是學會某個具體的R包,而是找所有R包使用的規律。
2.3 R包都在哪里
通常來源三個網站
2.3.1 CRAN網站
該網站有最新R語言的軟件,也有一些最新的R包。在該網站下載的R包都用install.package()
去安裝。
install.package()
2.3.2 Bioconductor網站
該網站含有和生物,生信相關的R包,如limma包。用BioManager::install()
去安裝,2018年以前寫的生信教程,安裝該網站上的包用Bioclnstall::biocLite(),現在不能使用了,但是有些代碼能用,比如limma每年更新,只是在細節上。現在該網站上的包統一用以下的安裝方式:
BioManager::install()
2.3.3 Github網站
CRAN網站和Bioconductor網站的包是有專人管理,開發者把代碼都是經過調試,提交和審核。而github網站的包是沒人管理,包其實一般沒什么問題。安裝方式devtools::install_github()
,安裝方式與前兩者不一樣,因為沒人審核,R包名可能會重復,所以安裝R包時得加上用戶名:用戶名/R包名
devtools::install_github(“jmzeng1314/idmap1”)
2.4 R包怎么安裝和加載
2.4.1 R包怎么安裝
每一個包是從哪里來的,就決定它是用什么代碼去安裝,安裝R包時,包的名字加引號
- 常用三種在線方式安裝R包:
###1.CRAN:
install.package()
install.package("stringr")
###2.Bioconductor
BioManager::install()
BioManager::install("ggplot2")
###3.Github
devtools::install_github()
devtools::install_github(“jmzeng1314/idmap1”)
問題:作為初學者,沒有接觸過的R包,不知道這個R包從哪里來?
先用前兩種安裝方式試試,Github上的R包是沒法試的,用必應或是百度搜索,R包是從哪里來,再從以上3種安裝方式選對應的方式安裝。
- 本地安裝:
有一些R包非常,如存放注釋信息的R包,有六百多MB,用鏡像下載非常慢,可以先下載到本地電腦,在本地安裝。這種情況非常少見,如:
devtools::install_local("TCGAmutations-master.zip")
2.4.2 R包怎么加載
安裝R包后需要加載,沒有安裝過的包是沒法加載的,才能使用里面的函數,加載R包時,包名不需要加引號
。
常用的加載方式:library()
library(stringr)
##加載R包,包名不要引號,常用的加載方式,是檢查是R包否安裝成功的標準
require(stringr)
##另一種加載R包的函數:require()
R包安裝一次就可以,每次打開新的session(Rstudio窗口)都要加載需要用到的R包。
2.5 怎么樣實現R包快速下載
鏡像網站相當于主網站的副本,訪問主網站存在障礙時,訪問鏡像網站也可。
R和Bioconductor主網站位于國外,選擇國內的鏡像可加快訪問速度。
2.5.1 國內鏡像推薦:
清華鏡像(TUNA,Beijing)
http://mirrors.tuna.tsinghua.edu.cn/CRAN/
http://mirrors.tuna.tsinghua.edu.cn/bioconductor/中科大鏡像(USTC,Hefei)
http://mirrors.ustc.edu.cn/CRAN/
http://mirrors.ustc.edu.cn/bioc/
兩個鏡像可以選擇用,在國外不需要設置國內鏡像,看看下載速度怎么樣,需不需要設置鏡像。
2.5.2 設置鏡像的方法:
- 方法1:Rstudio設置
缺點,只能設置CRAN鏡像,不能設置Bioconductor鏡像
- 方法2:代碼設置
缺點:只能用一次,每次重啟session(Rstudio窗口)安裝R包時需要運行,對于新手把這兩句代碼放到網頁筆記里比較方便查找,不要嫌麻煩,并不是每天需要裝包。一般裝一兩個R包只要網絡沒問題,從官方網站下載也可以。(有永久性辦法,但是會對一些電腦配置有影響)
options("repos"=c(CRAN="http://mirrors.tuna.tsinghua.edu.cn/CRAN/"))
options(BioC_mirror="http://mirrors.ustc.edu.cn/bioc/")
2.6 R包安裝和使用邏輯
2.6.1 安裝包--加載包--使用包里的函數
順序亂了就會報錯:找不到函數(could not find function...),不存在包叫'syringr‘等。
某些包在安裝過程中會出現一大堆提示信息,只要不出現Error就不用理會。
安裝之后里立即library(),有時會出現一大堆信息,只要不出現Error就不管。
安裝同一個網站上的多個R包時,可以c()函數,把多個包放進去,一次性安裝。但是加載時,不能一次加載多個包,一次只能加載一個包。
2.6.2 已安裝、不加載,快速使用
::
前面是一個包的名字,::
后面是一個函數的名字,兩者的聯系是一個從屬關系。用::
這種方式去安裝R包,就不需要使用library。
BioManager::install()
dplyr::filter()
devtools::install_github()
報錯沒有BioManager和devtools的解決辦法:
install.packages("tidyr")
install.packages('BiocManager')
BiocManager::install("ggplot2")
install.packages('devtools')
devtools::install_github("jmzeng1314/idmap1") #括號里寫作者用戶名加包名
2.7 常見疑問
2.7.1 大片提示信息
安裝和加載包是,看到一大片提示信息:
解決辦法:檢查是否有Error,沒有就忽略,說明加載成功。
2.7.2 package not available
100%會遇到,導致的原因有:
原因1:包名寫錯(包沒有安裝是沒法用tab鍵自動補齊的,容易寫錯)
原因2:安裝命令使用錯誤(最常見,CRAN的包用了Bioconductor的安裝方式,如GSVA包)
原因3:本機的R語言版本與包所要求的版本不符(極少)
R語言版本99%的情況下是沒有問題,但它總是無辜被懷疑。一般4到5年沒更新,有些R包沒法裝上才可能出現問題。
原因4:包過時被剔除了
去網頁查找Depends:R(>4.0.0),如果說明包的使用是要求版本的,使用的R語言沒有達到版本會報錯。更新R語言就如剝一層皮,如果非要用,可以不用更新R語言,就在該包的頁面上找歷史版本。如果R語言版本太舊,就更新。
有些包不更新也不維護,依賴的包動了小細節,包也會報錯,代碼兼容性差一些,CRAN,Bioconductor會把這樣的包移除掉,導致曾經這個包能用,現在是不能用的。CRAN(archive),Bioconductor(Removed Packages),從網頁上搜這個包有沒有過時,如果還能找到正常的頁面,還能點進去告知怎么安裝,還處在一個相對正常的話那就能用的。只有極少數的包會被移除,如birta,大多數包能正常使用。
2.7.3 是否更新
- 最后出現提示信息:Update all/some/none? [a/s/n]:
懶惰策略:能不更新就不更新,除非一直報錯,優先輸入n,出現問題再輸入a,不要選s。
不想回答:安裝命令加參數:update=F,ask=F,特別是批量安裝R包時,因為更新也更新不出來什么東西。只要安裝時不出現一大堆R包有問題,R語言版本就不管,比如用的是3.9,現在是4.2,一年或是兩年后出現5再考慮。
”學R語言要高冷,能no就no,no不行要yes;學Linux要聽話,讓你yes你就yes“--from 小潔老師
2.7.4 加載A包,報錯B包不存在
依賴的包,都要安裝,先安裝報錯提示不存在的包(不存在誰安裝誰,缺啥補啥)
R包之間存在復雜的依賴關系
使用A包,就必須同時用B、C,而C又依賴D包。
大多數情況下:
安裝A,就會自動安裝BCD包
加載A,就會自動加載BCD包
也會有一部分包會出錯。
2.7.5 依賴包的版本不夠新
卸載更新,就是重新下載
小規律:安裝和加載過程中的報錯信息,注意看引號""
,引號里大多是依賴包的名字
更新一個包:重新安裝,或先刪除再重新安裝。
更新所有的包:update.packages(),括號里什么都不寫,更新會花很長時間。
2.7.6 報錯中有connection或url,404,http
網絡限制了你的進步(報錯中有connection或url,404,http,是網絡問題)
網絡問題有很多種原因:
不聯網不能下載R包。
校園網限制時,換成手機熱點。
鏡像沒有設置,從國外網下載,比較慢。
鏡像崩了,可能性很小。
可能使用非法的軟件。
- 解決:換個時間,換個網絡。
2.7.7 分情況討論
if(!require(stringr))install.packages("stringr")
##require(stringr)加載包。
as.logical(require(ggplot2))
Loading required package: ggplot2
#[1] TRUE,返回TRUE說明包能成功加載,FALSE表示不能成功加載。
require和library可以加載包,它們之間有一個差別,require可以被轉變為一個邏輯值。
已安裝,加載成功:require(包)返回TRUE;!require(包)返回FALSE。
未安裝,加載失?。簉equire(包)返回FALSE;!require(包)返回TRUE。
if(FALSE) 則后面的代碼被跳過,不安裝
if(TRUE) 則后面的代碼被執行,安裝
已安裝,則不安裝
未安裝,則安裝
2.8 R包的使用場景
某流程代碼中用到某些包(正常安裝后加載)
學繪圖,用到ggplot2(非常優秀的包,需要單獨系統學習,枝干上的一些知識點學完就可以學習無數的R包,其它包不需要單獨學習)
別人的人代碼套自己的數據,報錯不會改(沒有基礎上容易出現的問題,需要比較自己的數據和別人的數據區別是什么,從R語言上講,一個是數據類型,一個是數據結構,只要保證這兩個沒問題,一般沒什么問題。)
大多數包里的函數規律一致,不需要單獨學習,用到哪個函數學哪個函數
一般?包名
,注意函數的形式參數、實際參數以及默認參數。
- 少部分包里的函數自有語法,例如ggplot2,dplyr等。
2.9 R包如何使用-獲取幫助
2.9.1 快速查看函數幫助文檔
問號函數名,問號包,如?ggplot
,?sd
,有的包不寫幫助文檔。
2.9.2 找R包介紹頁面(直接搜)
- 直接到官網搜索或是其它網站。
- Limma官網
https://bioconductor.org/packages/release/bioc/html/limma.html
也可以在google和必應上搜別人的中文教程
2.9.3 Vignettes 在線教程
- 不是所有的R包都有Vignettes在線教程,得運行后才知道有沒有。
browseVignettes("stringr")
##運行后彈出網頁
- 點擊查看介紹
作者給了入門教程,這種優秀包的教學很多都被翻譯成中文教程,發布在各個中文網頁上,自己可以向別人學習。
2.9.4 少數R包有cheatsheets
cheatsheets:小抄,速查表。如RStudio Cheatsheets
會告訴包里面都有哪些函數以及每個函數怎么用的。
- 搜索RStudio Cheatsheets,官網如下:
https://www.rstudio.com/resources/cheatsheets/
2.10 補充知識點
列出一個包里都有哪些函數或是數據:ls("package:包名")
,一定要先library()
library(stringr)
ls("package:stringr")
##查看一個包有哪些函數,方便學習
rm(list = ls())
a = 1
b = 2
ls()
#[1] "a" "b"
##把環境里的幾個變量名稱組成一個向量
library(ggplot2)
ls("package:ggplot2")
3 總結
3.1 R語言里的符號
()
函數
[]
向量、數據框、矩陣取子集
[[]]
列表取子集
$
數據框取列,列表取子集
=
, <-
賦值,=
除了賦值符號,也可以做形式參數和實際參數的連接,
==
判斷是否相等
!
否定
{}
多行代碼,如function后面
#
注釋
""
字符串,單引號或是雙引號都可以
::
包::
函數,一個包里面的函數,在不加載包的情況下使用它。
@
符號對象,和$
差不多,@
是給對象取元素或是子集,用$
還是用@
主要是里面的結
構,對比使用再決定使用哪一個。
3.2 解決問題的正確姿勢
遇到一個問題:如報錯,異常值等,檢查代碼是否有問題。
環境問題,找不到對象,考慮引號和賦值等情況,文件是不是在工作目錄下,看不懂是什么報錯,重啟是一種神奇地解決辦法。
數據:之前的代碼能運行,換了一個數據后,代碼不能運行,檢查數據有什么不同,數據結構,數據類型,異常值。
搜報錯:把報錯信息直接貼到谷歌或是必應搜索。
有效提問:讓問題具體化一些。
3.3 認清楚函數和數據
函數:在括號前的英文字母或是字母組合,對陌生的函數,用?函數名
調用幫助文檔,里面的示例方便理解。
形式參數:熟練函數的用法,形式參數可以省略。
實際參數是出現最多遍的東西:更換數據,畫圖的設置
文件名(數據):R語言代碼里經常會出現文件名字以字符串的名字出現在實際參數的位置上。而且實際參數所在的函數,必須是能夠識別這種文件名,能夠處理文件名
數據框或是矩陣以及列表:數據框或是矩陣的標志[ ];列表的標志[[ ]]。
R包library的括號里,library(),括號里肯定是R包。
說明
以上內容是聽生信技能樹小潔老師的R語言線上課,根據自己的理解記錄下來,小潔老師授課非常細心,對不同水平的同學都照顧到,并且補充很多技巧以及注意事項。
成功安裝R包是順利分析第一步,記住小潔老師說的多搜一搜,多試一試,找到正確安裝R包的方法,函數才能順利調用處理數據和作圖。