Polimorfizm jest prawdopodobnie najpotężniejszą cechą języków programowania zorientowanych obiektowo, obok ich obsługi abstrakcji, i to właśnie odróżnia programowanie obiektowe od bardziej tradycyjnego programowania z abstrakcyjnymi typami danych. Polimorfizm dosłownie oznacza wiele form i do tego właśnie służy w programowaniu obiektowym. Ta sama nazwa będzie oznaczać różne znaczenia, w zależności od kontekstu, w jakim jest używana, tak jak w przypadku naszych języków naturalnych. Pozwala to na znacznie czystsze i zrozumiałe abstrakcje, a także kod. Mówiąc najprościej, polimorfizm można zaimplementować na dwa różne sposoby: od wewnątrz lub od zewnątrz obiektów. Gdy jest zaimplementowany z wewnątrz obiektów, każdy obiekt musi zawierać definicję tego, jak będzie radził sobie z danym komunikatem. Jest to najpopularniejsza metoda i można ją znaleźć w Javie lub Pythonie. R jest pod tym względem bardzo wyjątkowy i realizuje podejście zewnętrzne, formalnie znane jako generyczne lub parametryczny polimorfizm. Ten sposób programowania może być frustrujący dla osób, które stosowały tylko podejście wewnętrzne, ale może być bardzo elastyczny. Podejście zewnętrzne pozwala zdefiniować ogólną metodę lub funkcję dla typów obiektów, których jeszcze nie zdefiniowałeś i których nigdy nie możesz tego zrobić. Java i Python również mogą implementować ten typ polimorfizmu, ale nie jest to ich naturą, tak jak R może implementować wnętrze, ale też nie jest to jego naturą.