R 프로그래밍에서 S4 방법을 사용하는 것이 언제 효과가 있습니까?
저는 전문적인 맥락에서 정기적으로 R로 프로그래밍하고 클라이언트 나 동료를위한 패키지도 작성합니다. 여기에있는 일부 프로그래머는 Java 배경 지식이 있으며 S4 메소드를 사용하여 모든 것을 객체 지향 방식으로 수행해야한다고 주장합니다. 반면에 내 경험에 따르면 S4 구현은 종종 성능이 저하되고 코드가 원하는 작업을 수행하도록 할 때 훨씬 더 많은 골칫거리를 유발합니다.
어떤 경우에는 복잡한 개체를 구성하거나 기존 개체를 제어 된 방식으로 추가 할 수 있어야한다는 데 동의합니다. 그러나 대부분의 경우 S4 구현은 standardGeneric, 메서드, 생성자, 이니셜 라이저 등을 정의하는 것과 같은 번거 로움없이 클래식 목록을 사용하여 쉽게 수행 할 수 있습니다.
R에 대한 S4 구현 작성을 언제 고려하십니까?
편집 : 명확성을 위해 R에서 일반적으로 OO에 대한 답변과 토론에 감사드립니다 .OOP는 R에서 여러 가지 방법으로 수행 할 수 있지만 제 질문은 실제로 S4 방법을 사용하는 부가 가치를 목표로합니다.
저는 이것이 여러분에게 직접 적용되지 않는다고 가정하고 있지만, Bioconductor 용 패키지를 개발하는 경우 S4 사용을 적극적으로 장려하고 현재 10 년의 더 나은 기간 동안 S4를 사용할 인센티브가 있습니다. 따라서 모든 핵심 패키지는 S4를 많이 사용합니다.
setGeneric, setMethod, NAMESPACE 처리 등의 추가 오버 헤드가 모두 고통 스럽다는 것을 알았습니다. 즉, 그것이 부과하는 구조, 확장 가능성 및 기타 그러한 것들이 그만한 가치가 있다는 것을 알게되었습니다. 모든 것과 마찬가지로 절충안이 있습니다. 훨씬 깔끔 할 수 있다고 생각합니다. S3 메서드가 명명 규칙 (foo.class)으로 단순히 위장하는 방식이 마음에 들지 않습니다. 내가 말한 모든 것, 나는 그렇게하라는 지시를받지 않는 한 내 코드에서 S4를 많이 사용하지 않는 경향이 있습니다.
내 경험은 당신의 경험과 일치하므로 S3를 독점적으로 사용합니다.
명확히하기 위해 : S4에는 몇 가지 멋진 기능 (예 : 여러 인수에 대한 디스패치 및 슬롯 유형 검사)이 있지만 기능이 비용을 능가하는 상황은 발생하지 않았습니다. 비용의 예는 다음과 같습니다. 모든 슬롯 변경에는 전체 객체 복사가 필요하며 (잠재적으로 더 나쁠 수 있음) S4 방법에 대한 지속적인 변경이 필요합니다.
요컨대 S4의 아이디어가 마음에 들지만 제 코드에서 사용하기 전에 성숙 될 때까지 기다릴 것입니다.
좋은 질문입니다! 그리고 나는 그것이 사려 깊은 토론을 생성하기를 바랍니다.
나는 그것을 사용한 적이 없으며 다음과 같은 이유로 의도하지 않습니다.
- 공연
- 나는 S4를 완전히 이해하는 인내심이 없으며 S3와의 관계입니다.
- 구문 suguar : 나는 method (object)보다 object.method ()를 선호합니다.
나는 suguar를 좋아합니다.
동물 트랙 데이터에 대한 공간 (sp) 클래스를 확장하기 위해 S4를 배웠습니다. 필요한 모든 것을 처음부터 작성하지 않기 위해 사용 가능한 옵션 중에서 가장 일관되고 일반적이며 많은 GIS 정의와 밀접하게 일치하는 최상의 선택이었습니다. 많은 사람들이 말하는 것처럼 S4가 번거롭지는 않지만 이제는 이와 같은 객체의 기본 구조를 탐색하는 데 익숙합니다. 성능도 좋고, 잘 할 수 있다고 생각 합니다만, 잘못하면 성능 함정이 있습니다.
공간 데이터에 관심이 있다면, spatstat는 S3에서 sp와 유사한 작업을 많이 수행하는 방법에 대한 좋은 예입니다.하지만 (겉보기에는 모든 공간....) 서로 다른 소프트웨어의 데이터 구조간에 명확한 비유가 거의 없습니다. .
S4 클래스는 공간 통계 (sensu 패키지 sp
) 에서 강력한 역할을 하며 한 유형의 데이터에서 다른 유형의 데이터로 원활하게 변환됩니다. 이것의 함정은 내 경험상 기껏해야 지루한 디버깅입니다. 지금까지 S3로 관리했지만 향후 S4 사용을 고려할 수 있습니다.
시간이 지남에 따라 일이 많이 진행됨에 따라 R의 다양한 분야의 핵심 기능 (공간 분석, 계량 경제학, 환경 측정 등)에서 강력한 역할을 할 것이라고 생각합니다.
R에서 OO를 수행하는 세 번째 방법을 제공하는 R.oo (CRAN에서)도 있다는 것을 잊지 마십시오. 제 생각에 이것은 다른 시스템에서 마이그레이션하는 프로그래머에게 더 친숙한 OO 시스템을 제공합니다. 함수 (그러면 print (foo)가 foo의 클래스에 디스패치해야 함) 메서드는 객체에 연결되어 있으므로 foo $ print ()를 수행합니다. Python 또는 C ++에서와 마찬가지로 foo.print ().
옛날에 Roxygen2는 S4 방법을 좋아하지 않았습니다. 2017 년 (적어도)부터는 함께 작동합니다.
나는 S3 및 S4 클래스 모두에서 작동하는 방법이 필요한 일부 함수를 만드는 불행을 겪었습니다. R-core는 이러한 시스템이 상호 작용하는 방식과 네임 스페이스가 작동하는 방식 및 Rcmd 검사가 작동하는 방식에 대한 세부 정보를 여러 번 변경했기 때문에 수년 동안이 코드를 계속 작동시키는 것이 매우 고통 스러웠습니다.
Google의 스타일 가이드가 마음에 들지 않으면 R-help 의이 스레드에서 잘 알려진 R 패키지 개발자의 의견을 고려하십시오.
Frank Harrell "시간을 소중히 여기는 것보다 컴퓨터 과학을 더 좋아한다면 S4를 사용하십시오."
Terry Therneau는 다음과 같이 썼습니다. 제가하는 일의 90 %는 경직 (S4) 클래스보다 느슨한 (S3) 클래스를 강력하게 선호합니다 .... S4 대 S3에 대한 요약
S4는 다음과 같이 크게 증가합니다. 1. 작성하기 불편 함 2. 디버그하기 어려움 3. 매우 모호한 코드 작성 능력 4. 디자인
S4 이득 : 5. 자동 변환을 지시하는 능력 6. 클래스 객체의 내용을 검증
참고 URL : https://stackoverflow.com/questions/3602154/when-does-it-pay-off-to-use-s4-methods-in-r-programming
'IT Share you' 카테고리의 다른 글
.class가 클래스의 정적 블록을 호출하지 않는 이유는 무엇입니까? (0) | 2020.11.08 |
---|---|
우리가 사용하면 안돼 (0) | 2020.11.08 |
.NET에서 Dapper로 데이터베이스 연결을 어떻게 처리합니까? (0) | 2020.11.08 |
Go HTTP 핸들러에서 ResponseWriter는 값이지만 Request는 포인터 인 이유는 무엇입니까? (0) | 2020.11.08 |
PHPUnit에서 시간을 "모의"할 수 있습니까? (0) | 2020.11.08 |