2016-04-19 6 views
3

Ich bin ziemlich neu in R und ich versuche, den Operator%>% und die Verwendung der "." (Punkt) Platzhalter. Als einfaches Beispiel funktioniert der folgende CodeKombinieren von Rohren und den Punkt Platzhalter in R

library(magrittr) 
library(ensurer) 
ensure_data.frame <- ensures_that(is.data.frame(.)) 
data.frame(x = 5) %>% ensure_data.frame 

jedoch der folgende Code

ensure_data.frame <- ensures_that(. %>% is.data.frame) 
data.frame(x = 5) %>% ensure_data.frame 

nicht, wo ich jetzt den Platzhalter in die is.data.frame Methode kochend.

Ich vermute, dass es mein Verständnis der Beschränkungen/Interpretation des Punktplatzhalters ist, der nacheilt, aber kann jemand das klären?

Antwort

1

Das „Problem“ ist, dass magrittr eine Kurzschreibweise für anonyme Funktionen hat:

. %>% is.data.frame 

ist in etwa die gleichen wie

function(.) is.data.frame(.) 

Mit anderen Worten, wenn der Punkt ist die (ganz links), hat das Rohr ein besonderes Verhalten.

Sie können das Verhalten auf einige Arten, z.

(.) %>% is.data.frame 

oder irgendeine andere Art und Weise, wo der LHS zu . In diesem speziellen Beispiel nicht identisch ist, kann dies als unerwünschte behaviuour erscheinen, aber häufig in Beispielen wie diese gibt es wirklich keine Notwendigkeit, Rohr der erste Ausdruck, so is.data.frame(.) so ausdrucksstark wie . %>% is.data.frame ist und Beispiele wie

data %>% 
some_action %>% 
lapply(. %>% some_other_action %>% final_action) 

kann argumentiert werden, dass sie clearner als

data %>% 
some_action %>% 
lapply(function(.) final_action(some_other_action(.))) 
0

Das ist das Problem:

. = data.frame(x = 5) 
a = data.frame(x = 5) 

a %>% is.data.frame 
#[1] TRUE 
. %>% is.data.frame 
#Functional sequence with the following components: 
# 
# 1. is.data.frame(.) 
# 
#Use 'functions' to extract the individual functions. 

Sieht für mich wie ein Bug, aber dplyr Experten können in läuten

Eine einfache Abhilfe in Ihrem Ausdruck ist .[] %>% is.data.frame zu tun..

+0

Vielen Dank für die Klarstellung, dass es eine Inkonsistenz in dplyr und für die Problemumgehung sein könnte! –