Poprawa szybkości implementacji języka R niekoniecznie wiąże się z zaawansowanymi technikami optymalizacji, takimi jak zrównoleglenie. Rzeczywiście, istnieje wiele prostych poprawek, które choć nie zawsze są oczywiste, mogą sprawić, że R będzie działał znacznie szybciej. Największym wąskim gardłem, jakie ludzie napotykają w przypadku R, jest brak zrozumienia właściwości niezmienności obiektu oraz kosztów ogólnych poniesionych podczas wykonywania kopii takich obiektów. Samo zajęcie się tym może przynieść radykalną poprawę wydajności i nie jest to zbyt trudne, gdy zrozumiesz, jak to zrobić. To dobry kandydat do rozpoczęcia poszukiwań optymalizacji. Jako przykład niektórych problemów, które mogą się pojawić, załóżmy, że masz nazwaną tablicę liczb. Teraz załóżmy, że chcesz zaktualizować pierwszy element programu to be, jak pokazano w poniższym fragmencie kodu:
a[1] <- 10
To zadanie jest o wiele bardziej złożone, niż się wydaje. W rzeczywistości jest realizowany za pośrednictwem funkcji zastępczej `”[<-„1` poprzez to wywołanie i przypisanie:
a <- `”[<-„` (a, 1, value = 10)
Na początku może się wydawać, że jest to bardzo dziwna składnia, ale pamiętaj, że jak widzieliśmy, że możemy mieć ciągi znaków, które reprezentują obiekty, w tym funkcje, tak jak w tym przypadku. Części linii `”[<-„` to w rzeczywistości nazwa funkcji wywoływanej z parametrami, a,1 i value = 10. Jeśli wykonasz poprzednie dwie linie, powinieneś otrzymać ten sam wynik; to jest pierwszy element w a bycia równym 10. To, co faktycznie się dzieje, to tworzenie wewnętrznej kopii; pierwszy element takiego obiektu zostanie zmieniony na 10 , a wynikowy obiekt zostanie ponownie przypisany do a. Mimo że po prostu zmieniamy tylko jeden element tablicy, w rzeczywistości cały wektor jest ponownie obliczany. Im większy wektor, tym gorszy problem, a to może znacznie spowolnić implementację. Jest jeszcze gorzej, gdy używasz ciężkich struktur danych, takich jak ramki danych. Języki, które pozwalają na mutabilność, takie jak Fortran lub C ++, po prostu zmienią określoną wartość w tablicy zamiast tworzyć nową kopię pełnej tablicy. Dlatego często zdarza się, że kod, który byłby w porządku w innych językach, generuje bardzo duże i często niepotrzebne narzuty, gdy jest programowany w podobny sposób w R.