programing

R의 전역 및 국소 변수

css3 2023. 6. 14. 22:09

R의 전역 및 국소 변수

저는 R의 초보자이며, R의 로컬 변수와 글로벌 변수의 사용법에 대해 상당히 혼란스럽습니다.

나는 인터넷에서 내가 사용하면 된다는 게시물을 읽었습니다.=또는<-하고 현재환변할것당입다니할수를서경에로 지정하겠습니다.<<-함수 내부에서 글로벌 변수에 액세스할 수 있습니다.

C처럼 괄호 안에 할 때마다 가 발생합니다.{}그래서 저는 이것이 R도 마찬가지인지 궁금합니다.아니면 R의 함수에 대해서만 국소 변수의 개념을 갖는 것입니까?

제가 실험을 조금 해봤는데, 괄호만으론 부족한 것 같은데, 제가 틀린 게 있나요?

{
   x=matrix(1:10,2,5)
}
print(x[2,2])
[1] 4

함수 내부에 선언된 변수는 해당 함수에 대해 로컬입니다.예를 들어:

foo <- function() {
    bar <- 1
}
foo()
bar

에는 다음됩니다.Error: object 'bar' not found.

이만 싶다면고들신,▁want▁make▁you▁to.bar글로벌 변수는 다음을 수행해야 합니다.

foo <- function() {
    bar <<- 1
}
foo()
bar

이우경bar기능 외부에서 액세스할 수 있습니다.

그러나 C, C++ 또는 다른 많은 언어와 달리 괄호는 변수의 범위를 결정하지 않습니다.예를 들어, 다음 코드 스니펫에서:

if (x > 10) {
    y <- 0
}
else {
    y <- 1
}

y액세스 가능한 상태로 유지됩니다.if-else진술.

잘 말씀하신 것처럼 중첩된 환경도 만들 수 있습니다.사용 방법을 이해하기 위해 다음 두 링크를 살펴볼 수 있습니다.

  1. http://stat.ethz.ch/R-manual/R-devel/library/base/html/environment.html
  2. http://stat.ethz.ch/R-manual/R-devel/library/base/html/get.html

다음은 작은 예입니다.

test.env <- new.env()

assign('var', 100, envir=test.env)
# or simply
test.env$var <- 100

get('var') # var cannot be found since it is not defined in this environment
get('var', envir=test.env) # now it can be found

<-현재 환경에서 할당을 수행합니다.

당신이 내부에 있을 때, R 기능은 당신을 위해 새로운 환경을 만듭니다.기본적으로 생성된 환경의 모든 항목이 포함되므로 이러한 변수도 사용할 수 있지만 새로 생성한 항목은 글로벌 환경에 기록되지 않습니다.

의 경우에는 분의경우대부▁in우경의.<<-사용자가 함수 안에 있더라도 이미 전역 환경에 있는 변수에 할당하거나 전역 환경에 변수를 생성합니다.하지만, 그것은 그렇게 간단하지 않습니다.부모 환경에서 관심 있는 이름을 가진 변수를 확인합니다.상위 환경에서 찾을 수 없는 경우 상위 환경(함수가 생성된 시점)의 상위 환경으로 이동하여 해당 환경을 찾습니다.글로벌 환경으로 계속 상향 이동하며, 글로벌 환경에서 찾을 수 없는 경우 글로벌 환경에서 변수를 할당합니다.

이것은 무슨 일이 일어나고 있는지 설명할 수 있습니다.

bar <- "global"
foo <- function(){
    bar <- "in foo"
    baz <- function(){
        bar <- "in baz - before <<-"
        bar <<- "in baz - after <<-"
        print(bar)
    }
    print(bar)
    baz()
    print(bar)
}
> bar
[1] "global"
> foo()
[1] "in foo"
[1] "in baz - before <<-"
[1] "in baz - after <<-"
> bar
[1] "global"

우리가 전화하지 않은 바를 처음 인쇄했을 때.foo하지만 여전히 글로벌해야 합니다. 이것은 말이 됩니다.두 번째 인쇄할 때는 내부에 있습니다.foo부르기 전에baz그래서 "infoo"라는 값은 의미가 있습니다.다음은 무엇을 확인할 수 있는 부분입니다.<<-실제로 하고 있습니다.다음으로 인쇄되는 값은 "in baz - before <<->"입니다. 인쇄 문구가 다음에 오는 경우에도 마찬가지입니다.<<-그 이유는<<-현재 환경에서는 보이지 않습니다(글로벌 환경에 있지 않은 경우).<<-처럼 행동함<-. 그래서 그 안에.bazbar의 값은 <<-> 앞의 "in bazz -"로 유지됩니다.일단 전화하면baz내부에 있는 바의 사본foo"in bazz"로 바뀌지만 우리가 세계를 볼 수 있듯이.bar변경되지 않습니다.이는 의 복사본이bar의 내부에 정의된.foo생성할 때 상위 환경에 있습니다.baz그래서 이것은 첫 번째 복사본입니다.bar그거<<-복사본이 표시되므로 할당된 복사본이 됩니다.그렇게<<-지구 환경에 직접 할당하는 것만이 아닙니다.

<<-까다롭고 피할 수 있다면 사용하는 것을 추천하지 않습니다.글로벌 환경에 할당하려는 경우 할당 기능을 사용하여 전역으로 할당할 것을 명시적으로 알릴 수 있습니다.

이제 변경합니다.<<-다음과 같은 효과가 있는지 확인할 수 있습니다.

bar <- "global"
foo <- function(){
    bar <- "in foo"   
    baz <- function(){
        assign("bar", "in baz", envir = .GlobalEnv)
    }
    print(bar)
    baz()
    print(bar)
}
bar
#[1] "global"
foo()
#[1] "in foo"
#[1] "in foo"
bar
#[1] "in baz"

그래서 두 번 다 우리가 내부에 바를 인쇄할 때foo"infoo"를 호출한 입니다.baz는 는이유 때문입니다.assign의 복제품이라고는 전혀 생각되지 않는bar우리가 정확히 어디를 봐야 하는지 알려줬기 때문에 foo 내부.하지만 이번에 글로벌 환경에서 bar의 가치는 우리가 명시적으로 할당했기 때문에 변경되었습니다.

로컬 변수를 만드는 것에 대해서도 물어보셨는데 함수를 만들지 않고도 쉽게 만들 수 있습니다.우리는 단지 그것을 사용하면 됩니다.local기능.

bar <- "global"
# local will create a new environment for us to play in
local({
    bar <- "local"
    print(bar)
})
#[1] "local"
bar
#[1] "global"

같은 노선을 따라 조금 더.

attrs <- {}

attrs.a <- 1

f <- function(d) {
    attrs.a <- d
}

f(20)
print(attrs.a)

"1"로 인쇄됩니다.

attrs <- {}

attrs.a <- 1

f <- function(d) {
   attrs.a <<- d
}

f(20)
print(attrs.a)

"20"을 인쇄합니다.

언급URL : https://stackoverflow.com/questions/10904124/global-and-local-variables-in-r