2016-11-14 4 views
0

은 내가 S4 클래스 myclass를 만들고 그들이 paramS4는 클래스 생성자 및 검증

setClass("myclass", slot = c(x = "numeric")) 

#constructor 
ValidmyClass<- function(object, param = 1) 
{ 
if([email protected] == param) return(TRUE) 
else return("problem") 

} 
setValidity("myclass", ValidmyClass) 

setMethod("initialize","myclass", function(.Object,...){ 
.Object <- callNextMethod() 
validObject(.Object,...) 
.Object 
}) 

하는 동안 나는 오류 메시지가 다음받을 매개 변수에 의해 주어진 조건을 확인하면 객체가 생성되도록 짧은 코드를 제시 Error in substituteFunctionArgs(validity, "object", functionName = sprintf("validity method for class '%s'", : trying to change the argument list of for validity method for class 'myclass' with 2 arguments to have arguments (object)

저는 인수에 대한 이슈를 이해하고 있지만이를 해결할 방법을 찾을 수 없습니다. setValidity에 대한 문서에서는 인수 메소드가 "NULL 또는 하나의 인수 (객체)의 함수"인 유효성 메소드 여야한다고 언급합니다. 그러므로 하나 이상의 논쟁을 제외하고 나의 이해로부터.

그러나이 예제의 배경은 주어진 외부 매개 변수의 값을 기준으로 myclass 개체의 생성을 테스트 할 수 있기를 바랍니다. 더 많은 조건을 추가해야한다면 충분한 유연성을 원합니다. 따라서 더 많은 슬롯을 추가하지 않아도 ValidmyClass 함수 만 업데이트하면됩니다.

답변

1

유효 함수는 object이라는 하나의 인수를 가져야합니다. 하나의 인수 함수를 만들 필요가 있지만 더 많은 인수 또는 데이터를 전달해야 할 때 종종 클로저를 사용하는 것으로 넘어집니다. 이제 ValidmyClass의 구현이 실제 유효 함수를 반환한다는 점에서 변경되었습니다. 둘러싼 함수의 인수는 관심있는 추가 인수의 집합입니다.

유효성 함수는 init에서 자동으로 호출됩니다. 그러나 객체가 생성 된 후 슬롯 x이 변경된 경우에는 적용되지 않습니다.

setMethod("initialize", "myclass", function(.Object,...) { 
    .Object <- callNextMethod() 
    .Object 
}) 

new("myclass", x = 2) 
new("myclass", x = 1) 

클로저에 대한 자세한 내용은 adv-R을 참조하십시오. 이 질문에 대한 답변을 생각 하긴하지만,이 구현이 실제로 도움이되는지는 알 수 없습니다. 클래스를 정의 할 때, 기본적으로 유효성 함수가 알고있는 추가 매개 변수도 수정합니다. 유효성 함수를 추상화 할 수있는 클래스가 여러 개있는 경우 클로저를 사용합니다. 런타임에 매개 변수를 변경하는 클래스가 하나있는 경우 클래스에 슬롯을 추가하는 것이 좋습니다. 클래스 정의를 변경하지 않으려는 경우 슬롯 슬롯을 추가하여 테스트 할 임의의 수의 값을 전달할 수 있습니다.