it-swarm.dev

R에서 "S3 방법"은 무엇을 의미합니까?

나는 R을 처음 접했기 때문에 S3 메소드와 객체가 무엇인지 모른다. S3 및 S4 객체 시스템이 있으며 가능한 경우 S4를 통해 S3를 사용하는 것이 좋습니다 (http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html). 그러나 S3 방법/객체의 정확한 정의를 모릅니다.

110
jiggysoo

대부분의 관련 정보는 ?S3 또는 ?UseMethod를 통해 간단히 찾을 수 있습니다.

S3은 메소드 디스패치 체계를 나타냅니다. R을 얼마 동안 사용했다면, 많은 종류의 객체에 대해 print, predictsummary 메소드가 있음을 알 수 있습니다.

S3에서는 다음과 같이 작동합니다.

  • 관심있는 객체의 클래스 설정 (예 : glm 메소드에 대한 호출의 반환 값에는 glm 클래스가 있음)
  • 일반 이름 (예 : print), 점 및 클래스 이름 (예 : print.glm)으로 메소드 제공
  • 이 일반적인 이름 (print)을 준비하려면 약간의 준비가되어 있어야합니다. 그러나 기존의 메소드 이름을 따르려고한다면 필요하지 않습니다 (도움말 참조). 당신이 이전에 참조).

보는 사람, 특히 새로 만든 펑키 모델 피팅 패키지의 사용자에게는 predict(myfit, type="class")보다 predict.mykindoffit(myfit, type="class")을 입력하는 것이 훨씬 편리합니다.

그것에 약간 더 있지만, 이것은 당신을 시작해야합니다. 객체의 속성 (클래스)을 기반으로 메소드를 디스패치하는이 방법에는 몇 가지 단점이 있지만 (C 순수 주의자는 아마도 밤에 깨어있을 것입니다) 많은 상황에서 적절하게 작동합니다. 최신 버전의 R에서는 새로운 방법이 구현되었지만 (S4 및 참조 클래스) 대부분의 사람들은 여전히 ​​S3 만 사용합니다.

79
Nick Sabbe

S3를 시작하려면 median 함수의 코드를보십시오. 프롬프트에서 median를 입력하면 본문에 한 줄이 있음을 알 수 있습니다.

UseMethod("median")

그것은 그것이 S3 방법이라는 것을 의미합니다. 즉, 다른 S3 클래스마다 다른 median 함수를 가질 수 있습니다. 가능한 모든 중간 방법을 나열하려면 다음을 입력하십시오.

methods(median) #actually not that interesting.  

이 경우 기본적으로 하나의 메소드 만 호출됩니다. 입력하여 해당 코드를 볼 수 있습니다

median.default

훨씬 더 흥미로운 예는 여러 가지 방법이있는 print 함수입니다.

methods(print)  #very exciting

일부 메소드에는 *s 이름 옆에 있습니다. 이는 패키지의 네임 스페이스 안에 숨겨져 있음을 의미합니다. find를 사용하여 어떤 패키지가 들어 있는지 확인하십시오. 예를 들어

find("acf")  #it's in the stats package
stats:::print.acf
48
Richie Cotton

http://adv-r.had.co.nz/OO-essentials.html 에서 :

