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