Das Problem ist nicht map
, sondern wie die %>%
pipe die .
behandelt. Betrachten Sie die folgenden Beispiele (denken Sie daran, dass /
eine Zwei-Argument-Funktion in R ist):
Entspricht '/'(1, 2)
oder 1 / 2
und ergibt 0.5
.
.
verwenden: Entspricht '/'(2, 1)
oder 2 / 1
und ergibt 2
.
Sie können sehen, dass 1
nicht mehr als erstes, sondern nur als zweites Argument verwendet wird.
.
verwenden: Dieses funktioniert jedoch nicht , wenn Sie die .
:
%Vor%
Wir können sehen, dass .
zweimal als erstes Argument und als Teilmenge im zweiten Argument injiziert wurde. Ein Ausdruck wie .$a
wird manchmal als geschachtelter Funktionsaufruf bezeichnet (die Funktion $
wird in der Funktion /
in diesem Fall verwendet).
Wir verwenden Klammern, um die Injektion erster Argumente zu vermeiden:
%Vor%Gibt 0,5 wieder.
Sie rufen tatsächlich map(df, df$data, min)
, nicht map(df$data, min)
.
Verwenden Sie geschweifte Klammern:
%Vor% Siehe auch den Header Den Punkt für sekundäre Zwecke verwenden in ?magrittr::'%>%'
, der lautet:
Insbesondere, wenn der Platzhalter nur in einer verschachtelten Funktion verwendet wird Call, Lhs wird auch als erstes Argument platziert werden! Der Grund für In den meisten Anwendungsfällen erzeugt dies den am besten lesbaren Code. Zum Beispiel ist
iris %>% subset(1:nrow(.) %% 2 == 0)
äquivalent zuiris %>% subset(., 1:nrow(.) %% 2 == 0)
, aber etwas kompakter. Es ist es möglich, dieses Verhalten zu übersteuern, indem Sie die rhs in geschweiften Klammern einschließen. Zum Beispiel ist1:10 %>% {c(min(.), max(.))}
äquivalent zuc(min(1:10), max(1:10))
.