2014-02-07 3 views
7

유연한 방법으로 함수를 지정하고 싶습니다. 어떻게하면 다른 함수를 만들 때 주어진 함수의 환경이 변경되지 않도록 할 수 있습니까? R 함수의 가변 범위

이 제대로 작동 설명하기 :

make.fn2 <- function(a, b) { 
    fn2 <- function(x) { 
     return(x + a + b) 
    } 
    return(fn2) 
} 

a <- 2; b <- 3 
fn2.1 <- make.fn2(a, b) 
fn2.1(3) # 8 
fn2.1(4) # 9 

a <- 4 
fn2.2 <- make.fn2(a, b) 
fn2.2(3) # 10 
fn2.1(3) # 8 

make.fn2 <- function(a, b) { 
fn2 <- function(x) { 
    return(x + a + b) 
} 
return(fn2) 
} 

a <- 2; b <- 3 
fn2.1 <- make.fn2(a, b) 

a <- 4 
fn2.2 <- make.fn2(a, b) 

fn2.1(3) # 10 
fn2.1(4) # 11 
fn2.2(3) # 10 
fn2.1(3) # 10 

답변

8

하지 않습니다 이것은 게으른 평가 때문이다. 이 함수는 호출 될 때까지 실제로 생성되지 않습니다. 따라서 두 번째 경우에는 두 번 모두 a의 새 버전이 선택됩니다. this other question을 참조하십시오.

당신은 force를 사용하여이 문제를 해결할 수 있습니다 :

make.fn2 <- function(a, b) { 
    force(a) 
    force(b) 
    fn2 <- function(x) { 
     return(x + a + b) 
    } 
    return(fn2) 
} 

이것은 ab의 함수가 생성 될 때, 함수가 호출하지 않을 때는 값을 선택하는 기능을 강제로. 올바른 출력을 생성합니다.

> a <- 2; b <- 3 
> fn2.1 <- make.fn2(a, b) 
> 
> a <- 4 
> fn2.2 <- make.fn2(a, b) 
> 
> fn2.1(3) # 10 
[1] 8 
> fn2.1(4) # 11 
[1] 9 
> fn2.2(3) # 10 
[1] 10 
> fn2.1(3) # 10 
[1] 8 
>