R Funktion mit mehreren Parametern anwenden


128

Ich habe eine Funktion f(var1, var2)in R. Angenommen, wir setzen var2 = 1und jetzt möchte ich die Funktion f()auf die Liste anwenden L. Grundsätzlich möchte ich eine neue Liste L * mit den Ausgängen erhalten

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

Wie mache ich entweder mit dieser apply, mapplyoder lapply?


Antworten:


190

Übergeben Sie einfach var2 als zusätzliches Argument an eine der Apply-Funktionen.

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

sapply(mylist,myfxn,var2=var2)

Dies gilt var2für jeden Anruf von myfxn. Wenn Sie stattdessen möchten, dass jeder Anruf von myfxnden 1. / 2. / 3. / etc. Erhält . Element von beiden mylistund var2, dann bist du in mapplyder Domäne.


5
aber beachte, dass myfxnes vektorisiert sein kann, in welchem ​​Fall man verwenden solltemyfxn(unlist(mylist), var2=var2)
baptiste

Das ursprüngliche Beispiel war unklar, schien jedoch nicht vektorisiert zu sein. Punkt jedoch gut aufgenommen.
Ari B. Friedman

Ist dies eine Möglichkeit, diese Funktion "on the fly" zu nutzen? So etwas wie das: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)Aber ich bekomme eine Fehlermeldung, dass Argument 2 mit mehreren formalen Argumenten
übereinstimmt

1
@emudrak Ich denke, das Problem dort ist nur, dass Sie das Argument benennen, das Sie varanstelle von übergeben var2. R kann nicht erraten, was du meinst.
Ari B. Friedman

49

Wenn Ihre Funktion zwei Vektorvariablen hat und sich für jeden Wert von ihnen selbst berechnen muss (wie von @Ari B. Friedman erwähnt), können Sie mapplyFolgendes verwenden:

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

was dir gibt:

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

3
Eine Gegenstimme für die Verallgemeinerung, selbst mit einem einfachen und klaren Beispiel.
JASC

mapplywird auch recycelt, wenn vars1ein einzelnes Element vorhanden ist. Zum Beispiel wenn vars1 <- 3, mapply(mult_one, vars1, vars2)kehrt zurück 30 60 90. Dies ist nützlich, wenn Sie lapplydas zweite Argument einer Funktion verwenden möchten .
Paul Rougieux

3

Die weitere Verallgemeinerung des Beispiels von @ Alexander outerist in Fällen relevant, in denen sich eine Funktion für jedes Paar von Vektorwerten selbst berechnen muss :

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

gibt:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.