2014-04-06 6 views
2

이것은 비교적 간단한 문제이지만 난처하게되었습니다. 나는 R로 프로그래밍하고,하지만 난 문제가 보여주는 몇 가지 간단한 코드를 작성하려고했습니다 아래 나는이 문제가 R. 제한됩니다 생각하지 않는다 :다른 함수의 입력에서 추가 매개 변수가있는 함수

f1 = function(x) { 
    return(a + x) 
} 

f2 = function(ftn) { 
    return(ftn(1)) 
} 

f3 = function(a) { 
    return(f2(f1)) 
} 

문제 : 나는 F3를 호출하는 경우 (2) [예를 들어] f2 (f1)가 반환되고 f2 (f1)은 f1 (a + 1)을 반환합니다. 그러나 f1은 f3에 넣은 'a'의 값을 인식하지 못하므로 코드가 작동하지 않습니다! f1이 f3으로 입력을 인식 할 수 있도록 할 수있는 방법이 있습니까?

답변

3

R은 동적 범위가 아닌 어휘 범위를 사용합니다. 함수는 함수가 정의 된 환경에서 사용 가능한 변수 (사용되었지만 정의되지 않은 변수)를 찾습니다. f1이 글로벌 환경에서 정의되었으므로 a이 글로벌 환경에서 조회되고 거기에 a이 없습니다. 우리는이 같은 f3의 실행중인 인스턴스에서 자유 변수를 찾기 위해 f1을 강제 할 수

f3 = function(a) { 
    environment(f1) <- environment() 
    return(f2(f1)) 
} 

이 일시적으로 원하는 환경과 새로운 f1f3 내에서 만들어집니다.

f1f3 내에서 필요한 경우 또 다른 가능성은 (오히려 지구 환경에 비해)가 f1를 정의하는 것입니다 :

f3 = function(a) { 
    f1 = function(x) { 
     return(a + x) 
    }  
    return(f2(f1)) 
} 

그런데, 실행중인 기능 평가의 마지막 표현이 너무이 반환된다 다음과 같이 쓸 수있다 :

f3 <- function(a) { 
     f1 <- function(x) a + x 
     f2(f1) 
} 
관련 문제