Ada fungsi yang disebut Map
yang mungkin mirip dengan peta dalam bahasa lain:
lapply
mengembalikan daftar dengan panjang yang sama dengan X, yang setiap elemennya merupakan hasil dari penerapan FUN ke elemen X yang sesuai.
do.call
membangun dan mengeksekusi panggilan fungsi dari nama atau fungsi dan daftar argumen untuk diteruskan ke sana.
Map
menerapkan fungsi ke elemen terkait dari vektor yang diberikan ... Map
adalah pembungkus sederhana mapply
yang tidak berusaha menyederhanakan hasilnya, mirip dengan mapcar Common Lisp (dengan argumen yang didaur ulang, namun). Versi mendatang dapat memungkinkan beberapa kontrol dari tipe hasil.
Map
adalah pembungkus di sekitar mapply
lapply
adalah kasus khusus mapply
- Karena itu
Map
dan lapply
akan serupa dalam banyak kasus.
Sebagai contoh, ini adalah lapply
:
lapply(iris, class)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
Dan hal yang sama menggunakan 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
mengambil fungsi sebagai input dan memecah argumen lainnya ke fungsi. Ini banyak digunakan, misalnya, untuk merakit daftar menjadi struktur yang lebih sederhana (seringkali dengan rbind
atau cbind
).
Sebagai contoh:
x <- lapply(iris, class)
do.call(c, x)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
do.call
hampir sama denganapply
di Lispdo.call(cbind, x)
versi saat ini memberi sayaError in do.call(c, x) : 'what' must be a function or character string
...cbind()
berbeda dari fungsic()
, dan meskipun ini juga berfungsi, ia memberikan hasil yang berbeda.lapply
menerapkan fungsi di atas daftar,do.call
memanggil fungsi dengan daftar argumen. Itu tampak sangat berbeda bagi saya ...Untuk memberi contoh dengan daftar:
Dengan lapply Anda mendapatkan rata-rata dari setiap elemen dalam daftar seperti ini:
do.call
memberikan kesalahan, karena rata-rata mengharapkan argumen "trim" menjadi 1.Di sisi lain,
rbind
ikat semua argumen secara searah. Jadi untuk mengikat X berturut-turut, Anda lakukan:Jika Anda akan menggunakan
lapply
, R akan berlakurbind
untuk setiap elemen daftar, memberi Anda omong kosong ini:Untuk memiliki sesuatu seperti Peta, Anda perlu
?mapply
, yang merupakan sesuatu yang sama sekali berbeda. Untuk mendapatkan misalnya rata-rata setiap elemen dalam X, tetapi dengan pemangkasan yang berbeda, Anda bisa menggunakan:sumber
lapply
mirip denganmap
,do.call
bukan.lapply
menerapkan fungsi ke semua elemen daftar,do.call
memanggil fungsi di mana semua argumen fungsi ada dalam daftar. Jadi untukn
daftar elemen,lapply
memilikin
panggilan fungsi, dando.call
hanya memiliki satu panggilan fungsi. Jadido.call
sangat berbeda darilapply
. Semoga ini menjelaskan masalah Anda.Contoh kode:
dan:
sumber
Dengan kata paling sederhana:
lapply () menerapkan fungsi yang diberikan untuk setiap elemen dalam daftar, sehingga akan ada beberapa panggilan fungsi.
do.call () menerapkan fungsi yang diberikan ke daftar secara keseluruhan, jadi hanya ada satu panggilan fungsi.
Cara terbaik untuk belajar adalah bermain-main dengan contoh-contoh fungsi dalam dokumentasi R.
sumber
lapply()
adalah fungsi seperti peta.do.call()
berbeda. Ini digunakan untuk meneruskan argumen ke fungsi dalam bentuk daftar daripada meminta mereka disebutkan. Misalnya,sumber
Meskipun sudah ada banyak jawaban, ini adalah contoh saya untuk referensi. Misalkan kita memiliki daftar data sebagai:
Fungsi ini mengembalikan daftar.
Di atas berarti sesuatu seperti di bawah ini.
Sekarang mari kita lakukan hal yang sama untuk do.call
Itu berarti
Dalam contoh kita, ia mengembalikan 21. Singkatnya, lapply selalu mengembalikan daftar sementara jenis kembalinya dari do.call benar-benar tergantung pada fungsi yang dijalankan.
sumber
Perbedaan keduanya adalah:
=> Ini mengirim 1, parameter berfungsi => ini mengirim 2, parameter berfungsi dan seterusnya
Hanya mengirim 1 ... n sebagai vektor dan parameter berfungsi
Jadi dalam berlaku Anda memiliki panggilan fungsi n, di do.call Anda hanya memiliki satu
sumber