[英]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_dbefore
和files
并在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_dbefore
到Fun_data_read(...)
我们通过sum_dbefore
到Fun_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.