Есть ли способ разделить конвейер в R на две функции вывода?

#r #pipe #magrittr

Вопрос:

Мне нужно сохранить версии сводных таблиц latex и word. Есть ли оператор трубопровода, который может разделить вход на два выхода? В идеале я хотел бы что-то, что будет species_tab одновременно принимать и сохранять в latex и word.

 library(datasets) library(flextable) library(gt)  species_tab lt;- iris %gt;%   tabyl(Species)  species_tab %gt;%   gt() %gt;%   gtsave(filename = "species.tex")  species_tab %gt;%   flextable() %gt;%   save_as_docx(path = "species.docx")   

Ответ №1:

Один из вариантов-обернуть с {}

 library(datasets) library(flextable) library(gt) iris %gt;%   tabyl(Species) %gt;%   {. %gt;%  gt() %gt;%   gtsave(filename = "species.tex")  . %gt;%  flextable() %gt;%  save_as_docx(path = "species.docx") }  

Комментарии:

1. Можете ли вы позже добавить, как работают {} и точки?

2. @ibm Документация для help("%gt;%") говорит ... The reason for this is that in most use-cases this produces the most readable code. For example, iris %gt;% subset(1:nrow(.) %% 2 == 0) is equivalent to iris %gt;% subset(., 1:nrow(.) %% 2 == 0) but slightly more compact. It is possible to overrule this behavior by enclosing the rhs in braces. For example, 1:10 %gt;% {c(min(.), max(.))} is equivalent to c(min(1:10), max(1:10))

Ответ №2:

Вы можете использовать %Tgt;% оператор из magrittr , который используется, когда вы хотите вернуть lhs оператор, а не вывод rhs . Однако это грязно и не совсем подходит для оператора, поэтому подойдет решение @akrun. Но есть случаи, когда вам не нужно использовать { } , и оператор тройника предпочтительнее обычной трубы.

 library(magrittr)  species_tab %Tgt;%   { gtsave(data = gt(.), filename = "species.tex")} %gt;%   flextable() %gt;%   save_as_docx(path = "species.docx")  

Комментарии:

1. Это сработало для меня, но только после того, как я удалил flextable()%gt;% . Кажется, я не могу редактировать (предложенная очередь редактирования заполнена), а вы? Я все равно отмечу как правильный, так как этот комментарий будет опубликован