2016-07-21 3 views
0

나는 함수는 다음과 같이 찾고 있습니다. Func_Daily()Func_getFiles() 함수에서 폴더 안에있는 파일을 가져오고 그 파일을 Func_data_read() 함수로 전달하여 해당 폴더 내의 각 파일을 읽고 변경합니다. 문제는 지금은 값 (sum_dbefore)을 계산하는 다른 기능을 가지고, 내가이 Func_data_read() 함수 내에서하는 것이 필요합니다 R 사용하여 함수에 두 변수 전달은 lapply

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) 
} 

이 방법은 files Func_data_read()에와 함께 그 값을 전달하는 내부 lapply 있는가 함수 내에서 두 변수를 모두 사용하고 값을 다시 가져와 Func_Daily의 데이터에 저장 하시겠습니까? lapply를 사용하여 쉽게 할 수있는 방법이 있다고 생각합니다. 그러나 지금까지는 방법을 알 수 없었습니다. 가능한 경우 전체 설정을 다시 작성하고 싶지는 않지만 스크립트 내부의 몇 가지 기능에 연결되어 있습니다. 그래서 lapply를 사용하여 sum_dbeforefiles을 전달하고 Func_data_read() 안에 사용하면됩니다.

+0

'mcmapply()'를 시도 했습니까? – hrbrmstr

+0

아니요. – BallerNacken

+0

@BallerNacken :'sum_dbefore'이 ** 모든'files'에 대해 ** 동일하지 않다면'mcmapply()'에 대한 @hrbrmstr 주석이 올바른 접근법입니다. – aichao

답변

1

예, 다음은이 sum_before을 가정해야 할 모든 files에 대한 같은 : 그것은

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) 
} 

위, 우리는 입력 인수를 추가하기 전에 Fun_data_read

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) 
    } 
} 

정의 sum_dbefore ~ Fun_data_read(...)에 대해 sum_dbefore ~ Fun_data_read() ~를 전달합니다.3210을 "FUN의 선택적 인수"로 사용하십시오. documentation for mclapply USAGE 아래 참조 :

mclapply (X, 재미를, ..., mc.preschedule = TRUE, mc.set.seed = TRUE, mc.silent = FALSE, mc.cores = 위해 getOption ("코어") mc.cleanup = TRUE)

인수

... 재미 선택적 인수

희망이 도움이됩니다.

+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 다음 명시 적으로 mclapplyFunc_data_read(x)이 통과 할 필요가 없습니다, 모든 files에 대해 하나의 일정하다고 가정하면.

sum_dbeforeFunc_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 

그대로 귀하의 코드가 작동합니다.

+0

그 설명에 감사드립니다. 그러나'sum_dbefore'은 항상 변합니다. 여러 요인에 따라 다릅니다. – BallerNacken

+0

위의 코드에 따르면'sum_dbefore'는'Func_day_before (DATE)'를 사용하여'mclapply' 내에서'Func_data_read'가 호출되기 전에 한 번만 계산됩니다 - 즉, 모든 단일 실행에 대한'files'의 모든 값에 대해 동일합니다 'Func_Daily'. 그래서 어떤 하나의'Func_Daily' 호출 안에서,'sum_dbefore'은 ** 변화하지 않습니다 **. 따라서 위의 코드가 작동해야합니다. –

+0

동의어 : 'sum_dbefore'은 하나의 숫자라고 가정합니다. –