这是一个相当简单的问题。但我找不到每个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 <- ()
这有助于将所有代码保持在相同的逻辑中,将结果提前“管道”。
答案 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)
这将正确创建a
,b
和c
。
答案 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)}