繁体   English   中英

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

[英]R - Passing two variables to a function using 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()使用它们将是我的首选方式。

是的,假设所有files sum_before 相同 ,以下操作应做到:

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_dbeforeFun_data_read(...)我们通过sum_dbeforeFun_data_read()通过mclapply为“可选参数FUN”。 请参阅用法mclapply文档

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

参数

... FUN的可选参数

希望这可以帮助。

假设我已正确理解您的信息,并且sum_dbefore是所有files的单个常量,那么您无需在mclapply其显式传递给Func_data_read(x)

sum_dbefore是中遇到Func_data_read(x) ,R将搜索功能的封闭环境这个变量。 如果不存在,它将搜索封闭环境中的封闭环境,依此类推。 这里可以找到很好的解释。

例如,

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

您的代码应该可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM