do.call这个函数是我在搜索问题时会看到别人经常使用的一个函数,心生好奇,这次来看看它的用法。 从文档来看,do.call可以通过名字构建和执行函数,并且将参数以列表的形式传入。 Description do.call constructs and executes a function call from a name or a function and a list of arguments Usage do.call(what, args, quote = FALSE, envir = parent.frame()) Arguments what either a function or 例子 # 生成一个复数序列 do.call("complex", list(imag = 1:3)) ## [1] 0+1i 0+2i 0+3i # 如果我们有一个列表(比如数据框) # 我们需要使用 do.call(f, list(A), envir = env) ## [1] 2 # 使用env环境函数与env环境变量 do.call("f", list(quote(A)), envir = env
R 中的 do.call() 是我极少用到的一个函数,不过它在很多情况下是蛮有用的,之前我也做过简单的介绍。 它可以在实际调用函数时将参数以列表的形式传入,下面是一个简单的函数: f <- function(x) print(x^2) 我们可以用下面的方式调用 do.call(): do.call(f, list 最近我需要批量更新参数时发现了 do.call() 的好用之处。 在批量建模时可能需要比较对建模函数设定不同的参数,我们以求和函数作为建模函数举例。 我们来看看 do.call() 如何解决这个问题。
这个读取及合并操作可以使用lapply和do.call来完成。 示例如下: ###1. ,b=x,c=x) write.table(df, file=paste0("test/",x,".txt"), row.names = F) }) ###2. lapply读入6个文件,并使用do.call list.files("test", full.names = T)%>%lapply(function(x){ read.table(x, header = T) }) # 使用rbind合并 do.call 这个方法很好用,有一个小问题:当数据的列名不一样时,rbind会报错,比如: # 更改第一个数据框的列名为"d" "e" "f" colnames(file_list[[1]])<-c("d","e","f") do.call previous names 这个时候,可以手动打开原文件,然后修改列名,也可以将数据框转换为matrix,比如: file_mat <- lapply(file_list, as.matrix) do.call
#do.call函数在数据框中执行函数(函数,数据列) library("plyr") #加载获取rbind.fill函数 #第一种方法 list1<-list() list1[[1]]=data.frame (t(data.frame(Job_Pwordseg.ct[1]))) list1[[2]]=data.frame(t(data.frame(Job_Pwordseg.ct[2]))) do.call( 1]))),data.frame(t(data.frame(Job_Pwordseg.ct[2])))) 核心函数是plyr包中的rbind.fill函数(合并的数据,必须是data.frame),do.call (do.call用法) 关于do.call其他用法(R语言 函数do.call()使用 ) 有一个list,想把里面的所有元素相加求和。 (sum,list) list.sum<-do.call(cbind,list) do.call() 是告诉list一个函数,然后list里的所有元素来执行这个函数。
] <- raster(tif_file_name[i]) } tif_file_list$fun <- max tif_file_list$na.rm <- TRUE tif_mosaic <- do.call (mosaic, tif_file_list) plot(tif_mosaic) # tif_merge <- do.call(merge, tif_file_list) rf <- writeRaster 这样操作无疑是比较麻烦的,因此我们需要借助do.call()函数来实现2个以上栅格的拼接工作——这个do.call()函数可以接受可变数量的参数,例如本文中我们需要对大量栅格遥感影像加以逐一拼接,具体有多少景遥感影像我们自己也不一定确定 ,且也不关心;因此就结合这一函数,将刚刚已经转为栅格对象(Raster* object)类型的图像所组成的列表tif_file_list作为参数,用do.call()函数来调用mosaic()函数,直到将 tif_file_list列表中全部的栅格对象(Raster* object)类型的元素都带入到mosaic()函数运行后,do.call()函数就结束了。
(cox.zph_res.sum) <- c("OS_YEARS", "cox.zph_p") } cox.zph_OK[[DS]] <- cox.zph_res.sum } } do.call (rbind, cox.zph_OK) max_year <- min(do.call(rbind, cox.zph_OK)[,1]) #分别对每个数据集进行Cox回归分析 split_data <- (rbind, Myo_LUAD_Zscores)[,1], p = do.call(rbind, Myo_LUAD_Zscores)[,2] , SubPop = "Myo", DS = rownames(do.call(rbind (rbind, Myo_LUSC_Zscores)[,1], p = do.call(rbind, Myo_LUSC_Zscores)[,2]
result=list() x <- c(5,6,0,3) s = 0 for (i in 1:length(x)){ s=s+x[[i]] result[[i]]=c(x[[i]],s) 补充do.call ——批量操作 do.call(cbind,result) #批量将result结合成一个矩阵,进行简化
提供的解决方案有两种: do.call(setdiff, strsplit(c(a, b), split = "")) # 或者 Reduce(setdiff, strsplit(c(a, b), split > do.call(setdiff, strsplit(c("ATA", "AAA"), split = "")) [1] "T" > Reduce(setdiff, strsplit(c("ATA", > Reduce(setdiff, strsplit(c("AAA", "ATA"), split = "")) character(0) > do.call(setdiff, strsplit(c("
for循环for(i in 1:length(fs)){ re[[i]] = read.delim(paste0("GSExxx_RAW/",fs[i]),row.names = 1)}re2 = do.call 隐式循环+自定义函数re = lapply(fs, function(f){ read.delim(paste0("GSExxx_RAW/",f),row.names = 1)})re2 = do.call
min.cells = 5, min.features = 300 ) return(sce)}) do.call do.call(rbind, lapply(sceList, dim))lapply(sceList, dim):lapply 函数遍历 sceList中的每个Seurat对象,并对每个对象应用 dim do.call(rbind, ...):do.call 函数将 lapply 返回的结果(每个对象的维度)按行绑定(rbind),生成一个矩阵,矩阵的每一行对应一个样本的数据维度。 min.cells = 5, min.features = 300 ) return(sce)}) do.call min.cells = 5, min.features = 300 ) return(sce)}) do.call
step3: 计算各个基因在各个癌症的均值 # 但是突然间发现,下面的代码难度更高了: sm = do.call(cbind, lapply(dat_list, function(x) df2, 1, function(x) sum(x>0)) tmp_list= split(names(n_genes),n_genes) lapply(tmp_list, length) ordd=do.call (c, lapply(tmp_list, function(cg){ # cg=tmp_list[[1]] ord=do.call(c,lapply F, show_rownames = T, show_colnames = F) p2 df3=sm[specific_genes,] ord=do.call
lapply(fs, function(i){ read.table(file.path('GSE123005_RAW/',i),header = T) }) lapply(dat, head) do.call (rbind,lapply(dat, dim)) 可以看到,确实是每个txt的行数不一样哦: > do.call(rbind,lapply(dat, dim)) [,1] [,2] [ duplicated(x[,1]),] rownames(x)=x[,1] x }) ids=unique(unlist( lapply(dat,rownames))) df = do.call
names(tmp), function(x){ rep(x,length(tmp[[x]])) })),sep='_') , gene=unlist(tmp)) }) group_g=do.call (rbind,deg_list) group_g=do.call(rbind,deg_list) library(org.Hs.eg.db) group_g$gene=toTable(org.Hs.egSYMBOL
pathway.score <- function(data,gene){ y <- as.numeric(data[gene,]) rownames <- rownames(data) dataframes<-do.call x$Gene_End<-sum(abs(x$Correlation))} x}) GeneID<-do.call ,bbbbb) bbbbbb }) Corr<-do.call
) current.sce <- computeSumFactors(current.sce, clusters=clusters) return(current.sce) }) sce = do.call (multiBatchNorm , sce) sce = do.call(cbind, sce) 最终发现,原来这段代码调用了随机函数。 ) current.sce <- computeSumFactors(current.sce, clusters=clusters) return(current.sce) }) sce = do.call (multiBatchNorm , sce) sce = do.call(cbind, sce) > sce2class: SingleCellExperiment dim: 10000 4645
[5] "HALLMARK_WNT_BETA_CATENIN_SIGNALING" [6] "HALLMARK_TGF_BETA_SIGNALING" 纯文本-> 数据框 直接do.call 连接就可: test <- do.call('cbind', x_split) > test[1:5,1:5] HALLMARK_TNFA_SIGNALING_VIA_NFKB HALLMARK_HYPOXIA
8. do.call() 针对某个数据集执行指定的函数功能。 实例: res=clusterApply(cl,2:10, function(y) xx +y)do.call('rbind',res) ? 9. stopCluster() 关闭集群。
我实际上是创造了一个do.call( cbind,lapply 的复杂语法,熟悉这些函数的小伙伴就容易理解。 bs = split(colnames(compSce),compSce$mice) names(bs) ct = do.call( cbind,lapply(names(bs), function pseudobulk gene expression per cell-type getPseudobulk <- function(mat, celltype) { mat.summary <- do.call
do.call("c", args) } c2(a=1, b=2) #a b #1 2 test = "a" c2(!! eval_tidy(expr(do.call("c", !!args))) } c3(!! # add <- function(e1, e2) e1 + e2 ### 手动定义add函数的两个参数 x1 = 'e1' x2 = 'e2' ### 照上述例子定义一个add2函数,只需要将do.call do.call("add", args) } add2(!!x1 := 1, !! e2))) do.call("add", args) } add3(!!x1 := 1, !!x2 := 2) #[1] 3 {}的效果类似于执行!!
title,collapse='\t') writeLines(outlines, con=output) return(info) }) close(output) pubmed_Info <- do.call (rbind,pubmedinfo) 如果没有断,那么我们直接使用pubmedinfo变量 pubmed_Info <- do.call(rbind,pubmedinfo) 这里就可以看见基本的信息了 records), PubMed_ID = uid) return(pubmed_data) }) ADORA1_pubmeddata <- do.call