2015-05-08 3 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 в RStudio оставляет более эффективный метод, который необходимо пожелать.

Это можно сделать в коде?

Есть функция, которая принимает трубопровод и бежит/переваривает построчно показывает выход на каждом шаге в консоли и вы продолжите, нажав ввести как в demos(...) или examples(...) пакета направляющих

+0

Проверьте функцию 'debug()' R '. Это близко к тому, что вы хотите. Вы можете использовать его с инструкциями 'print()'. Этот пост в [Cross Validated] (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.

Typing, как в @ zx8754,

x %>% print %>% foo %>% print %>% bar %>% print %>% baz 

добавляет много накладных расходов, а мне, побеждает вся цель 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 ESS или RStudio).

3

Вы можете выбрать, какие результаты будут распечатаны с помощью tee-оператора (%T>%) и print(). Ти-оператор используется исключительно для побочных эффектов, таких как печать.

# i.e. 
mtcars %>% 
    group_by(cyl) %T>% print() %>% 
    sample_frac(0.1) %T>% print() %>% 
    summarise(res = mean(mpg)) 
Смежные вопросы