이것은 다소 불쾌한 구현 세부 사항이있는 해킹을 나타냅니다. 여기 S4 클래스는
.B <- setClass("B", representation(b="environment"))
내가 초기에주의를 기울 슬롯과 같은 환경으로, 그래서 각 인스턴스는 자신의 환경 (보다는 기본을 것 같은 환경을 공유하는 모든 인스턴스 및 적절한 경우를 얻을 수있다 있었다 싱글)
setMethod(initialize, "B",
function(.Object, ..., b=new.env(parent=emptyenv()))
{
b[["value"]] <- NA
callNextMethod(.Object, ..., b=b)
})
하는의는 다음과 같은의 방법을 구현하는 지연 할당 된 값
setGeneric("delay<-", function(x, ..., value) standardGeneric("delay<-"))
setGeneric("delay", function(x, ...) standardGeneric("delay"))
을 설정하고 검색 할 수 제네릭을 정의 할 수 ... 일부와
> b <- .B()
> delay(b)
[1] NA
> delay(b) <- 1 # no type safety; could use, e.g., delay<-,numeric-method
> delay(b)
[1] "running query"
[1] 1
을 우리의 환경
setReplaceMethod("delay", "B", function(x, ..., value) {
force(value) # don't want to be _too_ lazy
delayedAssign("value", testFunction(value), [email protected])
x
})
에서, 요소, '값'에 값을 서명하고 그것을 여기
setMethod("delay", "B", function(x, ...) [email protected][["value"]])
우리의 노동의 제품 검색 b1과 b가 동일한 환경을 공유하기 때문에 사용자를 놀라게 할 수있는 이상한 참조 의미 (아마도 사용자가 참조 의미를 기대하는 사용자조차도)
> b1 <- b # reference semantics, delayed
> delay(b1) <- 2
> delay(b)
[1] "running query"
[1] 2
S4 개체가 아닌 환경에 "지연 지정"만 할 수 있습니다. – hadley
@hadley 어쩌면 언어에 추가하라는 요청을해야합니까? 아니면 너무 어렵다고 생각하니? 그러면 문제는 그런 기능 요청에 대해 어떻게 생각합니까? – wligtenberg
구현이 매우 어려울 것입니다. 예를 들어 객체가 유효한지 검사 할 때 실수로 평가를하지 않도록주의해야하기 때문입니다. – hadley