Liczby

Liczby w R zachowują się mniej więcej tak, jak można by tego oczekiwać matematycznie. Na przykład operacja 2 / 3  wykonuje rzeczywiste dzielenie, co daje 0,6666667 w R. To naturalne zachowanie numeryczne jest bardzo wygodne do analizy danych, ponieważ nie trzeba płacić zbyt dużo Uwaga przy używaniu numerów różnych typów, które mogą wymagać specjalnego traktowania w innych językach. Obowiązują również matematyczne priorytety operatorów, jak również użycie nawiasów. Poniższy przykład pokazuje, jak zmienne mogą być używane w operacjach i jak są obsługiwane priorytety operatorów. Jak widać, podczas wykonywania operacji można mieszać użycie zmiennych z wartościami:

x <- 2

y <- 3

z <- 4

(x * y + z) / 5

#> [1] 2

Operację modulo można wykonać za pomocą symbolu %%, natomiast dzielenie całkowitoliczbowe za pomocą symbolu%/%:

7 %% 2

#> [1] 1

7 %/% 3

#> [1] 2

Praca z typami danych i strukturami danych

W tej sekcji podsumowano najważniejsze typy danych i struktury danych w języku R. W tym krótkim przeglądzie nie będziemy ich szczegółowo omawiać. Pokażemy tylko kilka przykładów, które pozwolą ci zrozumieć kod przedstawiony w tej książce. Jeśli chcesz zagłębić się w nie, możesz zajrzeć do ich dokumentacji lub niektórych odniesień wymienionych we wstępie do tego rozdziału. Podstawowymi typami danych w R są liczby, tekst i wartości logiczne (PRAWDA lub FAŁSZ), które R wywołuje odpowiednio cyfry, znaki i wartości logiczne. Ściśle mówiąc, istnieją również typy dla liczb całkowitych, liczb zespolonych i surowych danych (bajtów), ale nie będziemy ich używać bezpośrednio w tej książce. Sześć podstawowych struktur danych w R to wektory, czynniki, macierze, ramki danych i listy, które podsumujemy w kolejnych sekcjach.

Stan śledzenia z symbolami i zmiennymi

Podobnie jak większość języków programowania, R umożliwia przypisywanie wartości do zmiennych i odwoływanie się do tych obiektów po nazwie. Nazwy, których używasz do odwoływania się do zmiennych, nazywane są symbolami w języku R. Te zmienne mogą zawierać dowolny typ obiektu dostępny w języku R, nawet ich kombinacje podczas korzystania z list. Co więcej, te obiekty są niezmienne

W R operatorem przypisania jest <- który jest symbolem mniejszości (< ), po którym następuje myślnik (-). Jeśli wcześniej pracowałeś z pseudokodem algorytmu, może Ci się on wydawać znajomy. Możesz również użyć pojedynczego symbolu równości (=) do przydziałów, podobnie jak w wielu innych językach, ale ja wolę trzymać się operatora <-. Wyrażenie takie jak x <- 1oznacza, że ​​wartość 1 jest przypisana do symbolu x, który można traktować jako zmienną. Możesz również przypisać odwrotnie, co oznacza, że ​​wyrażenie takie jak 1 -> x  miałoby taki sam efekt jak wcześniej. Jednak przypisanie od lewej do prawej jest bardzo rzadko używane i jest bardziej wygodną funkcją w przypadku gdybyś zapomniał operatora przypisania na początku wiersza w konsoli. Zauważ, że podstawianie wartości jest wykonywane w momencie przypisania wartości do z, a nie w momencie, gdy obliczana jest wartość z. Jeśli wprowadzisz następujący kod do konsoli, zobaczysz, że po raz drugi drukowany jest 􀁛, nadal ma on wartość, którą miał y, gdy był używany do przypisania do niego, a nie wartość y przypisaną później:

x <- 1

y <- 2

z <- c(x,y)

z

#> [1] 1 2

Y <- 3

z

#> [1] 1 2

