+ - 0:00:00
Notes for current slide
Notes for next slide

Podstawy programowania

Programowanie

© Łukasz Wawrowski

1 / 26

Wprowadzenie

  • mniej języka naturalnego, więcej operatorów

  • komunikacja człowiek-komputer

  • rozwiązywanie bardziej złożonych problemów za pomocą:

    • funkcji
    • warunków
    • pętli
2 / 26

Funkcje

3 / 26

Funkcje

Metoda Copy'ego i Paste'a jest potężnym narzędziem, ale nie powinna być nadużywana

Funkcję ograniczają potrzebę kopiowania kodu i ułatwiają wprowadzanie zmian.

  1. Funkcję zawierającą dużo kodu można ładnie nazwać, co ułatwia rozumienie programu

  2. W przypadku potrzeby wprowadzenia zmian wystarczy to zrobić tylko w jednym miejscu

  3. Unikanie problemów przy kopiowaniu np. zamiana nazwy zmiennej

4 / 26

Przepis na funkcję

Stworzenie funkcji wymaga:

  1. wymyślenia nazwy funkcji

  2. określenia elementów wejściowych

  3. umieszczenia kodu w ciele funkcji

5 / 26

Dobre praktyki tworzenia funkcji

  • nazwy funkcji powinny być czasownikami

  • ustalona notacja: podkreślnik vs. camelCase

  • wspólny przedrostek

# Good
input_select()
input_checkbox()
input_text()
# Not so good
select_input()
checkbox_input()
text_input()
6 / 26

Składnia funkcji

oblicz_srednia <- function(liczby, zaokraglenie = 2){
srednia <- mean(liczby)
srednia_zaokr <- round(x = srednia, digits = zaokraglenie)
return(srednia_zaokr)
}
temp <- c(-1, 7, 9, 11, 8, 4, 3, 2)
oblicz_srednia(temp)
## [1] 5.38
oblicz_srednia(liczby = temp, zaokraglenie = 0)
## [1] 5

Funkcje to programowanie na wysokim poziomie abstrakcji. Tworzymy obliczenia dla jakichś danych wejściowych, a wywołujemy je na konkretnych obiektach.

7 / 26

Przykład

Obliczenie wskaźnika dla wybranych kolumn:

wsk=min(x)max(x)x¯

8 / 26

Bardzo złe pomysły

# Too short
f()
# Not a verb, or descriptive
my_awesome_function()
# Never do this!
col_mins <- function(x, y) {}
rowMaxes <- function(y, x) {}
# Don't do this!
T <- FALSE
c <- 10
mean <- function(x) sum(x)

Źródło

9 / 26

Zadanie

Stwórz funkcję, która będzie normalizować wartości cechy w zakresie od 0 do 1 według wzoru:

z=xmin(x)max(x)min(x)

10:00
10 / 26

Warunki

11 / 26

Wykonywanie warunkowe

Za pomocą instrukcji if możemy warunkowo wykonywać kod. Ogólna postać jest następująca:

if(warunek1){
# kod wykonany jeśli warunek jest równy TRUE
} else if(warunek2) {
# kod wykonany jeśli warunek1 jest równy FALSE, a warunek2 jest równy TRUE
} else {
# kod wykonany jeśli warunek1 i warunek2 jest równy FALSE
}

Warunek musi zwracać wartość logiczną TRUE albo FALSE.

Szczególnie przydatne w funkcjach do sprawdzania poprawności argumentów wejściowych (patrz też: stopifnot).

12 / 26

Porównywanie

x <- 4
x
## [1] 4
x == 4
## [1] TRUE
length(x) > 0
## [1] TRUE
x == NA
## [1] NA
is.na(x)
## [1] FALSE
13 / 26

Operatory łączenia

Dopuszczalne operatory łączenia: && (i), || (lub).