R의 세 가지 OO 시스템은 클래스와 메소드 정의 방식이 다릅니다 :

  • S3는 일반 함수 OO라는 프로그래밍 스타일 OO)를 구현합니다. 이는 Java, C++ 및 C #과 같이 메시지 전달 OO를 구현하는 대부분의 프로그래밍 언어와 다릅니다. (메소드)는 객체로 전송되고 객체는 호출 할 함수를 결정합니다. 일반적으로이 객체는 메소드/메시지 이름 앞에 나타나는 메소드 호출에서 특수하게 나타납니다 (예 : canvas.drawRect ( "blue")). 계산은 여전히 ​​메소드를 통해 수행되지만 일반 함수라고하는 특수한 유형의 함수는 drawRect (canvas, "blue")와 같이 호출 할 메소드를 결정합니다 .S3은 매우 캐주얼 한 시스템입니다. 클래스의 정의.

  • S4는 S3와 유사하게 작동하지만보다 형식적입니다. S3에는 두 가지 주요 차이점이 있습니다. S4에는 각 클래스의 표현 및 상속을 설명하는 공식 클래스 정의가 있으며 제네릭과 메서드를 정의하기위한 특수 도우미 함수가 있습니다. S4에는 다중 디스패치도 있습니다. 즉, 일반 함수는 하나의 인수가 아닌 여러 인수의 클래스를 기반으로 메소드를 선택할 수 있습니다.

  • 간단히 RC라고하는 참조 클래스는 S3 및 S4와는 상당히 다릅니다. RC는 메시지 전달 OO를 구현하므로 메소드는 함수가 아닌 클래스에 속합니다. $는 객체와 메소드를 분리하는 데 사용되므로 메소드 호출은 canvas $ drawRect ( "blue")와 같습니다. RC 객체도 변경할 수 있습니다. R의 일반적인 수정시 복사 시맨틱을 사용하지 않지만 제자리에서 수정됩니다. 따라서 추론하기가 더 어려워 지지만 S3 또는 S4로는 해결하기 어려운 문제를 해결할 수 있습니다.

OO가 아닌 다른 시스템도 있지만 여기에서 언급하는 것이 중요합니다.

  • 기본 유형, 다른 OO 시스템의 기초가되는 내부 C 레벨 유형. 기본 유형은 대부분 C 코드를 사용하여 조작되지만, 기본 유형은 다른 OO 시스템.
34
Amit K Thakur

나는이 질문에 주로 이름이 어디에서 왔는지 궁금해했다. 이 위키 백과 기사 에서 이름은 R이 기반으로하는 S 프로그래밍 언어의 버전을 나타냅니다. 다른 답변에 설명 된 방법 디스패치 체계는 S에서 왔으며 버전에 따라 적절하게 레이블이 지정되어 있습니다.

11
Sam Hoice

시험

methods(residuals)

"residuals.lm"및 "residuals.glm"을 나열합니다. 이것은 선형 모델 m과 유형 residuals(m)을 적합하게 만들면, Resids.lm이 호출됩니다. 일반화 된 선형 모형을 적합하면 잔차 .glm이 호출됩니다. 일종의 C++ 객체 모델이 거꾸로되어 있습니다. C++에서는 파생 클래스로 재정의되는 가상 함수가있는 기본 클래스를 정의합니다. R에서는 가상 (일명 일반) 함수를 정의한 다음이 함수를 대체 할 클래스 (메소드 정의)를 결정합니다. 이를 수행하는 클래스는 하나의 공통 수퍼 클래스에서 파생 될 필요가 없습니다. 나는 일반적으로 S4보다 S3을 선호한다는 데 동의하지 않을 것입니다. S4는 형식이 더 많고 (= 더 많은 타이핑) 일부 응용 프로그램에는 너무 많을 수 있습니다. 그러나 S4 클래스는 C++에서 클래스 나 구조체처럼 정의 될 수 있습니다. 특정 클래스의 객체가 문자열과 두 개의 숫자로 구성되도록 지정할 수 있습니다.

setClass("myClass", representation(label = "character", x = "numeric", y = "numeric"))

해당 클래스의 객체로 호출 된 메소드는 해당 멤버가있는 객체에 의존 할 수 있습니다. S3 클래스와는 매우 다릅니다. S3 클래스는 여러 요소의 목록 일뿐입니다.

S3 및 S4에서는 fun(object, args)가 아니라 object$fun(args)가 멤버 함수를 호출합니다. 후자와 같은 것을 찾고 있다면 프로토 패키지를 살펴보십시오.

8
Harald Brendel