Projekt R

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:)