2017-01-05 2 views
-1

사용자 정의 함수의 환경을 R로 명시 적으로 정의해야합니까, 아니면 함수를 만들 때 자동으로 "생성"됩니까?R의 함수 환경을 정의해야합니까?

함수를 만드는 것이 자동으로 함수 내에서 함수를 만들거나 환경을 명시 적으로 만들어야하는지 여부를 알고 싶습니다. 전자가 사실이라면 (즉, 환경이 자동으로 생성되는 경우) 어떻게 명시 적으로 참조 할 수 있습니까?

먼저 해당 기능을위한 새 환경을 만들거나 (예 : new.env을 사용하여 새 환경을 할당해야 함) 다른 구문 (예 : "current.env()")을 사용해야합니까?

내가 사용하는 간단한 예제는이 기능을 사용하는 assign 기능입니다.

function(a,b) { 
    assign(paste(a,b,sep='.'), 'help me', envir = ONLY CURRENT FUNCTION) 
} 
+3

작은 코드 예제가 여기에서하려는 것을 설명하는 데 도움이 될 것으로 판단됩니다. – Spacedman

+0

'get()'함수를 사용할 수 있습니다; 첫 번째 인수는 변수의 문자열 이름이고 명명 된 'envir'인수는 쿼리 할 환경 변수입니다.'get ('a', envir = my.env) ' – BadZen

+2

걱정하지 마라. 일이 잘 될 것이다. 'for'는 자신의 환경이나 범위를 가지고 있지 않습니다. – Gregor

답변

7

현재의 환경이 environment()에 의해 반환됩니다 :

> foo = function(a,b){assign(paste(a,b,sep="."),99,envir=as.environment(-1));ls()} 
> foo("fnord","fnord") 
[1] "a"   "b"   "fnord.fnord" 

또는 다른 사람들이 여기에 말하는 된 내용을 복사함수가 호출 될 때 foo() 호출 할 때마다 당신은 단지에 대해 생각 환경 등 다른 환경을 가지고

> environment() 
<environment: R_GlobalEnv> 
> foo <- function() environment() 
> foo() 
<environment: 0x1391b88> 
> foo() 
<environment: 0x1391f08> 
> foo() 
<environment: 0x1392288> 
> foo() 
<environment: 0x13916a0> 

공지 사항이 생성됩니다.

는 함수가 호출 된 둘러싸는 프레임을 얻을 parent.frame()를 사용하려면

> bar <- function() parent.frame() 
> bar() 
<environment: R_GlobalEnv> 

bar()으로 지구 환경을 반환, 내 작업 공간에서 불렀다.우리는 당신의 assign() 예를 보면

> foobar <- function() { print(environment()); bar() } 
> foobar() 
<environment: 0x74a7d68> 
<environment: 0x74a7d68> 

것은, 당신이 말할 필요가 없습니다 : 우리가 다른 함수 내부에서 bar()를 호출한다면, 우리는 그와 같은 함수가 호출 환경이 지금이라고 의 환경을 얻을 현재 환경을 원한다면 어떤 환경을 사용할 것인가? 당신이 이것에 대해 명시하기를 원한다면, 당신은 사용하십시오 :

> foo(20) 
[1] 20 
> foo(10) 
[1] 10 
> foo("a") 
[1] "a" 

을 제공

foo <- function(x) { 
    assign("y", x, envir = environment()) 
    y # return(y) to show it is assigned `x` 
} 

어느 상위 프레임에 할당 할 경우, 단지 통과 envir = parent.frame() :

foo <- function(x) { 
    assign("y", x, envir = parent.frame()) 
    "not returning `y`" # return something else 
} 
이 주어지는 것은

> ls() 
[1] "bar" "foo" "foobar" 
> foo(20) 
[1] "not returning `y`" 
> ls() 
[1] "bar" "foo" "foobar" "y"  
> y 
[1] 20 

y을 반환하지 않았지만 assign()은 지정된 환경에서 y을 생성했습니다.

다른 환경에 할당하기 위해 이와 같이 assign()을 수행해야하는 경우는 거의 없지만 스트레스를받는 것이 중요합니다. 이것의 주된 이유는 함수가 부작용을 가지고 있고 R이 함수에 입력 및 출력을 가져 와서 다른 어떤 것에 영향을 미치지 않고 코드가 작동하는 방식을 추론하는 것이 더 쉬운 함수형 언어라는 것입니다. 내가 foo1()를 호출하면 부작용이 없다는 것을 알고 있기 때문에 따라서 당신은 그냥 입력을 복용하고 출력을 반환하는 것,

foo1 <- function(x) { 
    y <- x 
    y 
} 

y <- foo1(x) 

이상
foo2 <- function(x, varname) { 
    assign(varname, x, envir = parent.frame()) 
    invisible() 
} 

foo2(x, "y") 

을 선호 할 것입니다. 이것은 당신이 assign()을 선택했기 때문에 조금 고안되었지만 이것은 광범위하게 적용됩니다. 또한 복잡한 목록이나 다른 유형의 객체가 많은 R 함수에서 반환되는 이유이기도합니다. 특히 모델에 적합합니다.

+0

감사합니다. 이것은 제가 찾고 있던 정확한 * 간단한 설명입니다. 이 모든 철저하게 내 질문에 대한 답변. – theforestecologist

+2

@ theforestologologist 당신은 더 읽기가 어려울 수 있습니다 해들리 Wickham 자신의 고급 R 도서에서 환경의 계정을 읽고, 읽기 쉬운 웹 버전 : http://adv-r.had.co.nz/Environments.html –

+0

참고해 주셔서 감사합니다! 또한,이 질문의 연장으로 나를 도울 수 있습니까? (채팅 참조 : http://chat.stackoverflow.com/rooms/132428/room-for-theforestecologist-and-gavin-simpson) – theforestecologist

0

할당에 환경을 언급하지 마십시오.

> ls() 
[1] "foo" 

내가 foo를 호출합니다 hey.you를 생성하고 그 값 반환 :

> foo("hey","you") 
[1] 99 

을하지만 엉망 내 환경이 때문에하지 않는

foo = function(a,b){ 
    assign(paste(a,b,sep="."),99) 
return(hey.you) # note this is hard coded here... 
} 

라는 것은 hey.you 없습니다 함수의 환경에서 생성 :

> ls() 
[1] "foo" 

이것이 기본값입니다.

?assign 

    pos: where to do the assignment. By default, assigns into the 
      current environment. See ‘Details’ for other possibilities. 

하면 명시 적으로 언급했고, 당신은에, 그래서 당신이 우리에게 진짜 좋은 이유를 제공하지 않는 한 당신이해야 할 다음 단지 무엇을 지정 복사 왜하지 않는 경우 :

> foo = function(a,b){assign(paste(a,b,sep="."),99,envir=environment());ls()} 
> foo("bubble","gum") 
[1] "a"   "b"   "bubble.gum" 
+0

하지만 함수의 현재 환경을 참조해야한다면 어떻게해야합니까? – theforestecologist

+0

왜'environment()'가 당신이 원하는 것을하고 있지 않습니까? – BadZen

+0

'assign (paste (a, b, sep = "."), 99, envir = as.environment (-1))' – Spacedman

관련 문제