2013-08-18 5 views
1

사용자 정의 S4 클래스의 선택적 슬롯을 지정하는 것이 올바른지 궁금합니다. 일부 현지화 된 메타 데이터를 저장하기위한 슬롯이있는 S4 클래스를 생성 중입니다. 메타 데이터가 모든 언어에서 항상 제공되는 것은 아니므로이 슬롯을 비워 둘 필요가 있습니다.맞춤 S4 클래스의 선택적 슬롯은 무엇입니까?

나는 그것을 가지게되었지만 해킹 된 것 같은 느낌이 들었다. (내가 몇 개의 슬롯을 제거했기 때문에 클래스가 약간 쓸모 없다.)

setMethod("initialize","myClass",function(.Object,meta_localized = NULL){ 
[email protected]_generatedon = Sys.Date() 

# note meta_localized is a custom class, thus is.na does not work, it works 
# only for list and vectors 
if(!is.null(meta_localized)){ 
[email protected]_meta_localized <- meta_localized 
} else { 
    .Object 
}   
} 

웹에 주위 listOrNull 솔루션과 같은 가상 클래스 여러 방법을 시도하지만 나를 위해 작동하지 않았다. 그래서 이것은 정말로 나쁜 습관입니까? 권장 방법이 있습니까 (S4를 제외하고는 제외)

답변

1

질문은 클래스 정의와 비슷합니다. 당신은 클래스의 조합을 사용하여 작동하지 않는 것을 나타냅니다에도 불구하고, 나는

setOldClass("Date") 
setClassUnion("DateOrNULL", c("Date", "NULL")) 

.My <- setClass("My", representation(meta="DateOrNULL")) 

및 제안했을 다음

> .My() 
An object of class "My" 
Slot "meta": 
NULL 

> .My(meta=Sys.Date()) 
An object of class "My" 
Slot "meta": 
[1] "2013-08-18" 

initialize 방법 tricky이고, 나는 가능하면 그들을 피하려고 것입니다. 또한 S4에서 제공하는 정식 클래스 정의를 선택하고 특정 유형의 정보를 포함하거나 포함하지 않을 수있는 슬롯을 허용하는 것은 다소 직관적이지 않습니다. Date 인스턴스는 길이가 0이거나 NA가 될 수 있습니다. 클래스의 컨텍스트에서 NULL과 같은 목적을 제공하고 있습니까?