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?

Michael
quelle
Ähnliche Frage: stackoverflow.com/questions/2545879/…
Scott C Wilson

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.

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