Birden fazla parametre ile uygulama işlevi


128

f(var1, var2)R'de bir fonksiyonum var. Farz edelim ki ayarladık var2 = 1ve şimdi fonksiyonu f()listeye uygulamak istiyorum L. Temel olarak çıktılarla yeni bir L * listesi almak istiyorum

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

Bunu nasıl biriyle yaparsınız apply, mapplyya lapply?


Yanıtlar:


190

Var2'yi uygulama işlevlerinden birine ekstra argüman olarak iletin.

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

sapply(mylist,myfxn,var2=var2)

Bu var2, her çağrıya aynı şekilde geçer myfxn. Bunun yerine, her çağrının myfxn1./2 ./3. / Vb. Almasını istiyorsanız . her ikisinin de öğesi mylistve var2ardından kullanıcısının mapplyetki alanındasınız.


5
ancak myfxnbunun vektörleştirilmiş olabileceğini unutmayın , bu durumda kişi kullanılmalıdırmyfxn(unlist(mylist), var2=var2)
baptiste

Orijinal örnek net değildi, ancak vektörize edilmemiş gibi görünüyordu. Ancak iyi değerlendirilmiş nokta.
Ari B. Friedman

Bunu "anında" bir işlev olarak çalıştırmanın bir yolu mu? Bunun gibi bir şey: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)Ama 2. argümanın birden fazla resmi argümanla eşleştiğine dair bir hata alıyorum
emudrak

1
@emudrak Sanırım sorun, varyerine ilettiğiniz argümanı adlandırmanızdan kaynaklanıyor var2. Ne demek istediğini anlayamazsın.
Ari B. Friedman

49

Fonksiyonunuzun iki vektör değişkeni varsa ve her bir değeri üzerinde kendini hesaplamanız gerekiyorsa (@Ari B.Friedman tarafından belirtildiği mapplygibi) aşağıdaki gibi kullanabilirsiniz :

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

bu size verir:

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

3
Basit ve açık bir örnekle bile genelleme için bir olumlu oy.
JASC

mapplyvars1tek bir elemente sahipse de geri dönüşüm yapacaktır . Örneğin, ne zaman vars1 <- 3, mapply(mult_one, vars1, vars2)döner 30 60 90. Bu, lapplybir işlevin ikinci bağımsız değişkeninin üzerinde kullanmak istediğinizde yararlıdır .
Paul Rougieux

3

@ Alexander'ın örneğini daha fazla genellemek için, outerbir fonksiyonun her bir vektör değeri çifti üzerinde kendisini hesaplaması gereken durumlarda geçerlidir :

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

verir:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.