x <- 4
x
## [1] 4
x > 2 && x < 6
## [1] TRUE
x > 2 && x < 3
## [1] FALSE
x > 2 || x < 3
## [1] TRUE
14 / 26

Przykład

Sprawdzenie czy liczba jest mniejsza, większa od 0 czy równa 0.

15 / 26

Zadanie

Napisz funkcję, która na podstawie wartości liczby który zwróci różne komunikaty:

  • liczba podzielna przez 3,

  • liczba podzielna przez 5,

  • liczba podzielna przez 3 i 5,

  • liczba niepodzielna ani przez 3 ani przez 5.

Operator zwracający resztę z dzielenia to %%:

10 %% 2
## [1] 0
10 %% 3
## [1] 1
15:00
16 / 26

Pętle

17 / 26

Pętla

  • powtarzanie danej akcji z innymi danymi wejściowymi

  • w R zaimplementowane są pętle: for, while, repeat

  • zamiast pętli można wektoryzować przetwarzanie

18 / 26

Pętla for

Pętla składa się z trzech elementów:

  • wyjście - zarezerwowanie odpowiedniej ilości miejsca w pamięci na wynik

  • sekwencja - iterator i liczba wykonywanych razy (zakres)

  • ciało - przetwarzanie, którego wynik za każdym przebiegiem pętli będzie inny

for(iterator in zakres){
# ciało pętli
}
19 / 26

Wypisanie nazw miesięcy

for(month in 1:length(month.name)){
print(month.name[month])
}
## [1] "January"
## [1] "February"
## [1] "March"
## [1] "April"
## [1] "May"
## [1] "June"
## [1] "July"
## [1] "August"
## [1] "September"
## [1] "October"
## [1] "November"
## [1] "December"
20 / 26

Wypisanie nazw miesięcy

for(month in seq_along(month.name)){
print(month.name[month])
}
## [1] "January"
## [1] "February"
## [1] "March"
## [1] "April"
## [1] "May"
## [1] "June"
## [1] "July"
## [1] "August"
## [1] "September"
## [1] "October"
## [1] "November"
## [1] "December"
21 / 26

Przykład

100 krotny rzut kostką.

22 / 26
wynik_kostka <- numeric(100)
for(rzut in seq_along(wynik_kostka)){
wynik_kostka[rzut] <- sample(1:6, 1)
}
table(wynik_kostka)
## wynik_kostka
## 1 2 3 4 5 6
## 19 12 18 18 16 17

Wektoryzacja

Ile liczb w wektorze jest dodatnich.

liczby <- sample(x = seq(-100,100,1), size = 10000, replace = T)
f_petla <- function(x){
wynik <- logical(length(x))
for(i in seq_along(x)){
wynik[i] <- x[i] > 0
}
return(sum(wynik))
}
f_petla(liczby)
## [1] 4936
f_wektor <- function(x){
wynik <- x > 0
return(sum(wynik))
}
f_wektor(liczby)
## [1] 4936
23 / 26

Wektoryzacja

microbenchmark::microbenchmark(f_petla(liczby), f_wektor(liczby))
## Unit: microseconds
## expr min lq mean median uq max neval
## f_petla(liczby) 605.902 620.2515 636.55099 625.201 631.7515 1087.501 100
## f_wektor(liczby) 40.601 48.6510 66.86496 49.602 50.5005 1794.601 100
24 / 26

Inne sposoby na pętle

  • funkcje z rodziny apply: lapply, sapply, vapply

  • funkcje map z pakietu purrr - napisane w C, operujące głównie na listach

  • przetwarzanie równoległego: pakiet parallel

25 / 26

Zadanie

Napisz pętlę, która wyświetli tekst piosenki 99 bottles of beer on the wall

10:00
26 / 26

Wprowadzenie

  • mniej języka naturalnego, więcej operatorów

  • komunikacja człowiek-komputer

  • rozwiązywanie bardziej złożonych problemów za pomocą:

    • funkcji
    • warunków
    • pętli
2 / 26
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow