Cel spotkania


  • zrozumieć, dlaczego będziemy przez semestr używać R zamiast np. SPSSa, Statistica, Staty czy Excela,

  • oswoić się ze środowiskiem RStudio (gdzie co jest, co się gdzie klika),

  • nauczyć się podstawowej “gramatyki” R: jak przypisywać wartości, jak wywoływać funkcje, jak czytać komunikaty o błędach,

  • zacząć pracować w skryptach, a nie tylko w konsoli.



Dlaczego R?

R is the lingua franca of statistical research. Work in all other languages should be discouraged.
– Jan de Leeuw (as quoted by Matt Pocernich on R-help)
JSM 2003, San Francisco (August 2003)

fortune(78)



Czym różni się obsługa programu przez klikanie w menu (jak w Excelu czy SPSS) od pisania poleceń (kodu)? Jakie widzicie Państwo wady i zalety każdego z tych podejść?



  • R nie ma rozbudowanego GUI — nie da się “na pamięć” nauczyć się klikać sekwencji przycisków bez rozumienia, co się właściwie dzieje. To z jednej strony utrudnienie, z drugiej — zmusza do świadomego myślenia o analizie.

  • R jest darmowy i open-source — rozwijany przez ogromną społeczność statystyków, więc nowe metody pojawiają się w R zwykle szybciej niż w komercyjnych pakietach.

  • Kod można powtórzyć — jeśli ktoś przeprowadził analizę w SPSS klikając w menu, trudno dokładnie odtworzyć, co zrobił. Skrypt R to dokładny, powtarzalny przepis.

  • Wynik jest “surowy” — R nie wypluwa domyślnie stron tabelek, które można później nauczyć się interpretować, bądź ignorować. Trzeba samemu poprosić o to, czego się potrzebuje — a to wymusza myślenie, rozumienie, co się właściwie chce osiągnąć.




Czym jest R (rys historyczny)?

Logo projektu R
Logo projektu R



R to sam język programowania i środowisko do obliczeń statystycznych.

Język R powstał na początku lat 90. XX wieku w Nowej Zelandii, na Uniwersytecie w Auckland. Jego twórcami byli Ross Ihaka i Robert Gentleman - stąd nazwa “R” pochodzi od pierwszych liter ich imion.

R został stworzony jako darmowa implementacja komercyjnego języka S, który powstał w Bell Laboratories w latach 70. Ihaka i Gentleman chcieli stworzyć narzędzie do nauczania statystyki, które byłoby dostępne dla studentów bez kosztów licencji.

R został po raz pierwszy udostępniony publicznie w 1993 roku.

W 1995 roku Martin Mächler z ETH Zurich przekonał twórców do udostępnienia R na licencji GNU GPL, co uczyniło go prawdziwie open source’owym projektem.

