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.