2014-04-04 3 views
0

지연 할당을 사용하여 S4 객체의 슬롯에 새 값을 할당하고 싶습니다. 이 할당은 기본적으로 데이터베이스 쿼리이며, 값이 실제로 사용될 때만 데이터베이스 쿼리가 실행되기를 원합니다. S4 객체 슬롯에서 delayedAssign

그러나뿐만 아니라 할 것입니다이 테스트를 위해서

:

testFunction <- function(id = 1){ 
    print("running query") 
    return(id) 
} 

delayedAssign("test", testFunction(id = 2)) 

이 작동합니다. "실행중인 쿼리"는 테스트가 호출 될 때만 인쇄되고 할당은 호출되지 않습니다. 이와 대조적으로 :

test2 <- testFunction(id = 2) 

이제는 똑같은 일을 할 수 있기를 바랍니다.

delayedAssign("[email protected]", testFunction(id = 2)) 

불행히도 현재 환경에서는 'someObject @ slotName'이라는 객체 이름을 만듭니다. 해결 방법에 대한 아이디어가 있으십니까?

+0

S4 개체가 아닌 환경에 "지연 지정"만 할 수 있습니다. – hadley

+0

@hadley 어쩌면 언어에 추가하라는 요청을해야합니까? 아니면 너무 어렵다고 생각하니? 그러면 문제는 그런 기능 요청에 대해 어떻게 생각합니까? – wligtenberg

+0

구현이 매우 어려울 것입니다. 예를 들어 객체가 유효한지 검사 할 때 실수로 평가를하지 않도록주의해야하기 때문입니다. – hadley

답변

3

이것은 다소 불쾌한 구현 세부 사항이있는 해킹을 나타냅니다. 여기 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 
+0

와우 마틴! 이것은 매우 창조적 인 솔루션입니다. – wligtenberg

관련 문제