development

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

big-blog 2020. 7. 26. 11:37
반응형

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


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


관련 정보의 대부분은 보면 볼 수 있습니다 ?S3또는 ?UseMethod, 그러나 요컨대 :

S3은 메소드 디스패치 체계를 나타냅니다. 당신이 잠시 동안 R을 사용한 적이 있다면, 당신은이 있음을 알 수 있습니다 print, predictsummary객체의 다른 종류의 많은 방법.

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

  • 관심있는 객체의 클래스 설정 (예 : 메소드 호출의 반환 값 glm은 class입니다 glm)
  • 일반적인 이름 (예와 방법을 제공하는 print다음 다음), 도트 및 클래스 명 (예 : print.glm)
  • 이 일반적인 이름 ( print)을 준비하기 위해 약간의 준비가 이루어져야 하지만, 기존의 메소드 이름을 따르고 자하는 경우에는 필요하지 않습니다 (필요한 경우 이전에 참조한 도움말 참조). ).

하여 보는 사람의 눈에, 특히, 새로 만든 펑키 모델 피팅 패키지의 사용자, 훨씬 더 편리하게 입력 할 수 있도록되는 predict(myfit, type="class")보다 predict.mykindoffit(myfit, type="class").

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


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

UseMethod("median")

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

methods(median) #actually not that interesting.  

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

median.default

훨씬 더 흥미로운 예는 print다양한 방법을 가진 함수입니다.

methods(print)  #very exciting

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

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

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

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

  • S3는 일반 기능 OO라고하는 OO 프로그래밍 스타일을 구현합니다. 이것은 메시지 전달 OO를 구현하는 Java, C ++ 및 C #과 같은 대부분의 프로그래밍 언어와 다릅니다. 메시지 전달을 사용하면 메시지 (메서드)가 객체로 전송되고 객체는 호출 할 함수를 결정합니다. 일반적으로이 객체는 메소드 호출에서 특수하게 나타나며 일반적으로 메소드 / 메시지 이름 앞에 나타납니다 (예 : canvas.drawRect ( "blue")). S3가 다릅니다. 계산은 여전히 ​​메소드를 통해 수행되지만 일반 함수라고하는 특수 유형의 함수는 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 시스템의 빌딩 블록을 제공하기 때문에 알아야합니다.

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


시험

methods(residuals)

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

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

Methods that are called with an object of that class can rely on the object having those members. That's very different from S3 classes, which are just a list of a bunch of elements.

With S3 and S4, you call a member function by fun(object, args) and not by object$fun(args). If you are looking for something like the latter, have a look at the proto package.

참고URL : https://stackoverflow.com/questions/6583265/what-does-s3-methods-mean-in-r

반응형