Używanie nazw zmiennych, takich jak x, y i z, jest łatwe, ale w przypadku prawdziwych programów ich używanie jest bardzo kosztowne. Kiedy używasz takich nazw, prawdopodobnie masz bardzo dobre wyobrażenie o tym, jakie wartości będą zawierać i jak będą używane. Innymi słowy, ich zamiar jest dla ciebie jasny. Jednak gdy dajesz swój kod komuś innemu lub wracasz do niego po długim czasie, intencje te mogą nie być jasne i wtedy tajemnicze nazwy mogą być szkodliwe. W prawdziwych programach Twoje nazwy powinny być samoopisowe i natychmiast komunikować zamiar. Standardowe nazwy obiektów w języku R powinny zawierać tylko znaki alfanumeryczne (liczby i litery ASCII), podkreślenia (_) oraz, w zależności od kontekstu, nawet kropki (.). Jednak R pozwoli ci użyć bardzo tajemniczych ciągów, jeśli chcesz. Na przykład w poniższym kodzie pokazujemy, jak zmienna o nazwie !A @B #C $D %E&F jest używana do umieszczania wektora z trzech liczb całkowitych. Jak widać, możesz nawet używać spacji. Możesz użyć tej niestandardowej nazwy pod warunkiem, że zawiniesz ciąg znakami odwrotnymi (`):

!A @B #C $D %E&F`  <- C(1,2,3)

!A @B #C $D %E&F`

#> [1] 1 2 3

Nie trzeba dodawać, że należy unikać tych nazw, ale należy mieć świadomość, że istnieją, ponieważ mogą się przydać podczas korzystania z bardziej zaawansowanych funkcji języka R. Te typy nazw zmiennych nie są dozwolone w większości języków, ale R jest pod tym względem elastyczny. Ponadto przykład pokazuje wspólny motyw związany z programowaniem w języku R: jest tak elastyczny, że jeśli nie będziesz ostrożny, skończysz strzelając sobie w stopę. Nierzadko zdarza się, że ktoś jest bardzo zdezorientowany co do jakiegoś kodu, ponieważ zakładał, że R zachowa się w określony sposób (na przykład wywoła błąd w określonych warunkach), ale nie testuje jawnie takiego zachowania, a później stwierdza, że ​​zachowuje się inaczej .

Wykonywanie kodu R w sesjach nieinteraktywnych

Gdy kod ma już funkcjonalność, którą chciałeś zaimplementować, wykonanie go za pośrednictwem sesji interaktywnej przy użyciu konsoli może nie być najlepszym sposobem na zrobienie tego. W takich przypadkach inną opcją jest polecenie komputerowi, aby wykonał kod bezpośrednio za Ciebie, w sesji nieinteraktywnej. Oznacza to, że nie będziesz w stanie wpisywać poleceń w konsoli, ale odniesiesz korzyść z możliwości skonfigurowania komputera do automatycznego wykonywania kodu lub integracji go z większymi systemami, w których R jest tylko jednym z wiele elementów. Jest to znane jako tryb wsadowy. Aby wykonać kod w trybie wsadowym, masz dwie opcje: starą komendę R, CMD BATCH, której nie będziemy się przeglądać, i nowszą komendę, Rscript, której będziemy. Rscript to polecenie, które można wykonać w terminalu komputera. Otrzymuje nazwę pliku kodu źródłowego i wykonuje jego zawartość.

W poniższym przykładzie wykorzystamy różne koncepcje, które wyjaśnimy w kolejnych sekcjach, więc jeśli nie czujesz się gotowy, aby je zrozumieć, możesz pominąć to teraz i wrócić do tego później.

Załóżmy, że masz następujący kod w pliku o nazwie greeting.R. Pobiera argumenty przekazane przez wiersz poleceń do Rscript przez obiekt args utworzony za pomocą funkcji commadArgs() , przypisuje odpowiednie wartości zmiennym powitania i nazwy, a na koniec wyświetla wektor zawierający te wartości.

args  ← commandArgs(TRUE)

greeting ← args[1]

name ← args[2]

print(c(greeting, name))

Gdy będziesz gotowy, możesz użyć polecenia Rscript, aby wykonać go z terminala (nie z poziomu konsoli R), jak pokazano powyżej. Wynik pokazuje wektor z przekazanymi wartościami zmiennych powitania i nazwy. Gdy zobaczysz wiersz polecenia, który zaczyna się od symbolu $ zamiast symbolu >, oznacza to, że powinieneś wykonać ten wiersz w terminalu komputera, a nie w konsoli R.