W 1997 roku utworzono R Core Team - grupę deweloperów odpowiedzialnych za rozwój języka. To właśnie ta grupa kontroluje kod źródłowy R do dzisiaj (https://cran.r-project.org/).

Wersja 1.0.0: Pierwsza stabilna wersja R 1.0.0 została wydana 29 lutego 2000 roku - symboliczna data w “przestępnym” roku.





Instalacja oprogramowania


Instalacja: R i RStudio

Instalujemy dwie rzeczy — to częste źródło nieporozumień na start:



Dla nieskupionych (nieobecnych) materiał wideo (po polsku):

http://stat1.kursy.bartoszmackiewicz.pl/c/0/4

lub




Wersja oprogramowania

Sprawdźmy wersję R, którą mamy aktualnie zainstalowaną na naszym komputerze.

version # ?version
##                _                                
## platform       x86_64-w64-mingw32               
## arch           x86_64                           
## os             mingw32                          
## crt            ucrt                             
## system         x86_64, mingw32                  
## status                                          
## major          4                                
## minor          6.1                              
## year           2026                             
## month          06                               
## day            24                               
## svn rev        90187                            
## language       R                                
## version.string R version 4.6.1 (2026-06-24 ucrt)
## nickname       Happy Hop
# to nie funkcja, tylko obiekt. Wywołanie version() zwróci błąd. 

Poszczególne pola oznaczają platformę i architekturę procesora (platform, arch), system operacyjny (os), status wydania (status, np. puste dla wersji stabilnej albo under development dla wersji rozwojowej), numer wersji rozbity na część główną i poboczną (major, minor), datę wydania (year, month, day), numer rewizji w repozytorium SVN (svn rev), pełny opis wersji (version.string) oraz nazwę kodową wydania (nickname).

# version jest równoważne z R.version

R.version # ?R.version
##                _                                
## platform       x86_64-w64-mingw32               
## arch           x86_64                           
## os             mingw32                          
## crt            ucrt                             
## system         x86_64, mingw32                  
## status                                          
## major          4                                
## minor          6.1                              
## year           2026                             
## month          06                               
## day            24                               
## svn rev        90187                            
## language       R                                
## version.string R version 4.6.1 (2026-06-24 ucrt)
## nickname       Happy Hop

Albo

R.Version() # ?R.Version()
## $platform
## [1] "x86_64-w64-mingw32"
## 
## $arch
## [1] "x86_64"
## 
## $os
## [1] "mingw32"
## 
## $crt
## [1] "ucrt"
## 
## $system
## [1] "x86_64, mingw32"
## 
## $status
## [1] ""
## 
## $major
## [1] "4"
## 
## $minor
## [1] "6.1"
## 
## $year
## [1] "2026"
## 
## $month
## [1] "06"
## 
## $day
## [1] "24"
## 
## $`svn rev`
## [1] "90187"
## 
## $language
## [1] "R"
## 
## $version.string
## [1] "R version 4.6.1 (2026-06-24 ucrt)"
## 
## $nickname
## [1] "Happy Hop"


Pełniejszy obraz środowiska, razem z załadowanymi pakietami i ich wersjami, daje:

# Uzyskaj i wyświetl informacje o wersji języka R, systemu operacyjnego oraz podłączonych lub załadowanych pakietach

sessionInfo() # ?sessionInfo()
## R version 4.6.1 (2026-06-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=English_United States.utf8 
## [2] LC_CTYPE=English_United States.utf8   
## [3] LC_MONETARY=English_United States.utf8
## [4] LC_NUMERIC=C                          
## [5] LC_TIME=English_United States.utf8    
## 
## time zone: Europe/Warsaw
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] fortunes_1.5-5
## 
## loaded via a namespace (and not attached):
##  [1] digest_0.6.39     R6_2.6.1          fastmap_1.2.0     xfun_0.60        
##  [5] cachem_1.1.0      knitr_1.52        htmltools_0.5.9   rmarkdown_2.32   
##  [9] lifecycle_1.0.5   cli_3.6.6         sass_0.4.10       jquerylib_0.1.4  
## [13] compiler_4.6.1    rstudioapi_0.19.0 tools_4.6.1       evaluate_1.0.5   
## [17] bslib_0.12.0      yaml_2.3.12       otel_0.2.0        jsonlite_2.0.0   
## [21] rlang_1.3.0

W praktyce przy diagnozowaniu problemu sprawdza się kolejno: wersję R, wersje pakietów w other attached packages, a przy kłopotach z tekstem, sortowaniem lub datami także locale i strefę czasową.


# packageVersion("nazwa_pakietu")

packageVersion("fortunes")
## [1] '1.5.5'




Dlaczego warto sprawdzać wersje R i pakietów (libraries)?

  1. Reprodukowalność wyników

Ten sam kod może dać inne wyniki w różnych wersjach R lub pakietu — zmieniają się domyślne algorytmy, metody losowania, sposoby zaokrąglania czy obliczeń statystycznych. Bez znajomości wersji nie da się wiarygodnie odtworzyć analizy (własnej sprzed miesięcy czy cudzej z publikacji).

  1. Kompatybilność kodu

Nowsze wersje pakietów czasem usuwają lub zmieniają funkcje (tzw. breaking changes), więc kod działający na jednej wersji może rzucać błędem na innej. Odwrotnie — bardzo stary R może nie obsługiwać nowych pakietów.

  1. Błędy i poprawki (bugfix’y)

Starsze wersje mogą zawierać znane błędy, które zostały już naprawione — a nieświadome korzystanie z wadliwej wersji prowadzi do cichych, trudnych do wykrycia pomyłek w wynikach.

  1. Zależności między pakietami

Pakiety w R często zależą od siebie nawzajem (i od konkretnej wersji R). Niedopasowane wersje mogą powodować konflikty lub uniemożliwiać instalację/uruchomienie kodu.

  1. Współpraca i publikacje naukowe

W pracach badawczych i publikacjach dobrą praktyką jest raportowanie wersji (R + pakiety), żeby inni mogli odtworzyć dokładnie te same warunki analizy — to standard w nauce otwartej (open science).



Uwaga co do instalowania nowych wersji R. Ogólnie warto. Mniej więcej co roku, w kwietniu, wypuszczana jest duża aktualizacja. W ciągu roku również pojawiają się pomniejsze aktualizacje. Samo zainstalowanie nowej wersji R nie powinno psuć nam kodu, który działał w wersjach wcześniejszych (konserwatywni deweloperzy). Powinna za to poprawić się wydajność.

Jednym z mankamentów R w porównaniu do innych języków jest jego powolność. Jest jednak piekielnie wygodny przy konceptualizacji i pisaniu kodu. Powszechny dowcip mówi, że “gdy programista R ‘kompiluje’ swój kod, programista C szuka na StackOverflow (teraz pyta ChatGPT) jak wczytać plik csv”.




Stare środowisko graficzne R (Rgui.exe)

