2016-10-13 3 views
0

생성자에서 validity 메서드를 호출하여 S4 개체를 작성하려고합니다. 나는 내가 나이가 12이 동일 싶습니다 물론S4 생성자 초기화 및 프로토 타입

new("Person", Age = 12) 
#Error in if ([email protected] < 0) return("Age cannot be negative") : 
#argument is of length zero 

장난감의 예이다 얻을 수 있기 때문에

setClass("Person", slot = c(Age = "numeric")) 

validityPerson<-function(object){ 
    if([email protected] < 0)return("Age cannot be negative") 
TRUE 
} 
setValidity("Person", validityPerson) 
setMethod("initialize","Person", function(.Object,...){ 
validObject(.Object) 
.Object 
}) 

이 코드는 문제가있다,하지만 난이 가질 수있는 방법을 이해하는 것을 시도하고있다 잠재적으로 모든 종류의 다른 초기화를 수행 할 수있는 메소드를 초기화 한 다음 유효한지 검사하십시오.

답변

1

?initialize 도움말 페이지의 예에서 실제로 개체를 초기화해야합니다. 그렇지 않으면 슬롯이 채워지지 않습니다. 그렇지 않은 경우 ...은 매개 변수를 들추고 아무 것도하지 않습니다. 당신은 기본 callNextMethod

setMethod("initialize", "Person", function(.Object, ...) { 
    .Object <- callNextMethod() 
    validObject(.Object) 
    .Object 
}) 
+0

지적 용 Thx. 현재 작동하고 있지만, 나는 아직도이 라인을 얻지 못한다. 난 callNextMethod() '상속이 관련된 경우에만 필요한 것이라고 생각했다. 그런데 내가 왜 이걸 필요로합니까? –

+0

'callnextMethod()'를 호출하지 않으면 initialize 함수에 전달 된 모든 매개 변수를 취하여 슬롯에 할당해야합니다. 함수가'Age ='매개 변수를 포착하기 위해'... '을 갖도록 정의했지만 아무 것도하지 않습니다. 이 경우'callNextMethod'는'...'을 사용하여 슬롯을 할당 해줍니다. – MrFlick

+0

의미가 있습니다. 설명 해줘서 고마워. –

1

setClass 실제로 당신이 많은 작업을 수행하여 초기화 호출 할 수 있습니다. 당신이 수익을 캡처하는 첫 번째 줄을 수정하는 경우 :

setClass("Person", slot = c(Age = "numeric")) -> Person

는 당신은

Person(Age=12)으로 객체를 생성 할 수 있습니다.