R трубы (%>%) возможности - хранение и частичное использование?

Мне нравится идея, что труба улучшает читаемость, но у меня возникли трудности с ее использованием из-за ее негибкости. До сих пор мне это удавалось только тогда, когда моя цель - напрямую передать X через набор функций h(g(f(x,foo),bar),stuff)

x %>%
f(foo) %>%
g(bar) %>%
h(stuff)

Если я хочу сохранить промежуточный вывод, чтобы у меня был h(x,stuff,f(x,foo)), возможно ли это? я пробовал

x %>% 
intermediate = f(foo) %>% 
g(bar)

но это не удается. Назначение не работает, потому что первый аргумент - это имя, а не значение; есть ли противоположный эквивалент?

Я знаю, что вы можете использовать "." ссылаться на x или его части несколько раз, но есть ли способ использовать только его часть изначально? Я хочу выполнять разные функции на разных столбцах, таких как

data.frame(x[,1],apply(.[,2:3],2,fun1),apply(.[,4],2,fun2))

но я не могу понять, как ограничить первый аргумент только x[,1] вместо всего x, Я не могу использовать %>% select(1) %>% потому что тогда это отбросит все остальное навсегда. Есть ли способ сделать это, или я должен просто завершить конвейер, выполнить эти функции и запустить другой конвейер? Это самое простое решение, чтобы просто положить все x в кадр данных, а затем %>% select(1,5:9) %>%?

1 ответ

Решение

Вы можете написать функцию для выполнения назначения, которое вы можете включить в цепочку. Что-то вроде

save_to <- function(x, v) {
    var <- substitute(v)
    eval(bquote(.(var) <- .(x)), envir=globalenv())
    x
}


library(magrittr)
x<-1:10
f<-function(x) x+1
g<-function(x) x*2
h<-function(x) paste(x, collapse=", ")    

x %>% f %>% g %>% save_to(z) %>% h
# [1] "4, 6, 8, 10, 12, 14, 16, 18, 20, 22"
z
#  [1]  4  6  8 10 12 14 16 18 20 22

Обратите внимание, что это сохраняет значение в глобальной среде. По этой причине это, вероятно, не очень хорошая идея (функции с побочными эффектами, как правило, являются плохой практикой проектирования на функциональных языках). Было бы лучше разбить его на разные цепочки.

z <- x %>% f %>% g
z %>% h
Другие вопросы по тегам