programing tip

R에서 "<<-"(범위 지정)을 어떻게 사용합니까?

itbloger 2020. 7. 11. 10:56
반응형

R에서 "<<-"(범위 지정)을 어떻게 사용합니까?


나는 R intro에서 범위 지정에 대해 읽었 으며 <<-과제 에 대해 매우 궁금 합니다.

매뉴얼은에 대한 하나의 (매우 흥미로운) 예제를 보여주었습니다 <<-. 내가 여전히 누락 된 것은 이것이 유용 할 수있는 상황입니다.

그래서 내가 당신에게서 읽고 싶은 것은 언제 사용 <<-이 흥미롭고 유용 할 수 있는지에 대한 예 (또는 예에 대한 링크)입니다 . 그것을 사용하는 것의 위험은 무엇입니까 (쉽게 추적하는 것처럼 보임), 공유하고 싶은 팁이 있습니다.


<<-상태를 유지하기 위해 클로저와 함께 가장 유용합니다. 다음은 최근 논문에서 발췌 한 섹션입니다.

클로저는 다른 함수로 작성된 함수입니다. 클로저는 부모 함수의 환경을 둘러싸 기 때문에 소위 호출 되며 해당 함수의 모든 변수와 매개 변수에 액세스 할 수 있습니다. 이것은 두 가지 수준의 매개 변수를 가질 수 있기 때문에 유용합니다. 한 수준의 매개 변수 (부모)가 함수 작동 방식을 제어합니다. 다른 레벨 (자식)이 작업을 수행합니다. 다음 예제는이 아이디어를 사용하여 전력 함수 패밀리를 생성하는 방법을 보여줍니다. 부모 함수 ( power) 는 실제로 어려운 작업을 수행하는 자식 함수 ( squarecube)를 만듭니다 .

power <- function(exponent) {
  function(x) x ^ exponent
}

square <- power(2)
square(2) # -> [1] 4
square(4) # -> [1] 16

cube <- power(3)
cube(2) # -> [1] 8
cube(4) # -> [1] 64

두 레벨에서 변수를 관리하는 기능은 또한 함수가 상위 환경에서 변수를 수정할 수 있도록하여 함수 호출 전반에 걸쳐 상태를 유지할 수있게합니다. 다른 수준에서 변수를 관리하는 열쇠는 이중 화살표 할당 연산자 <<-입니다. <-항상 현재 레벨에서 작동 하는 일반적인 단일 화살표 할당 ( ) 과 달리 이중 화살표 연산자는 상위 레벨에서 변수를 수정할 수 있습니다.

이를 통해 다음 예제와 같이 함수가 호출 된 횟수를 기록하는 카운터를 유지할 수 있습니다. new_counter실행될 때마다 환경을 만들고이 환경에서 카운터 i초기화 한 다음 새 기능을 만듭니다.

new_counter <- function() {
  i <- 0
  function() {
    # do something useful, then ...
    i <<- i + 1
    i
  }
}

새로운 기능은 폐쇄이고 환경은 둘러싸는 환경입니다. 클로저 counter_onecounter_two실행시, 각각의 엔 클로징 환경에서 카운터를 수정 한 다음 현재 카운트를 반환합니다.

counter_one <- new_counter()
counter_two <- new_counter()

counter_one() # -> [1] 1
counter_one() # -> [1] 2
counter_two() # -> [1] 1

( 함수 매개 변수 를로 설정 한 경우) <<-와 동등한 것으로 생각하면 도움이됩니다 . 장점은 더 많은 매개 변수 (예 : 환경)를 지정할 수 있으므로 대부분의 경우 이상 사용하는 것을 선호합니다 .assigninheritsTRUEassignassign<<-

사용 <<-하고 assign(x, value, inherits=TRUE)"변수 'x'가 나타날 때까지 제공된 환경의 환경을 검색합니다." 다시 말해, 해당 이름의 변수를 찾을 때까지 환경을 순서대로 진행하여 해당 변수를 할당합니다. 이것은 기능의 범위 내에 있거나 글로벌 환경에있을 수 있습니다.

이러한 기능의 기능을 이해하려면 R 환경 (예 :)을 이해해야합니다 search.

대규모 시뮬레이션을 실행할 때 이러한 기능을 정기적으로 사용하고 중간 결과를 저장하고 싶습니다. 이를 통해 주어진 함수 나 apply루프 범위 밖에서 객체를 만들 수 있습니다 . 특히 큰 루프가 예기치 않게 끝나는 것에 대해 우려하는 경우 (예 : 데이터베이스 연결 끊기),이 경우 프로세스의 모든 항목을 잃을 수 있습니다. 이는 장기 실행 프로세스 중에 결과를 R 환경 내에 대신 저장한다는 점을 제외하고 데이터베이스 나 파일에 결과를 기록하는 것과 같습니다.

이것에 대한 나의 주요 경고 : 특히 전역 변수를 사용하고 있기 때문에 특히주의해야합니다 <<-. 즉, 함수가 매개 변수로 제공된 값을 사용할 것으로 예상했을 때 함수가 환경의 오브젝트 값을 사용하는 상황으로 끝날 수 있습니다. 이것은 함수형 프로그래밍이 피하려고하는 주요한 것 중 하나입니다 ( 부작용 참조 ). 함수 내에서 사용되지 않지만 캐싱에 사용되며 나중에 복구 해야하는 경우 (또는 메타를 수행하는 경우) 고유 변수 이름 (세트 또는 고유 매개 변수와 함께 붙여 넣기 사용)에 값을 할당 하여이 문제를 피합니다. -중간 결과 분석).


One place where I used <<- was in simple GUIs using tcl/tk. Some of the initial examples have it -- as you need to make a distinction between local and global variables for statefullness. See for example

 library(tcltk)
 demo(tkdensity)

which uses <<-. Otherwise I concur with Marek :) -- a Google search can help.


f <- function(n, x0) {x <- x0; replicate(n, (function(){x <<- x+rnorm(1)})())}
plot(f(1000,0),typ="l")

The <<- operator can also be useful for Reference Classes when writing Reference Methods. For example:

myRFclass <- setRefClass(Class = "RF",
                         fields = list(A = "numeric",
                                       B = "numeric",
                                       C = function() A + B))
myRFclass$methods(show = function() cat("A =", A, "B =", B, "C =",C))
myRFclass$methods(changeA = function() A <<- A*B) # note the <<-
obj1 <- myRFclass(A = 2, B = 3)
obj1
# A = 2 B = 3 C = 5
obj1$changeA()
obj1
# A = 6 B = 3 C = 9

On this subject I'd like to point out that the <<- operator will behave strangely when applied (incorrectly) within a for loop (there may be other cases too). Given the following code:

fortest <- function() {
    mySum <- 0
    for (i in c(1, 2, 3)) {
        mySum <<- mySum + i
    }
    mySum
}

you might expect that the function would return the expected sum, 6, but instead it returns 0, with a global variable mySum being created and assigned the value 3. I can't fully explain what is going on here but certainly the body of a for loop is not a new scope 'level'. Instead, it seems that R looks outside of the fortest function, can't find a mySum variable to assign to, so creates one and assigns the value 1, the first time through the loop. On subsequent iterations, the RHS in the assignment must be referring to the (unchanged) inner mySum variable whereas the LHS refers to the global variable. Therefore each iteration overwrites the value of the global variable to that iteration's value of i, hence it has the value 3 on exit from the function.

Hope this helps someone - this stumped me for a couple of hours today! (BTW, just replace <<- with <- and the function works as expected).

참고URL : https://stackoverflow.com/questions/2628621/how-do-you-use-scoping-assignment-in-r

반응형