R - 使用lapply将两个变量传递给函数

时间:2016-07-21 10:25:14

标签: r function lapply

我的功能如下:

Func_Daily <- function(DATAdir, DATE, RERUN){
  sum_dbefore <- Func_day_before(DATE)
  files <- Func_getFiles(DATE)
  if(length(files) > 0){
    data <- mclapply(files, function(x) Func_data_read(x), mc.cores = nCores)
    print(data)
  }
}

主程序将所需的变量传递给Func_Daily()Func_Daily()从函数Func_getFiles()获取文件夹中的文件,并将其传递给函数Func_data_read(),以读取和更改该文件夹中的每个文件。 现在的问题是,我有另一个计算值(sum_dbefore)的函数,我将需要Func_data_read()函数内的函数:

Func_data_read <- function(file){
  if(length(file) > 0){
    data <- lf_getNetCDF(file)
    data$RR[1] <- data$RR[1]+sum_dbefore
    data$RR_acc <- cumsum(data$RR)
  }else{
    print(paste("no files on", DATE))
  }
  return(data)
}

lapply内部是否有办法将该值与files一起传递给Func_data_read()以使用函数内的两个变量并获取值以将其保存到Func_Daily中的数据? 我想有一种简单的方法可以使用lapply,但到目前为止,我无法弄清楚如何。如果可能的话,我不想重建整个设置,因为它连接到脚本中的一些其他功能。因此,使用lapply传递sum_dbeforefiles并在Func_data_read()中使用它们将是我首选的方式。

2 个答案:

答案 0 :(得分:1)

是的,假设sum_before为所有files相同,则应执行以下操作:

Func_Daily <- function(DATAdir, DATE, RERUN){
  sum_dbefore <- Func_day_before(DATE)
  files <- Func_getFiles(DATE)
  if(length(files) > 0){
    data <- mclapply(files, Func_data_read, sum_dbefore = sum_dbefore, mc.cores = nCores)
    print(data)
  }
}

在其之前定义Fun_data_read

Func_data_read <- function(file, sum_dbefore) {
  if(length(file) > 0){
    data <- lf_getNetCDF(file)
    data$RR[1] <- data$RR[1]+sum_dbefore
    data$RR_acc <- cumsum(data$RR)
  } else {
    print(paste("no files on", DATE))
  }
  return(data)
}

在上文中,我们将sum_dbefore的输入参数添加到Fun_data_read(...),我们将sum_dbefore传递给Fun_data_read()mclapply作为“TestInterceptor的可选参数FUN”。请参阅 USAGE 下的documentation for mclapply

  

mclapply(X,FUN,...,mc.preschedule = TRUE,mc.set.seed = TRUE,            mc.silent = FALSE,mc.cores = getOption(“cores”),mc.cleanup = TRUE)

参数

  

... FUN的可选参数

希望这有帮助。

答案 1 :(得分:1)

假设我已正确理解您,sum_dbefore是所有files的单一常量,那么您不需要在Func_data_read(x)内明确地将其传递给mclapply }。

sum_dbefore内遇到Func_data_read(x)时,R将在函数的封闭环境中搜索此变量。如果它不存在,那么它将搜索封闭环境的封闭环境,依此类推。可以找到一个很好的解释here

例如,

library(parallel)
q <- 10
mclapply(1:3, function(x) sqrt(x + q), mc.cores = 1)

# [[1]]
# [1] 3.316625
# 
# [[2]]
# [1] 3.464102
# 
# [[3]]
# [1] 3.605551

您的代码应该按原样运行。