Gibt es Fälle, in denen es nicht vorteilhaft ist, die Magnetröhre innerhalb von R-Funktionen aus den Perspektiven von (1) Geschwindigkeit und (2) Fähigkeit zum Debuggen effektiv zu verwenden?Magrittr-Rohr in R-Funktionen
Antwort
Es gibt Vor- und Nachteile bei der Verwendung eines Rohrs innerhalb einer Funktion. Der größte Vorteil ist, dass Sie beim Lesen des Codes leichter sehen können, was in einer Funktion passiert. Die größten Nachteile sind, dass Fehlermeldungen schwieriger zu interpretieren sind und die Pipe einige der Bewertungsregeln von R durchbricht.
Hier ist ein Beispiel. Nehmen wir an, wir möchten eine sinnlose Umwandlung in den Datensatz mtcars
vornehmen. Hier ist, wie wir das mit Rohren tun könnte ...
library(tidyverse)
tidy_function <- function() {
mtcars %>%
group_by(cyl) %>%
summarise(disp = sum(disp)) %>%
mutate(disp = (disp^4)/10000000000)
}
Man kann deutlich sehen, was in jeder Phase passiert, auch wenn es nicht ist, etwas Sinnvolles zu tun. Nun wollen sie den Zeitcode schaut den Dagwood Sandwich-Ansatz ...
base_function <- function() {
mutate(summarise(group_by(mtcars, cyl), disp = sum(disp)), disp = (disp^5)/10000000000)
}
viel schwieriger zu lesen, auch wenn es uns das gleiche Ergebnis gibt ...
all.equal(tidy_function(), base_function())
# [1] TRUE
Die häufigste Art und Weise zu entweder über ein Rohr oder ein Dagwood Sandwich vermeiden ist es, die Ergebnisse der einzelnen Schritte zu einer Zwischengröße zu speichern ...
intermediate_function <- function() {
x <- mtcars
x <- group_by(x, cyl)
x <- summarise(x, disp = sum(disp))
mutate(x, disp = (disp^5)/10000000000)
}
besser lesbar als die letzte Funktion und R werden Ihnen ein wenig detaillierte Informationen, wenn ein Fehler aufgetreten ist. Außerdem gehorcht es den traditionellen Bewertungsregeln. Auch hier gibt es die gleichen Ergebnisse wie die beiden anderen Funktionen ...
all.equal(tidy_function(), intermediate_function())
# [1] TRUE
Sie speziell über Geschwindigkeit gefragt, also lassen Sie uns, indem Sie jeder von ihnen 1000 mal diese drei Funktionen vergleichen ...
library(microbenchmark)
timing <-
microbenchmark(tidy_function(),
intermediate_function(),
base_function(),
times = 1000L)
timing
#Unit: milliseconds
#expr min lq mean median uq max neval cld
#tidy_function() 3.809009 4.403243 5.531429 4.800918 5.860111 23.37589 1000 a
#intermediate_function() 3.560666 4.106216 5.154006 4.519938 5.538834 21.43292 1000 a
#base_function() 3.610992 4.136850 5.519869 4.583573 5.696737 203.66175 1000 a
Auch in diesem trivialen Beispiel ist die Pipe ein kleines bisschen langsamer als die anderen beiden Optionen.
Fazit
Fühlen Sie sich frei um das Rohr in Ihren Funktionen zu verwenden, wenn es die bequemste Art und Weise für Sie Code zu schreiben. Wenn Sie Probleme haben oder Ihren Code so schnell wie möglich verwenden müssen, wechseln Sie zu einem anderen Paradigma.
Ihr Dagwood-Sandwich braucht nur einige Zeilenumbrüche und Einkerbungen und ist sehr gut lesbar. – Roland
Kennt jemand Pakete, in denen der Rohroperator verwendet wird? Ich habe es nur in Skriptbeispielen verwendet. – user2506086
Mir scheint, dass Piping näher an das Schreiben der Anweisungen für etwas ist. Daher möchte ich es in Fällen verwenden, in denen ich möchte, dass mein Code gut lesbar ist. Auf der anderen Seite bekomme ich Schwierigkeiten beim Debuggen. Wenn Sie versuchen, in eine Pipe zu debuggen, müssen Sie sich durch die '%>%' Funktion bewegen und herausfinden, in welche Zeile Sie hineingehen wollen.Scheint, als ob ich ein Paket für andere Leute schreibe, um zu verwenden, ob ich die Pipe verwende, wird ein Gleichgewicht zwischen wie natürlich ich sein will, um den Code zu lesen, und wie einfach ich es sein möchte, um den Code zu debuggen. – user2506086
- 1. In CSV in Array in Python konvertieren
- 2. Zoom-in in Weltkarte in R
- 3. 'IN' & 'NICHT IN' in Linq Abfrage
- 4. % in% Veränderung in dplyr Paket in R
- 5. Schleifen in Schleifen in Schleifen in Java
- 6. "IN" und "NOT IN" in CakePHP3
- 7. Funktionsparameter in Zeichenfolge in Parameter in Objekt
- 8. In Operator in Linq
- 9. In Python in bash
- 10. in Verknüpfungstabelle in Hibernate
- 11. IN-Klausel in sqlite
- 12. \ in path.combine in C#
- 13. ZWISCHEN IN in SQL
- 14. "IN" Operator in Linq
- 15. in
- 16. in
- 17. in
- 18. in
- 19. in
- 20. Synchronisation in Vektoren in Java
- 21. SQLite in Operator in query()
- 22. Blobs in Blobstore in GAE
- 23. mehr IN-Bedingungen in JPQL
- 24. RadUpload in FormView in RadAjaxPanel
- 25. Javascript in select in Selen
- 26. SQL - IN vs. NICHT IN
- 27. Bindung in ItemTemplate in ResourceDictionary
- 28. Split in Großbuchstaben in PHP?
- 29. Kreuzung in sqlite3 in Python
- 30. Assoziativität von "in" in Python?
Fragen Sie nach Ausführungsgeschwindigkeit oder Geschwindigkeit in Bezug auf die Entwicklungszeit? – Dason
Wie auch immer, es gibt einige Leute, die Sie fragen, ob es Fälle gibt, in denen die Verwendung von magritrtröhren in Bezug auf Geschwindigkeit oder Debugging-Fähigkeit von Vorteil ist ... – Dason
Die einzige Möglichkeit, dies zu beantworten, besteht darin, mehrere Beispiele einzurichten und zu benchmarken. Hast du das versucht? –