2014-07-11 9 views
2

R 언어에서는 함수 ff (jj, kk, mm)가 있다고 가정합니다. 호출 함수 (또는 대화 형 세션에서 호출하는 사람)가 호출시 jj와 kk에 대해 임의의 방식으로 mm을 만들 수 있도록하고 싶습니다.R 기능을 사용하여 평가시 자체 포멀 값을 볼 수 있습니까?

구체성를 들어, 가정 :

ff <- function(jj, kk, mm){ 
    xx <- jj + kk 
    out<- xx/mm 
    out 
} 

그런 다음 실행시에, 나는 mm <- jj*kk을 설정합니다. 즉 :

ff(2, 3, (jj*kk)) 

이 수율 :

Error in ff(2, 3, (jj * kk)) : object 'jj' not found 

mm 때까지 슬로우되지 않는이 오류는 jjkk 이미 한 후 즉 이 성공적으로 평가, 평가됩니다. 그래서 그들은 서로 다른 범위의 규칙으로 두 번 평가됩니다. 나는 이것이 R 표준 스코프라는 것을 알고 있습니다. 나는 묻고 있는데, 함수를 쓸 수있는 간단한 방법은 숫자 또는 다른 공식적인 인수의 함수를 제공 할 수 있습니까? mm이 필요하기 전에 인수가 제공되었거나 평가 될 수 있다면 말입니까?

내가이 작업을 수행해야하는지 묻는 것은 아닙니다. 이 후자의 질문에 대해 의견을 제시하는 사람들에게 나는 솔직하게 예의 바르게 행동 할 것입니다.

jj를 사전 계산할 수 있는지, 사전 채혈 한 번호를 손에 넣을 수 있는지 묻지 않습니다. 나는 이 그럴듯한 대답이지만, 내가 문제를 단순화 한 이유로 작동하지 않는다는 것을 안다. 약자로

+2

는 것처럼 점을 설명하기에 * 왜 이렇게 안 * 'Jj = 99; kk = 101; ff (2,3, (jj * kk))''jj'와'kk'의 값을 무시합니다. 왜냐하면 그것들은 각각 2와 3과 같을 때 함수 안에서 평가되기 때문입니다. 이것은'ff' 문서를 읽지 않은 R 사용자를 놀라게 할 것입니다 ... – Spacedman

+0

나는 잘 모르겠습니다. 함수 f <-function (x) {x^2}가 있고 x <- 3, f (x)이면 9가 될 것으로 기대합니다. 그러나 f (2)를 수행하면 4 잠깐 ... 내가 본 것 같아. 당신은이 기능을 사용하는 누군가를 상상하고 있습니다, 누가 그것을 쓰지 않았습니까? 나는이 프로젝트가 일회성이라는 것을 확신한다. 그래서 나의 경우에는 문제가 발생하지 않는다. 하지만 어떻게 할 수 있는지 봅니다. – andrewH

+0

http://adv-r.had.co.nz/Computing-on-the-language.html 도움이 될 수 있습니다. – hadley

답변

5

이, 함수 ff()이 작동하지 않는 jjkk 어느 쪽도 '볼 수'있는 점을 유리한있는 supplied arguments are evaluated in the context of the calling environment 때문에.

은과 같이, 함수의 자체 평가 프레임의 컨텍스트 내에서 mm에 공급되는 문을 평가 eval(substitute())을 사용하려면 :

ff <- function(jj, kk, mm){ 
    mm <- eval(substitute(mm)) 
    xx <- jj + kk 
    out<- xx/mm 
    out 
} 

ff(2, 3, (jj*kk)) 
## [1] 0.8333333 
+1

또한'(jj * kk)'주변의 괄호는 필요하지 않습니다. 그들없이. – Spacedman

+0

감사합니다. Josh! 그것은 정확하게 일을합니다. 이것은 자체적 인 질문을받을만한 가치가 있지만, 후속 조치가 있습니다. LookHere <- function (X) {eval (substitute (X), envir = parent.frame (n = 0)}};와 같이 함수의 자체 환경을 참조하고자한다면? FF <- 기능 (JJ, KK, mm) { mm <- LookHere (mm) XX <- JJ + 아웃 KK <- XX/mm 아웃} FF (2, 3 (JJ * KK)) 분명히 부모.프레임 (n = 0)이 잘못되었습니다. 뭐가 맞습니까? – andrewH

+0

@andrewH - 안녕하세요. 지금은 설명 할 시간이 없지만 LookHere <- function (X) eval (do.call (substitute, list (substitute (X), env = parent.frame (n = 1)), env = parent.frame (n = 1))' –