Übergabe mehrerer Argumente an FUN of lapply (und andere * gelten)

99

Ich habe eine Frage zum Übergeben mehrerer Argumente an eine Funktion bei der Verwendung von lapplyin R.

Wenn ich lapply mit der Syntax von verwende, ist lapply(input, myfun);dies leicht verständlich und ich kann myfun so definieren:

myfun <- function(x) {
 # doing something here with x
}

lapply(input, myfun);

und Elemente von inputwerden als xArgument an übergeben myfun.

Aber was ist, wenn ich noch ein paar Argumente weitergeben muss myfunc? Zum Beispiel ist es so definiert:

myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

Wie kann ich diese Funktion verwenden, um beide inputElemente (als xArgument) und ein anderes Argument zu übergeben?

Vasily A.
quelle
Beenden der Eingangsleitungen der R-Konsole mit ";" ist ein Zeichen dafür, dass Sie in der Vergangenheit wahrscheinlich eine Makroverarbeitungssprache verwendet haben. Das Triple-Dots-Argument wird in Unterabschnitt 4 des Abschnitts "Schreiben eigener Funktionen" des Dokuments "Einführung in R" beschrieben, wahrscheinlich das erste "Handbuch", das Sie lesen sollten.
IRTFM

Antworten:

120

Wenn Sie die Hilfeseite nachschlagen, ist eines der Argumente lapplydas Geheimnisvolle .... Wenn wir uns den Abschnitt Argumente auf der Hilfeseite ansehen, finden wir die folgende Zeile:

...: optional arguments to ‘FUN’.

Alles, was Sie tun müssen, ist, Ihr anderes Argument lapplyals Argument in den Aufruf aufzunehmen:

lapply(input, myfun, arg1=6)

und zu lapplyerkennen, dass dies arg1kein Argument ist, mit dem es zu tun weiß, wird es automatisch an weiterleiten myfun. Alle anderen applyFunktionen können dasselbe tun.

Ein Nachtrag: Sie können ihn auch verwenden, ...wenn Sie Ihre eigenen Funktionen schreiben. Angenommen, Sie schreiben eine Funktion, die plotirgendwann aufgerufen wird, und möchten die Plotparameter Ihres Funktionsaufrufs ändern können. Sie könnten jeden Parameter als Argument in Ihre Funktion aufnehmen, aber das ist ärgerlich. Stattdessen können Sie ...(als Argument sowohl für Ihre Funktion als auch für den Aufruf zum Plotten) verwenden und jedes Argument, das Ihre Funktion nicht erkennt, automatisch an weiterleiten plot.

Jonathan Christensen
quelle
Was ist, wenn Ihr zweites Argument, z. B. "arg1", eine Liste ist, die mit der "Eingabe" -Liste übereinstimmt? Wenn ich lapply (input, myfun, arg1 = input2) versuche , wobei input2 eine Liste ist, sieht es so aus, als würde lapply die gesamte Liste auf einmal übergeben, anstatt wie bei 'input' Element für Element.
Alan
10
Ich habe gerade eine Antwort in einem anderen Beitrag gefunden, der funktioniert: mapply (myfun, df $ input, df $ input2)
Alan
18

Wie von Alan vorgeschlagen, wendet die Funktion 'Mapply' eine Funktion auf mehrere Mehrfachlisten oder Vektorargumente an:

mapply(myfun, arg1, arg2)

Siehe Manpage: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html

Andrew
quelle
Und es ist outerin der gleichen Weise erwähnenswert , die eine Funktion auf jedes Wertepaar in zwei Vektorargumenten anwendet. Manpage: stat.ethz.ch/R-manual/R-devel/library/base/html/outer.html
ms609
11

Sie können dies folgendermaßen tun:

 myfxn <- function(var1,var2,var3){
      var1*var2*var3

    }

    lapply(1:3,myfxn,var2=2,var3=100)

und Sie erhalten die Antwort:

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600

Gpwner
quelle
3
myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

xist ein Vektor oder eine Liste und myfunin lapply(x, myfun)wird für jedes Element der genannten xgetrennt.

Option 1

Wenn Sie möchten , verwenden ganze arg1in jedem myfunAnruf ( myfun(x[1], arg1), myfun(x[2], arg1)usw.), die Verwendung lapply(x, myfun, arg1)(wie oben angegeben).

Option 2

Wenn Sie jedoch wie rufen myfunzu jedem Element arg1neben Elemente getrennt x( myfun(x[1], arg1[1]), myfun(x[2], arg1[2])etc.), ist es nicht möglich zu verwenden lapply. Verwenden Sie stattdessen mapply(myfun, x, arg1)(wie oben angegeben) oder apply:

 apply(cbind(x,arg1), 1, myfun)

oder

 apply(rbind(x,arg1), 2, myfun).
hanna
quelle