$ Rscript greetig.R  Hi John

[1] „Hi” „Joh”

Zwróć uwagę, że jeśli po prostu uruchomisz plik bez żadnych argumentów, zostaną one przekazane jako wartości NA, co pozwoli ci dostosować kod do takich sytuacji:

$ Rscript greeting.R

[1] NA NA

To był bardzo prosty przykład, ale ten sam mechanizm może być użyty do wykonania znacznie bardziej złożonych systemów, takich jak ten, który zbudujemy w ostatnich rozdziałach tej książki, aby stale pobierać dane cenowe w czasie rzeczywistym ze zdalnych serwerów. Wreszcie, jeśli chcesz zapewnić mechanizm, który jest bliższy mechanizmowi w Pythonie, możesz zajrzeć do pakietu optparse, aby utworzyć strony pomocy wiersza poleceń, a także przeanalizować argumenty.

Wydajna pętla zapisu i wykonania

Jednym z najbardziej produktywnych sposobów pracy z R, szczególnie podczas nauki, jest użycie pętli write-execute, która wykorzystuje funkcję wysyłania do konsoli wspomnianą w poprzedniej sekcji. Pozwoli ci to zrobić dwie bardzo ważne rzeczy: opracować kod za pomocą małych i szybkich iteracji, które pozwolą ci zobaczyć postęp krok po kroku, aż osiągniesz zbieżność z poszukiwanym zachowaniem, i zapisać kod, do którego doszedłeś jako ostateczny wynik, który można łatwo odtworzyć za pomocą pliku kodu źródłowego, którego użyłeś do swoich iteracji. Pliki kodu źródłowego  R mają rozszerzenie .R Zakładając, że masz plik kodu źródłowego gotowy do wysyłania wyrażeń do konsoli, podstawowe kroki przez pętlę zapisu i wykonania są następujące:

  1. Zdefiniuj, jakie zachowanie chcesz zaimplementować za pomocą kodu.
  2. Napisz minimalną ilość kodu niezbędną do osiągnięcia jednego zachowania, którego oczekujesz w swojej implementacji.
  3. Użyj funkcji wysyłania do konsoli, aby sprawdzić, czy wynik w konsoli jest zgodny z oczekiwaniami, a jeśli tak nie jest, zidentyfikuj możliwe przyczyny.
  4. Jeśli nie jest to zgodne z oczekiwaniami, wróć do drugiego kroku w celu naprawienia kodu, aż uzyska zamierzony element zachowania.
  5. Jeśli tego się spodziewałeś, wróć do drugiego kroku, aby rozszerzyć kod o inny element zachowania, aż do osiągnięcia konwergencji.

Ta pętla zapisu i wykonania stanie się dla ciebie drugą naturą, gdy zaczniesz jej używać, a kiedy to się stanie, będziesz bardziej produktywnym programistą języka R. Pozwoli ci to szybciej diagnozować problemy, szybko eksperymentować z kilkoma sposobami wykonania tego samego zachowania, aby znaleźć ten, który wydaje się najlepszy dla twojego kontekstu, a gdy masz działający kod, pozwoli ci również wyczyścić implementację, aby zachować takie samo zachowanie, ale lepszy lub bardziej czytelny kod.

Dla doświadczonych programistów powinien to być proces znany i bardzo podobny do programowania sterowanego testami (TDD), ale zamiast używać testów jednostkowych do automatycznego testowania kodu, weryfikujesz dane wyjściowe w konsoli w każdej iteracji i nie ma zestawu testów do ponownego przetestowania każdej iteracji. Mimo że TDD nie będzie używany w tej książce, zdecydowanie możesz go użyć w R.

Zachęcam cię do skorzystania z tej pętli zapisz-wykonaj, aby przeanalizować  przedstawione przykłady. Czasami pokażemy postęp krok po kroku, aby lepiej zrozumieć kod, ale praktycznie niemożliwe jest pokazanie wszystkich iteracji pętli zapisu i wykonania, przez które przeszedłem, aby go opracować, a większość wiedzy, którą możesz zdobyć, pochodzi od iteracji w ten sposób.

