Как подавать результат цепи трубопровода (magrittr) на объект

Это довольно простой вопрос. Но я не смог найти ответ на 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 <- ()

это поможет сохранить весь код в той же логике подачи результатов вперед "вниз по трубе".

Ответы

Ответ 1

Попробуйте следующее:

data.frame( x = c(1:3), y = (4:6)) %>% sum -> a

Ответ 2

Вы можете сделать это так:

data.frame( x = c(1:3), y = (4:6)) %>%  
sum %>%  
assign(x="a",value=.,pos=1)  

Несколько замечаний:

Вы можете использовать "." чтобы сообщить magrittr, какой аргумент передается объекту. По умолчанию он является первым, но здесь я использую ., чтобы указать, что я хочу его во втором аргументе value.

Во-вторых, мне пришлось использовать аргумент pos=1, чтобы выполнить назначение в глобальной среде.

Ответ 3

Вы также можете использовать оператор <<-:

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.

Ответ 5

Что мне нравится делать (и я нашел этот трюк где-то, что не могу вспомнить), использовать {.} -> 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