{"id":980,"date":"2018-09-11T11:04:52","date_gmt":"2018-09-11T09:04:52","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=980"},"modified":"2018-09-11T11:04:52","modified_gmt":"2018-09-11T09:04:52","slug":"utiliser-des-pipes-pour-enchainer-des-instructions","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/utiliser-des-pipes-pour-enchainer-des-instructions\/","title":{"rendered":"Utiliser des pipes pour encha\u00eener des instructions"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Piping\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<p>Quand je fais mon cours d&rsquo;initiation R aux petits Padawans de l&rsquo;ann\u00e9e, j&rsquo;ai toujours un peu de difficult\u00e9s \u00e0 leur montrer l&rsquo;int\u00e9r\u00eat du <strong>pipe<\/strong> (<code>%&gt;%<\/code>) au moment o\u00f9 je leur montre les fonctions de <code>dplyr<\/code>. C&rsquo;est toujours un moment o\u00f9 je m&rsquo;anime, o\u00f9 je fais des grands gestes pour montrer comment on pousse le r\u00e9sultat d&rsquo;une commande \u00e0 travers un \u00ab\u00a0tuyau\u00a0\u00bb pour qu&rsquo;elle atterrise dans une deuxi\u00e8me commande, o\u00f9 je gesticule dans l&rsquo;espoir de convaincre mon auditoire somme toute dubitatif de la commodit\u00e9 de la chose.<\/p>\n<p>Je me disais donc (comme souvent) que la chose qu&rsquo;il me manquait vraiment pour expliquer l&rsquo;int\u00e9r\u00eat des pipes, c&rsquo;\u00e9tait un petit dessin&#8230; J&rsquo;ai saut\u00e9 le pas et voici donc le r\u00e9sultat:<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Piping\/piping_complete.jpg\" alt=\"\" \/><\/p>\n<p>L&rsquo;id\u00e9e, c&rsquo;est d&rsquo;expliquer les diff\u00e9rentes mani\u00e8res d&rsquo;encha\u00eener des commandes en prenant pour exemple la confection d&rsquo;une <strong>omelette \u00e0 la ciboulette<\/strong>. En effet, pour faire cette omelette, il faut s&rsquo;acquitter de trois t\u00e2ches successives:<\/p>\n<ul>\n<li><strong>casser les oeufs<\/strong> et y ajouter sel et poivre<\/li>\n<li><strong>battre ensemble les blancs et les jaunes<\/strong><\/li>\n<li><strong>cuire le tout \u00e0 la po\u00eale<\/strong> et parsemer de ciboulette cisel\u00e9e<\/li>\n<\/ul>\n<p>Quand on d\u00e9bute en R, la fa\u00e7on classique dont on pourrait (m\u00e9taphoriquement) confectionner une omelette \u00e0 la ciboulette, ce serait d&rsquo;encha\u00eener ces trois \u00e9tapes <em>en r\u00e9servant \u00e0 chaque fois le r\u00e9sultat dans un r\u00e9cipient<\/em> (= en attribuant le r\u00e9sultat \u00e0 un objet).<\/p>\n<p>En R, \u00e7a donne \u00e7a:<\/p>\n<pre><code>white_and_yolk &lt;- crack(egg, add_seasoning)\nomelette_batter &lt;- beat(white_and_yolk)\nomelette_with_chives &lt;- cook(omelette_batter,add_chives)\n<\/code><\/pre>\n<p>En cuisine, \u00e7a donne \u00e7a:<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Piping\/piping_successive.jpg\" width=\"50%\" \/><\/p>\n<p>Pas de souci, on a bien fait le job! Par contre, on a <strong>sali de la vaisselle<\/strong>\/on a d\u00fb cr\u00e9er des <strong>objets interm\u00e9diaires<\/strong>.<\/p>\n<p>De fait, si on veut \u00e9viter de salir de la vaisselle, on peut \u00ab\u00a0cuire l&rsquo;oeuf battu issu du blanc et du jaune issu de l&rsquo;oeuf cass\u00e9\u00a0\u00bb. C&rsquo;est-\u00e0-dire faire l&rsquo;omelette en une seule ligne de commande.<\/p>\n<p>En R, \u00e7a donne \u00e7a:<\/p>\n<pre><code>omelette_with_chives &lt;- cook(beat(crack(egg, add_seasoning)),add_chives)\n<\/code><\/pre>\n<p>En cuisine, \u00e7a donne \u00e7a:<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Piping\/piping_all_in_one.jpg\" width=\"65%\" \/><\/p>\n<p>Cette fois-ci, le souci, ce n&rsquo;est pas la vaisselle salie, mais la confusion!&#8230; La r\u00e9daction et la relecture des instructions est en effet malcommode du fait que l&rsquo;on <strong>lit les instructions dans l&rsquo;ordre inverse de leur r\u00e9alisation<\/strong><\/p>\n<p>Le fait d&rsquo;utiliser des \u00ab\u00a0pipes\u00a0\u00bb (tuyaux, en anglais) va nous permettre d&rsquo;\u00e9viter ces deux \u00e9cueils en <strong>\u00e9vitant la cr\u00e9ation d&rsquo;objets interm\u00e9diaires<\/strong> tout en permettant des respecter <strong>l&rsquo;ordre naturel des instructions<\/strong>&#8230;<\/p>\n<p>En R:<\/p>\n<pre><code>egg %&gt;% \n  crack(add_seasoning) %&gt;% \n  beat() %&gt;% \n  cook(add_chives) -&gt; omelette_with_chives\n<\/code><\/pre>\n<p>En cuisine:<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Piping\/piping_piped.jpg\" width=\"40%\" \/><\/p>\n<p>On fait passer le r\u00e9sultat de chaque op\u00e9ration \u00e0 l&rsquo;op\u00e9ration suivante via un tuyau&#8230; Trop fastoche, l&rsquo;omelette \u00e0 la ciboulette.<\/p>\n<p>Et bon app\u00e9tit bien s\u00fbr!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quand je fais mon cours d&rsquo;initiation R aux petits Padawans de l&rsquo;ann\u00e9e, j&rsquo;ai toujours un peu de difficult\u00e9s \u00e0 leur montrer l&rsquo;int\u00e9r\u00eat du pipe (%&gt;%) au moment o\u00f9 je leur montre les fonctions de dplyr. C&rsquo;est toujours un moment o\u00f9 je m&rsquo;anime, o\u00f9 je fais des grands gestes pour montrer comment on pousse le r\u00e9sultat d&rsquo;une commande \u00e0 travers un \u00ab\u00a0tuyau\u00a0\u00bb pour qu&rsquo;elle atterrise dans une deuxi\u00e8me commande, o\u00f9 je.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/utiliser-des-pipes-pour-enchainer-des-instructions\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-980","post","type-post","status-publish","format-standard","hentry","category-tous-les-posts"],"_links":{"self":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/980","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/comments?post=980"}],"version-history":[{"count":10,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/980\/revisions"}],"predecessor-version":[{"id":990,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/980\/revisions\/990"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=980"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}