我喜欢做的(我在不记得的地方发现了这个技巧)是{.} -> 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