Purrr – funkcje na wektorach i listach
Biblioteka Purrr to zestaw narzędzi programowania funkcyjnego do pracy z funkcjami, wektorami i listami, który pozwala w łatwy sposób zrezygnować z pętli.
Nasze zmagania z tą biblioteką zacznijmy od jej zainicjowania:
1 |
library(purrr) |
Utwórzmy listę x zawierającą 100 elementów:
1 |
x = as.list(runif(100,1,100)) |
Korzystając z funkcji map do każdego elementu listy zaimplementujemy dowolną funkcję. Na przykład sprawdzającą czy dany element jest większy od 7:
1 |
map(x,function(x) x > 7) |
Utwórzmy teraz kolejną listę y:
1 |
y = as.list(runif(100,1,100)) |
Mając dwie listy o tej wielkości możemy sumować odpowiadające sobie elementy za pomocą funkcji map2:
1 |
map2(x,y,sum) |
Wykorzystując pmap możemy zimplementować dowolną funkcję na dowolnej liczbie list lub wektorów:
1 2 |
z = as.list(runif(100,1,100)) pmap(list(x,y,z),function(x,y,z) sqrt(x^2+y^2+z^2)) |
Biblioteka purrr ma wiele narzędzi do szybkiego filtrowania list i wektorów. Napiszmy najpierw funkcję func zwracającą wartość logiczną w przypadku, gdy wartość x jest większa od 20:
1 |
func = function(x) x>20 |
Do wyselekcjonowania elementów listy spełniających wyrażenie w funkcji używamy funkcji keep:
1 |
keep(x,func) |
Odwrotny efekt uzyskamy stosując funkcję discard:
1 |
discard(x,func) |
Funckja head_while zwraca wszystkie pierwsze elementy z listy spełniające wyrażenie:
1 |
head_while(x, func) |
Do sprawdzenia czy wszystkie elementy listy spełniają wyrażenie służy every:
1 2 3 4 |
every(x, func) > every(x, func) [1] FALSE |
Some sprawdza czy którykolwiek z elementów spełnia wyrażenie:
1 2 3 4 |
some(x,func) > some(x,func) [1] TRUE |
Has_element pozwala sprawdzić, czy lista zawiera konkretny element:
1 2 3 4 5 |
n = c("ibm","asus","acer","microsoft") has_element(n,"asus") > has_element(n,"asus") [1] TRUE |
Do zwracania pierwszej wartości z listy spełniającej wyrażenie służy funkcja detect:
1 2 3 4 5 |
func = function(x) x<20 detect(x,func) > detect(x,func) [1] 14.75841 |
Możemy również zwrócić tylko indeks tego elementu listy korzystając z detect_index:
1 2 |
> detect_index(x,func) [1] 5 |
Do łaczenia list wykorzystujemy append i prepend. Różnica pomiędzy nimi jest taka, że kolejność łączonych elementów jest odwócona:
1 |
append(x,y) |
Mając wielowymiarową listę:
1 |
l = list(list(1,2,3),list(4,5),list(5)) |
Możemy ją uprościć do jednowymiarowej korzystając z flatten:
1 |
flatten(l) |
Lub transponować:
1 |
transpose(l) |
Zaprezentowana dzisiaj biblioteka jest rozbudowanym pakietem narzędziowym do pracy na wektorach i listach z wykorzystaniem programowania funkcyjnego. Przedstawiliśmy Wam tylko kilka najciekawszych zastosowań. Po więcej musicie sięgnąć do dokumentacji:)