Jak być może pamiętasz, język R wywodzi się z języka S. Model obiektowy S ewoluował w czasie, a jego trzecia wersja wprowadziła atrybuty klas, co pozwoliło na model obiektowy S3, który znajdujemy dzisiaj w R. Wciąż jest to model obiektowy w R, a większość wbudowanych klas R jest typu S3. To poprawny i bardzo elastyczny model obiektowy, ale bardzo różni się od tego, do czego przyzwyczajeni są ludzie wywodzący się z innych języków obiektowych. S3 jest najmniej formalnym modelem obiektowym, więc brakuje mu kilku kluczowych aspektów. Na przykład S3 nie oferuje formalnych definicji klas, co oznacza, że nie ma formalnej koncepcji dziedziczenia lub hermetyzacji, a polimorfizm jest uzyskiwany za pomocą typów ogólnych. Oczywiste jest, że jego funkcjonalność jest ograniczona pod pewnymi kluczowymi względami, ale programista ma dość dużą elastyczność. Jednak, jak ujął to Hadley Wickham w Advanced R, autorstwa Chapman and Hall, 2014: „S3 ma pewną elegancję w swoim minimalizmie: nie można zabrać jej żadnej części i nadal mieć użyteczny system obiektowy”