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?

Michael
sumber
Pertanyaan serupa: stackoverflow.com/questions/2545879/…
Scott C Wilson

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.

Ari B. Friedman
sumber
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
Alexander
sumber
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
ms609
sumber