Konsola ‘starego GUI’ R
Konsola ‘starego GUI’ R




RStudio (IDE)

Logo projektu R Studio
Logo projektu R Studio



RStudio to znacznie późniejszy projekt - to zintegrowane środowisko programistyczne (IDE), które ułatwia pracę z językiem R. RStudio powstało dopiero w 2011 roku, założone przez JJ Allaire.

RStudio to:

  • Wygodny edytor kodu z podświetlaniem składni

  • Panel z wizualizacją danych i wykresów

  • Zarządzanie projektami

  • Integrację z systemami kontroli wersji (Git)

  • Podgląd zmiennych i obiektów w pamięci

  • i inne

W 2022 roku firma RStudio zmieniła nazwę na Posit, by lepiej odzwierciedlić fakt, że rozwija narzędzia nie tylko dla R, ale też dla Pythona i innych języków. Samo oprogramowanie RStudio Desktop nadal nosi tę nazwę.

Więc krótko: R ma ~33 lat, RStudio ~15 lat - to narzędzie powstałe dla już istniejącego języka.





Orientacja w RStudio

IDE
IDE


RStudio domyślnie dzieli ekran na cztery panele. Dla dokumentacji i przypomnienia:

Panel Co tam się dzieje
Source (skrypt) tu piszemy kod, który chcemy zachować i móc uruchomić ponownie
Console (konsola) tu kod jest faktycznie wykonywany; można pisać też bezpośrednio tutaj
Environment / History lista obiektów, które aktualnie “istnieją” w naszej sesji
Files / Plots / Packages / Help pliki w folderze roboczym, wykresy, zainstalowane pakiety, dokumentacja

Skrót, który wart jest zapamiętania od razu: Ctrl+Enter (Windows) / Cmd+Enter (Mac) — uruchamia bieżącą linię lub zaznaczony fragment kodu ze skryptu w konsoli.





Biblioteki (pakiety)

options(repos = c(CRAN = "https://cloud.r-project.org")) # <- ta linijka ustawia domyślne repozytorium CRAN, z którego R pobiera pakiety, czyli mówi R, skąd ma je brać, funkcja available.packages() wymaga bowiem określenia lustra CRAN (Comprehensive R Archive Network).

paste0("Aktualna liczba pakietów na dzień kompilacji poniższego dokumentu (", 
       Sys.Date(), ") html to: ",
       
       nrow(available.packages()
            )
       
       )
## [1] "Aktualna liczba pakietów na dzień kompilacji poniższego dokumentu (2026-10-08) html to: 25341"


kableExtra::kbl(head(available.packages()))


# options(knitr.kable.NA = "–")

pkgs <- as.data.frame(
  head(
    available.packages(),10))[,
                              c("Package", "Version", "Depends", "Imports", "License", "NeedsCompilation")
                              ]


pkgs[] <- lapply(pkgs, function(x) gsub("\\s*\n\\s*", " ", x)) # usuwa łamania linii z długich pól

# "yes"/"no" jako kolorowe etykiety
pkgs$NeedsCompilation <- kableExtra::cell_spec(
  pkgs$NeedsCompilation,
  color = "white", 
  bold = TRUE,
  background = ifelse(pkgs$NeedsCompilation == "yes", "#F39C12", "#18BC9C")
  )

kableExtra::kbl(pkgs, row.names = FALSE,
                escape = FALSE, 
                align = "llllcc",
                col.names = c("Pakiet", "Wersja", "Zależności", "Importy", "Licencja", "Kompilacja"),
                caption = "Pakiety dostępne w repozytorium CRAN (10 pierwszych, posortowanych alfabetycznie)") |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                            full_width = TRUE, 
                            font_size = 14) |>
  kableExtra::row_spec(0, 
                       bold = TRUE, 
                       color = "white", 
                       background = "#2C3E50") |>
  kableExtra::column_spec(1,
                          bold = TRUE, 
                          color = "#2C3E50") |>
  kableExtra::column_spec(2, 
                          monospace = TRUE) |>
  kableExtra::column_spec(3:4, 
                          width_max = "18em", 
                          color = "#7B8A8B") |>
  kableExtra::footnote(general = "Źródło: available.packages()", 
                       general_title = "")
