Koja je razlika između sapply i lapply u R? Kada biste trebali koristiti jedno nasuprot drugom? Bonus: Kada trebate koristiti vapply?


Odgovor 1:

Pretpostavljam da već znate što * primijeniti funkcija :-).

Glavna razlika između lapply i sapply je da će sapply pokušati pojednostaviti onoliko koliko može izlaziti lapply. Ako vaša funkcija vrati pojedinačnu vrijednost za svaki element popisa, sapply će vratiti vektor s tim vrijednostima, npr. Korisno kada želite provjeriti duljinu elemenata popisa.

Druga je mogućnost da vaša funkcija vraća vektore iste veličine za svaki element popisa, npr. Raspon i kvantne funkcije. U tom će slučaju sapply vratiti matricu s brojem redaka jednakim duljini vaših vektora i brojem stupaca jednakim duljini popisa.

U slučaju da sapply ne može pojednostaviti izlaz, ponašat će se potpuno isto kao i lapply.

Sada, sapply nejasnoća povratnih vrijednosti (ponekad popis, ponekad matrica ili vektor) čini razvoj paketa s njim malo složenije nego što bi trebao biti. Morate (ili barem trebali) ručno provjeriti klasu svake povratne vrijednosti kada koristite sapply i bacite odgovarajuće iznimke. Vapply to prilično dobro rješava svojim argumentom FUN.VALUE. Morate izričito definirati koliki je vaš izlaz (znak, numerički, cijeli broj, faktor ili bilo što drugo) i duljina izlaza.

Mislim da već možete zamisliti kada upotrijebiti vapply: kad god dopustite nekom drugom da koristi vaše funkcije, trebali biste se odrezati u korist vapply :-).


Odgovor 2:

sapply će samo pokušati pojednostaviti rezultat lapply ako je moguće. Tako:

  • Ako je rezultat lapply lista gdje je svaki element duljina jedan, tada će sapply vratiti vektor.Ako je rezultat popis gdje je svaki element vektor iste duljine (> 1), vraća se matrica.Ako je Ne mogu shvatiti stvari, vraća se popis.

npr:

s lapply:

> x <- popis (a = 1: 4, b = rnorm (10), c = rnorm (20, 1), d = rnorm (100, 5))> lapply (x, mean) $ a [1] 2.5 $ b [1] 0,06082667 $ c [1] 1,467083 $ d [1] 5,074749

sapply:

> sapply (x, mean) abcd 2.50000000 0.06082667 1.46708277 5.07474950

Odgovor 3:

Mogu vam dati primjer:

To će uspjeti, ali drugo ne može:

# 1

l <- popis ("a", "b", c ("x", "y"), c ("1", "3", "4"))

sz <- max (sapply (l, funkcija (x) dužina (x)))

# 2

l <- popis ("a", "b", c ("x", "y"), c ("1", "3", "4"))

sz <- max (lapply (l, funkcija (x) dužina (x)))

Budući da se funkcija max () ne odnosi na popis već samo na vektor. I lapply vraća listu i sapply vraća vektor.