хранить промежуточные результаты в трубе - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу сохранить промежуточные результаты в канале, но каким-то образом это не совместимо с оператором %>% pipe:

if(!require(pacman)) install.packages('pacman')
pacman::p_load(dplyr, magrittr)

# generate test data
a <- 1:5 

# this works perfectly
b <- a %>% exp %T>%
  { a.mean <<- mean(sqrt(.)) } %T>%
  { a.sd <<- sd(sqrt(.)) } %>% 
  round(2) 

b

a.mean
a.sd

all.equal(a.mean, mean(sqrt(exp(a))))
all.equal(a.sd, sd(sqrt(exp(a))))    

# this not so much
b2 <- a %>% exp %T>%
  { a.mean2 <<- . %>% sqrt %>% mean } %T>%
  { a.sd2 <<- . %>% sqrt %>% sd } %>%
  round(2)

b2

a.mean2 # 'functional sequence
a.sd2   # 'functional sequence

1 Ответ

0 голосов
/ 03 марта 2019

Трубные цепочки, начинающиеся с . %>%, будут создавать функциональные последовательности, содержание . не оценивается.

Если вы используете (.) %>%, вы получите ожидаемое поведение.

library(magrittr)
a <- 1:5 

b2 <- a %>% exp %T>%
{ a.mean2 <<- (.) %>% sqrt %>% mean } %T>%
{ a.sd2 <<- (.) %>% sqrt %>% sd } %>%
  round(2)

b2
#> [1]   2.72   7.39  20.09  54.60 148.41

a.mean2 
#> [1] 5.684048
a.sd2
#> [1] 4.232675

Создано в 2019-03-02 пакетом Представить (v0.2.1)

...