Pakiety dostępne w repozytorium CRAN (10 pierwszych, posortowanych alfabetycznie)
Pakiet Wersja Zależności Importy Licencja Kompilacja
a11yShiny 0.1.4 R (>= 4.1) shiny (>= 1.9.0), htmltools (>= 0.5.0), DT, ggplot2, rlang EUPL-1.2 no
a5R 0.6.0 R (>= 4.2) cli, rlang (>= 1.1.0), units, vctrs (>= 0.6.0), wk (>= 0.9.0) Apache License (>= 2) yes
aae.pop 0.2.0 R (>= 4.1.0) stats, abind, cubature, future.apply, mc2d, nleqslv, rlang Apache License 2.0 no
AalenJohansen 1.0 NA NA GPL (>= 2) no
aamatch 0.4.5 R (>= 3.5.0) iTOS, stats GPL-2 no
aanova 1.0.1 R (>= 3.5.0) RColorBrewer, dplyr, emmeans, ggplot2, ggpubr, multcomp, tidyr, stringr, MASS, vegan MIT + file LICENSE no
AATtools 0.0.3 R (>= 3.6.0) magrittr, dplyr, doParallel, foreach GPL-3 no
ABACUS 1.0.0 R (>= 3.1.0) ggplot2 (>= 3.1.0), shiny (>= 1.3.1), GPL-3 no
abasequence 0.1.0 NA NA GPL-3 no
abba 0.2.0 NA yaml, uuid, stringr, httr2, magrittr, tools, rstudioapi, digest, tidyr Apache License (>= 2) no
Źródło: available.packages()


Jeśli w przyszłości sami będziemy tworzyć pakiety poniżej przydatny pakiet do sprawdzania:

  • czy ta nazwa jest już zajęta na CRAN, Bioconductor, GitHub etc.,

  • czy nazwa nie jest zastrzeżonym znakiem towarowym,

  • czy nie ma niepożądanych skojarzeń językowych (np. wulgaryzmy), etc.

# Pakiet sprawdza, czy daną nazwę pakietu można użyć: weryfikuje jej poprawność, sprawdza, czy jest zajęta na GitHubie, CRAN i Bioconductorze, oraz szuka niezamierzonych znaczeń w Wikisłowniku i Wikipedii.

# install.packages("available")
library(available)
available::avaliable("ggplot2")


Alternatywnie

# install.packages("pak")
library(pak)
pak::pkg_name_checkable("ggplot2")


Albo bez dodatkowych pakietów:

"ggplot2" %in% rownames(utils::available.packages())
## [1] TRUE


utils::available.packages()["ggplot2", ]
##                                                                                                                                                                                                                                                                                    Package 
##                                                                                                                                                                                                                                                                                  "ggplot2" 
##                                                                                                                                                                                                                                                                                    Version 
##                                                                                                                                                                                                                                                                                    "4.0.3" 
##                                                                                                                                                                                                                                                                                   Priority 
##                                                                                                                                                                                                                                                                                         NA 
##                                                                                                                                                                                                                                                                                    Depends 
##                                                                                                                                                                                                                                                                               "R (>= 4.1)" 
##                                                                                                                                                                                                                                                                                    Imports 
##                                                                                                                              "cli, grDevices, grid, gtable (>= 0.3.6), isoband, lifecycle (>\n1.0.1), rlang (>= 1.1.0), S7, scales (>= 1.4.0), stats, vctrs\n(>= 0.6.0), withr (>= 2.5.0)" 
##                                                                                                                                                                                                                                                                                  LinkingTo 
##                                                                                                                                                                                                                                                                                         NA 
##                                                                                                                                                                                                                                                                                   Suggests 
## "broom, covr, dplyr, ggplot2movies, hexbin, Hmisc, hms, knitr,\nmapproj, maps, MASS, mgcv, multcomp, munsell, nlme, profvis,\nquantreg, quarto, ragg (>= 1.2.6), RColorBrewer, roxygen2,\nrpart, sf (>= 0.7-3), svglite (>= 2.1.2), testthat (>= 3.1.5),\ntibble, vdiffr (>= 1.0.6), xml2" 
##                                                                                                                                                                                                                                                                                   Enhances 
##                                                                                                                                                                                                                                                                                       "sp" 
##                                                                                                                                                                                                                                                                                    License 
##                                                                                                                                                                                                                                                                       "MIT + file LICENSE" 
##                                                                                                                                                                                                                                                                            License_is_FOSS 
##                                                                                                                                                                                                                                                                                         NA 
##                                                                                                                                                                                                                                                                      License_restricts_use 
##                                                                                                                                                                                                                                                                                         NA 
##                                                                                                                                                                                                                                                                                    OS_type 
##                                                                                                                                                                                                                                                                                         NA 
##                                                                                                                                                                                                                                                                                      Archs 
##                                                                                                                                                                                                                                                                                         NA 
##                                                                                                                                                                                                                                                                                     MD5sum 
##                                                                                                                                                                                                                                                         "c50d6864f6226ed9759e5deaa0a25e7f" 
##                                                                                                                                                                                                                                                                           NeedsCompilation 
##                                                                                                                                                                                                                                                                                       "no" 
##                                                                                                                                                                                                                                                                                       File 
##                                                                                                                                                                                                                                                                                         NA 
##                                                                                                                                                                                                                                                                                  Published 
##                                                                                                                                                                                                                                                                  "2026-04-22 09:10:03 UTC" 
##                                                                                                                                                                                                                                                                                      Built 
##                                                                                                                                                                                                                                                                                         NA 
##                                                                                                                                                                                                                                                                                 Repository 
##                                                                                                                                                                                                                                                  "https://cloud.r-project.org/src/contrib"


