我的功能如下:
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()
中使用它们将是我首选的方式。
答案 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
您的代码应该按原样运行。