1. ホーム
  2. r

[解決済み] lapplyとdo.callの違いは何ですか?

2022-04-22 04:36:50

質問

最近Rを勉強しているのですが、2つの関数で混乱しています。 lapplydo.call . と似ているだけのようです。 map というLispの関数があります。しかし、なぜこんなにも違う名前の関数が2つもあるのでしょうか?なぜRでは、単に map ?

解決方法は?

という関数があります。 Map 他の言語ではmapに似ているかもしれません。

  • lapply はXと同じ長さのリストで、その各要素はXの対応する要素にFUNを適用した結果であることを返します。

  • do.call は、名前または関数とそれに渡される引数のリストから関数呼び出しを構築し、実行します。

  • Map は,与えられたベクトルの対応する要素に関数を適用します. Map の単純なラッパーです。 mapply Common Lispのmapcarに似ていて、結果を単純化しようとはしません(ただし、引数は再利用されます)。将来のバージョンでは、結果の型をある程度制御できるようになるかもしれない。


  1. Map のラッパーです。 mapply
  2. lapply の特殊なケースです。 mapply
  3. したがって Maplapply は多くの場合において類似していることでしょう。

例えば、次のようなものです。 lapply :

lapply(iris, class)
$Sepal.Length
[1] "numeric"

$Sepal.Width
[1] "numeric"

$Petal.Length
[1] "numeric"

$Petal.Width
[1] "numeric"

$Species
[1] "factor"

また、同じように 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 は関数を入力とし、その他の引数を関数にスプラッタします。例えば、リストをより単純な構造に組み立てるために広く使われている(しばしば rbind または cbind ).

例えば

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