2014-11-30 2 views
34

R에서 새 클래스를 만드는 데 장점이나 단점을 찾기 위해 공개 질문을 게시하고 있습니다. R, S3, S4, R5 클래스를 만들 때 기본적으로 사용되는 4 가지 패러다임이 있습니다. 또는 RC) 및 R6.R : S3, S4, R5 (RC) 또는 R6에 클래스 만들기?

S3는 R의 핵심 라이브러리의 대부분을 사용하며 일반 메소드 전달을 사용하여 간단하고 가볍게 구조화 된 패턴을 고수하는 것이 유리할 것으로 보입니다. 캡슐화, 메소드 정의 등과 같이 나에게 명확하지 않은 다른 이유로 이것을 사용하지 않기를 바란다. 예를 들어, 클래스를 구조화 할 때 일반 메소드가 클래스 및 그 자연의 것들.

S4는 그다지 뛰어나지는 않지만, 분명히 발생할 수있는 분명한 실수를하기 위해 유형 관련 안전에 대한 형편없는 개념이 있습니다. 그러나 나는 여전히 S4 클래스가 캡슐화와 같은 것들에 대해 확신 할 수 없다는 의미에서 유지하기가 어렵다고 느낀다. 나를 혼란스럽게하는 또 다른 이유는 네임 스페이스의 개념이 거의 없다는 것입니다.

R5는 메소드의 정의가 함수를 디스패치하는 것이 아니라 클래스에 바인딩되어있는 익숙한 것과 비슷합니다. 여기에는 익숙해 진 클래스의 관점에서 객체를 구성하는 것에 관한 약간의 생각이 있습니다. 한 가지 단점은 R5도 S4를 기반으로 구축된다는 것입니다.

R6은 개인 및 공개 기능 및 속성과 같이 OOP 기능을 더 많이 추가 한 개인에 의해 R5가 다시 작성된 것처럼 보입니다.하지만이 정보에 대한 정보가 없기 때문에이 클래스에 대한 지원을 거의 찾을 수 없습니다. Google 검색을 통해 스파 스가 될 수 있습니다. 당신이 말할 수

, 나는 R의 OO 개념과 사투를 벌인거야 내가 일반적으로 OOP와 관련된 다음과 같은 측면을 알아낼 수 없습니다

  1. 유형 안전/유형
  2. 방법은/etc 바인딩, 캡슐화, 멤버 변수, 객체,
  3. 의 네임 및 조직 코드 상속의
  4. 버전.

내가 좋아하는 수업 시스템이 R 커뮤니티에 무엇인지 설명 할 수있는 답변을 제공 할 수 있는지 그리고 수업을 언제 사용하는지 가장 잘 생각하는 방법에 대해 궁금합니다.

+2

왜 "고급"의견 질문에 답변을하고 upvoted하지만 기본 의견 질문은 플래그가 지정되고, 타르 럽고, 페더 링됩니까? Google을 사용하고, rdev에게 물어보고, 색깔있는 책 등을 읽으십시오. – rawr

+1

또한 proto와 R.oo가 있습니다. 어쨌든 추상적 인 대답은 그다지 유용하지 않을 것 같습니다. 작지만 실제와 비슷한 구체적인 문제를 풀어 각 클래스 유형을 사용하여 작성하고 가장 편한 것을 확인하십시오. 그렇게하지 않으려는 경우 현명한 결정을 내릴 수있는 근거가 없으므로 S3를 사용하십시오. 가장 널리 사용되며 실제로 잘못 처리 할 수 ​​없기 때문입니다. –

+5

이 질문은 끝났습니다. 여기에 답을 드리겠습니다. S3과 R6을 적절하게 사용하십시오. RC를 사용하지 마십시오 (R6에 의해 대체되었습니다). S4를 사용하지 마십시오. 가치가있는 것보다 더 번거롭고 기능 프로그래밍이나 OOP를 잘하지 못합니다 (예외적으로 multimethod에 대한 지원은 있지만 거의 필요하지 않습니다). –

답변

37

이미 다양한 OOP 유형에 대한 정의와 용도를 알고있는 것으로 보입니다. 어떤 것을 사용하는 것이 적절한 때에 대한 의견을 제시 할 것입니다.

  1. 상황에

    사용 S3 클래스 경우 다음 두 가지 모두 적용 즉, (가) 개체는 정적이 아닌 자기 수정하고, (나)는 다중 인수 메소드 서명에 대한 상관 없어, 당신의 메서드는 객체의 S3 클래스 인 첫 번째 인수에 순전히 파견합니다. 또한 S3 클래스는 이러한 제한 사항을 준수하면서 많은 운영자에게 과부하를 걸기 좋은 솔루션입니다.

  2. 개체가 정적이고 자체 수정되지는 않지만 다중 인수 메서드 서명에 관심이있는 경우 S4 클래스를 사용하십시오. 내 경험에 비추어 볼 때, S4 OOP는 가치있는 것보다 항상 번거로운 작업 이었지만 어느 정도 유형 안전을 "보장"합니다.

  3. 개체가 자체 수정되는 경우 참조 클래스를 사용하십시오. 그렇지 않으면 많은 대체 메소드를 정의해야합니다 (예 : some_method<-, some_method(obj) <- value 구문으로 호출). R은 매번 객체의 전체 복사본을 생성 할 것이기 때문에 이것은 어색하고 계산 속도가 느립니다. R6는 좋은 대안이지만 내 목적에 꼭 필요한 것은 아닙니다.

R에 익숙하지 않은 대부분의 사람들은 혼란 스럽다고 생각합니다. 너무 많은 OOP 구현이있는 이유는 합의가 없었기 때문입니다.

올바르지 않습니다.

통계적 특성으로 인해 R의 대부분의 이질적인 구조 (즉, 객관적인 것)는 통계 알고리즘의 결과 인 lm, glmnet, gbm 등의 개체가됩니다. 그것은 일반적으로이 정보를 번들과 요약에 대한 기대 인터페이스를 제공하기에 충분 : 통계 놀이터로서의 유산 때문에 등,

print, summary을이 상속 같은에 대한 자세한 고급 개념을 생각하는 데에서 사용자를 확보하고 할당/할당 해제하고, 더 많은 공헌자에게 경기장을 엽니 다. 이것은 Ruby와 같은 일반적인 객체 지향 언어보다 R에서 복잡한 프로젝트 (예 : 웹 서버, 텍스트 구문 분석기, 그래픽 인터페이스 등)를 만드는 것이 다소 성가시다는 것을 의미하지만 OOP 유형이 동일하지 않습니다. 사용의 용이함에 균형을 이룬다.

그것에 대해 생각해 보는 마지막 방법은 서로 다른 접근법이 물질의 상전이, 즉 고체, 기체, 액체 같은 것입니다. 모든 이종 구조 (즉, OOP 유사 물체)를 균일하게 처리하는 대신, 일부는 다른 구조보다 하나의 구조 아래에서 자연스럽게 떨어진다. 오버랩 된 print 메서드로 멋지게 표시되도록 S3 클래스의 간단한 목록을 래핑하는 경우이 목적을 위해 전체 참조 클래스를 설정하는 것이 바람직하지 않습니다.

관련 문제