R語言的for循環支援任何向量(注意,是向量),無論向量是任何模式,如
x <- c(3,4,5)
for (n in x) print(n^2)
但是如果,我現在有兩個matrix,如下
u <- matrix(seq(1,16),ncol=2);u
v <- matrix(seq(17,28),ncol=2);v
我希望通過循環的方式,以每個matrix的兩列作為輸入做線性拟合, 如下
> lm(u[,1]~u[,2])
Call:
lm(formula = u[, 1] ~ u[, 2])
Coefficients:
(Intercept) u[, 2]
-8 1
于是我想當然:
for (m in c(u,v)){
lm(m[,1]~m[,2])
}
Error in m[, 1] : incorrect number of dimensions
我忘記了
c()
會把所有matrix降成一維,這就很尴尬了。這是因為R不支援對非向量集合的循環操作。如果想實作非向量集合的循環,隻能曲線救國,如lapply或get,這裡介紹get。
get(): 根據命名在環境中搜尋變量
get(x, pos = -1, envir = as.environment(pos), mode = "any",
inherits = TRUE)
pos, envir: 在哪裡搜尋,這個太複雜,不好展開
mode:定義搜尋的變量類型,如function, numeric等
一定要記住
get
,一個非常實用的函數,是以上面的for循環應該作如下改寫:
for (m in c("u","v")){
z <- get(m)
print(z)
}
于是,這解決了我昨天晚上遇到的問題。我打算對3個DESeq2的比較table進行過濾,
res1 <- results(dds, contrast = c("condition","Day1","Day0"),pAdjustMethod="fdr",alpha=0.05)
res2 <- results(dds, contrast = c("condition","Day2","Day0"),pAdjustMethod="fdr",alpha=0.05)
res3 <- results(dds, contrast = c("condition","Day3","Day0"),pAdjustMethod="fdr",alpha=0.05)
本來代碼長下面這個樣子,各種他提示錯誤:
for (res in c(res1,res2,res3)){
paste0(res, “SigUp”) <- subset(res, padj < 0.01 & log2FoldChange >0 )
}
我需要解決兩個問題:
一: 如何在for循環中增加變量名, 使用assign對非局部變量進行讀寫
二: 還有如何對非向量集合進行循環, 使用get擷取變量内容。
是以最後的代碼長這個樣子:
for (res in c("res1","res2","res3")){
m = get(res)
nam <- paste0(res,"SigUpt")
assign(nam, subset(m, padj < 0.01 & log2FoldChange >0 ))
}
其實可以用list,然後用lapply, 然後分别提取的。
resSigUp <- lapply(list(res1,res2,res3), subset, padj < 0.01 & log2FoldChange >0 )