Funkcja wysyłania do konsoli

Podstawowa instalacja języka R zapewnia środowisko konsoli, o którym wspomnieliśmy w poprzedniej sekcji. Ta konsola to naprawdę wszystko, czego potrzebujesz do pracy z R, ale wpisywanie wszystkiego bezpośrednio w niej szybko stanie się uciążliwe i może nie być najlepszą opcją. Aby efektywnie pracować z R, musisz mieć możliwość eksperymentowania i wykonywania iteracji tak szybko, jak to tylko możliwe. Takie postępowanie przyspieszy Twoją naukę i produktywność. Niezależnie od używanego narzędzia, kluczową funkcjonalnością, której potrzebujesz, jest możliwość łatwego wysyłania fragmentów kodu do konsoli bez konieczności ich samodzielnego wpisywania lub kopiowania ich z edytora i wklejania do konsoli. W RStudio można to zrobić, klikając przycisk Uruchom lub Źródło w prawym górnym rogu panelu edytora kodu. W Emacsie możesz użyć polecenia ess-eval-region.

Narzędzia do wydajnej pracy z R

W tej sekcji omówimy narzędzia, które pomogą nam podczas pracy z R.

Wybierz IDE lub potężny edytor

Aby uzyskać wydajne tworzenie kodu, możesz wypróbować potężniejszy edytor lub zintegrowane środowisko programistyczne (IDE). Najpopularniejszym IDE dla R jest RStudio. Oferuje imponujący zestaw funkcji, który znacznie ułatwia interakcję z R. Jeśli jesteś nowy w R i programowaniu w ogóle, prawdopodobnie jest to najlepszy sposób. Jak widać na poniższym obrazku, otacza konsolę (prawa strona) w większą aplikację, która oferuje dużo funkcjonalności, a w tym przypadku wyświetla system pomocy (lewa strona). Ponadto RStudio oferuje między innymi zakładki umożliwiające nawigację po plikach, przeglądanie zainstalowanych pakietów, wizualizację wykresów, a także dużą liczbę opcji konfiguracyjnych w rozwijanych menu górnych. W całej tej książce nie będziemy korzystać z żadnych funkcji oferowanych przez RStudio. Wszystko, co ci pokażę, to czysta funkcjonalność R. Postanowiłem postępować w ten sposób, aby upewnić się, że książka będzie przydatna dla każdego programisty R, w tym dla tych, którzy nie używają RStudio. Dla użytkowników RStudio oznacza to, że mogą istnieć łatwiejsze sposoby wykonania niektórych zadań, które pokażę, i zamiast programować kilka wierszy, wystarczy kliknąć kilka przycisków. Jeśli wolisz to, zachęcam do przejrzenia doskonałych webinariów RStudio Essential, które można znaleźć na stronie internetowej RStudio .

Należy uważać, aby uniknąć częstego błędu określania R jako RStudio. Ponieważ wiele osób poznaje język R za pośrednictwem RStudio, myślą, że RStudio to w rzeczywistości R, a tak nie jest. RStudio to opakowanie wokół języka R, które rozszerza jego funkcjonalność, i jest technicznie znane jako IDE. Doświadczeni programiści mogą wolą pracować z innymi narzędziami, które już znają i kochają i używali od wielu lat. Na przykład w moim przypadku wolę używać Emacsa  dla wszelkie programy, które robię. Emacs to bardzo potężny edytor tekstu, który możesz programowo rozszerzyć, aby działał tak, jak chcesz, używając języka programowania znanego jako Elisp, który jest rozszerzeniem Lisp. Jeśli używasz również Emacsa, pakiet ess jest wszystkim, czego naprawdę potrzebujesz. Jeśli zamierzasz używać Emacsa, zachęcam do przejrzenia dokumentacji pakietu ess. Jeśli używasz Vima, Sublime Text, Atom lub innych podobnych narzędzi, jestem pewien, że możesz również znaleźć przydatne pakiety.

Interpreter i konsola

