HOWTO · R
Funktion mit mehreren Argumenten in R anwenden
Dieses Tutorial demonstriert, wie man in R eine Funktion mit mehreren Argumenten anwendet
Auf dieser Seite
Um eine R-Funktion mit mehreren Argumenten anzuwenden, übergeben Sie feste Werte nach der Funktion an apply() oder lapply() und Vektoren mit zueinander passenden Werten an mapply() oder Map(). Wählen Sie die Funktion danach aus, welche Form die Eingabe hat und ob Sie ein Listen- oder ein vereinfachtes Ergebnis benötigen.
Zusätzliche Argumente an apply-Funktionen übergeben
apply(X, MARGIN, FUN, ...) wendet FUN auf Ausschnitte eines Arrays an. Bei einer Matrix wählt MARGIN = 1 die Zeilen und MARGIN = 2 die Spalten aus. Argumente nach FUN werden an diese Funktion übergeben. Sie können daher unverändert bleiben, während sich der jeweilige Ausschnitt ändert. Dasselbe Prinzip gilt für lapply(X, FUN, ...): Die Funktion ruft FUN für jedes Listenelement einmal auf und gibt immer eine Liste zurück. sapply() folgt demselben elementweisen Muster, versucht aber, das Listenergebnis nach Möglichkeit zu einem Vektor oder einer Matrix zu vereinfachen. Es ist nicht grundsätzlich schneller.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
scores <- matrix(1:6, nrow = 2)
row_totals <- apply(scores, MARGIN = 1, FUN = function(row, scale, offset) {
sum(row * scale + offset)
}, scale = 2, offset = 1)
print(row_totals)
[1] 21 27
Die Funktion erhält jede Zeile als row, während scale und offset unverändert auf 2 und 1 gesetzt bleiben. apply() ist für Arrays vorgesehen. Bei einem Dataframe kann die Verwendung die Spalten auf einen gemeinsamen Typ umwandeln. Verwenden Sie lapply() oder Map(), wenn die Listenelemente und ihre Typen erhalten bleiben sollen.
mapply für parallele Argumente verwenden
Verwenden Sie mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE), wenn jeder Funktionsaufruf Werte aus entsprechenden Positionen mehrerer Eingaben erhalten soll. Anders als apply() wählt die Funktion keine Matrixränder aus. Über MoreArgs übergebene Werte bleiben bei jedem Aufruf gleich; die über ... gelieferten Werte ändern sich von Aufruf zu Aufruf. Standardmäßig versucht mapply(), das Ergebnis ähnlich wie sapply() zu vereinfachen.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
add_with_tax <- function(price, tax, rate) price * (1 + rate) + tax
prices <- c(10, 20, 30)
fees <- c(1, 2, 3)
totals <- mapply(add_with_tax, prices, fees, MoreArgs = list(rate = 0.1))
print(totals)
[1] 12 24 36
Hier wird jeder Preis mit der Gebühr an derselben Position kombiniert, während der Steuersatz gleich bleibt. Wenn die Eingaben unterschiedlich lang sind, wiederholt mapply() Werte gemäß den Vektor-Recyclingregeln von R. Verwenden Sie gleich lange Eingaben, wenn jedes Element genau einen Partner haben soll. Setzen Sie SIMPLIFY = FALSE, wenn Sie ein Listenergebnis bevorzugen.
Map verwenden, wenn ein Listenergebnis benötigt wird
Map(FUN, ...) wendet FUN auf entsprechende Elemente seiner Eingaben an und gibt eine Liste zurück. Das entspricht mapply() mit deaktivierter Vereinfachung. Map eignet sich daher, wenn das Ergebnis jedes Aufrufs als separates Listenelement erhalten bleiben soll.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
combine <- function(values, multiplier) values * multiplier
parts <- list(first = 1:2, second = 3:4)
scaled <- Map(combine, parts, c(10, 100))
print(scaled)
$first
[1] 10 20
$second
[1] 300 400
Jedes Listenelement wird zusammen mit dem Multiplikator an derselben Position übergeben. Die Funktion gibt eine Liste zurück, selbst wenn sich deren Elemente zu einem Vektor oder einer Matrix zusammenfassen ließen. Wie mapply() wiederholt auch Map() Werte aus kürzeren Eingaben. Prüfen Sie daher die Längen, wenn die Zuordnung nach Position wichtig ist.
Die passende Apply-Funktion auswählen
- Verwenden Sie
apply()für Zeilen oder Spalten einer Matrix oder eines anderen Arrays und übergeben Sie feste zusätzliche Argumente nachFUN. - Verwenden Sie
lapply()für eine Listeneingabe, wenn das Ergebnis immer eine Liste bleiben soll. Verwenden Siesapply(), wenn die versuchte Vereinfachung hilfreich ist und die resultierende Form passt. - Verwenden Sie
mapply()für mehrere Eingaben, deren Elemente an entsprechenden Positionen zu Argumenten desselben Funktionsaufrufs werden. Setzen SieSIMPLIFY = FALSE, wenn das Ergebnis eine Liste sein soll. - Verwenden Sie
Map()für dasselbe Muster mit parallelen Eingaben, wenn standardmäßig eine Liste zurückgegeben werden soll.
Bei allen vier Funktionen kommen zuerst die regulären Argumente der angewendeten Funktion. Benennen Sie feste Werte, wenn dadurch ihre Rolle klarer wird. Prüfen Sie bei mapply() und Map(), ob das Recycling zur beabsichtigten Zuordnung passt. Beachten Sie bei apply(), dass ein Dataframe umgewandelt werden kann, bevor seine Zeilen oder Spalten verarbeitet werden. Diese Unterschiede helfen bei der Auswahl mehr als eine pauschale Aussage zur Geschwindigkeit.