What's the difference between lapply and do.call?

前端 未结 7 1275
孤独总比滥情好
孤独总比滥情好 2020-11-29 14:46

I\'m learning R recently and confused by two function: lapplyand do.call. It seems that they\'re just similar to map function in Lisp.

7条回答
  •  感动是毒
    2020-11-29 15:04

    There is a function called Map that may be similar to map in other languages:

    • lapply returns a list of the same length as X, each element of which is the result of applying FUN to the corresponding element of X.

    • do.call constructs and executes a function call from a name or a function and a list of arguments to be passed to it.

    • Map applies a function to the corresponding elements of given vectors... Map is a simple wrapper to mapply which does not attempt to simplify the result, similar to Common Lisp's mapcar (with arguments being recycled, however). Future versions may allow some control of the result type.


    1. Map is a wrapper around mapply
    2. lapply is a special case of mapply
    3. Therefore Map and lapply will be similar in many cases.

    For example, here is lapply:

    lapply(iris, class)
    $Sepal.Length
    [1] "numeric"
    
    $Sepal.Width
    [1] "numeric"
    
    $Petal.Length
    [1] "numeric"
    
    $Petal.Width
    [1] "numeric"
    
    $Species
    [1] "factor"
    

    And the same using Map:

    Map(class, iris)
    $Sepal.Length
    [1] "numeric"
    
    $Sepal.Width
    [1] "numeric"
    
    $Petal.Length
    [1] "numeric"
    
    $Petal.Width
    [1] "numeric"
    
    $Species
    [1] "factor"
    

    do.call takes a function as input and splatters its other arguments to the function. It is widely used, for example, to assemble lists into simpler structures (often with rbind or cbind).

    For example:

    x <- lapply(iris, class)
    do.call(c, x)
    Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
       "numeric"    "numeric"    "numeric"    "numeric"     "factor" 
    

提交回复
热议问题