2013-03-06 2 views
2

기본 출력 요소를 정의하고 숨겨진 나머지 요소를 유지하는 옵션이 있으면 R의 S3 클래스에 대해 궁금해했습니다. 우리가S3 클래스의 기본 요소

res <- toy(c(1:10)) 
res 

를 통해 이제 결과를 액세스 할 때

toy <- function(x){ 
    resA <- mean(x) 
    resB <- length(x) 

    output <- list(resA=resA, resB=resB, x=x) 
    class(output) <- "toy" 
    output 
} 

우리가 얻을 : 예를 들어, 우리가 어떤 일을 계산하고이처럼 S3 클래스로 다시보고 장난감 기능을 가지고 말할 수 예상대로 전체 목록을 결과로 출력합니다. 우리가 S3 인쇄 방법을 또한 다음

`print.toy` <- function(x){ 
    print(x$resA) 
} 

를 정의한다면 우리는 (이 경우 resBx에) 불필요한 정보를 숨기고 사용자는 resA보고 인쇄 표준 출력을 제공 할 수 있습니다. 그러나 이것은 클래스 toy의 객체에 대해 더 많은 계산을 적용하려는 경우 약간의 혼란을 야기 할 수 있습니다.

res <- toy(c(1:10)) 
res 
# Produces an error 
res + 1 
# Accesses the correct variable of class toy: 
res$resA + 1 

내 질문은 res + 1 전화뿐만 아니라 작동 할 수 있도록 어떤 변수가 지정되지 않은 경우주의해야 S3 클래스의 표준 값으로 목록 항목 resA을 정의 할 수있는 방법이있다, 지금 ?

감사합니다. @Ari 언급으로

+1

나는 이것을 위해'+'를 오버로드 할 필요가 있다고 생각한다. –

답변

4

한 가지 방법은 벡터를 사용하는 것입니다 + 대신 목록의 속성. 이것은 정규 벡터처럼 작동해야하는 데이터의 기본 데이터 하나와 몇 가지 추가 메타 데이터가있는 경우에 가장 적합합니다. 기본 방법은 특성을 보존하지 않기 때문에

toy <- function(x) { 
    resA <- mean(x) 
    resB <- length(x) 

    structure(resA, x = x, b = resB, class = "toy") 
} 
print.toy <- function(x, ...) { 
    print(as.vector(x)) 
} 
t <- toy(1:10) 
t + 1 
# [1] 6.5 

또한, [를 재정의해야합니다.

+0

고마워요! '구조체 '는 내가 원했던 것입니다. 기본적으로 여러분이 말했듯이, 주요 데이터 조각과 숨겨진 정보가 있습니다. –

+0

답을 가지고 놀아 보니, '$ .toy'<- function (x, y, ...) {attr (x, as.character (y))}'함수가 숨겨진 속성을 액세스 할 수있게 만들었다. 내가 마음에서 가지고 있었던 정확하게 방법으로, 다시 감사드립니다! !! (확실하지 않은데, 답을 수정하고이 함수를 여기에 추가하거나 코멘트에 그대로 두는 편이 낫겠습니까?) –

+0

더 이상 생각하지 않고 그 일을하는 것을 권장하지 않습니다. 목록이 아닌 속성이있는 객체를 기반으로합니다. – hadley

2

, 당신은 같은 것을 할 필요가 있습니다

`+.toy` <- function(a, b) { 
    # you should check for class/mode/is.atomic here if necessary 
    a$resA <- a$resA + b 
    a 
} 

t <- toy(1:10) 
t + 1 
# [1] 6.5 
+0

오버로드가 유일한 방법 인 것처럼 보이는 것은 유감 스럽습니다. 그 결과 오버로딩에서 전체 함수 집합이 발생하기 때문입니다. 나는 목록 항목이 지정되지 않은 경우'print' 출력을 기본 요소로 만드는 방법에 대해 약간의 기대를 가졌습니다. 따라서 R은이 항목을 추출하고이 항목에 대해 요청 된 작업을 수행합니다. –

+0

나는 당신의 요점을 이해하는 동안, 이것이 있어야 할 방법입니다. '+'는 기본적으로리스트 나 다른 객체에 대한 연산을 할 수 없다. – Arun