首页 文章

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

提问于
浏览
18

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

  • 13

    试试这个:

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

    你可以这样做:

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

    有几点需要注意:

    你可以使用"."告诉 magrittr 被提出的对象属于哪个参数 . 默认情况下它是第一个,但是我在这里使用 . 表示我想要它在第二个 value 参数中 .

    其次,我必须使用 pos=1 参数在全局环境中进行赋值 .

  • 4

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

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

    Edit: 我认为约翰保罗是最安全的建议,你可以继续使用链条做不同的部分结果任务 . 例如:

    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 ,_28848611_和 c .

  • 3

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

  • 21

    我喜欢做什么(我发现这个技巧,我记不住了)是在我的管道末端使用 {.} -> 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()的答案很好,但输入有点长 . 您需要使用 . ,因为数据不是第一个参数,您必须将新参数的名称放在 "" 中,并指定环境( 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
    

相关问题