23

这是一个相当简单的问题。但我找不到每个 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 <- ()

这将有助于将所有代码保持在相同的逻辑中,将结果“向下传递”。

4

5 回答 5

27

尝试这个:

data.frame( x = c(1:3), y = (4:6)) %>% sum -> a
于 2014-09-22T14:16:22.237 回答
13

你可以这样做:

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

有几点需要注意:

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

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

于 2014-09-22T14:10:05.250 回答
5

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

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)

这将正确创建a和。bc

于 2014-09-22T14:13:44.747 回答
4

使用 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

于 2014-09-26T12:08:00.897 回答
3

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

您也可以使用(.)istead of{.}但它看起来有点奇怪

例如,而不是这个:

  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

它可以更轻松地查看管道数据的最终位置。此外,虽然这看起来没什么大不了的,但添加另一个最后一步会更容易,因为您不需要->向下移动到新行,只需在 the 之前添加新行{.}并添加步骤即可。

像这样:

iris %>% 
    ddply(.(Species), summarise, 
          mean.petal = mean(Petal.Length),
          mean.sepal = mean(Sepal.Length)) %>% 
    arrange(desc(mean.petal)) %>%   # just add a step here
    {.} -> summary

不过,这无助于保存中间结果。John Paul 对使用 assign() 的回答很好,但打字有点长。您需要使用 ,.因为数据不是第一个参数,您必须将新参数的名称放在""'s 中,并指定环境 ( 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
于 2016-02-25T03:50:51.967 回答