diff --git a/_posts/pipe/pipe.Rmd b/_posts/pipe/pipe.Rmd new file mode 100644 index 0000000..a6dcfc0 --- /dev/null +++ b/_posts/pipe/pipe.Rmd @@ -0,0 +1,125 @@ +--- +title: How to use the Pipe +description: | + Understand the difference between the magritr pipe and the native pipe, and when + to use each. Understand when it is better to use the pipe rather than regular + Base R syntax. +author: R.Andres Castaneda +date: '2023-05-09' +output: + distill::distill_article: + self_contained: false + toc: true + toc_depth: 3 + toc_float: true +--- + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE) + +``` + +# Packages + +## loading and attaching + +There is an important difference between loading and attaching a package. + +- Loading refers to put all the components of a package available in memory ( code, data, and any DLLs; register S3 and S4 methods). However, those components are not in the search the **search path**, which is equivalent to the **ado path** in Stata. This is way, we need to call the function of loaded package with `::`. If the packages has not been loaded, using `::` loads the package. + +- Attaching loads the package and makes it available in the search path. You do it using `library()` or `require()`. When it is attached, you don't need to use `::`, but you can. + +Read more [here](https://r-pkgs.org/dependencies-mindset-background.html#sec-dependencies-attach-vs-load), R-Packages book. + +## When to attach + +Attaching has the advantage of not using `::`, but when you use too many packages, it is difficult to know what function comes from what package. + +I attach when I am using a package that I need all the time. For example, `tidyverse` or `data.table`. However, try to always use `::` because the code is clearer and there is no penalty in speed (minimum). + +```{r, eval=FALSE} +flights |> + dplyr::filter(dest == "IAH") |> + dplyr::mutate(speed = distance / air_time * 60) |> + dplyr::select(year:day, dep_time, carrier, flight, speed) |> + dplyr::arrange(dplyr::desc(speed)) + + +flights |> + filter(dest == "IAH") |> + mutate(speed = distance / air_time * 60) |> + select(year:day, dep_time, carrier, flight, speed) |> + arrange(desc(speed)) + +``` + +If you are developing packages, you **cannot** attach packages. You always have to use `::` + +# Main idea of the pipe + +```{r} +# load libraries that we will need + +library(nycflights13) # data or use library(help = "datasets") +library(tidyverse) +library(data.table) + +``` + +We need to talk first about frames. Let's go to Stata first. + +At the most basic level, the pipe is a syntax transformation in which you separate the argument from the function + +```{r} +x = 1:10 + +# from this +mean(x) + +# to this + +x |> mean() +``` + +But it by itself is not super useful. You see the real power when you work with dataframes + +```{r, eval=FALSE} +# so you go from this +flights1 <- filter(flights, dest == "IAH") +flights2 <- mutate(flights1, speed = distance / air_time * 60) +flights3 <- select(flights2, year:day, dep_time, carrier, flight, speed) +arrange(flights3, desc(speed)) + + +# or this +arrange( + select( + mutate( + filter(flights, dest == "IAH"), + speed = distance / air_time * 60 + ), + year:day, dep_time, carrier, flight, speed + ), + desc(speed) +) + + +# to this + + +``` + +To this. + +```{r} +flights |> + filter(dest == "IAH") |> + mutate(speed = distance / air_time * 60) |> + select(year:day, dep_time, carrier, flight, speed) |> + arrange(desc(speed)) +``` + +# sources + +- This post in [stackoverflow](https://stackoverflow.com/a/72086492/11472481) +- This [blog](https://ivelasq.rbind.io/blog/understanding-the-r-pipe/) by Isabella Velásquez. It is outdated because it is based in R 4.1, but it is still useful. diff --git a/_posts/pipe/pipe.html b/_posts/pipe/pipe.html new file mode 100644 index 0000000..c09eb70 --- /dev/null +++ b/_posts/pipe/pipe.html @@ -0,0 +1,1668 @@ + + + + +
+ + + + + + + + + + + + + + + +Understand the difference between the magritr pipe and the native pipe, and when +to use each. Understand when it is better to use the pipe rather than regular +Base R syntax.
+There is an important difference between loading and attaching a package.
+Loading refers to put all the components of a package available in memory ( code, data, and any DLLs; register S3 and S4 methods). However, those components are not in the search the search path, which is equivalent to the ado path in Stata. This is way, we need to call the function of loaded package with ::
. If the packages has not been loaded, using ::
loads the package.
Attaching loads the package and makes it available in the search path. You do it using library()
or require()
. When it is attached, you don’t need to use ::
, but you can.
Read more here, R-Packages book.
+Attaching has the advantage of not using ::
, but when you use too many packages, it is difficult to know what function comes from what package.
I attach when I am using a package that I need all the time. For example, tidyverse
or data.table
. However, try to always use ::
because the code is clearer and there is no penalty in speed (minimum).
flights |>
+ dplyr::filter(dest == "IAH") |>
+ dplyr::mutate(speed = distance / air_time * 60) |>
+ dplyr::select(year:day, dep_time, carrier, flight, speed) |>
+ dplyr::arrange(dplyr::desc(speed))
+
+
+flights |>
+ filter(dest == "IAH") |>
+ mutate(speed = distance / air_time * 60) |>
+ select(year:day, dep_time, carrier, flight, speed) |>
+ arrange(desc(speed))
+If you are developing packages, you cannot attach packages. You always have to use ::
# load libraries that we will need
+
+library(nycflights13) # data or use library(help = "datasets")
+library(tidyverse)
+library(data.table)
+We need to talk first about frames. Let’s go to Stata first.
+At the most basic level, the pipe is a syntax transformation in which you separate the argument from the function
+ +But it by itself is not super useful. You see the real power when you work with dataframes
+# so you go from this
+flights1 <- filter(flights, dest == "IAH")
+flights2 <- mutate(flights1, speed = distance / air_time * 60)
+flights3 <- select(flights2, year:day, dep_time, carrier, flight, speed)
+arrange(flights3, desc(speed))
+
+
+# or this
+arrange(
+ select(
+ mutate(
+ filter(flights, dest == "IAH"),
+ speed = distance / air_time * 60
+ ),
+ year:day, dep_time, carrier, flight, speed
+ ),
+ desc(speed)
+)
+
+
+# to this
+To this.
+flights |>
+ filter(dest == "IAH") |>
+ mutate(speed = distance / air_time * 60) |>
+ select(year:day, dep_time, carrier, flight, speed) |>
+ arrange(desc(speed))
+# A tibble: 7,198 x 7
+ year month day dep_time carrier flight speed
+ <int> <int> <int> <int> <chr> <int> <dbl>
+ 1 2013 7 9 707 UA 226 522.
+ 2 2013 8 27 1850 UA 1128 521.
+ 3 2013 8 28 902 UA 1711 519.
+ 4 2013 8 28 2122 UA 1022 519.
+ 5 2013 6 11 1628 UA 1178 515.
+ 6 2013 8 27 1017 UA 333 515.
+ 7 2013 8 27 1205 UA 1421 515.
+ 8 2013 8 27 1758 UA 302 515.
+ 9 2013 9 27 521 UA 252 515.
+10 2013 8 28 625 UA 559 515.
+# i 7,188 more rows
+
`,e.githubCompareUpdatesUrl&&(t+=`View all changes to this article since it was first published.`),t+=` + If you see mistakes or want to suggest changes, please create an issue on GitHub.
+ `);const n=e.journal;return'undefined'!=typeof n&&'Distill'===n.title&&(t+=` +Diagrams and text are licensed under Creative Commons Attribution CC-BY 4.0 with the source available on GitHub, unless noted otherwise. The figures that have been reused from other sources don’t fall under this license and can be recognized by a note in their caption: “Figure from …”.
+ `),'undefined'!=typeof e.publishedDate&&(t+=` +For attribution in academic contexts, please cite this work as
+${e.concatenatedAuthors}, "${e.title}", Distill, ${e.publishedYear}.+
BibTeX citation
+${m(e)}+ `),t}var An=Math.sqrt,En=Math.atan2,Dn=Math.sin,Mn=Math.cos,On=Math.PI,Un=Math.abs,In=Math.pow,Nn=Math.LN10,jn=Math.log,Rn=Math.max,qn=Math.ceil,Fn=Math.floor,Pn=Math.round,Hn=Math.min;const zn=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],Bn=['Jan.','Feb.','March','April','May','June','July','Aug.','Sept.','Oct.','Nov.','Dec.'],Wn=(e)=>10>e?'0'+e:e,Vn=function(e){const t=zn[e.getDay()].substring(0,3),n=Wn(e.getDate()),i=Bn[e.getMonth()].substring(0,3),a=e.getFullYear().toString(),d=e.getUTCHours().toString(),r=e.getUTCMinutes().toString(),o=e.getUTCSeconds().toString();return`${t}, ${n} ${i} ${a} ${d}:${r}:${o} Z`},$n=function(e){const t=Array.from(e).reduce((e,[t,n])=>Object.assign(e,{[t]:n}),{});return t},Jn=function(e){const t=new Map;for(var n in e)e.hasOwnProperty(n)&&t.set(n,e[n]);return t};class Qn{constructor(e){this.name=e.author,this.personalURL=e.authorURL,this.affiliation=e.affiliation,this.affiliationURL=e.affiliationURL,this.affiliations=e.affiliations||[]}get firstName(){const e=this.name.split(' ');return e.slice(0,e.length-1).join(' ')}get lastName(){const e=this.name.split(' ');return e[e.length-1]}}class Gn{constructor(){this.title='unnamed article',this.description='',this.authors=[],this.bibliography=new Map,this.bibliographyParsed=!1,this.citations=[],this.citationsCollected=!1,this.journal={},this.katex={},this.publishedDate=void 0}set url(e){this._url=e}get url(){if(this._url)return this._url;return this.distillPath&&this.journal.url?this.journal.url+'/'+this.distillPath:this.journal.url?this.journal.url:void 0}get githubUrl(){return this.githubPath?'https://github.com/'+this.githubPath:void 0}set previewURL(e){this._previewURL=e}get previewURL(){return this._previewURL?this._previewURL:this.url+'/thumbnail.jpg'}get publishedDateRFC(){return Vn(this.publishedDate)}get updatedDateRFC(){return Vn(this.updatedDate)}get publishedYear(){return this.publishedDate.getFullYear()}get publishedMonth(){return Bn[this.publishedDate.getMonth()]}get publishedDay(){return this.publishedDate.getDate()}get publishedMonthPadded(){return Wn(this.publishedDate.getMonth()+1)}get publishedDayPadded(){return Wn(this.publishedDate.getDate())}get publishedISODateOnly(){return this.publishedDate.toISOString().split('T')[0]}get volume(){const e=this.publishedYear-2015;if(1>e)throw new Error('Invalid publish date detected during computing volume');return e}get issue(){return this.publishedDate.getMonth()+1}get concatenatedAuthors(){if(2
tag. We found the following text: '+t);const n=document.createElement('span');n.innerHTML=e.nodeValue,e.parentNode.insertBefore(n,e),e.parentNode.removeChild(e)}}}}).observe(this,{childList:!0})}}var Ti='undefined'==typeof window?'undefined'==typeof global?'undefined'==typeof self?{}:self:global:window,_i=f(function(e,t){(function(e){function t(){this.months=['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'],this.notKey=[',','{','}',' ','='],this.pos=0,this.input='',this.entries=[],this.currentEntry='',this.setInput=function(e){this.input=e},this.getEntries=function(){return this.entries},this.isWhitespace=function(e){return' '==e||'\r'==e||'\t'==e||'\n'==e},this.match=function(e,t){if((void 0==t||null==t)&&(t=!0),this.skipWhitespace(t),this.input.substring(this.pos,this.pos+e.length)==e)this.pos+=e.length;else throw'Token mismatch, expected '+e+', found '+this.input.substring(this.pos);this.skipWhitespace(t)},this.tryMatch=function(e,t){return(void 0==t||null==t)&&(t=!0),this.skipWhitespace(t),this.input.substring(this.pos,this.pos+e.length)==e},this.matchAt=function(){for(;this.input.length>this.pos&&'@'!=this.input[this.pos];)this.pos++;return!('@'!=this.input[this.pos])},this.skipWhitespace=function(e){for(;this.isWhitespace(this.input[this.pos]);)this.pos++;if('%'==this.input[this.pos]&&!0==e){for(;'\n'!=this.input[this.pos];)this.pos++;this.skipWhitespace(e)}},this.value_braces=function(){var e=0;this.match('{',!1);for(var t=this.pos,n=!1;;){if(!n)if('}'==this.input[this.pos]){if(0 =k&&(++x,i=k);if(d[x]instanceof n||d[T-1].greedy)continue;w=T-x,y=e.slice(i,k),v.index-=i}if(v){g&&(h=v[1].length);var S=v.index+h,v=v[0].slice(h),C=S+v.length,_=y.slice(0,S),L=y.slice(C),A=[x,w];_&&A.push(_);var E=new n(o,u?a.tokenize(v,u):v,b,v,f);A.push(E),L&&A.push(L),Array.prototype.splice.apply(d,A)}}}}}return d},hooks:{all:{},add:function(e,t){var n=a.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=a.hooks.all[e];if(n&&n.length)for(var d,r=0;d=n[r++];)d(t)}}},i=a.Token=function(e,t,n,i,a){this.type=e,this.content=t,this.alias=n,this.length=0|(i||'').length,this.greedy=!!a};if(i.stringify=function(e,t,n){if('string'==typeof e)return e;if('Array'===a.util.type(e))return e.map(function(n){return i.stringify(n,t,e)}).join('');var d={type:e.type,content:i.stringify(e.content,t,n),tag:'span',classes:['token',e.type],attributes:{},language:t,parent:n};if('comment'==d.type&&(d.attributes.spellcheck='true'),e.alias){var r='Array'===a.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(d.classes,r)}a.hooks.run('wrap',d);var l=Object.keys(d.attributes).map(function(e){return e+'="'+(d.attributes[e]||'').replace(/"/g,'"')+'"'}).join(' ');return'<'+d.tag+' class="'+d.classes.join(' ')+'"'+(l?' '+l:'')+'>'+d.content+''+d.tag+'>'},!t.document)return t.addEventListener?(t.addEventListener('message',function(e){var n=JSON.parse(e.data),i=n.language,d=n.code,r=n.immediateClose;t.postMessage(a.highlight(d,a.languages[i],i)),r&&t.close()},!1),t.Prism):t.Prism;var d=document.currentScript||[].slice.call(document.getElementsByTagName('script')).pop();return d&&(a.filename=d.src,document.addEventListener&&!d.hasAttribute('data-manual')&&('loading'===document.readyState?document.addEventListener('DOMContentLoaded',a.highlightAll):window.requestAnimationFrame?window.requestAnimationFrame(a.highlightAll):window.setTimeout(a.highlightAll,16))),t.Prism}();e.exports&&(e.exports=n),'undefined'!=typeof Ti&&(Ti.Prism=n),n.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/?[\da-z]{1,8};/i},n.hooks.add('wrap',function(e){'entity'===e.type&&(e.attributes.title=e.content.replace(/&/,'&'))}),n.languages.xml=n.languages.markup,n.languages.html=n.languages.markup,n.languages.mathml=n.languages.markup,n.languages.svg=n.languages.markup,n.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:{pattern:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},n.languages.css.atrule.inside.rest=n.util.clone(n.languages.css),n.languages.markup&&(n.languages.insertBefore('markup','tag',{style:{pattern:/(
+
+
+ ${e.map(l).map((e)=>`
`)}}const Mi=`
+d-citation-list {
+ contain: layout style;
+}
+
+d-citation-list .references {
+ grid-column: text;
+}
+
+d-citation-list .references .title {
+ font-weight: 500;
+}
+`;class Oi extends HTMLElement{static get is(){return'd-citation-list'}connectedCallback(){this.hasAttribute('distill-prerendered')||(this.style.display='none')}set citations(e){x(this,e)}}var Ui=f(function(e){var t='undefined'==typeof window?'undefined'!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{}:window,n=function(){var e=/\blang(?:uage)?-(\w+)\b/i,n=0,a=t.Prism={util:{encode:function(e){return e instanceof i?new i(e.type,a.util.encode(e.content),e.alias):'Array'===a.util.type(e)?e.map(a.util.encode):e.replace(/&/g,'&').replace(/e.length)break tokenloop;if(!(y instanceof n)){c.lastIndex=0;var v=c.exec(y),w=1;if(!v&&f&&x!=d.length-1){if(c.lastIndex=i,v=c.exec(e),!v)break;for(var S=v.index+(g?v[1].length:0),C=v.index+v[0].length,T=x,k=i,p=d.length;T
+
+`);class Ni extends ei(Ii(HTMLElement)){renderContent(){if(this.languageName=this.getAttribute('language'),!this.languageName)return void console.warn('You need to provide a language attribute to your
Footnotes
+
+`,!1);class Fi extends qi(HTMLElement){connectedCallback(){super.connectedCallback(),this.list=this.root.querySelector('ol'),this.root.style.display='none'}set footnotes(e){if(this.list.innerHTML='',e.length){this.root.style.display='';for(const t of e){const e=document.createElement('li');e.id=t.id+'-listing',e.innerHTML=t.innerHTML;const n=document.createElement('a');n.setAttribute('class','footnote-backlink'),n.textContent='[\u21A9]',n.href='#'+t.id,e.appendChild(n),this.list.appendChild(e)}}else this.root.style.display='none'}}const Pi=ti('d-hover-box',`
+
+
+