2013-06-03 17 views

risposta

28

Ecco un'altra opzione:

Filter(Negate(is.null), x) 
11

Che dire:

x[!unlist(lapply(x, is.null))] 

Ecco una breve descrizione di ciò che sta accadendo.

  1. lapply ci dice quali elementi sono NULL

    R> lapply(x, is.null) 
    $a 
    [1] FALSE 
    
    $b 
    [1] FALSE 
    
    $c 
    [1] TRUE 
    
  2. Poi si convect la lista in un vettore:

    R> unlist(lapply(x, is.null)) 
    a  b  c 
    FALSE FALSE TRUE 
    
  3. Poi si passa TRUE-FALSE:

    R> !unlist(lapply(x, is.null)) 
        a  b  c 
    TRUE TRUE FALSE 
    
  4. Infine, selezionare gli elementi utilizzando la solita notazione:

    x[!unlist(lapply(x, is.null))] 
    
+3

Non 'x [! Sapply (x, is.null)]' essere più veloce? – Julius

0

più semplice e probabilmente più veloce di quanto sopra, i seguenti lavori per gli elenchi di qualsiasi valore non ricorsivo (nel senso di is.recursive):

example_1_LST <- list(NULL, a=1.0, b=Matrix::Matrix(), c=NULL, d=4L) 
example_2_LST <- as.list(unlist(example_1_LST, recursive=FALSE)) 

str(example_2_LST) stampe:

List of 3 
$ a: num 1 
$ b:Formal class 'lsyMatrix' [package "Matrix"] with 5 slots 
    .. [email protected] x  : logi NA 
    .. [email protected] Dim  : int [1:2] 1 1 
    .. [email protected] Dimnames:List of 2 
    .. .. ..$ : NULL 
    .. .. ..$ : NULL 
    .. [email protected] uplo : chr "U" 
    .. [email protected] factors : list() 
$ d: int 4 
+0

Non è necessario fare riferimento alle funzioni in base e util con 'base ::' e 'utils ::'. –

1
x[!sapply(x,is.null)] 

Questo generalizza a qualsiasi dichiarazione logica sull'elenco, proprio sub nella logica per "is.null".

Problemi correlati