Jak wspomniałem wcześniej, R jest językiem interpretowanym. Po wprowadzeniu wyrażenia do konsoli R lub wykonaniu skryptu R na terminalu systemu operacyjnego program zwany interpreter analizuje i wykonuje kod. Inne przykłady języków interpretowanych to Lisp, Python i JavaScript. W przeciwieństwie do C, C++ i Java, R nie wymaga jawnej kompilacji programów przed ich wykonaniem. Wszystkie programy języka R składają się z serii wyrażeń. Interpreter zaczyna od przeanalizowania każdego wyrażenia, podstawienia obiektów za symbole tam, gdzie to konieczne, ich oceny i na koniec zwrócenia wynikowych obiektów. W następnych sekcjach zdefiniujemy każde z tych pojęć, ale należy pamiętać, że jest to podstawowy proces, przez który przechodzą wszystkie programy języka R. Konsola R jest najważniejszym narzędziem do korzystania z języka R i można ją traktować jako element otaczający interpretera. Konsola to narzędzie, które umożliwia wpisywanie wyrażeń bezpośrednio w języku R i sprawdzanie, jak odpowiada. Interpreter odczyta wyrażenia i odpowie, przedstawiając wynik lub komunikat o błędzie, jeśli taki wystąpił. Kiedy wykonujesz wyrażenia przez konsolę, interpreter automatycznie przekaże obiekty do funkcji print(), dlatego możesz zobaczyć wynik wydrukowany poniżej twoich wyrażeń. Jeśli wcześniej używałeś wiersza poleceń (na przykład bash w Linuksie w macOS lub cmd.exe w Windows) lub języka z interaktywnym interpreterem, takim jak Lisp, Python lub JavaScript, konsola powinna wyglądać znajomo, ponieważ jest po prostu interfejs wiersza poleceń. Jeśli nie, nie martw się. Interfejsy wiersza poleceń są prostymi w użyciu narzędziami. Są to programy, które otrzymują kod i zwracają obiekty, których wydrukowane reprezentacje widzisz poniżej wykonywanego kodu. Po uruchomieniu R zobaczysz okno z konsolą R. Wewnątrz konsoli zobaczysz komunikat podobny do pokazanego poniżej. Ten komunikat wyświetla podstawowe informacje, w tym wersję R, którą używasz, informacje o licencji, przypomnienia o tym, jak uzyskać pomoc, oraz wiersz polecenia.

Należy zauważyć, że domyślnie R wyświetli znak większości (>) na początku ostatniego wiersza konsoli, sygnalizując, że jest gotowy do odbierania poleceń. Ponieważ R prosi o wpisanie czegoś, nazywa się to wierszem polecenia. Kiedy zobaczysz symbol większości, R może otrzymać więcej wyrażeń jako dane wejściowe. Jeśli tego nie robisz, jest to prawdopodobnie spowodowane tym, że R jest zajęty przetwarzaniem czegoś, co wysłałeś i przed wysłaniem czegoś innego powinieneś poczekać, aż się zakończy. W większości przypadków w tej książce w ogóle unikniemy wyświetlania takich poleceń, ponieważ możesz wpisywać kod do pliku kodu źródłowego lub bezpośrednio do konsoli, ale jeśli go wprowadzimy, upewnij się, że nie jawnie wpisz to. Na przykład, jeśli chcesz replikować następujący fragment kodu, wystarczy wpisać w konsoli tylko 1 + 2 i nacisnąć klawisz Enter. Kiedy to zrobisz, zobaczysz [1] 3, które jest wynikiem otrzymanym od R. Śmiało i wykonaj różne wyrażenia arytmetyczne, aby poczuć konsolę:

> 1 + 2

[1] 3

Zwróć uwagę na [1], który towarzyszy każdej zwracanej wartości. Jest tam, ponieważ wynik jest w rzeczywistości wektorem (uporządkowaną kolekcją). [1] oznacza, że ​​indeks pierwszego elementu wyświetlanego w tym wierszu to 1 (w tym przypadku nasz wynikowy wektor ma jedną wartość wewnątrz). Na koniec powinieneś wiedzieć, że konsola zapewnia narzędzia do przeglądania poprzednich poleceń. Prawdopodobnie okaże się, że klawisze strzałek w górę iw dół są najbardziej przydatne. Możesz przewijać poprzednie polecenia, naciskając je. Strzałka w górę pozwala spojrzeć na wcześniejsze polecenia, a strzałka w dół – na późniejsze polecenia. Jeśli chcesz powtórzyć poprzednie polecenie z niewielką zmianą lub jeśli chcesz poprawić błąd, możesz to łatwo zrobić za pomocą tych klawiszy.