Na stronie projektu można sprawdzać pakiety “manualnie”:

https://cran.r-project.org/web/packages/available_packages_by_date.html

Co może jednakowoż psuć nam kod, to aktualizacja paczek, których używamy. Pracując na projektach, zazwyczaj “mrozi się” wersje paczek i pilnuje poszczególnych użytkowników, żeby pracowali na spójnych co do wersji paczkach (czytaj: odbiera im się możliwość samodzielnych aktualizacji).

Pakietem R, który służył do zarządzania wersjami pakietów był np. {packrat}. {Packrat} umożliwiał izolowanie projektów R od zewnętrznych zależności, tak aby w przypadku aktualizacji pakietów, projekt pozostał stabilny. {Packrat} zapewniał również narzędzia do zarządzania bibliotekami i łatwe przełączanie między różnymi wersjami pakietów. Ale to póki co tytułem dygresji i żeby było w notatkach.

Dziś jego zadanie przejął pakiet {renv}.




Instalacja pakietów

  • Aby zainstalować nowy pakiet można ściągnąć odpowiedni plik ze strony https://cran.r-project.org/web/packages/ i zainstalować go ręcznie

  • Wygodniej jest wykonać polecenie: install.packages("nazwa_pakietu")

  • Aby załadować zainstalowany pakiet do pamięci w danej sesji R należy wykonać polecenie: library(nazwa_pakietu) albo require(nazwa_pakietu)

  • Aktualizację wszystkich zainstalowanych pakietów można wykonać za pomocą polecenia: update.packages() Aktualizacje bywają niezwykle pożyteczne, i zdradliwe zarazem. Z jednej strony niosą nowe, rozszerzone, możliwości, przyspieszenie, optymalizację (niepotrzebne skreślić), z drugiej mogą wywalić cały projekt do kosza (zmiana argumentów funkcji, użycie innych metod, wygaszenie jakiejś funkcjonalności). Pakiety mają swoje cykle życia.


Zainstalujmy sobie pierwszy pakiet poleceniem install.packages("fortunes"). Uruchommy pakiet poleceniem library(fortunes), a następnie skorzystajmy z dostępnej tam funkcji fortune() (bez żadnego argumentu).

# install.packages("fortunes") # mam już ten pakiet, stąd zakomentowanie linijki

library(fortunes)

fortune()
## 
## Actually the documentation of sunflowerplot is wrong in botanical sense.
## Sunflowers have composite flowers in capitula, and the things called 'petals'
## in documentation are ligulate, sterile ray-florets (each with vestigial petals
## which are not easily visible in sunflower, but in some other species you may
## see three (occasionally two) teeth).
##    -- Jari Oksanen
##       R-help (December 2007)




Pomoc w R

  • Możemy użyć silnika wyszukiwarki wbudowanej w RStudio. Default’owo prawe dolne okienko, przycisk Help (albo Pomoc w przypadku polskojęzycznej instalacji soft’u)

  • Poleceniami w konsoli help() lub z użyciem znaku zapytania przed szukaną frazą, pojedynczy ? (równoważny poleceniu help("nazwa_pakietu"))
    bądź podwójny ?? (równoważny poleceniu help.search("nazwa_pakietu")).

help() # wywołanie dokumentacji - pomoc na temat funkcji help


help.start() uruchamia przeglądarkę internetową z interfejsem do dokumentacji R. Oferuje dostęp do pełnej dokumentacji, w tym podręczników, zainstalowanych pakietów i innych zasobów.

help.start() #


Wywołanie pomocy na temat konkretnej funkcji

help(abs) #

?abs # jak wyżej - równoznaczne


Wyszukuje w dokumentacji funkcje związane z danym hasłem, starszy odpowiednik ??

??abs

help.search("abs") # 


Funkcja apropos() w R jest używana do wyszukiwania obiektów w środowisku R, które zawierają określony ciąg znaków w swojej nazwie. Jest to bardzo przydatne narzędzie, gdy chcesz znaleźć funkcje, zmienne lub inne obiekty, ale nie pamiętasz ich dokładnych nazw.

apropos("abs") # 


- W RStudio można ustawić kursor na nazwie funkcji i nacisnąć F1




Błędy w R


Trzy rodzaje komunikatów:

  • Error,
  • Warning,
  • Message


Typ Czy kod działa dalej? Co oznacza?
Error ❌ Nie, wykonanie zostaje przerwane Coś jest na tyle źle, że R nie może kontynuować
Warning ✅ Tak Wynik powstał, ale może być nie taki, jak myślisz
Message ✅ Tak Informacja, zwykle niegroźna


