R语言的并行化处理-返回多个对象

昨天还是有遗憾,一是没有搞清楚全局赋值号怎么使用,今天过后我觉得昨天五迷三道的
二是还是不知道apply和parApply通用的返回多个对象的方法,今天算是解决了。

1
2
3
4
5
6
7
8
9
i <- c(1:100)
i <- matrix(i,rep(1,length(i)))
a <<- vector(length = 100, mode = "numeric")
b <<- vector(length = 100, mode = "numeric")
mytest_fun <- function(i){
a[i] <<- sqrt(i)
b[i] <<- log(i)
}
result <- apply(i,2,mytest_fun)

这时候返回的是result是b的结果,而a和b都是有正常结果的,因为我用了<<- 全局赋值符号
如果我把外面的<<-去掉呢?

1
2
3
4
5
6
7
8
9
i <- c(1:100)
i <- matrix(i,rep(1,length(i)))
a <- vector(length = 100, mode = "numeric")
b <- vector(length = 100, mode = "numeric")
mytest_fun <- function(i){
a[i] <<- sqrt(i)
b[i] <<- log(i)
}
result <- apply(i,2,mytest_fun)

结果是一样的,a和b有正常的结果,而result返回的是b
如果我把函数里面的<<-去掉呢?

1
2
3
4
5
6
7
8
9
i <- c(1:100)
i <- matrix(i,rep(1,length(i)))
a <<- vector(length = 100, mode = "numeric")
b <<- vector(length = 100, mode = "numeric")
mytest_fun <- function(i){
a[i] <- sqrt(i)
b[i] <- log(i)
}
result <- apply(i,2,mytest_fun)

里面肯定是不能去的,去掉后就不可能改变外面的a和b
所以这个符号只要在函数里面用即可!!
但是,洲更说,这种方法太危险!!
今天学习GSEA的代码时,返现函数可以返回多个对象的,只要把多个对象组成list,再return即可

1
2
3
4
5
6
7
8
i <- c(1:100)
i <- matrix(i,rep(1,length(i)))
mytest_fun <- function(i){
a <- sqrt(i)
b <- log(i)
return(list(a = a,b =b ))##最好对a和b赋值,这样取出时辨识度很高
}
result <- apply(i,2,mytest_fun)

这时候我们发现result是由100个list组成的list,每个list有两个元素
我们分别将他们取出

1
2
for (i in 1:100) {a[i] <-result[[i]]$a}
for (i in 1:100) {b[i] <-result[[i]]$b}

得到了想要的a和b
这时候我来看一下parApply能不能这样使用呢?

1
2
3
4
5
6
7
8
9
10
11
12
mytest_fun <- function(i){
a <- sqrt(i)
b <- log(i)
return(list(a = a,b =b ))
}
i <- c(1:100)
i <- matrix(i,rep(1,length(i)))
require(parallel)
cl.cores <- detectCores()
cl <- makeCluster(28)
clusterExport(cl,c("sqrt","i","a","b","log"))
result <- parApply(cl,i,2,mytest_fun)

一样的的result

1
2
for (i in 1:100) {a[i] <-result[[i]]$a}
for (i in 1:100) {b[i] <-result[[i]]$b}

取出也是没有问题的!!

###总结:

  • 函数默认会返回最后一个对象,使用return可以指定返回的对象,而return合用list可以返回多个对象,获取元素时只要使用’$‘符号即可
  • 而apply以及parApply一样的可以返回多个元素,只是这时候,返回的元素结构产生了变化,不能直接取出,逐个获取!!!
------ 本文结束------