Qual'è la differenza tra sapply e lapply in R? Quando dovresti usare l'uno contro l'altro? Bonus: quando dovresti usare vapply?


Risposta 1:

Presumo che tu sappia già cosa * applica la funzione :-).

La principale differenza tra lapply e sapply è che sapply cercherà di semplificare il più possibile l'output di lapply. Se la tua funzione restituisce un valore singolo per ciascun elemento dell'elenco sapply restituirà vettore con quei valori, ad esempio utile quando vuoi controllare la lunghezza degli elementi dell'elenco.

Un'altra possibilità è che la tua funzione restituisca vettori della stessa dimensione per ciascun elemento dell'elenco, ad esempio intervallo e funzioni quantili. In questo caso sapply restituirà una matrice con un numero di righe uguale alla lunghezza dei tuoi vettori e un numero di colonne uguale alla lunghezza dell'elenco.

Nel caso in cui sapply non riesca a semplificare l'output, si comporterà esattamente come lapply.

Ora, l'ambiguità di sapply dei valori di ritorno (a volte un elenco, a volte una matrice o un vettore) rende lo sviluppo di pacchetti con esso un po 'più complicato di quanto dovrebbe essere. Devi (o almeno dovresti) controllare manualmente la classe di ogni valore di ritorno quando usi sapply e lanci le eccezioni appropriate. Vapply risolve questo problema piuttosto bene con il suo argomento FUN.VALUE. Devi definire esplicitamente qual è il tuo output (carattere, numerico, intero, fattore o altro) e la lunghezza dell'output.

Penso che tu possa già immaginare quando usare il vapply: ogni volta che permetti a qualcun altro di usare le tue funzioni, dovresti abbandonare sapply a favore del vapply :-).


Risposta 2:

sapply cercherà solo di semplificare il risultato di lapply, se possibile. Così:

  • Se il risultato di lapply è un elenco in cui ogni elemento è di lunghezza uno, allora sapply restituirà un vettore. Se il risultato è un elenco in cui ogni elemento è un vettore della stessa lunghezza (> 1), viene restituita una matrice. non riesco a capire le cose, viene restituito un elenco.

ad esempio:

con lapply:

> x <- list (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

con sapply:

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

Risposta 3:

Forse posso darti un esempio:

Funzionerà, ma il secondo non può:

# 1

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

sz <- max (sapply (l, funzione (x) lunghezza (x)))

# 2

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

sz <- max (lapply (l, funzione (x) lunghezza (x)))

Perché la funzione max () non si applica a un elenco ma solo a un vettore. E lapply restituisce la lista e sapply restituisce un vettore.