message("Kawa wypita, można zaczynać.")
## Kawa wypita, można zaczynać.
warning("Druga kawa. Ręce lekko drżą.")
## Warning: Druga kawa. Ręce lekko drżą.
stop("Piąta kawa. Widzę dźwięki.")
## Error:
## ! Piąta kawa. Widzę dźwięki.

Ubrane w jakiś kontekst:

sprawdz_obecnosc <- function(nieobecnosci) {
  if (nieobecnosci == 0) message("Wzorowy student!")
  if (nieobecnosci == 2) warning("Prowadzący zaczyna kojarzyć Twoje nazwisko... ")
  if (nieobecnosci >= 3) stop("Niezaliczone. Do zobaczenia w przyszłym roku.")
  "Możesz iść na zajęcia."
}
sprawdz_obecnosc(0)
## Wzorowy student!
## [1] "Możesz iść na zajęcia."
sprawdz_obecnosc(2)
## Warning in sprawdz_obecnosc(2): Prowadzący zaczyna kojarzyć Twoje nazwisko...
## [1] "Możesz iść na zajęcia."
sprawdz_obecnosc(3)
## Error in `sprawdz_obecnosc()`:
## ! Niezaliczone. Do zobaczenia w przyszłym roku.




Hello World!


Napiszmy sobie jeszcze nieśmiertelną w każdym języku programowania linijkę kodu…

"Hello World!"
## [1] "Hello World!"


print("Hello World! \n") 
## [1] "Hello World! \n"
# print() pokazuje obiekt tak, jak R go reprezentuje: z cudzysłowami, numerem elementu [1] i znakami ucieczki; działa z dowolnym obiektem (ramki danych, listy, modele)


cat("Hello World! \n")
## Hello World!
# cat() wypisuje sam tekst, bez dodatków i bez automatycznego nowego wiersza na końcu; cat() tylko z prostymi wektorami, interpretuje znaki specjalne, więc \n daje nowy wiersz, a \t tabulację. Łączy też kilka argumentów spacją, np. cat("Wynik:", 42)
cat("Hello World! Hello World! Hello World! Hello World!")
## Hello World! Hello World! Hello World! Hello World!
cat("Hello World! \n Hello World! \n Hello World! \n Hello World! \n")
## Hello World! 
##  Hello World! 
##  Hello World! 
##  Hello World!
print("Z przedmiotu chciałbym dostać:",5) # ?print
## [1] "Z przedmiotu chciałbym dostać:"
cat("Z przedmiotu chciałbym dostać:",5)
## Z przedmiotu chciałbym dostać: 5




Rozpoczęcie pracy


Uwagi dot. rozpoczęcia pracy i pisania kodów:

  • Znacznik > w konsoli R oznacza, że R czeka na nasze polecenia.

  • + w konsoli oznacza niedokończone polecenie.

  • # służy do komentowania -> Użyteczny skrót: Ctrl + Shift + C

  • Chcąc uruchomić komendę/ linię kodu można postawić kursor w dowolnym miejscu wiersza z kodem, ewentualnie zaznaczyć interesujący nas fragment, który zamierzamy uruchomić, a następnie albo korzystamy ze skrótu klawiszowego Ctrl + Enter, albo myszką klikamy przycisk RUN

  • Pracę warto rozpocząć dwoma poleceniami getwd() oraz setwd(“…”)

  • Wielkość liter ma znaczenie – „A” i „a” oznaczają co innego, R jest case sensitive

  • Poszczególne komendy mogą być rozdzielane albo ENTER’em albo ; (jak w C++)

2 + 6; 5 * 6; 3 - 6
## [1] 8
## [1] 30
## [1] -3
# równoważne z 
2 + 6
## [1] 8
5 * 6
## [1] 30
3 - 6
## [1] -3
  • Spacje nie mają znaczenia (chyba, że sklejają się dwie funkcje czy wyrażenia), chociaż to x<-3 jest przypisanie, natomiast to: x < -3 porównanie.
5 + 6 - 3 - 6 + 4 + 2 - 
  
  4 + 8 + 3 + 2 + 7
## [1] 24
  • Nazwy obiektów mogą zawierać: litery, cyfry, _ (słownie: znak podkreślenia) i . (słownie: kropka). Nie mogą być samodzielną lub zaczynać się cyfrą, liczbą, bądź znakiem specjalnym. Nie mogą też być słowami zarezerwowanymi (if, TRUE, function, NA, etc.)


Operatory

  • Arytmetyczne:

    • dodawanie +,

    • odejmowanie -,

    • mnożenie *,

    • dzielenie /,

    • potęgowanie ^ albo **

  • Porównawcze: >, >=, <, <=, ==, !=

  • Logiczne:

    • negacja !,

    • koniunkcja &,

    • alternatywa | (dodatkowo również && oraz ||)

  • Formuła modelu: ~




Działania arytmetyczne

Dodawanie

5 + 7
## [1] 12

Odejmowanie

8 - 5
## [1] 3

