2017-11-09 3 views
2

Dies ist in mehreren Fällen aufgetaucht, und ich weiß nicht, ob diese aktuelle Instanz für die vielen Fälle, in denen dies für mich auftritt, verallgemeinern kann, aber ich hoffe, dass eine Antwort etwas Licht in die Zukunft bringen kann.Wie führe ich Rohre in eine Ungleichheit?

Die einfachste Version von diesem ist, wenn ich einige Datenverarbeitung mache und eine Auswertung auf dem Ergebnis einer Rohrleitung durchführen möchte. Ein einfaches Beispiel wäre:

> seq(9) %>% > 4 
Error: unexpected '>' in "seq(9) %>% >" 
> seq(9) %>% . > 4 
Error in .(.) : could not find function "." 

Die gewünschte Ausgabe eine logische Vektor

FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE 

In vielen Fällen möchte ich auf einige verrohrt Ausgang bewerten wäre, sondern es zuweisen und dann die Auswertung durchführen zu es funktioniert:

seq(9) -> vec 
vec > 4 

Gibt es eine Möglichkeit, diese Art von Bewertungen innerhalb einer Rohrkette vollständig abzuschließen?

+2

'sapply' ist unnötig,'> 'ist vektorisiert –

+0

@BenBolker Oh richtig, guten Ruf. – Mako212

+0

Einige sehr ähnliche Fragen, die zum Erstellen einer R-FAQ hilfreich sein können: [Numerische Berechnungen mit dem Piping-Befehl 'dplyr'] (https://stackoverflow.com/q/46836185/903061), [Reihenfolge der Operationen mit Rohrleitungen ] (https://stackoverflow.com/q/38531508/903061). Ich weiß, dass ich auch andere gesehen habe. Sie erscheinen nicht ganz wie Duplikate, aber ein kanonisches Duplikat könnte wahrscheinlich konstruiert werden. – Gregor

Antwort

4

Sie müssen geschweifte Klammern verwenden, wenn Sie nur Pipes verwenden möchten.

seq(9) %>% {. > 4} 

[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE 

würde ich mit purrr empfehlen, wenn Sie kochend diese Art von Dingen zu gehen, wie es in etwas mehr lesbaren Code führen.

library(dplyr) 
data_frame(x=1:9) %>% mutate(big_x = x>4) 

Unsolicited Meinung:

library(purrr) 

map_lgl(seq(9), ~.x > 4) 

[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE 
+1

Ich weiß, dass es ein merkwürdiges Beispiel ist, aber es ist ein wenig lachhaft, map_lgl (seq (9), ~ .x> 4) als "lesbarer" zu beschreiben als die unpiped Alternative "seq (9)> 4". – Gregor

+0

Ich sehe Ihren Punkt, aber ich meinte im Zusammenhang mit einer längeren Kette von Code. Ich finde nur die Verwendung von Klammern in der Mitte einer Kette ein wenig erschütternd. –

1

In einem etwas breiteren Kontext wird dies leicht mit mutate getan Wenn Sie meist sind mit atomaren Vektoren arbeiten, vermute ich, dass die tidyverse/Rohransatz Es wird mehr Ärger geben, als es wert ist. Wie die andere Antwort nahelegt, können Sie purrr verwenden, aber auch hier kann Base R einwandfrei funktionieren. Mehr Kontext für Ihr Problem könnte helfen.

+0

Meine Arbeit sind sehr oft tatsächlich Matrizen und soweit ich das beurteilen kann, kann ich keine dplyr-Befehle verwenden (dh mutieren usw.), ohne sie in einen Datenrahmen umzuwandeln. Ich hatte nach einem Weg gesucht, aber es scheint nicht, dass Funktionalität existiert, ohne in einen Datenrahmen zu konvertieren. – Brandon

2

magrittr stellt "Aliase" zur Verfügung, um binäre Operatoren in Pipe-fähige Funktionen umzuwandeln. Ich interessiere mich nicht für sie selbst, aber Sie können tun

library(magrittr) 
seq(9) %>% is_greater_than(4) 

die vollständige Liste finden Sie auf ?add (das ist ein Alias ​​für +). Es gibt Implementierungen für alles von + bis [[.

3

Eine weitere Option ist die > Funktion als Funktion und nicht als Operator zu nennen:

> seq(9) %>% `>`(4) 
[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE 
> seq(9) %>% '>'(4) 
[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE 

Ich denke, die einfachen Anführungszeichen am meisten Sinn machen, aber regelmäßige Zitate arbeiten in diesem Fall auch.