2014-02-19 5 views
3

병렬로 실행할지 여부를 지정할 수있는 lapply 함수의 다른 버전을 구현하고 싶습니다. 코드는 다음과 같다 :R : lapply ...를 전달할 때 "function"을 찾을 수 없습니까?

papply <- function(x,fun,..., 
    parallel=FALSE,parallel.options=list(mode="socket",cpus=2), 
    integrate=rbind,convert=NULL) { 
    if(parallel) { 
    require(parallelMap) 
    do.call(parallelStart,parallel.options) 
    result <- parallelLapply(x,fun,...) 
    parallelStop() 
    } else { 
    result <- lapply(x,fun,...) 
    } 
    if(is.function(integrate)) { 
    result <- do.call(integrate,result) 
    } 
    if(is.function(convert)) { 
    result <- convert(result) 
    } 
    return(result) 
} 

parallel=TRUE, 난 그렇지 않으면 내가 보통 lapply 함수를 사용 {parallelMap} 패키지에 parallelLapply()을 사용합니다. 두 가지 방법 모두에서 벡터 /리스트를 매핑하려고하면 x이고 매핑 기능은 fun입니다. fun에는 둘 이상의 매개 변수가있을 수 있으므로 fun에 추가 인수를 전달하려면 ...을 사용합니다.

그러나, 추가 인수는 같은 지정되지 않은 경우

papply(1:5,function(i,x){return(data.frame(a=i,b=i+1))}) 

그것은 잘 작동하고 올바른 값을 반환 추가 인수는

papply(1:5,function(i,x){return(data.frame(a=i,b=i+x))},x=1) 
같이 지정

a b 
1 1 2 
2 2 3 
3 3 4 
4 4 5 
5 5 6 

그러나 경우

문제가 해결되지 않았지만

과 같은 오류가보고되었습니다.
Error in get(as.character(FUN), mode = "function", envir = envir) : 
    object 'fun' of mode 'function' was not found 
4 get(as.character(FUN), mode = "function", envir = envir) 
3 match.fun(FUN) 
2 lapply(x, fun, ... = ...) at utils.R#37 
1 papply(1:5, function(i, x) { 
    return(data.frame(a = i, b = i + x)) 
}, x = 1) 

왜이 오류가 발생하는지 알 수 없습니다. 오류를 해결하고 기능을 작동 시키려면 어떻게합니까?

답변

4

이것은 위치 일치 및 인수 이름 지정 문제가됩니다. > 따라서 오류 - 당신이

papply(1:5,function(i,x){return(data.frame(a=i,b=i+x))},x=1) 

에 이름을 때

x이이 1:5fun으로 일치하는 것을 의미한다, 따라서 papply의 형식 인수입니다. R 알고하는 것이 불가능 함수의 현재 양식에서

당신은 당신이이 ... 구성 요소에서 고려되어야 할 x=1을 표시 할 때.

유용한 접근 방식으로 mapply에 대한 MoreArgs 인수를 참조하십시오.

+0

실제로 오류는 '1 : 5'가 '재미'와 일치한다는 것을 나타내지 만 왜 이런 일이 발생할 수 있습니까? –

+0

@KunRen -'papply'는 두 개의 인자'x'와'fun'를 가지고 있습니다. 당신은'papply'에 대한 호출에서'x'라고 명명했습니다. 그런 다음 위치 지정 일치는 이름이없는 첫 번째 인수를 아직 첫 번째 형식 인수와 일치시킵니다. 따라서 '1 : 5'는 '재미'로 매치됩니다. 함수 정의를 변경하여 두 함수에서 동일한 인수 이름을 가지지 않아야합니다. – mnel

+0

@mnei - 예,'x'를'.x'로 변경하고'fun'를'.fun'으로 변경 한 후에 작동합니다. '...'이 나타나면 인수의 이름을 지정하는 것이 매우 까다 롭습니다. 감사! –

관련 문제