2017-07-17 4 views
3

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

+1

Fragen Sie nach Ausführungsgeschwindigkeit oder Geschwindigkeit in Bezug auf die Entwicklungszeit? – Dason

+1

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

+0

Die einzige Möglichkeit, dies zu beantworten, besteht darin, mehrere Beispiele einzurichten und zu benchmarken. Hast du das versucht? –

Antwort

4

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.

+2

Ihr Dagwood-Sandwich braucht nur einige Zeilenumbrüche und Einkerbungen und ist sehr gut lesbar. – Roland

+1

Kennt jemand Pakete, in denen der Rohroperator verwendet wird? Ich habe es nur in Skriptbeispielen verwendet. – user2506086

+0

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