首页 > 解决方案 > R:使用 foreach 读取 csv 数据并对数据应用函数并导出回 csv

问题描述

我有 3 个 csv 文件,即file1.csv,file2.csvfile3.csv.

现在对于每个文件,我想导入 csv 并对它们执行一些功能,然后导出转换后的 csv。因此,输入 3 个 csv,输出 3 个转换后的 csv。而且只有 3 个独立的任务。所以我想我可以尝试使用foreach %dopar%. 请不要说我使用的是Window机器。

但是,我无法让它发挥作用。

library(foreach)
library(doParallel)
library(xts)
library(zoo)
numCores <- detectCores()
cl <- parallel::makeCluster(numCores)
doParallel::registerDoParallel(cl)

filenames <- c("file1.csv","file2.csv","file3.csv")
foreach(i = 1:3, .packages = c("xts","zoo")) %dopar%{
  df_xts          <- data_processing_IMPORT(filenames[i])
  ddates                <- unique(date(df_xts))
}

如果我注释掉最后一行ddates <- unique(date(df_xts)),代码运行良好,没有错误。

但是,如果我包含最后一行代码,我会收到以下错误,我不知道如何解决。我试图添加.export = c("df_xts").

Error in { : task 1 failed - "unused argument (df_xts)"

它仍然不起作用。我想了解我的逻辑有什么问题,我应该如何解决这个问题?我只是想对数据应用简单的函数,我还没有转换数据并将它们单独导出到 csv。然而我已经被困住了。

有趣的是,我在下面编写了简单的代码,效果很好。在foreach,a就像df_xts上面一样,被存储在一个变量中并传递Fun2给进程。下面的代码工作正常。但上面没有。我不明白为什么。

numCores <- detectCores()
cl <- parallel::makeCluster(numCores)
doParallel::registerDoParallel(cl)


# Define the function
Fun1=function(x){
  a=2*x
  b=3*x
  c=a+b
  return(c)
}

Fun2=function(x){
  a=2*x
  b=3*x
  c=a+b
  return(c)
}

foreach(i = 1:10)%dopar%{
  x <- rnorm(5)
  a <- Fun1(x)
  tst <- Fun2(a)
  return(tst)
  }
### Output: No error

parallel::stopCluster(cl)

更新:我发现问题在于date提取 csv 文件中日期数的函数,但我不知道如何解决这个问题。

标签: rforeachparallel-foreach

解决方案


的使用foreach()是正确的。您正在使用date()inddates <- unique(date(df_xts))但此函数将当前系统时间返回为 POSIX,并且不需要任何参数。因此,参数错误与date()函数有关。

所以我猜你想as.Date()改用或类似的东西。

ddates <- unique(as.Date(df_xts))

推荐阅读