Mnożenie

4 * 6
## [1] 24

Dzielenie

(5 + 5) / 2
## [1] 5

Potęgowanie

2^3 
## [1] 8
2**3 # lub
## [1] 8

Pierwiastkowanie

36^(1/2) # lub przez funkcję sqrt() wbudowaną w R
## [1] 6
sqrt(36)
## [1] 6
36^1/2 # pilnować nawiasów!
## [1] 18
36^0.5 # można z użyciem liczb dziesiętnych
## [1] 6

Część całkowita z dzielenia

# %/% to dzielenie całkowite: zwraca wynik dzielenia zaokrąglony w dół, czyli bez reszty
7 %/% 3    # 2
## [1] 2
10 %/% 4   # 2
## [1] 2
-7 %/% 3   # -3  (zaokrąglenie w dół, nie w stronę zera)
## [1] -3
-7 %/% -3   # 2  
## [1] 2
-7 / 3     # -2.333...  → floor → -3
## [1] -2.333333
-7 / -3    #  2.333...  → floor →  2
## [1] 2.333333

Modulo (reszta z dzielenia)

# reszta z dzielenia jednej liczby przez drugą
7 %% 3    # 1
## [1] 1
10 %% 2   # 0  (liczba parzysta)
## [1] 0
-7 %% 3   # 2  (wynik ma znak dzielnika)
## [1] 2
-7 %% -3   # -1
## [1] -1
library(ggplot2)

os_dzielenia <- function(a, b) {
  p <- data.frame(a = a, b = b, q = a %/% b, r = a %% b)
  p$etykieta <- sprintf("%d %%/%% %d = %d   ·   %d %%%% %d = %d",
                        p$a, p$b, p$q, p$a, p$b, p$r)
  p$etykieta <- factor(p$etykieta, levels = p$etykieta)

  # łuki: każdy skok o długości b
  luki <- do.call(rbind, lapply(seq_len(nrow(p)), function(i) {
    if (p$q[i] == 0) return(NULL)
    do.call(rbind, lapply(seq_len(abs(p$q[i])), function(k) {
      x0 <- sign(p$q[i]) * (k - 1) * p$b[i]
      x1 <- x0 + sign(p$q[i]) * p$b[i]
      t  <- seq(0, pi, length.out = 40)
      data.frame(etykieta = p$etykieta[i], skok = k,
                 x = (x0 + x1) / 2 - (x1 - x0) / 2 * cos(t),
                 y = 0.8 * sin(t))
    }))
  }))
  numery <- aggregate(x ~ etykieta + skok, data = luki, FUN = mean)

  ggplot() +
    geom_hline(yintercept = 0, colour = "#95A5A6", linewidth = 0.6) +
    geom_path(data = luki, aes(x, y, group = interaction(etykieta, skok)),
              colour = "#3498DB", linewidth = 1,
              arrow = arrow(length = unit(2, "mm"), type = "closed")) +
    geom_text(data = numery, aes(x, y = 0.95, label = skok),
              colour = "#3498DB", size = 3) +
    geom_segment(data = subset(p, r != 0),
                 aes(x = q * b, xend = a, y = 0, yend = 0),
                 colour = "#F39C12", linewidth = 2, lineend = "round") +
    geom_text(data = subset(p, r != 0),
              aes(x = q * b + r / 2, y = 0.3, label = paste("r =", r)),
              colour = "#F39C12", fontface = "bold", size = 3.5) +
    annotate("point", x = 0, y = 0, shape = 21, size = 3,
             fill = "white", colour = "#2C3E50") +
    geom_point(data = p, aes(x = a, y = 0), size = 2, colour = "#2C3E50") +
    geom_text(data = p, aes(x = a, y = -0.35, label = paste("a =", a)),
              colour = "#2C3E50", fontface = "bold", size = 3.5) +
    facet_wrap(~ etykieta, ncol = 1) +
    scale_x_continuous(breaks = -10:11, limits = c(-10, 11)) +
    scale_y_continuous(limits = c(-0.5, 1.1)) +
    labs(x = NULL, 
         y = NULL,
         subtitle = "Niebieskie skoki o długości b = iloraz (%/%)  ·  pomarańczowy odcinek = reszta (%%)") +
    theme_minimal(base_size = 12) +
    theme(axis.text.y = element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.minor = element_blank(),
          strip.background = element_rect(fill = "#2C3E50", colour = NA),
          strip.text = element_text(colour = "white", face = "bold", family = "mono"),
          plot.subtitle = element_text(colour = "#7B8A8B"))
}
os_dzielenia(a = c(7, 7, -7, -7), 
             b = c(3, -3, 3, -3)
             )


a b a %/% b a %% b sprawdzenie
7 3 2 1 6 + 1 = 7
7 −3 −3 −2 9 − 2 = 7
−7 3 −3 2 −9 + 2 = −7
−7 −3 2 −1 −6 − 1 = −7


