【问题标题】:write.csv results of each foreach iteration in RR中每次foreach迭代的write.csv结果
【发布时间】:2021-10-05 00:30:48
【问题描述】:

我正在使用 foreach 将我的工作并行化以处理一个非常大的数据集。下面是代码:

d <-
  foreach(a=files, .packages = 'hdf5r', .combine = 'cbind') %:%
    foreach(b=files, .combine = 'c') %dopar% {
      
      values <- "perform calculations"
    

  } 
d

我得到的输出是矩阵的形式......这是外部 foreach 中的“cbind”组合函数的结果。见附图。

但是,我真正想做的是能够将每个迭代结果保存在独立的 .csv 或 .txt 文件中。

我尝试使用用户定义的函数来替换“cbind”,但没有运气。我也将 write.table(......) 放在代码主体中,但它只捕获最后一次迭代,我不确定在嵌套的 foreach 中添加另一个 for 循环是否是好的做法。

有什么聪明的方法可以解决我的困境吗?

谢谢。

结果:

What I am getting from the script above

期望:

What I need to save in individual .csv

【问题讨论】:

    标签: r foreach write.table


    【解决方案1】:

    尝试以下方法。未经测试,但我以前使用过它,它可以工作,或者至少给出了如何制作它的想法。

    最里面的foreach必须返回一个值,把values作为它的最后一条指令。

    文件名由我选择,随意更改。

    d <- foreach(a=files, .packages = 'hdf5r', .combine = 'cbind') %dopar% {
      tmp <- foreach(b=files, .combine = 'c') %dopar% {
        
        values <- "perform calculations"
        values
      } 
      fname <- paste("result", i, "csv", sep = ".")
      fname <- file.path("~/tmp", fname)
      write.csv(tmp, fname, row.names = FALSE)
      # return value to outer loop
      tmp
    }
    d
    

    请注意,如果没有最后一个tmp,返回到最外层循环,d 将是NULL

    【讨论】:

    • 感谢您的回复。我可以用什么代替 fname
    • 请忽略这个后续问题。我在迭代器库中使用了 i from i = icount() 。它现在工作了!非常感谢您的帮助。
    • @PhilRugwiro 对不起,我现在才看到你的帖子。你是对的,i 是一个错字,我是从记忆中复制和粘贴的……应该是a,我不相信你需要icount(尽管它也应该这样做)。
    猜你喜欢
    • 2018-06-11
    • 2016-08-02
    • 2018-11-21
    • 2018-12-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多