Những gì tôi muốn làm (và tôi thấy thủ thuật này ở đâu đó tôi không thể nhớ) là sử dụng {.} -> obj
ở phần cuối của chuỗi ống của tôi. Bằng cách này, tôi có thể thêm các bước bổ sung vào cuối chuỗi bằng cách chỉ chèn một dòng mới và không phải đặt lại vị trí cho toán tử gán ->
.
Bạn cũng có thể sử dụng (.)
isntead của {.}
nhưng có vẻ hơi, lẻ.
Ví dụ, thay vì điều này:
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) -> summary
Làm điều này:
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) %>%
{.} -> summary
Nó làm cho nó dễ dàng hơn để xem nơi dữ liệu đường ống của bạn kết thúc. Ngoài ra, trong khi nó không có vẻ như một việc lớn, nó dễ dàng hơn để thêm một bước cuối cùng khi bạn không cần phải di chuyển ->
xuống một dòng mới, chỉ cần thêm một dòng mới trước khi {.}
và thêm bước.
Giống như vậy:
iris %>%
ddply(.(Species), summarise,
mean.petal = mean(Petal.Length),
mean.sepal = mean(Sepal.Length)) %>%
arrange(desc(mean.petal)) %>% # just add a step here
{.} -> summary
này không giúp với tiết kiệm kết quả trung gian mặc dù. Câu trả lời của John Paul để sử dụng assign() là tốt, nhưng hơi dài để gõ. Bạn cần sử dụng .
vì dữ liệu không phải là đối số đầu tiên, bạn phải đặt tên của đối số mới trong ""
và chỉ định môi trường (pos = 1
). Có vẻ như lười biếng đối với tôi, nhưng việc sử dụng %>%
là khoảng tốc độ.
Vì vậy, tôi quấn assign()
trong một chức năng nhỏ mà tốc độ nó lên một chút:
keep <- function(x, name) {assign(as.character(substitute(name)), x, pos = 1)}
Vì vậy, bây giờ bạn có thể làm điều này:
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
+1 Tôi không bao giờ nghĩ rằng sẽ có một sự biện minh cho '->'. Bây giờ có! –
Nhưng nếu bạn chỉ sử dụng '->' bạn không thể tiếp tục với chuỗi: ví dụ 'data.frame (x = c (1: 3), y = (4: 6))%>% sum -> a%>% exp' đưa ra một lỗi, bạn sẽ phải sử dụng dấu ngoặc đơn '(data.frame (x = c (1: 3), y = (4: 6))%>% sum -> a)%>% (exp) 'và nếu một trong những không cẩn thận có thể dẫn đến kết quả bất ngờ. –
G. Grothendieck, tôi đã thử đoạn mã trên ('data.frame (x = c (1: 3), y = (4: 6))%>% (tổng -> a)%>% exp') , nhưng nó không chỉ định một cách chính xác kết quả một phần cho 'a'. –