Ответ 1
Попробуйте следующее:
data.frame( x = c(1:3), y = (4:6)) %>% sum -> a
Это довольно простой вопрос. Но я не смог найти ответ на google/stackexchange и посмотрел документацию magrittr. Как вы кормите результат цепочки функций, которые связаны через% > %, чтобы создать вектор?
то, что я видел, большинство людей делают:
a <-
data.frame( x = c(1:3), y = (4:6)) %>%
sum()
но есть также решение, в котором я могу просто связать цепочку результата, чтобы передать его объекту, может быть, псевдоним или sth, похожий на это:
data.frame( x = c(1:3), y = (4:6)) %>%
sum() %>%
a <- ()
это поможет сохранить весь код в той же логике подачи результатов вперед "вниз по трубе".
Попробуйте следующее:
data.frame( x = c(1:3), y = (4:6)) %>% sum -> a
Вы можете сделать это так:
data.frame( x = c(1:3), y = (4:6)) %>%
sum %>%
assign(x="a",value=.,pos=1)
Несколько замечаний:
Вы можете использовать "." чтобы сообщить magrittr
, какой аргумент передается объекту. По умолчанию он является первым, но здесь я использую .
, чтобы указать, что я хочу его во втором аргументе value
.
Во-вторых, мне пришлось использовать аргумент pos=1
, чтобы выполнить назначение в глобальной среде.
Вы также можете использовать оператор <<-
:
data.frame( x = c(1:3), y = (4:6)) %>%
sum() %>%
`<<-`(a,.)
Изменить: Я думаю, что Джон Пол - это самое безопасное предложение, и вы можете продолжать работу с целями, выполняющими разные задания частичных результатов. Например:
data.frame( x = c(1:3), y = (4:6)) %>%
sum %>%
assign(x="a",value=., pos=1) %>%
exp %>%
assign(x="b",value=., pos=1) %>%
sqrt %>%
assign(x="c", value=., pos=1)
Это правильно создаст a
, b
и c
.
Используя pipeR %>>%
, это должно быть очень просто.
library(pipeR)
data.frame( x = c(1:3), y = (4:6)) %>>%
sum %>>%
(~ a)
Учебник pipeR может оказаться полезным: http://renkun.me/pipeR-tutorial/ Для назначения: http://renkun.me/pipeR-tutorial/Pipe-operator/Pipe-with-assignment.html
Что мне нравится делать (и я нашел этот трюк где-то, что не могу вспомнить), использовать {.} -> obj
в конце моей телефонной линии. Таким образом, я могу добавить дополнительные шаги в конец цепочки, просто вставив новую строку и не переставляя ее в оператор назначения ->
.
Вы также можете использовать (.)
isntead {.}
, но он выглядит немного, нечетно.
Например, вместо этого:
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) -> summary
Сделайте это:
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) %>%
{.} -> summary
Это упрощает просмотр, где заканчиваются ваши данные. Кроме того, в то время как это не похоже на большую сделку, проще добавить еще один последний шаг, так как вам не нужно перемещать ->
вниз в новую строку, просто добавьте новую строку перед {.}
и добавьте Шаг.
Так же:
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) %>%
arrange(desc(mean.petal)) %>% # just add a step here
{.} -> summary
Это не помогает сэкономить промежуточные результаты. Джон Пол отвечает, чтобы использовать функцию assign(), хорошо, но ее немного длиннее набрать. Вам нужно использовать .
, поскольку данные не являются первым аргументом, вы должны поместить имя нового аргумента в ""
и указать среду (pos = 1
). Кажется ленивым с моей стороны, но использование %>%
- это скорость.
Итак, я обернул assign()
в маленькую функцию, которая немного ускоряет ее:
keep <- function(x, name) {assign(as.character(substitute(name)), x, pos = 1)}
Итак, теперь вы можете сделать это:
keep <- function(x, name) {assign(as.character(substitute(name)), x, pos = 1)}
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) %>% keep(unsorted.data) %>% # keep this step
arrange(mean.petal) %>%
{.} -> sorted.data
sorted.data
# Species mean.petal mean.sepal
#1 setosa 1.462 5.006
#2 versicolor 4.260 5.936
#3 virginica 5.552 6.588
unsorted.data
# Species mean.petal mean.sepal
#1 setosa 1.462 5.006
#2 versicolor 4.260 5.936
#3 virginica 5.552 6.588