수색…


비고

범위가있는 가장 일반적인 함정은 병렬 처리에서 발생합니다. 모든 변수와 함수는 각 스레드에서 실행되는 새로운 환경으로 전달되어야합니다.

환경과 기능

함수 내에서 선언 된 변수는 해당 함수 내에서만 존재합니다 (전달되지 않는 한).

x <- 1

foo <- function(x) {
    y <- 3
    z <- x + y
    return(z)
}

y

오류 : 개체 'y'을 (를) 찾을 수 없습니다.

함수로 전달 된 다음 다시 할당 된 변수는 덮어 쓰여지 지만 함수 내부에서만 존재합니다 .

foo <- function(x) {
    x <- 2
    y <- 3
    z <- x + y
    return(z)
}

foo(1)
x

5

1

함수보다 높은 환경에서 할당 된 변수는 전달되지 않고 해당 함수 내에 존재합니다.

foo <- function() {
    y <- 3
    z <- x + y
    return(z)
}
    
foo()

4

하위 함수

함수 내에서 호출 된 함수 (즉 하위 함수)는 전달되지 않고 로컬 환경에 정의 된 모든 변수에 액세스하기 위해 해당 함수 내에서 정의되어야합니다.

이것은 실패합니다 :

bar <- function() {
    z <- x + y
    return(z)
}
    
foo <- function() {
    y <- 3
    z <- bar()
    return(z)
}

foo()

bar ()의 오류 : 'y'객체를 찾을 수 없습니다.

작동 방식 :

foo <- function() {
    
    bar <- function() {
        z <- x + y
        return(z)
    }
    
    y <- 3
    z <- bar()
    return(z)
}
    
foo()

4

글로벌 과제

변수는 <<- 사용하는 모든 환경에서 전역 적으로 할당 할 수 있습니다. bar() 가 이제 y 액세스 할 수 있습니다.

bar <- function() {
    z <- x + y
    return(z)
}
    
foo <- function() {
    y <<- 3
    z <- bar()
    return(z)
}

foo()

4

전 지구적인 임무는 매우 바람직하지 않습니다. 래퍼 함수를 ​​사용하거나 다른 로컬 환경에서 변수를 명시 적으로 호출하는 것이 좋습니다.

환경과 변수의 명시 적 할당

R의 환경은 명시 적으로 호출하고 이름을 지정할 수 있습니다. 변수는 명시 적으로 할당되고 해당 환경에서 호출 할 수 있습니다.

일반적으로 생성되는 환경은 package:base 또는 package:base 내의 하위 환경을 묶는 환경입니다.

e1 <- new.env(parent = baseenv())
e2 <- new.env(parent = e1)

변수는 명시 적으로 할당되고 해당 환경에서 호출 할 수 있습니다.

assign("a", 3, envir = e1)
   get("a", envir = e1)
   get("a", envir = e2)

e2e1 에서 상속되므로 e1e2 에서 a3 입니다. 그러나, 할당 내에 a e2 값이 변경되지 않는 ae1 .

assign("a", 2, envir = e2)
   get("a", envir = e2)
   get("a", envir = e1)

2

기능 종료

on.exit() 함수는 전역 변수를 할당해야하는 경우 변수 정리에 편리합니다.

일부 매개 변수, 특히 그래픽 용 매개 변수는 전역 적으로 만 설정할 수 있습니다. 이 작은 함수는보다 특수화 된 플롯을 작성할 때 일반적입니다.

new_plot <- function(...) {
     
     old_pars <- par(mar = c(5,4,4,2) + .1, mfrow = c(1,1))
     on.exit(par(old_pars))
     plot(...)
 }

패키지 및 마스킹

다른 패키지의 함수와 객체는 같은 이름을 가질 수 있습니다. 나중에로드 된 패키지는 이전 패키지를 '마스크'하여 경고 메시지가 인쇄됩니다. 이름으로 함수를 호출하면 가장 최근에로드 된 패키지의 함수가 실행됩니다. 이전 함수는 명시 적으로 액세스 할 수 있습니다.

library(plyr)
library(dplyr)

패키지 첨부 : 'dplyr'

다음 객체는 'package : plyr'에서 마스크 처리됩니다.

배열하다, 세다, 내리다, 실패하다, 이드, 변형하다, 이름 바꾸기, 요약하다, 요약하다

다음 객체는 'package : stats'에서 마스크 처리됩니다.

필터, 지연

다음 객체는 'package : base'에서 마스크 처리됩니다.

intersect, setdiff, setequal, union

코드를 작성할 때는 항상이 문제를 피하기 위해 package::function() 사용하여 함수를 명시 적으로 호출하는 것이 가장 좋습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow