介紹
WGCNA官網(wǎng)教程第一部分的第二個腳本FemaleLiver-02-networkConstr-auto.R
中用到的labels2colors
函數(shù)解讀
表達式:moduleColors = labels2colors(net$colors)
后面的腳本中 moduleColors
被視為與基因順序相同惯退,
目的是為了看moduleColors
與net$colors
的順序是否一一對應(yīng)铣口。
net$colors
簡介
> net$colors %>% head(20)
MMT00000044 MMT00000046 MMT00000051 MMT00000076 MMT00000080
0 1 1 17 4
MMT00000102 MMT00000149 MMT00000159 MMT00000207 MMT00000212
12 5 6 7 1
MMT00000231 MMT00000241 MMT00000268 MMT00000283 MMT00000334
1 4 4 5 1
MMT00000365 MMT00000368 MMT00000373 MMT00000384 MMT00000401
4 4 2 2 2
函數(shù)式與解讀
根據(jù)moduleColors=labels2colors(net$colors)
表達式進行解析适瓦。
> labels2colors
function (labels, zeroIsGrey = TRUE, colorSeq = NULL, naColor = "grey",
commonColorCode = TRUE)
{
# 1 if
if (is.null(colorSeq)) #真郎逃,未定義該值
colorSeq = standardColors() #執(zhí)行,standardColors()為WGCNA定義的顏色函數(shù)册招,默認返回一個值為435個顏色的向量搀突。
# 2 if
if (is.numeric(labels)) { #真,labels為數(shù)值
# 2.1 if
if (zeroIsGrey) #真根时,默認
minLabel = 0 #執(zhí)行,獲取值辰晕,minLabel = 0
else minLabel = 1
# 2.2 if
if (any(labels < 0, na.rm = TRUE)) #假蛤迎。
minLabel = min(c(labels), na.rm = TRUE) # 上面if 省略了{},是單行表達式!I∏邸!坑2跄取3稀!
nLabels = labels #執(zhí)行召川,注意這句與2.1 if和 2.2 if并列南缓。該句在2 if為真的判斷內(nèi)。這個縮進真的不太好觀察荧呐。????
}
else { #跳過
# 2.3 if
if (commonColorCode) {
factors = factor(c(as.matrix(as.data.frame(labels))))
nLabels = as.numeric(factors)
dim(nLabels) = dim(labels)
}
else {
labels = as.matrix(as.data.frame(labels))
factors = list()
for (c in 1:ncol(labels)) factors[[c]] = factor(labels[,
c])
nLabels = sapply(factors, as.numeric)
}
}
# 3 if
if (max(nLabels, na.rm = TRUE) > length(colorSeq)) { #此處nLabels = labels汉形,max(nLabels, na.rm = TRUE) 返回最大模塊數(shù)值18纸镊,length(colorSeq) = 435,假概疆!跳過
nRepeats = as.integer((max(labels) - 1)/length(colorSeq)) + 1
warning(paste("labels2colors: Number of labels exceeds number of avilable colors.", "Some colors will be repeated", nRepeats, "times."))
extColorSeq = colorSeq
for (rep in 1:nRepeats) extColorSeq = c(extColorSeq,
paste(colorSeq, ".", rep, sep = ""))
}
else { #真逗威,執(zhí)行
nRepeats = 1 #這個有啥用啊岔冀?下面函數(shù)沒用到呀凯旭!
extColorSeq = colorSeq #colorSeq 為長度435的顏色向量,
}
colors = rep("grey", length(nLabels)) #length(nLabels)等于基因數(shù)目3600使套,生成3600個重復(fù)的"grey"
fin = !is.na(nLabels) #非NA的值為TRUE罐呼,3600 個TRUE的邏輯向量。(!is.na(moduleLabels)) %>% table()
colors[!fin] = naColor #反轉(zhuǎn)向量fin侦高,缺失值NA為TRUE嫉柴,提取所有為TRUE的值,轉(zhuǎn)換為naColor,默認為"grey"奉呛。#也就是說计螺,原來nLabels缺失值部分可以轉(zhuǎn)換默認的”grey“,也可以通過naColor轉(zhuǎn)換為其它配色侧馅。并不是無用危尿。因為默認naColor = "grey",所以這里的colors仍全部為”grey“
finLabels = nLabels[fin]
colors[fin][finLabels != 0] = extColorSeq[finLabels[finLabels != 0]]
# 4 if
if (!is.null(dim(labels)))
dim(colors) = dim(labels)
colors
}
<bytecode: 0x000002ac4939e770>
<environment: namespace:WGCNA>
支線函數(shù)
standardColors()
函數(shù)式
WGCNA自帶函數(shù)馁痴。
n指定輸出顏色個數(shù)谊娇,最大435。這個函數(shù)輸出的顏色罗晕,給我那29條的染色體济欢,這不就正好了嗎?找個這么長的顏色向量不容易小渊。
不太理解.GlobalStandardColors
含義法褥,猜測是WGCNA內(nèi)置內(nèi)容。
> standardColors
function (n = NULL)
{
if (is.null(n))
return(.GlobalStandardColors)
if ((n > 0) && (n <= length(.GlobalStandardColors))) {
return(.GlobalStandardColors[c(1:n)])
}
else {
stop("Invalid number of standard colors requested.")
}
}
<bytecode: 0x000002ac3026ca78>
<environment: namespace:WGCNA>
any(labels < 0, na.rm = TRUE)
此處為FALSE
any(labels < 0, na.rm = TRUE)
中l(wèi)abels為 net$colors
數(shù)值向量酬屉,向量由WGCNA內(nèi)函數(shù)安排半等,應(yīng)該不會有<0的值。
讀作:labels中去掉na值呐萨,然后與0作比較杀饵,如果有一個值<0則返回TRUE。
復(fù)現(xiàn) ??(繞暈了)
由于labels在base包中有同名函數(shù)谬擦。為了更好的重復(fù)切距,這里還是用了labels作為變量名稱。
第3個 if位置看蒙圈了惨远,復(fù)現(xiàn)下谜悟。這里加了0與NA话肖,向量labels = c(2,NA,1,0,2)
中非0非NA的值有重復(fù),修改naColor為非顏色值葡幸,防止混淆最筒。
# #數(shù)據(jù)準備
> labels = c(2,NA,1,0,2)
> names(labels) = rep(paste0("gene",1:4))
> naColor = "apple" #設(shè)置了一個非顏色設(shè)置
## 轉(zhuǎn)換
> labels
## gene1 gene2 gene3 gene4 gene5
## 2 NA 1 0 2
> nLabels = labels
# 準備colorSeq相關(guān)
> colorSeq = standardColors()
> head(colorSeq)
## [1] "turquoise" "blue" "brown"
## [4] "yellow" "green" "red"
> length(colorSeq)
[1] 435
> extColorSeq = colorSeq
# 最后的colors
> colors = rep("grey", length(nLabels))
> colors
# [1] "grey" "grey" "grey" "grey" "grey"
> fin = !is.na(nLabels)
> fin
## gene1 gene2 gene3 gene4 gene5
## TRUE FALSE TRUE TRUE TRUE
> colors[!fin] = naColor #定義原向量nLabels中為NA值對應(yīng)位置的顏色為naColor。
> colors
#[1] "grey" "apple" "grey" "grey" "grey"
> finLabels = nLabels[fin]
> finLabels
## gene1 gene3 gene4 gene5
## 2 1 0 2
> finLabels != 0 #觀察
## gene1 gene3 gene4 gene5
## TRUE TRUE FALSE TRUE
> colors[fin] #觀察
# [1] "grey" "grey" "grey" "grey"
> finLabels[finLabels != 0] #觀察
## gene1 gene3 gene5
## 2 1 2
> extColorSeq[finLabels[finLabels != 0]] #觀察礼患。按上面1是钥,2數(shù)值位置索引出顏色,也就是按非空缅叠,非0模塊基因索引出位置悄泥。
# 顏色向量順序與非空基因順序相同。
# [1] "blue" "turquoise" "blue"
> colors[fin][finLabels != 0]
# [1] "grey" "grey" "grey"
> colors[fin][finLabels != 0] = extColorSeq[finLabels[finLabels != 0]] #對非空非0的模塊編號進行重新配色肤粱,替換掉原來的grey
# 4 if
> dim(labels) #觀察
# NULL
> is.null(dim(labels))
# [1] TRUE
> if (!is.null(dim(labels))) #不執(zhí)行弹囚。
dim(colors) = dim(labels)
> colors
## [1] "blue" "apple" "turquoise"
## [4] "grey" "blue"
本節(jié)小結(jié):
第3個if的位置實現(xiàn)的是,對net$colors
中的0賦值為"grey"领曼,對net$colors
NA值賦值為了naColor鸥鹉,默認為"grey",也可以用其它值庶骄,這里設(shè)為了非顏色“apple”值毁渗。
另外這里對0值模塊的配色是通過將非0值finLabels != 0
重新配色給替換原"grey"完成的。檢驗NA賦值方式是通過將naColor賦值給非顏色值來探索单刁,以免與原顏色值重復(fù)灸异。
小結(jié)
WGCNA
中的standardColors()
函數(shù)輸出的配色字符向量長度為435,可以用作一個配色板羔飞。用層級標題的方式梳理if條件肺樟。
-
第3個if的位置實現(xiàn)的是,對
net$colors
中的0賦值為"grey"逻淌,對net$colors
NA值賦值為了naColor么伯,默認為"grey",也可以用其它值卡儒。另外這里對0值模塊的配色是通過將非0值
finLabels != 0
重新配色給替換原"grey"完成的田柔。