programing

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

javamemo 2023. 7. 19. 21:04
반응형

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

방금 R 인트로에서 범위 지정에 대한 글을 다 읽었는데, 매우 궁금합니다.<<-과제.

설명서는 다음과 같은 한 가지 (매우 흥미로운) 예를 들어,<<-제가 이해했다고 생각합니다.제가 아직도 놓치고 있는 것은 이것이 언제 유용할 수 있는지에 대한 맥락입니다.

그래서 제가 여러분으로부터 읽고 싶은 것은 다음과 같은 경우에 대한 예시(또는 예시에 대한 링크)입니다.<<-흥미로울 수 있습니다.이 도구를 사용하면 어떤 위험이 있는지(추적하기 쉬워 보임), 공유하고 싶은 모든 팁이 있습니다.

<<-상태를 유지하기 위해 폐쇄와 함께 사용하는 것이 가장 유용합니다.제가 최근에 발표한 논문의 한 부분입니다.

폐쇄는 다른 함수에 의해 작성된 함수입니다.폐쇄는 상위 함수의 환경을 포함하고 해당 함수의 모든 변수와 매개 변수에 액세스할 수 있기 때문에 이를 가리킵니다.이것은 두 가지 수준의 매개 변수를 가질 수 있기 때문에 유용합니다.한 수준의 모수(상위)가 함수의 작동 방식을 제어합니다.다른 레벨(아이)이 일을 합니다.다음 예제에서는 이 아이디어를 사용하여 전력 함수 제품군을 생성하는 방법을 보여 줍니다.상위 함수(power 함수를 .square그리고.cube은 실제로 힘든 일을 그것은 실제로 힘든 일을 합니다.

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

두 가지 수준에서 변수를 관리할 수 있는 기능을 통해 함수가 상위 환경에서 변수를 수정할 수 있도록 함으로써 함수 호출 간에 상태를 유지할 수 있습니다. 연산자인 다 수 관 이 연 할 입 니 자 다 산 당 표 화 살 중 양 은 핵 심 변 한 준 하 는 리 수 의 를 ▁assign ▁the ▁the ▁arrow ment ▁at ▁variables<<- 할당)과는 달리<-는 항상 에서 작동하며 할 수 .는 현재 수준에서 항상 작동하며 이중 화살표 연산자는 상위 수준의 변수를 수정할 수 있습니다.

이를 통해 다음 예제와 같이 함수가 호출된 횟수를 기록하는 카운터를 유지 관리할 수 있습니다. ㅠㅠnew_counter됩니다. 즉, 카운터가 초기화됩니다.i이 환경에서 새 기능을 만듭니다.

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

새로운 기능은 폐쇄적이고 환경은 폐쇄적입니다.문을 닫을 때counter_one그리고.counter_two를 실행하면 각각이 주변 환경에서 카운터를 수정한 다음 현재 카운트를 반환합니다.

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

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

을 생각하면 도움이 됩니다.<<-와동하게에 하는.assign((으)로 inherits를 당해함매변수개의로 설정합니다.TRUEassign더 많은 매개 변수(예: 환경)를 지정할 수 있기 때문에 사용하는 것을 선호합니다.assign1파운드가 <<-대개의 경우에

용사를 합니다.<<-그리고.assign(x, value, inherits=TRUE)는 "변수 'x'가 발생할 때까지 제공된 환경의 배치 환경이 검색됩니다."를 의미합니다.이름을 거치게 ." 해 이 름 을 가 변 진 순 로 환 대 조 고 즉 하 할 사 다 변 니 합 당 에 수 이 을 경 당 계 서 속 때 수 찾 까 지 를 을 ▁in ▁will , 다 ments 할 ▁with , 즉 니 ▁it ▁name ▁keep ▁it 합 ▁in ▁the ▁it ▁environ ▁going 당 ▁that 이는 함수의 범위 내에 있거나 글로벌 환경에 있을 수 있습니다.

이러한 기능이 무엇을 하는지 이해하려면 R 환경도 이해해야 합니다(예: 사용).search).

