首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用doParallel而不是apply

使用doParallel而不是apply
EN

Stack Overflow用户
提问于 2021-11-11 16:31:39
回答 1查看 28关注 0票数 2

我正在尝试使用doParallelfunction应用到data.frame的每一行,而不是使用apply。我早些时候在这里发布了一个关于这个问题的问题:

doParallel instead of apply

我之前问题的答案适用于我当时提供的示例,但不适用于下面的示例。在我当前的示例中,我创建了一个简单的function,对于一个data.frame的每一行,只需将另一个data.framecolumns重命名。如果我不重命名function中第二个data.framecolumns,那么发布到我前面问题中的答案是有效的。

这是第一个data.frame

代码语言:javascript
复制
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

代码语言:javascript
复制
df2 <- read.table(text = '
   SS TT YY UU II
    4  5  6 CH  7
   44 55 66 CH 77
', header = TRUE)

下面是我的函数:

代码语言:javascript
复制
my.function1 <- function(aa, bb, cc, dd, ee) {
  colnames(df2) <- c('qqq', 'www', 'eee', 'rrr', 'ttt')
  return = list(new.df=df2)
}

apply语句起作用:

代码语言:javascript
复制
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语句不起作用:

代码语言:javascript
复制
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.framecolumns,则doParallel语句可以工作:

代码语言:javascript
复制
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)

在重命名函数中第二个doParallelcolumns时,如何让data.frame语句工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-11 16:38:07

使用.export

代码语言:javascript
复制
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])
}

-output

代码语言:javascript
复制
> 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69931769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档