현재의 환경이 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 함수에서 반환되는 이유이기도합니다. 특히 모델에 적합합니다.
작은 코드 예제가 여기에서하려는 것을 설명하는 데 도움이 될 것으로 판단됩니다. – Spacedman
'get()'함수를 사용할 수 있습니다; 첫 번째 인수는 변수의 문자열 이름이고 명명 된 'envir'인수는 쿼리 할 환경 변수입니다.'get ('a', envir = my.env) ' – BadZen
걱정하지 마라. 일이 잘 될 것이다. 'for'는 자신의 환경이나 범위를 가지고 있지 않습니다. – Gregor