R Language
변수의 범위
수색…
비고
범위가있는 가장 일반적인 함정은 병렬 처리에서 발생합니다. 모든 변수와 함수는 각 스레드에서 실행되는 새로운 환경으로 전달되어야합니다.
환경과 기능
함수 내에서 선언 된 변수는 해당 함수 내에서만 존재합니다 (전달되지 않는 한).
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)
삼
삼
e2
는 e1
에서 상속되므로 e1
과 e2
에서 a
는 3
입니다. 그러나, 할당 내에 a
e2
값이 변경되지 않는 a
에 e1
.
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()
사용하여 함수를 명시 적으로 호출하는 것이 가장 좋습니다.