如何将管道(magrittr)的结果提供给对象

时间:2014-09-22 13:52:54

标签: r magrittr

这是一个相当简单的问题。但我找不到每个google / stackexchange的答案,并查看magrittr的文档。 如何提供通过%>%连接的函数链的结果来创建向量?

我看到大多数人所做的是:

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

但是还有一个解决方案,我可以将结果管道链接到一个对象,也许是别名或类似的东西,有点像这样:

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

这有助于将所有代码保持在相同的逻辑中,将结果提前“管道”。

5 个答案:

答案 0 :(得分:21)

试试这个:

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

答案 1 :(得分:13)

你可以这样做:

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

有几点需要注意:

您可以使用&#34;。&#34;告诉magrittr提出的对象属于哪个参数。默认情况下它是第一个,但在这里我使用.表示我希望它在第二个value参数中

其次,我必须使用pos=1参数在全局环境中进行分配。

答案 2 :(得分:4)

您还可以使用<<-运算符:

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

编辑: 我认为John Paul是最安全的建议,您可以继续使用链条执行不同的部分结果分配。例如:

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)

这将正确创建abc

答案 3 :(得分:3)

使用pipeR&#39; %>>%这应该非常简单。

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

答案 4 :(得分:3)

我喜欢做什么(我发现这个技巧我无法记住)就是在我的管道末端使用{.} -> obj。这样我只需插入一个新行就可以在链的末尾添加额外的步骤,而不必重新定位到->赋值运算符。

你也可以使用(.)而不是{.},但它看起来有点,奇数

例如,而不是:

  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()的答案很好,但输入时间有点长。您需要使用.,因为数据不是第一个参数,您必须将新参数的名称放在""&#39; s中,并指定环境({ {1}})。我似乎很懒,但使用pos = 1是关于速度

所以我把%>%包裹在一个小功能中,加快了它的速度:

assign()

所以现在你可以这样做:

keep <- function(x, name) {assign(as.character(substitute(name)), x, pos = 1)}