我喜欢做的(我在不记得的地方发现了这个技巧)是在我的管道链末端使用{.} -> 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
但这无助于保存中间结果。 John Paul 对使用 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