Komentarz
W R operatory %/% i %% realizują tzw. dzielenie podłogowe (floored division): iloraz to floor(a / b), czyli wynik zawsze zaokrąglany w dół, w stronę minus nieskończoności, a nie w stronę zera, jak robi to np. C, Java czy trunc().

Reszta jest wtedy wyznaczona tak, żeby zawsze zachodziła tożsamość a == b * (a %/% b) + a %% b.

Z tego wynika charakterystyczna właściwość R: reszta ma zawsze znak dzielnika b (albo jest zerem), a jej wartość bezwzględna jest mniejsza niż |b|. Dlatego 7 %% -3 daje -2, a nie 1, a -7 %% 3 daje 2, a nie -1.


Działania rozbudowane

2^3+4*(16-10)
## [1] 32
3 ^ 2 - 1 + 3 ** (2 - 1) # ze spacjami być może czytelniej, nie wpływają na ewaluację wyrażenia
## [1] 11
5 + 6 - 3 - 6 + 4 + 2 - 
  4 + 8 + 3 + 2 + 7 # jak odpalić takie 'złamane' na dwie linijki działanie?
## [1] 24




Przewidywanie wyników



######################
2 + 3 * 4^2
######################
-2^2
######################
(-2)^2
######################
36^1/2
######################
7 %% -3
######################
TRUE + TRUE
######################
"5" == 5
######################
0.1 + 0.2 == 0.3
######################
x<-3; x < -3
######################
1/0; 0/0; sqrt(-1)




Przypisanie i zmienna

# skalary, wartości 'atomowe', przy czym de facto to wektor jednoelementowy
x <- 666
print(x)
## [1] 666
rm(x) # żeby usunąć ze środowiska i udowodnić, że zadziała
666 -> x
print(x)
## [1] 666
x = 666
print(x)
## [1] 666
# jeśli tworzony obiekt już istnieje jego wartość będzie zastąpiona nową
x = 69
print(x)
## [1] 69
# jeśli polecenie będące przypisaniem umieścimy w nawiasie () to po jego wykonaniu wynikowy obiekt będzie także wyświetlony w konsoli
(x = 69)
## [1] 69
# możemy sprawdzić, czy istnieje obiekt o nazwie x w przestrzeni funkcją exists(), gdzie nazwę obiektu podaje się jako argument tekstowy (ujęty w cudzysłów)
# exists(x)
exists("x")
## [1] TRUE


(wiek <- 25)
## [1] 25
imie <- "Ola"


To samo co robiliśmy przed momentem na liczbach działa również na zmiennych.

x <- 3
y <- 4
z <- x+y
print(z)
## [1] 7
x*y
## [1] 12
x%%y
## [1] 3
wiek + 5
## [1] 30




Konwencje nazewnictwa zmiennych

  • snake_case (preferowany przez tidyverse i większość współczesnych pakietów)
moja_zmienna <- 666
  • camelCase (popularne w starszym kodzie)
mojaZmienna <- 333
  • dot.case (tradycyjne dla R, ale dziś odradzane)
moja.zmienna <- 67
  • PascalCase (zazwyczaj dla klas S4/R6)
MojaKlasa <- setClass("Kognitywistyka")

# Nieistotne w tym momencie, ale...

# setClass() definiuje nową klasę S4, czyli formalny system obiektowy w R (z pakietu methods, ładowanego domyślnie). W odróżnieniu od luźnego systemu S3 klasa S4 ma ściśle określoną strukturę: nazwane pola, czyli sloty, z zadeklarowanymi typami. R pilnuje tych typów przy tworzeniu obiektu.




Skróty klawiszowe


  • Ctrl + Shift + N Nowy skrypt

  • Ctrl + ENTER odpalenie linijki kodu (albo wielu, jeśli to większy element tego samego polecenia/ funkcji)

  • Ctrl + L wyczyszczenie treści okna konsoli

  • Shift + Alt + strzałka góra lub dół skopiowanie linii kodu nad, bądź pod kopiowaną linią

  • Ctrl + 1 przenosi kursor do skryptu a Ctrl + 2 do konsoli

  • Ctrl + Shift + C komentarze (haszowanie linijki kodu)

  • Shift + Alt + J spis treści otwartego skryptu, markdown’a

  • Ctrl + Shift + K knitowanie pliku .rmd do wybranego formatu

  • Ctrl + Alt + I nowy chunk w markdown

  • (lewy) Alt + - wstawia <-

  • Tab autouzupełnia nazwy

  • strzałka w górę w konsoli przywołuje poprzednie polecenie

  • Esc przerywa niedokończone polecenie, czyli wychodzi ze stanu +


Ogólnie warto zajrzeć w Tools -> Keybords Shortcuts Help (Alt + Shift + K)

Gdzie kliknąć…
Gdzie kliknąć…




Źródła i inspiracje