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:
library(purrr)
Utwórzmy listę x zawierającą 100 elementów:
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:
map(x,function(x) x > 7)
Utwórzmy teraz kolejną listę y:
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:
map2(x,y,sum)
Wykorzystując pmap możemy zimplementować dowolną funkcję na dowolnej liczbie list lub wektorów:
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:
func = function(x) x>20
Do wyselekcjonowania elementów listy spełniających wyrażenie w funkcji używamy funkcji keep:
keep(x,func)
Odwrotny efekt uzyskamy stosując funkcję discard:
discard(x,func)
Funckja head_while zwraca wszystkie pierwsze elementy z listy spełniające wyrażenie:
head_while(x, func)
Do sprawdzenia czy wszystkie elementy listy spełniają wyrażenie służy every:
every(x, func)
> every(x, func)
[1] FALSE
Some sprawdza czy którykolwiek z elementów spełnia wyrażenie:
some(x,func)
> some(x,func)
[1] TRUE
Has_element pozwala sprawdzić, czy lista zawiera konkretny element:
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:
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:
> 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:
append(x,y)
Mając wielowymiarową listę:
l = list(list(1,2,3),list(4,5),list(5))
Możemy ją uprościć do jednowymiarowej korzystając z flatten:
flatten(l)
Lub transponować:
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:)