2015-05-08 97 views
8

有沒有辦法在每個步驟輸出流水線的結果而無需手動執行? (例如,沒有選擇和只運行選定的塊)單步執行中間結果的流水線

我經常發現自己正在逐線運行管道,以記住它正在做什麼或者當我正在開發一些分析。

例如:

library(dplyr) 

mtcars %>% 
    group_by(cyl) %>% 
    sample_frac(0.1) %>% 
    summarise(res = mean(mpg)) 
# Source: local data frame [3 x 2] 
# 
# cyl res 
# 1 4 33.9 
# 2 6 18.1 
# 3 8 18.7 

我最好選擇和運行:

mtcars %>% group_by(cyl) 

然後......

mtcars %>% group_by(cyl) %>% sample_frac(0.1) 

等等...

但是選擇和CMD/CTRL + ENTER in RStudio留下了一種更有效的方法。

這可以在代碼中完成嗎?

是否有一個函數,它接受一個管道和運行/通過顯示在控制檯中的每一步輸出線消化這行,你按繼續進入像demos(...)或包裝的examples(...)指導

+0

查看R的debug()函數。它接近你想要的。你可以用'print()'語句來使用它。這篇關於[交叉驗證](http://stats.stackexchange.com/questions/13535/running-an-r-script-line-by-line)的文章更多地介紹了它。 –

回答

1

magrittr功能鏈很容易。例如定義一個函數my_chain

foo <- function(x) x + 1 
bar <- function(x) x + 1 
baz <- function(x) x + 1 
my_chain <- . %>% foo %>% bar %>% baz 

,並得到一個鏈的最終結果:

 > my_chain(0) 
    [1] 3 

你可以得到functions(my_chain) 一個功能列表,並定義像這樣的「步進」功能:

stepper <- function(fun_chain, x, FUN = print) { 
    f_list <- functions(fun_chain) 
    for(i in seq_along(f_list)) { 
    x <- f_list[[i]](x) 
    FUN(x) 
    } 
    invisible(x) 
} 

和運行隔着print功能鏈:

stepper(my_chain, 0, print) 

# [1] 1 
# [1] 2 
# [1] 3 

或者與等待用戶輸入:

stepper(my_chain, 0, function(x) {print(x); readline()}) 
2

添加打印:

mtcars %>% 
    group_by(cyl) %>% 
    print %>% 
    sample_frac(0.1) %>% 
    print %>% 
    summarise(res = mean(mpg)) 
+0

我得到的那個打印返回它的參數,所以這個工程,但它不是真的更短/更快/更方便,而不僅僅是手選擇和運行塊。 –

+0

@andrewwong告訴我們更多,爲什麼你需要逐行運行,更重要的是你爲什麼要逐一查看打印輸出? – zx8754

+1

已更新的問題。我想要像控制檯中的交互式步進器或者所有生成中間體的自動神奇降價文檔。感謝您的想法! –

1

恕我直言magrittr是最有用交互,那就是當我瀏覽數據或建立一個新的公式/模型。

在這種情況下,存儲在不同的變量,中間結果是非常耗時和分散注意力,而管道讓我專注於數據,而不是鍵入:

x %>% foo 
## reason on results and 
x %>% foo %>% bar 
## reason on results and 
x %>% foo %>% bar %>% baz 
## etc. 

這裏的問題是,我不知道事先提供最終的管道,就像@bergant一樣。

打字,如@ zx8754,

​​

增加開銷很大,對我來說,擊敗magrittr的整個目的。

本質magrittr缺少一個簡單的操作,無論打印管道結果。
好消息是,它似乎很容易手藝之一:

`%P>%`=function(lhs, rhs){ print(lhs); lhs %>% rhs } 

現在你可以打印管:

1:4 %P>% sqrt %P>% sum 
## [1] 1 2 3 4 
## [1] 1.000000 1.414214 1.732051 2.000000 
## [1] 6.146264 

我發現,如果一個定義/使用密鑰綁定%P>%%>%,原型製作工作流程非常簡化(請參閱Emacs ESSRStudio)。

3

您可以使用tee-operator(%T>%)和print()選擇要打印的結果。三通操作員專門用於打印等副作用。

# i.e. 
mtcars %>% 
    group_by(cyl) %T>% print() %>% 
    sample_frac(0.1) %T>% print() %>% 
    summarise(res = mean(mpg))