2015-07-19 61 views
8

我想結束與賦值運算符的管道在R.如何用賦值運算符結束管道?

我的目標(在僞R):

data %>% analysis functions %>% analyzedData 

在數據和analyzedData均爲data.frame。

我試過這個的幾個變種,每個給出一個唯一的錯誤信息。 一些重複我已經試過:

data %>% analysis functions %>% -> analyzedData 
data %>% analysis functions %>% .-> analyzedData 
data %>% analysis functions %>% <-. analyzedData 
data %>% analysis functions %>% <- analyzedData 

錯誤消息:

Error in function_list[[k]](value) : 
    could not find function "analyzedData" 
Error: object 'analyzedData' not found 
Error: unexpected assignment in: .. 

更新: 我想通了,要做到這一點的方法是:

data %>% do analysis %>% {.} -> analyzedData 

這種方式,來解決/調試一個長管道,你可以將這兩行放入你的管道,以儘量減少重新運行代碼並隔離問題。

data %>% pipeline functions %>% 
    {.}-> tempWayPoint 
    tmpWayPoint %>% 
more pipeline functions %>% {.} -> endPipe 
+3

'分析數據<- data %>%分析功能' – scoa

+0

您的標題有點誤導;你真正想要做的是將一個任務交錯插入管道,而不是結束它。 –

回答

6

這可能是最容易做的任務作爲第一件事情(如SCOA提到),但如果你真的想要把它放在最後,你可以使用assign

mtcars %>% 
    group_by(cyl) %>% 
    summarize(m = mean(hp)) %>% 
    assign("bar", .) 

將輸出存入「欄」

或者,您可以只使用->運算符。你提到了你的問題,但它看起來像你使用類似

mtcars %>% -> yourvariable 

,而不是

mtcars -> yourvariable 

你不希望有%>%中的->

+0

謝謝,這似乎是個竅門。你知道使用'{。} - > endPipe'vs'assign(「endPipe」,。)'的相對優點嗎?我發現assign可以讓你指定環境作爲參數。除此之外,如果我們只對分配到當前環境感興趣,那麼它比另一個更好?這只是文體上的差異嗎? –

+0

我試過這個,但分配不起作用。代碼評估,但我沒有得到一個名爲「酒吧」的新對象。 – ccoffman

+0

@ccoffman你應該得到一個叫做'bar'的新對象。它會在當前的環境中評估,所以如果你在函數內部做了這些事情,然後在函數退出後尋找「bar」,那麼ye'bar'將不再存在。這更多是一個確定範圍的問題。 – Dason

2

更新:我想出的辦法做到這一點是:data %>% do analysis %>% {.} -> analyzedData

這種方式,來解決/調試長的管道,你可以刪除這兩條線段到你管,以儘量減少代碼重新運行,並隔離問題。

data %>% pipeline functions %>% 
    {.}-> tempWayPoint 
    tmpWayPoint %>% 
more pipeline functions %>% {.} -> endPipe 

如果你有更好的方法做到這一點,請讓我知道。

+2

你不需要'%>%{。}'。你可以做'pipeline_functions - > tmpWaypoint'。 –

4

您可以將管道鏈想象成多線功能,它與其他多線功能一樣。通常的辦法來挽救輸出參數是分配給在第一行:

analyzedData <- data %>% analysis functions 

就像你會做:

plot <- ggplot(data,aes(x=x,y=x)) + 
    geom_point() 
5

它看起來像前你正試圖裝飾%>%管道操作員,創造一個新對象的副作用。人們會假設你可以使用賦值運算符->來實現這一點,但它不會在管道中工作。這是因爲->的優先級低於用戶定義的運算符,如%>%,這會破壞解析:您的管道將被解析爲(initial_stages) -> (final_stages),這是無意義的。

解決方案是用用戶定義的版本替換->。雖然我們在這,我們不妨使用lazyeval包,以確保它會創造一個它應該去的對象:

`%->%` <- function(value, x) 
{ 
    x <- lazyeval::lazy(x) 
    assign(deparse(x$expr), value, x$env) 
    value 
} 

在使用這樣的一個例子:

smry <- mtcars %>% 
    group_by(cyl) %->% # ->, not > 
    tmp %>% 
    summarise(m=mean(mpg)) 

tmp 
#Source: local data frame [32 x 11] 
#Groups: cyl 
# 
# mpg cyl disp hp drat wt qsec vs am gear carb 
#1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
#2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
#3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
#4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 
#5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 
#.. ... ... ... ... ... ... ... .. .. ... ... 

smry 
#Source: local data frame [3 x 2] 
# 
# cyl  m 
#1 4 26.66364 
#2 6 19.74286 
#3 8 15.10000