使用 doParallel 而不是 apply
Using doParallel instead of apply
我正在尝试使用 doParallel
将 function
应用于 data.frame
的每一行,而不是使用 apply
。我早些时候在这里发布了一个关于这个的问题:
发布到我之前的问题的答案适用于我当时提供的示例,但不适用于下面的示例。在我当前的示例中,我创建了一个简单的 function
,对于一个 data.frame
的每一行,只需重命名第二个 data.frame
的 columns
。如果我不重命名 function
中第二个 data.frame
的 columns
,那么发布到我之前的问题的答案有效。
这是第一个data.frame
:
df1 <- read.table(text = '
aa bb cc dd ee
1 7 8 9 10
2 70 80 90 100
', header = TRUE, stringsAsFactors = FALSE)
这是第二个data.frame
:
df2 <- read.table(text = '
SS TT YY UU II
4 5 6 CH 7
44 55 66 CH 77
', header = TRUE)
这是我的函数:
my.function1 <- function(aa, bb, cc, dd, ee) {
colnames(df2) <- c('qqq', 'www', 'eee', 'rrr', 'ttt')
return = list(new.df=df2)
}
apply
语句有效:
function.output <- apply(df1, 1, function(x) {my.function1(x[1], x[2], x[3], x[4], x[5])})
function.output
#[[1]]
#[[1]]$new.df
# qqq www eee rrr ttt
#1 4 5 6 CH 7
#2 44 55 66 CH 77
#
#
#[[2]]
#[[2]]$new.df
# qqq www eee rrr ttt
#1 4 5 6 CH 7
#2 44 55 66 CH 77
doParallel
语句不起作用:
library(doParallel)
dat1 <- df1
ncores1 <- detectCores()-5
c1 <- parallel::makeCluster(ncores1)
registerDoParallel(c1)
v1 <- foreach(i = 1:nrow(dat1)) %dopar% {
my.function1(dat1[i,1], dat1[i,2], dat1[i,3], dat1[i,4], dat1[i,5])
}
#Error in { : task 1 failed - "object 'df2' not found"
v1
stopCluster(c1)
#Error: object 'v1' not found
如果我修改 function
,使其不会重命名第二个 data.frame
的 columns
,那么 doParallel
语句会起作用:
my.function2 <- function(aa, bb, cc, dd, ee) {
return = list(new.df=df2)
}
dat2 <- df1
ncores2 <- detectCores()-5
c2 <- parallel::makeCluster(ncores2)
registerDoParallel(c2)
v2 <- foreach(i = 1:nrow(dat2)) %dopar% {
my.function2(dat2[i,1], dat2[i,2], dat2[i,3], dat2[i,4], dat2[i,5])
}
v2
#[[1]]
#[[1]]$new.df
# SS TT YY UU II
#1 4 5 6 CH 7
#2 44 55 66 CH 77
#
#
#[[2]]
#[[2]]$new.df
# SS TT YY UU II
#1 4 5 6 CH 7
#2 44 55 66 CH 77
stopCluster(c2)
如何在重命名函数中第二个 data.frame
的 columns
时使 doParallel
语句起作用?
使用.export
v1 <- foreach(i = 1:nrow(dat1), .export = "df2") %dopar% {
my.function1(dat1[i,1], dat1[i,2], dat1[i,3], dat1[i,4], dat1[i,5])
}
-输出
> v1
[[1]]
[[1]]$new.df
qqq www eee rrr ttt
1 4 5 6 CH 7
2 44 55 66 CH 77
[[2]]
[[2]]$new.df
qqq www eee rrr ttt
1 4 5 6 CH 7
2 44 55 66 CH 77
我正在尝试使用 doParallel
将 function
应用于 data.frame
的每一行,而不是使用 apply
。我早些时候在这里发布了一个关于这个的问题:
发布到我之前的问题的答案适用于我当时提供的示例,但不适用于下面的示例。在我当前的示例中,我创建了一个简单的 function
,对于一个 data.frame
的每一行,只需重命名第二个 data.frame
的 columns
。如果我不重命名 function
中第二个 data.frame
的 columns
,那么发布到我之前的问题的答案有效。
这是第一个data.frame
:
df1 <- read.table(text = '
aa bb cc dd ee
1 7 8 9 10
2 70 80 90 100
', header = TRUE, stringsAsFactors = FALSE)
这是第二个data.frame
:
df2 <- read.table(text = '
SS TT YY UU II
4 5 6 CH 7
44 55 66 CH 77
', header = TRUE)
这是我的函数:
my.function1 <- function(aa, bb, cc, dd, ee) {
colnames(df2) <- c('qqq', 'www', 'eee', 'rrr', 'ttt')
return = list(new.df=df2)
}
apply
语句有效:
function.output <- apply(df1, 1, function(x) {my.function1(x[1], x[2], x[3], x[4], x[5])})
function.output
#[[1]]
#[[1]]$new.df
# qqq www eee rrr ttt
#1 4 5 6 CH 7
#2 44 55 66 CH 77
#
#
#[[2]]
#[[2]]$new.df
# qqq www eee rrr ttt
#1 4 5 6 CH 7
#2 44 55 66 CH 77
doParallel
语句不起作用:
library(doParallel)
dat1 <- df1
ncores1 <- detectCores()-5
c1 <- parallel::makeCluster(ncores1)
registerDoParallel(c1)
v1 <- foreach(i = 1:nrow(dat1)) %dopar% {
my.function1(dat1[i,1], dat1[i,2], dat1[i,3], dat1[i,4], dat1[i,5])
}
#Error in { : task 1 failed - "object 'df2' not found"
v1
stopCluster(c1)
#Error: object 'v1' not found
如果我修改 function
,使其不会重命名第二个 data.frame
的 columns
,那么 doParallel
语句会起作用:
my.function2 <- function(aa, bb, cc, dd, ee) {
return = list(new.df=df2)
}
dat2 <- df1
ncores2 <- detectCores()-5
c2 <- parallel::makeCluster(ncores2)
registerDoParallel(c2)
v2 <- foreach(i = 1:nrow(dat2)) %dopar% {
my.function2(dat2[i,1], dat2[i,2], dat2[i,3], dat2[i,4], dat2[i,5])
}
v2
#[[1]]
#[[1]]$new.df
# SS TT YY UU II
#1 4 5 6 CH 7
#2 44 55 66 CH 77
#
#
#[[2]]
#[[2]]$new.df
# SS TT YY UU II
#1 4 5 6 CH 7
#2 44 55 66 CH 77
stopCluster(c2)
如何在重命名函数中第二个 data.frame
的 columns
时使 doParallel
语句起作用?
使用.export
v1 <- foreach(i = 1:nrow(dat1), .export = "df2") %dopar% {
my.function1(dat1[i,1], dat1[i,2], dat1[i,3], dat1[i,4], dat1[i,5])
}
-输出
> v1
[[1]]
[[1]]$new.df
qqq www eee rrr ttt
1 4 5 6 CH 7
2 44 55 66 CH 77
[[2]]
[[2]]$new.df
qqq www eee rrr ttt
1 4 5 6 CH 7
2 44 55 66 CH 77