Porównanie R z innym oprogramowaniem

Moim zamiarem w tej sekcji nie jest zapewnienie kompleksowego porównania między R i innym oprogramowaniem, ale po prostu wskazanie kilku najbardziej zauważalnych funkcji R. Jeśli możesz, zachęcam do samodzielnego przetestowania innego oprogramowania, abyś wiedział z pierwszej ręki, jakie może być najlepsze narzędzie do wykonywanej pracy. Najbardziej zauważalną cechą języka R w porównaniu z innymi programami statystycznymi, takimi jak SAS, Stata, SPSS, a nawet Python, jest bardzo duża liczba dostępnych pakietów. W sieci The Comprehensive R Archive Network (CRAN) opublikowano prawie 12 000 pakietów i nie obejmuje to pakietów opublikowanych w innych miejscach, takich jak repozytoria Git. Dzięki temu R może mieć bardzo dużą społeczność i ogromną liczbę narzędzi do analizy danych w takich obszarach, jak finanse, matematyka, uczenie maszynowe, obliczenia o wysokiej wydajności i wiele innych. Z wyjątkiem Pythona, R ma znacznie więcej możliwości programistycznych niż SAS, Stata, SPSS, a pod pewnymi względami nawet większe niż Python (na przykład w R można używać różnych modeli obiektowych). Jednak wydajne i efektywne użycie języka R wymaga użycia kodu, co dla niektórych osób oznacza stromą krzywą uczenia się, podczas gdy Stata i SPSS mają graficzne interfejsy użytkownika, które prowadzą użytkownika przez wiele zadań za pomocą kreatorów typu „wskaż i kliknij”. Moim zdaniem to trzymanie się za rękę, choć przyjemne dla początkujących, szybko staje się ważnym ograniczeniem dla osób pragnących stać się średnio zaawansowanymi i zaawansowanymi użytkownikami, i właśnie w tym miejscu naprawdę widać zalety programowania. R ma jeden z najlepszych systemów graficznych spośród wszystkich istniejących programów. Najpopularniejszym pakietem do tworzenia wykresów w R, z którego będziemy intensywnie korzystać, jest pakiet ggplot2, ale jest też wiele innych świetnych pakietów graficznych. Ten pakiet umożliwia modyfikację praktycznie każdego aspektu wykresu poprzez gramatykę graficzną i znacznie przewyższa wszystko, co widziałem w SPSS, Stata, SAS, a nawet Pythonie. R to świetne narzędzie, ale nie jest odpowiednie do wszystkiego. Jeśli chcesz przeprowadzić analizę danych, ale nie chcesz poświęcać czasu na naukę programowania, lepszym rozwiązaniem może być oprogramowanie takie jak SAS, Stata lub SPSS. Jeśli chcesz opracować oprogramowanie analityczne, które można bardzo łatwo zintegrować z większymi systemami i które musi być podłączone do różnych interfejsów, Python może być lepszym narzędziem do tego zadania. Jeśli jednak chcesz wykonać wiele złożonych analiz danych i wykresów, a spędzasz głównie czas na tych obszarach, R to świetny wybór.

…wprowadzenie do R c.d.

R to elastyczny język programowania

Jak widzieliśmy, oprócz dostarczania narzędzi statystycznych, R jest językiem programowania ogólnego przeznaczenia. Możesz użyć R, aby rozszerzyć własną funkcjonalność, zautomatyzować procesy wykorzystujące złożone systemy i wiele innych rzeczy. Zawiera funkcje z innych języków programowania obiektowego i ma mocne podstawy do programowania funkcjonalnego, które doskonale nadaje się do rozwiązywania wielu problemów związanych z analizą danych. R pozwala użytkownikowi pisać potężny, zwięzły i opisowy kod.

