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

grr*_*bla 21 r magrittr

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

我看到大多数人做的是:

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

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

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

这将有助于将所有代码保持在相同的逻辑中,将结果输送到"管道下方".

G. *_*eck 23

试试这个:

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

  • +1我从来没有想过会有` - >`的理由.现在有! (7认同)
  • 但是如果你只使用` - >`就不能继续使用链:例如`data.frame(x = c(1:3),y =(4:6))%>%sum - > a %>%exp`给出错误,你必须使用括号`(data.frame(x = c(1:3),y =(4:6))%>%sum - > a)%>%( exp)`如果一个人不小心可能会导致意想不到的结果. (7认同)
  • (1) 继续链不是一个好主意。如果你真的想通过它更好地分配一个变量,让它变成两个链。仍然可以这样写:`data.frame( x = c(1:3), y = (4:6)) %&gt;% sum -&gt; a; 一个 %&gt;% exp` 来避免这个问题。(2) 中途分配是一个副作用,功能风格是为了避免副作用。 (7认同)

Joh*_*aul 13

你可以这样做:

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

有几点需要注意:

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

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

  • @iShouldUseAName你能扩展一下吗?这有什么危险? (12认同)

Car*_*lli 5

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

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

编辑:我认为约翰·保罗(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)
Run Code Online (Sandbox Code Playgroud)

这将正确地创建abc