meneruskan beberapa argumen ke FUN dari lapply (dan lainnya * berlaku)

99

Saya punya pertanyaan tentang melewatkan beberapa argumen ke suatu fungsi, saat menggunakan lapplyin R.

Ketika saya menggunakan lapply dengan sintaks lapply(input, myfun);- ini mudah dimengerti, dan saya dapat mendefinisikan myfun seperti itu:

myfun <- function(x) {
 # doing something here with x
}

lapply(input, myfun);

dan elemen dari inputditeruskan sebagai xargumen ke myfun.

Tetapi bagaimana jika saya perlu menyampaikan beberapa argumen lagi myfunc? Misalnya, didefinisikan seperti itu:

myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

Bagaimana saya bisa menggunakan fungsi ini dengan melewatkan kedua inputelemen (sebagai xargumen) dan beberapa argumen lainnya?

Mudah A
sumber
1
Mengakhiri jalur input konsol R dengan ";" adalah tanda bahwa Anda mungkin menggunakan beberapa bahasa pemrosesan makro di masa lalu. Argumen titik tiga dijelaskan di sub-bagian 4 dari bagian "Menulis fungsi Anda sendiri" dari dokumen "pengantar R", bisa dibilang "Manual" pertama yang harus Anda baca.
IRTFM

Jawaban:

122

Jika Anda mencari halaman bantuan, salah satu argumennya lapplyadalah yang misterius .... Ketika kita melihat bagian Argumen di halaman bantuan, kita menemukan baris berikut:

...: optional arguments to ‘FUN’.

Jadi yang harus Anda lakukan adalah memasukkan argumen Anda yang lain dalam lapplypanggilan sebagai argumen, seperti:

lapply(input, myfun, arg1=6)

dan lapply, mengenali itu arg1bukan argumen yang tahu apa yang harus dilakukan, secara otomatis akan meneruskannya myfun. Semua applyfungsi lainnya dapat melakukan hal yang sama.

Tambahan: Anda juga dapat menggunakan ...saat Anda menulis fungsi Anda sendiri. Misalnya, Anda menulis sebuah fungsi yang memanggil plotdi beberapa titik, dan Anda ingin dapat mengubah parameter plot dari pemanggilan fungsi Anda. Anda bisa memasukkan setiap parameter sebagai argumen dalam fungsi Anda, tapi itu mengganggu. Sebagai gantinya Anda bisa menggunakan ...(sebagai argumen untuk fungsi Anda dan panggilan untuk plot di dalamnya), dan memiliki argumen yang tidak dikenali oleh fungsi Anda akan diteruskan secara otomatis plot.

Jonathan Christensen
sumber
Bagaimana jika argumen kedua Anda, misalnya, "arg1" adalah daftar yang cocok dengan daftar "masukan"? Ketika saya mencoba lapply (input, myfun, arg1 = input2) di mana input2 adalah daftar, sepertinya lapply melewati seluruh daftar sekaligus, bukan elemen demi elemen seperti dengan 'input'.
Alan
10
Saya baru saja menemukan jawaban di posting lain yang berfungsi: mapply (myfun, df $ input, df $ input2)
Alan
18

Seperti yang disarankan oleh Alan, fungsi 'mapply' menerapkan fungsi ke beberapa Daftar Ganda atau Argumen Vektor:

mapply(myfun, arg1, arg2)

Lihat halaman manual: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html

Andrew
sumber
Dan perlu disebutkan outerdengan nada yang sama, yang menerapkan fungsi ke setiap pasangan nilai dalam dua argumen vektor. Halaman manual
ms609
11

Anda dapat melakukannya dengan cara berikut:

 myfxn <- function(var1,var2,var3){
      var1*var2*var3

    }

    lapply(1:3,myfxn,var2=2,var3=100)

dan Anda akan mendapatkan jawabannya:

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600

Gpwner
sumber
3
myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

xadalah vektor atau daftar dan myfunin lapply(x, myfun)dipanggil untuk setiap elemen xsecara terpisah.

Pilihan 1

Jika Anda ingin menggunakan keseluruhan arg1dalam setiap myfunpanggilan ( myfun(x[1], arg1), myfun(x[2], arg1)dll.), Gunakan lapply(x, myfun, arg1)(seperti yang dinyatakan di atas).

pilihan 2

Namun jika Anda ingin memanggil myfunsetiap elemen arg1secara terpisah bersama elemen x( myfun(x[1], arg1[1]), myfun(x[2], arg1[2])dll.), Itu tidak mungkin digunakan lapply. Sebagai gantinya, gunakan mapply(myfun, x, arg1)(seperti yang disebutkan di atas) atau apply:

 apply(cbind(x,arg1), 1, myfun)

atau

 apply(rbind(x,arg1), 2, myfun).
hanna
sumber