R jest wolny, tak jak wolności i jak darmowe piwo

Pod wieloma względami język odnosi sukcesy, ponieważ tworzy platformę, za pomocą której wiele osób może tworzyć nowe rzeczy, a język R okazał się bardzo skuteczny w tym zakresie. Jednym z kluczowych ograniczeń języka S było to, że był dostępny tylko w pakiecie komercyjnym, ale R jest wolnym oprogramowaniem. Wolny jak w wolności i wolny jak w darmowym piwie. Prawa autorskie do głównego kodu źródłowego R należą do R Foundation i są publikowane na warunkach licencji General Public License (GPL). Według Free Software Foundation, wolne oprogramowanie (wolne jak wolność) daje ci następujące cztery wolności:

Wolność 0: Uruchom program w dowolnym celu

Wolność 1: Przestudiuj, jak działa program i dostosuj go do swoich potrzeb

Wolność 2: Rozpowszechniaj kopie, abyś mógł pomóc swojemu sąsiadowi

Wolność 3: ulepszaj program i upublicznij swoje ulepszenia

Te wolności pozwoliły firmie R rozwinąć silne, płodne społeczności, w skład których wchodzą światowej klasy statystycy i programiści, a także wielu wolontariuszy, którzy pomagają ulepszyć i rozszerzyć język. Pozwalają również na rozwijanie i utrzymywanie języka R dla wszystkich popularnych systemów operacyjnych oraz na łatwe korzystanie z niego przez osoby i organizacje, które chcą to zrobić, prawdopodobnie udostępniając swoje ustalenia w sposób umożliwiający innym powtórzenie ich wyników. Taka jest siła wolnego oprogramowania.

Do czego R się nie nadaje

Żaden język programowania ani system nie są doskonałe. R z pewnością ma wiele wad, z których najczęstszą jest to, że może być boleśnie powolny (jeśli nie jest używany prawidłowo). Należy pamiętać, że R jest zasadniczo oparty na 40-letniej technologii, wracając do oryginalnego systemu S opracowany w Bell Labs. Dlatego kilka jego niedoskonałości wynika z faktu, że nie został zbudowany w oczekiwaniu na wiek danych, w którym żyjemy teraz. Kiedy narodził się R, dysk i pamięć RAM były bardzo drogie, a internet dopiero się zaczynał. Pojęcia dotyczące analizy danych na dużą skalę i obliczeń o wysokiej wydajności były rzadkie. Szybko do przodu, koszt sprzętu to tylko ułamek tego, co kiedyś, moc obliczeniowa jest dostępna online za grosze, a wszyscy są zainteresowani gromadzeniem i analizowaniem danych na dużą skalę. Ten gwałtowny wzrost w analizie danych wyniósł na pierwszy plan dwa podstawowe ograniczenia języka R, fakt, że jest on jednowątkowy i związany z pamięcią. Te dwie cechy drastycznie go spowalniają. Co więcej, R jest interpretowanym językiem z dynamicznym typowaniem, co może sprawić, że będzie jeszcze wolniejszy. I wreszcie, R ma niezmienność obiektów i różne sposoby implementacji programowania obiektowego, co może utrudniać ludziom, szczególnie tym pochodzącym z innych języków, pisanie kodu wysokiej jakości, jeśli nie wiedzą, jak sobie z nim radzić im. Powinieneś wiedzieć, że wszystkie cechy wymienione w tym akapicie są omówione w dalszej części.

Mieczem obosiecznym w R jest to, że większość jego użytkowników nie myśli o sobie jako o programistach i jest bardziej zainteresowana wynikami niż procesami (co niekoniecznie jest złe). Oznacza to, że większość kodu R, który można znaleźć w Internecie, jest napisanych bez względu na elegancję, szybkość lub czytelność, ponieważ większość użytkowników języka R nie koryguje swojego kodu w celu usunięcia tych niedociągnięć. To przenika do kodu, który jest niejednolity i nie jest rygorystycznie testowany, co z kolei tworzy wiele skrajnych przypadków, które należy wziąć pod uwagę podczas korzystania z pakietów niskiej jakości. Dobrze będzie, jeśli będziesz o tym pamiętać.