저는 대규모 시뮬레이션을 실행할 때 이러한 기능을 정기적으로 사용하며 중간 결과를 저장하고 싶습니다. 수 . 즉, 객체를 만들 수 있습니다.apply루프. 특히 큰 루프가 예기치 않게 종료되는 것(예: 데이터베이스 연결 끊김)에 대한 우려가 있는 경우 프로세스에서 모든 것을 잃을 수 있습니다.이는 R 환경 내에 결과를 저장한다는 점을 제외하고는 장시간 실행되는 프로세스 중에 데이터베이스 또는 파일에 결과를 기록하는 것과 같습니다.

이와 관련된 주요 경고: 현재 글로벌 변수를 사용하고 있으므로 특히 사용할 때 주의해야 합니다.<<-즉, 매개 변수로 제공된 개체를 사용할 것으로 예상했을 때 함수가 환경의 개체 값을 사용하는 상황이 발생할 수 있습니다.이것은 기능적 프로그래밍이 피하려고 하는 주요 사항 중 하나입니다(부작용 참조).함수 내에서 사용되지 않는 고유 변수 이름(세트 또는 고유 매개 변수와 함께 붙여넣기 사용)에 값을 할당하여 나중에 복구해야 할 경우(또는 중간 결과에 대한 메타 분석을 수행해야 할 경우)를 방지합니다.

내가 사용했던 한 장소<<-tcl/tk를 사용하는 에 있었습니다.초기의 예 중 일부는 상태가 완전하기 위해 로컬 변수와 글로벌 변수를 구분해야 하기 때문에 이를 가지고 있습니다. 를 참조하십시오.

 library(tcltk)
 demo(tkdensity)

어떤 것을 사용합니까?<<-그렇지 않으면 저는 마렉의 의견에 동의합니다 :) -- 구글 검색이 도움이 될 수 있습니다.

이 주제에 대해 저는 지적하고 싶습니다.<<-연산자는 for 루프 내에서 적용될 때(이상하게) 이상하게 행동합니다(다른 경우도 있을 수 있습니다).다음 코드가 주어집니다.

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

함수가 예상 합계 6을 반환할 것으로 예상할 수 있지만 대신 전역 변수를 사용하여 0을 반환합니다.mySum생성 중이며 값 3이 할당됩니다.여기서 무슨 일이 일어나고 있는지 완전히 설명할 수는 없지만 확실히 for 루프의 본문은 새로운 범위 '레벨'이 아닙니다.대신에, R은 밖을 보는 것 같습니다.fortest수 , 찾수없음mySum따라서 루프를 처음 통과할 때 할당할 변수를 만들고 값 1을 할당합니다.할 때,되지 않은) RHS를 .mySum변수인 반면 LHS는 전역 변수를 나타냅니다. 각 은 글로벌 인 따서각반전변역값수의을해값덮다반니어씁으로 덮어씁니다.i따라서 함수를 종료할 때 값은 3입니다.

이것이 누군가에게 도움이 되길 바랍니다 - 이것은 오늘 저를 몇 시간 동안 괴롭혔습니다! (BTW, 그냥 교체하세요.<<-와 함께<-기능이 예상대로 작동합니다.

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

<<-연산자는 참조 메서드를 작성할 때 참조 클래스에도 유용할 수 있습니다.예:

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

저는 글로벌 환경에서 객체의 내부 맵()을 변경하기 위해 사용합니다.

a = c(1,0,0,1,0,0,0,0)

제가 c(1,2,3,1,2,3,4,5)인 벡터를 얻고 싶다고 하자. 즉, 1이 있으면 1로 하고, 그렇지 않으면 다음 1까지 1을 더합니다.

map(
  .x = seq(1,(length(a))),
  .f = function(x) {
    a[x] <<- ifelse(a[x]==1, a[x], a[x-1]+1)
    })
a
[1] 1 2 3 1 2 3 4 5

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

반응형