2016-07-21 23 views
0

我有一个函数看起来像这样:的R - 传递两个变量来使用功能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与filesFunc_data_read()一起传递价值在函数内部使用两个变量并将值返回以将其保存到数据中Func_Daily? 我想有一个简单的方法来使用lapply做到这一点,但到目前为止我无法弄清楚如何。如果可能的话,我不想重建整个设置,因为它连接到脚本内部的一些功能。因此,使用lapply来传递sum_dbeforefiles并在Func_data_read()内使用它们将是我的首选方式。

+0

你试过'mcmapply()'吗? – hrbrmstr

+0

没有没有。我会看看'mapply()' – BallerNacken

+0

@BallerNacken:如果'sum_dbefore'对于所有'files'都是**不一样**,那么@hrbrmstr有关'mcmapply()'的注释是正确的方法。 – aichao

回答

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_dbeforeFun_data_read(...),并且我们将sum_dbefore通过Fun_data_read()通过mclapply作为“FUN的可选参数”。见documentation for mclapply用法

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

参数

...可选参数到FUN

希望这会有所帮助。

+0

我试过了,但是像这样:''Davis_RR_acc_read < - function(file,sum_dbefore)''data < - mclapply(files,function(x)Davis_RR_acc_read(x),sum_dbefore = sum_dbefore,mc.cores = nCores)'但这给了我一个未使用的参数错误。你的版本可以工作。非常感谢! – BallerNacken

1

假设我理解正确的话,你和sum_dbefore是所有files一个恒定的,那么你不应该需要内mclapply明确这个传递给Func_data_read(x)

当在Func_data_read(x)中遇到sum_dbefore时,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 

您的代码应工作,因为它是。

+0

感谢您的解释。但'sum_dbefore'总是在变化。取决于多种因素。 – BallerNacken

+0

根据你上面的代码,在'mclapply'内调用'Func_data_read'之前''sum_dbefore'只用'Func_day_before(DATE)'计算一次 - 也就是说,对于'files'的所有值, 'Func_Daily'。因此,在任何一次'Func_Daily'调用中,'sum_dbefore'都不会**变化。所以上面的代码应该可以工作。 –

+0

顺便说一句:我假设'sum_dbefore'是一个单一的数字。 –