R menerapkan fungsi dengan beberapa parameter


128

Saya memiliki fungsi f(var1, var2)di R. Misalkan kita mengatur var2 = 1dan sekarang saya ingin menerapkan fungsi f()ke daftar L. Pada dasarnya saya ingin mendapatkan daftar L * baru dengan outputnya

[f(L[1],1),f(L[2],1),...,f(L[n],1)]

Bagaimana saya melakukan ini dengan apply, mapplyatau lapply?


Jawaban:


190

Cukup teruskan var2 sebagai argumen tambahan ke salah satu fungsi terapkan.

mylist <- list(a=1,b=2,c=3)
myfxn <- function(var1,var2){
  var1*var2
}
var2 <- 2

sapply(mylist,myfxn,var2=var2)

Ini meneruskan hal yang sama var2ke setiap panggilan myfxn. Jika sebaliknya Anda ingin setiap panggilan myfxnmendapatkan 1st / 2nd / 3rd / etc. elemen keduanya mylistdan var2, maka Anda berada di mapplydomain.


5
tetapi perhatikan bahwa myfxndapat divektorisasi, dalam hal ini seseorang harus menggunakanmyfxn(unlist(mylist), var2=var2)
— baptiste

Contoh aslinya tidak jelas tetapi tampaknya tidak vektor. Poin diambil dengan baik, bagaimanapun.
— Ari B. Friedman

Apakah cara untuk membuat ini berfungsi sebagai fungsi "dengan cepat?" Sesuatu seperti ini: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)Tapi saya mendapatkan kesalahan bahwa argumen 2 cocok dengan beberapa argumen formal
— emudrak

1
@emudrak Saya pikir masalahnya ada jus yang Anda penamaan argumen Anda lulus varbukan var2. Aku tidak mengerti maksudmu.
— Ari B. Friedman

49

Jika fungsi Anda memiliki dua variabel vektor dan harus menghitung sendiri pada setiap nilainya (seperti yang disebutkan oleh @Ari B.Friedman), Anda dapat menggunakan mapplysebagai berikut:

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
mapply(mult_one,vars1,vars2)

yang memberi Anda:

> mapply(mult_one,vars1,vars2)
[1] 10 40 90

3
Satu suara positif untuk generalisasi, bahkan dengan contoh yang sederhana dan jelas.
— JASC

mapplyjuga akan mendaur ulang jika vars1memiliki satu elemen. Misalnya saat vars1 <- 3, mapply(mult_one, vars1, vars2)return 30 60 90. Ini berguna ketika Anda ingin menggunakan lapplyargumen kedua dari sebuah fungsi.
— Paul Rougieux

3

Untuk lebih menggeneralisasi contoh @ Alexander, outerrelevan dalam kasus di mana suatu fungsi harus menghitung dirinya sendiri pada setiap pasangan nilai vektor:

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
outer(vars1,vars2,mult_one)

memberikan:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.