From fb290763b93e66a4d02fa2fffb96422c6b0aa0b2 Mon Sep 17 00:00:00 2001 From: Quarto GHA Workflow Runner Date: Wed, 6 Dec 2023 09:08:14 +0000 Subject: [PATCH] Built site for gh-pages --- .nojekyll | 2 +- ...roducible-analytical-pipelines-with-R.epub | Bin 9294040 -> 9294040 bytes ...producible-analytical-pipelines-with-R.pdf | Bin 10555552 -> 10555533 bytes book_conclusion.html | 2 +- ci_cd.html | 2 +- fprog.html | 10 +++++----- git.html | 2 +- github.html | 2 +- index.html | 2 +- intro.html | 2 +- lit_prog.html | 2 +- packages.html | 2 +- part1_conclusion.html | 2 +- part1_intro.html | 2 +- part2_conclusion.html | 2 +- part2_intro.html | 2 +- preface.html | 2 +- prerequisites.html | 2 +- project_rewrite.html | 2 +- project_start.html | 2 +- references.html | 2 +- repro_cont.html | 2 +- repro_intro.html | 2 +- search.json | 4 ++-- targets.html | 2 +- testing.html | 2 +- 26 files changed, 29 insertions(+), 29 deletions(-) diff --git a/.nojekyll b/.nojekyll index d0663da..35b9976 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -0fa01853 \ No newline at end of file +08d1bcef \ No newline at end of file diff --git a/Building-reproducible-analytical-pipelines-with-R.epub b/Building-reproducible-analytical-pipelines-with-R.epub index f1fc15f53ffc77d8f96208963ad8903da2100829..8100eeb1ad36f951277e21f9e30e0e45c2b74ea7 100644 GIT binary patch delta 30927 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 Pv4<(SMV`!r&fUf&>e0!QJ)CL%v(L?ydLF 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 Wi|=F5`4}LMJZzGE3?fG&Wd0v?D25jR diff --git a/Building-reproducible-analytical-pipelines-with-R.pdf b/Building-reproducible-analytical-pipelines-with-R.pdf index c220937b0f677f23681e026b80c3fc3fd107bb79..3855c45ee6f6f3573489ba1325ce980a6904334d 100644 GIT binary patch delta 26100 zcmagkb8sZ_`!D*}23?u=P0?B~nKnfrwkP1i*qyf?b>45Y= z1|TDl3CIj&0kQ(wfb2jHASaLu$PMHH@&fsQ{6GPqAn+GZ2q+8`0g3{}fZ{+2pd?TV zC=HYW$^zwp@<0WkB2Wpa3{(NC0@Z-(Kn^I1`}vtETBm=19E`# z)mVQEn^+>j%c~zOp_JY3Qa%|Kj1Fly$!6!Z(-Ys35m1m{l=TTKWR}v?2Yhj8;2re3 zJ%7q&SyB6F-VDG)7=%|ZV{YF5c)Kvi3nG-ru}5?a;>5L29Gt%8;%Od3&SvGqO)c<} z&DlbrEx%@($cYhm=CR*o@zSt>s^5kvzL2P2B^95hTdFT07Jq@=~X8DII z1%N^z2+&dbQy0XfW>AUqYL5I^a*R3n7Lpi zHO)q88oq@$-LZHs=PZ3QxQphec+ax>CiHI- zVkkW!=pkw71d*z;ux|>6cZToq`H1z*#97!$Swphs#7>bD5hYwK-`pQgu5O7Gd(yMFC+JZ4haE`%?9=iSX=Oe)pxU*#J2~9?JgxIWjCaeG!SOa zX4$Vbrvo_2M4gfHXy93zPfhHmOFj&}WndFa&%mK+{MW_K4vKq~xtc>*(iwU~~ zV{{e_SM=<$k|a%w73T9j| zCRdL+Y}{wppzPabX{(YNmJYL{uVi+OG>gAu{fOZ@OE81Jk!9!;$6EbES2+AUapUcZ zt>0!WNE`2L@1~kfd>6K;t;r@2F*_4dm4$gcU!6BUtxPVxbQF2n=$CGXMD#*s(dS{) z>I!&zun_@%TRHna7QOoSbmvVqFB*;`3aBpevo&Z{E zS$L=_KyblXzGT0dyHh%T&@|=fNG$msu7qxm7Eme{5cj<9t(QAXKkEm|Yk3`dz`H04 znid^ab90=z7L%}~8CKi#CkBh&!}l;uf=pJ>tXF7z6b5QkEa9L#8S^d)@b02V*(Pi#PK>!STI3Vg2}N_97F2~y!C?PD zY<5e9UOy=UPOvI+ks+Y9&P(e#BzMVhHQih036@YXbr$YwLyf%my8mtP?%ln{c)|T@DVfZF?0t%=#Kn+dBGiXZ1 zGt6@Y{SNcR0hBedb@x)iu)*#%o^J%=ow>Dx3N2?uKK-TQGvg1omofy9$xv;$Q10V* zWTIaFma|+9m7b}NN$~@KO^}}Y7+r#VC2gEqT4kYFS>8NlS+FBIcFKwhMIMiXe=TL{ zUh&_$GZbEp&ZZ2nJ9j<)8(;--^zpC|5~+OOkQUs~Q{ zqf%Zjt{XMB0{R;_baV#Y{sU+hI*6&pFNm4CJ+6*EzaD~n=6XN-y>QtAT)n9P1)g(A zW257Og8XCDIbeARB2Wlfe7`j`@0Ft2RPPw2-^<0{>IZB$0k>#@jmtri$2+6ern8l~ zyT4zL`)Q7-ayY@I#iST$g=7LzecUlKe^*I#Hrmg$S6;-q{?xd52!qY8>P2Y93Ov`O zlu%+ws|t=*H(rP1gs@-x)+ZO8Q4`rA7VsUAbur95h;u&1a zP@tq_bpG93TQ`2hTrW_g&1j0kTq@+}BlIJXkbXJVPzeS{t!$9YA5W+dU;^v>9KvF9 zQDuGe&Q}=2jY++M${x&q(%+^GneAiw3^R|YM-XFtAhF^911(kWsr#(Zgyv=~SL2lB zNnMKyV_bl;)VWg07B3h_BC!-Fy-PGhy}Tl8n3GWp=gfko)w*gM_MZ|+^V`9NAqdU4 z?$M?0sv{2%gVw-}g1N^KK%63&&qaF0C{12WiA^EhN(q}D<>V(Oyh+nRpdFFwC=y;F zw?pv$Vm%!?kGiJ5z%EUz*x=b_4To}W&DUi)2q}ytP%qIcj%;!ydf1{S<}Y8toU4K- z7Bk_6ursG;ieg>PrG9#kTxcm+u54hJh|nk#CvkW(?u*zmNF|ZR%8P2%w>r~9W$b>- zcv6hB>*(??OacZoHG}C+51r-2zrzXAsgi-W-#zAsy&#>&29SFZG#+P&19(rL{(03L z)vZe}W#)qXtj%IGv$EYfZN{)z)L$4ez;kB4XS3oU9HA3`)r@CHvPo{2*M7PU`6H?^ z;kxAZVxymdPv}^mh)YZl8Vv@vK)UqXLz`k7_wsp(hRI_?OOTsY0yF~q-Xj7&C#4pN zTWNo=;~(r9IGk6~0zGp08~|SH;AH*igjr>Fe7xXjk#>r~w9B96nK-9i@6wqxKPVNt zvZ$kU(UX(J%B<46mZW5G+pRT6l?+(*EJHOm-3Cw2@O`1(iB;Sm?r2bOg4ruBPH%w+ zLg!2-lfH#_V)p#R@v{DJ#yJoW7g3a&_uV{OGW%;;mf9}AyD|TcJpz>V{^8=&U1Gu- zXbg#GTCph|?ymk@%34+M9VJ=4WE^mGf&ejRJbJYb-RQX;aDlzi7dbKG0L*tSkn!qv zU{kPKpr|H#4PFrr;jD&v(0#y;afC13r0jK*uw#o;;JpvGjE_dD&F9u`@6fF}x@vn` zN%JJ?{ypYjPZive=>gW6Tz>Kqy#x;S>Bc6uj3AGqd$ev$RKE3ipF_UJ-V0~Ee~|L` z{+!;NMtL(zZ!8jxXMK$4W8Wh<-yR8w?_5Q zPBAuV)YN6n$zVBR5*u4ds7|W0uI08P`!h>%%B1KxsLHZ{H>4I$A39TGNqN_BsoY#N ztWmL2wiRRd9?K}P*z1iiXlKtbAZ0$LyaSw_BS7bVsco^#m97fEiR`8zYMdqjUp}$x zAHbH-NY^(^2F#KWcDoi2;MZ?Ct$vo&RZT8KnPl zLiBo{fa4}3SDN?#p&8vU%PQntpA%FauD^qZj>lKI zu=5ihnfUdKP@9Kw3W72SK#v~UkW~#ila%e-8Ssb8il=`X`d}HJGOw_!LBnmT$ari4oJ|2#NJ+hJH~ZL72h9t-^QhRYRT%l;N6I*o7#oG|PjTb=xJ z&%{MbkDwE`zE}MxZ_sxh*{%i+5;R=S%EYA&M^d{t;Z2jBy;cLA;6SQ1n03;m z+q`4R^|c>MyNHr5iHCvi)(b?Hs}}Huw$Y<54sa~Q_d&);9LEjDFZI*+D)_tz#_C+6 zvnRb_a@W5cyUh>*+R!;ea0#7yAM<6IUCi2MgALxt6-M9aLIO<7bQ+<3aw4t7*38b8 z>3e>GU8a+dV?b~(YoJVt2T-&X(Ip1>HpS42k}GT~U(AM#j~uCJ0k zJn_7fBuPiX_AmL0`7zI?mt5BeJwHcb;vnU6Kc10@P>GO9$kHwJ_vHch6Ulo~od~TV!gm($k8;tTsJbEyKm zU)U>94cfOg^>^;hhVE%k?C_}6Se=Wp?dj1i>#;P_fCK6-DHw7wEv-ElHdA&Di8N)n zf9CY3l(qc@e`5re#1C5$sbiU%k{0)C>z6UCM@pepj@I=#>L)Ptw9iP{#yCDuh*vY? z8MPSdemC7&&aKhz(d%5N(_mhQpPwRqFA1`kz19>gumYTnz=})nTK5nVm8*-O|TXsG1kDmO9 zWa+TA}6+_Rx-M>s{{r8*ovQSH_uIYKA^Cw zifKMZ-i;p*n_lfkVFUa7FY%^oQv05a3nx|V0HiLT%yL}{YQcO1<{O`$^qDNvGZ)T{ zw^v+>Mq-i~h;OJ7=<4*0`L&)9^>&fX7;W`Y$WJ=NDuT+FjsZFbiS>wi+xS?uwl|vBo45Uie;3@Rb2qdIqm0Nagz8QW zfJ14mT30h^6fDQ4*kksgTV{RqF-T@V^~0X~R7Yya^p~@WIc)EC=u{6gghItdbXf#n zP_eTTa%bAyDmT)cF!v#S{1U#1ou$QEd3&(7K$MhVIS(_1a9RC{KiJK66<(9t1Jjv`OWitXJrILp+Y|yyq}HX_ zUjn`aehK;l{1W^nS?|CN|O$H^0uVVvOf`V!zkE1(R5EdKIuI3PZ_c-6wJQx7kqp6_W*R!W~gwqwOehT zj2;%r9mwH7wm;uZizP-jovsfZB%{8jsyAI$j;G0a7E));s$hc2`6UhCZg+ z(<2Y(87j^;+Ain`Ok6nXhK=K6Mit9ec(Pk-Bm9=z2Zwz*d@;;Bu>~TfY)?M3AtxI_ ze)mmhLyL78+xN?3=731iGEssNm+XDT9@cmTH2d6d6?x>ZFkw*oqCjKl3RL*WaQkJ8 zJowjKlHIf*rdyJ+2-<&66x?W@+KAi7Vj5?&)QfRD)S=&~A>;Yb6|&>9kh7#UwG2dR zF|@*@HOuMm>ot9l7gA`n$~z>pBPbP+=kJ@479ghav)#eBj{#zy7^+iB>qa6ZYB)C6s7iBjC%}F1DyAkN5D`TPpfm{80H;VaHh57PHG*{ozIs z)TFS*jusV9c8veEDrZ=6rOJ=}Uw659q9b6FU)xfKd$_%=Vv8w3c~OLb3+NL)dvdz@ z{hTa<1p`{X6~Jpl0uS|S)MI8WDN%gzLR@I&tm5~*G4y>QHCaZbkYj7>NodL zJ(L<{pG!e}lDFy4j_SSi>wDK2fFLd0V9tzwK=h3E-JAlaXh{ZBYUAup|1yOIdQzf@=T7^#xDqLPxL$Eq+K)8s7XX$ zF*Ue|8KOQ09WA9+L-`u`@aHmUrCevV#=u(L3yuDUXi2Q4U_`mL4lSR4nY4qbAjLhP zpjgy-1Y9}%&f1EQL`||dN`!2zX^8g>dQcWWk0m-j=I9X0COiw}wm{Ru`#rsZ zx%7+Bb=QiJqDZSD3LN|awDTxA2mkBj8jK?{7uoqvar@pp3PbOk#>)K(m>3?bUn=K3 zzs8XR+#i~sR!x5_U3deyH(v%N2tOQcDW!1EW5(6cJ~)e7Gh`zVTYX9t{Fgek1iF$o z0eoHA3T_#HW2-(KU&~(sLyt`~HPaK9;r_2DzDW_Br{|0NCkh$vfS7|@DKxoIyP?sB z&j^B)w%gE84uRL@OJ9I3;&h)+4ZK2QQ|0R&<)(hVXRRi1k^G;{1TWzDWbo0==PJ>Q z?+s(R9mhX1+`;3sg3@WMGuH36?PBQ3l)Zn*DTVGkdO*1)K2-xCU?%Aw8jEOzEm2b- zUVVspfO7@Ekhac^Jb2zf#FTMLTs@lNa3@^p5@cGcq>`{H!gf!@m7%%fgg`qko|z{n zS1k!1b_axn`19UBA!o7#>-|J)szmFP1gU#evUw6!i#anYAx+e6;`{|{f^sNCZ1k}! zLowxwGiCZeh+5EqX-L}McpJ*-suUyiert(K$QP`Oq??ilsAik7~)lP^Gl%YGQg{* z*quZb*X&nAJcjC_XVYCz_>o8@oU^Dqr34ALa8V*@e5){EKdY6bS4o~Qv(p1P29NdV zj(AiMTsvRwnOtFIg*}rBnQ}HRFru+N|%`DTNtXhRtM2e4C`b#yhf3?*V zUJX5&zRxG|hr>QxIz{SCWjkf zv&!_9)puIgWoBtxKMthtR%_K$ZnSQ%;CMR2aN)LSha{i=H5(u}bIGlES62eUVT;C% zl+~$d;|GG*!khdhkG$xQH3Q?_feFIaICSNDJ=TO7fJf)U-`Zm6JcjGOP<%NhVpz1}}IZt`?1n9O1H#GByV3iqKyla7Vhys7$v zZ?Mc$v*CRLkTK{#v@pc*b#cGgDor|Xh86R%*GF|@+akM)?r8h6kQ3T^U4sCbLw~bc zhZZ@0u4OJz|2fVZUcKJ=tTJTfb?vK@eb}l=p-ov!M9oYo1mi-M@sB?UuNd&70;%ZN zKSQa1x$3!?<#W04>Vc{O+~9$c&VK%24Nk|N zo82Swaw!94=gNUzt@@X^_tWiZfP$vkn^FkuxW0@Hd+G*hWF zD+;h#G*huND+Z)^QTWgwfknpdU%Mbhdh?)E#7|DAi`t}eYbR^-%5o+CCnv3SU;hyQ|CNQ;SuI-PGbSvFW_0<~MM}fE2d;!h zu~gX0ltUNKVN-#sB)2moU=lu%)lkbrQtkbdm^vYEH5;&l~t2oOWAm0P>H zy7j?iCDotMxExa9qsy?%h#m@}!`0VcB~*C#ac5nxuex5nZ!>tOcz87jt+$V54f(I1?HFbn2qfCJH~UfqE!lRKV|q>aRIR>Twtn8c z1xLKX?zhn9YW*Qfr(^*ur9gRx(I%rIPQ2YiqX|nB`N+FRK5Jp3e{P(sXkajsMGG_vNv6F1`0yWeicPct(+up z4bQI+&Yr$reuS^yVTnc7m0hg|$GeJy()9FnK$bg3Czu!Af|{OYvTdSe00sdBS#O7 zwm^$!@+c+Z*whE+B6KCb!nlQeli-L{aUIB zwiWkXeP0Kh>J9;bDmqRoBA!}k>W?H!+Ef~iDNUR>MK}+87?0H44XP-8Zj?3*QUhO5 zaqtfV7S}em0~0bT6{{bSar?Tz=T3Qn;!BU8-z=mh{V9HHOUdi^7!%wn7^IMJq#Sy977i{ED{frw< zOV^qKER?dCo7{ZMemREz(w;T9*UhfdsE-~GNdYi%-}zr5dgQj$gLRx9;TLr)^e|#J zgZz_QDrVsiI%$evoSd899tpQ1xOD!LjPETu)Bvvknh$2=Y=V9v{oHEnGLEGte?s1+ zAQJwAZky3)seCkDZbH+qrtb2utLma{Pf=)lId&P_Lph7e($tNVR!qc0 zC2%Q?A-Y~SRxKJU`c9+X%whRD?@VwcCG|bM%kOh<@-npDM&{Ui)X$>=kWyrF^0WL8 zj!f)hcB(}t`G6l*$++oy4O2Z<-7WPEQz@^`S?PtW!tGK~sU-VNFGf-G6zM?4Wz}2) zUYdzmJi;Lf=d>EzT>+8W2&`5fD?c*q>~T0OQ7A`ZHqm@R zXg3Yb;KZPYB6K25d!R0tb&m3k@Hv?LR&h#(UvbKAJA3IqMFcXQx)kf4gz9BMF5&|+&2 z5kR|*#b{l;!bc%-7Q!0kkHB45&cRyOn}=9Kzov8`gK?y8(H%XtUUJe|Md`3HZ=QkDXN>_g_}N`mh=7 z?qfH%i1F}|V*iOLdi(zo)9H1aUM8e(SC4P#k4IQD3U0#GTv_G0uhk>jCeG*IIiRgx zw*Xxn8oruD@LhM69lC*bHMI3#b#oR^`d@XU{qMRpO4ti}1|i`+3_MQ0-fnxcz%Q0P zL!W*OuD>}0HY8-?G?lKN?U8qe2P)f}@Hv7j;Y_i?p+eZ^-7gU8qS-WjaUKP-M2lSE z>qZ;zc+DKn;c@5ifpnAaha{!)Sm71>-|-jOYw7UB5tjY2xJBqcJ7R^U+thbJZOnX9 zAy-CT!`SrturujN-USYS8x~0@#Pmm#>PhG&WoAO?lH&BGY8I_uM2;e}N^wRBR^N{r zkFszPE-(9=+|GW_JT-IJoTcs`5*CR?f|y$9>SAVW_`eZ~@0-Q}vNrt&IuHY>iF{Vju5ZF9>>baorZjC)qA;enq3_)~g&AtnaL@ z^9-5eomQvBnXRLW5Vr&fa=cQkDxC9LXrE;!%L;{~hqa$-1VL#GA0M9jUA~{sfVUa^ zQ4YBagWl~MC4@(Zs*Jfbp0nk5@AIJH{?+*lZ=TTI#&r*KjtneT{J!*AujceNvGtBn zhbE7%P#!orA0`inQ9a+fw!3!;u8;@YgkfKTSebYYH#e?(GxU&Je&8@2c1}y0-Jpd4 zwB5VeIwi2LlIyTRnad6u;1q zJ{7`6rJz-Zw44=o_6)wabWAiUKMl@{{s=`Kr0OGCDyCcrr~DHgnm|3yRX})#TG%4s zaoSuLRcj%eh>r`I0H#!Rt0(-g_Hu!?XhkHuXhjy3L`%{()ou)3%-1&n9QQ=IMvlKn z<}(wa#I!?YVL#LHRP0P0ie>LYv@6%CeZe@%%o11U?{>H+-u@n0?}-u z2kcoh3w~$$5(rj>9lqLTl!9d3_8eb=3=vWt%}Mu#i8?5F7$#hP>NlMrkcLPwmMy<+CO?)}TEFoV?dE(NN<9`~V%e_|` zHC0l})~M^_K3c21fsxb3ysOG)MTb%BiU`^s_wv9Sw-p*fWBd`0-vCkMV6sRfp$0*& z`sa>`5m{UPO_P&~H_6}~m2?xg(ugWb1q#XaU_Uc)*n*2~Uq3^j-U1K#EN^_+604E1 zUaRp6Q$?C4=*H)`998w-+iuBUE0js0e{C)%CYHK$HzmATgNLFOHHi@qgmUz;@Bb-c zWbfB`o9(|#C};Ck!jQ{nbOHCMgjjckU?j^7be0r5Hu}4hC20&x+g+~Ek5_K>Bcq?V z1f!RdZIr)Ef$qIYWydkO+f_`sovV@8f|(37vR zC+?o_(=TxA09Olhzm7~}=^ypQ&3tTerrWi}g!#dFNfjho7)XcvC{YW1 z|Ew8R!5MGYn~)8?m*eN}HD5ElXI>D%C1w5)O?K!-8SF`S7h^;AnL-L-v?M2Q9YcQvg(11yT8G@%fUC>;!{iBGT;Fs%@I?ao=~CuGCK_ z{h88bHf=A-u1sWl@1x`t1PK?X?|FTRGti?#G}{gl4$O`jf9GRX5e10;p1=6$eDZZ( zKA3N%o82~Wj}G3}q1^7~nbXECscbnmKs}F-7XmtB2tvgle@2jiNj|E)Pq)#IZTvmH zB0lru370=c9g9)J^;n5)u)tIF`Ik@|wU6aS71clO91wGgN+HHkffC`ZZ5F8g@jAg0 z;nwlA&wyt!@5(o-UJf^c`8Ttkf?kr{3cF!Us_HMMve-&oqmn|Dsze3Vqbz%o=Nt=% z&nY2IJ-)bqPIEIC=eut^h--lftl-+;ZDA=cVv-OKI|^h}nu89q8_1#hKN9EA`~N2H z9bJG$u9)!Ga$YIhidrcL)*r`ZdNO;=a0(?HgtylQrvalBl;dlS%ta$5P(uPjZ~lC{ z5M+gF?@sPz3aM^QB25@7QbJqW+qjQ;VD%EKiy^K~bZIcBX=yNb2M)mWzc=l=u9gd`RHJ{6 zfszBJac}+_2p32S#|Gaw!!~tyXL+|Z80ZeHfzpv>`}FT*#B3o`vsPv4LV zz~BGYMC5uCX^*o{ponT#G0Nm$~Cl1Sg-OqlD{GIm>c>;Rx1ZhNYKU_uj_DO1zL{C2h-BlU$0R>76`kf$gL zVQi5AOnG{44P1fmm`u#-A2!_HvxQjXl_vG zzd{eosq%tvY9tpS9g&rCg~d_11oJ@{QG|EgBzR80$PFZhXX4rWkfspGdL^(dv7qq5 zqe(Q$z5k$g|K$7zNQnW)d@}r5`QQ8*;9y3&|$%e zU1Be!$1FZfbj-t+$=S^vBSxynqJ@<_Vhw_7X=Q8oUNTo{G9 zrgbb&wX1dS!@Zp%kW%W4(}gHRmzoX=E@@=0#VA!RBpFog$KtgVoK*Ej!UA}Q#jrhwELxl1GA83=XWG%mn z2wR!Hu2$E!GMOes+T7Tl;YG~43s1UauFq9i2DQjUy6I}`&xTbs`7Zyms_!{n+4#q_AA9=ZYN--+nQnALyFEf^ z>e3o7?brD821Rl~B&C`xn)Va5wPK=qKy*}XCH$EKxdI{auV{7xIHs(%j*T8YTxGhO z5boAgI6VTVhMY&D_X4?WGP$h{$?ikWKU;Ht`$@o@iynJxYaVha#P9Uy)mF@Z>N?ka zhEB5!hw8dEX8omEg$}4SuOVKG0DBddvN!qM9#NNhSNF*96wGC&z%W6{g!B|l7kH-a zbSdC!M3h_~4{KnUfNVmo53M7i@gHn#8JV2$6rOf0A+m?Sh$`5uDw@Z>&WrUA)+c&{ z&168tY08Bzyl3U02;-w~QuW1MrTJE{al>WA^K~qWYcx(F##zLJ{9j3W+VMN*vyj62 z;PF~qZGL2};n_b{$-`{Fm|gNryo`;2)V}Co=82%&y4%^%NWr51sA*qjOqhKMjoaD% zos*uS=b>2PR77DeY9M>F&RP(XG}JbJ=Mac)H5U#*sIZa6$as*9!Q-tn=tuQ#jJ*qs zpL}@T@W%Wov+H_XHR72uRDO`$vXLKKRevw{9xsGa^fIaFDjVRx{L0gZebXDCf-Q<=4RV`eNkob~#xG$N_M_K0Qxf7(7-Z|L!Pw zT6_n*E+ZU9jt&)#K6ea#j(UWkaJPn$NIH@Ae{Oxg+t%iEjxj0-RNu0J-wi)Ir%YWt zJ8|T^IrD!WpWf`ep%@zNN6u~@VlHAmo}3<@mi*d2-#dBY`rEs^Yx2$L=H!l5SHErN z#*NRWwv6&@y_<9Udiwb0&iI;I3|;X4UqU&EV=dPnmpw7r3BxYoH)Elm02>SVRADmI zv2?syDC7nbsB0~k2`mkCwU)~OrUoKh&m{-D2Z^oc3Vkm>0EMmRIx4IW_C1VOwzHg% zHCxr#-t4X7aCqIww^0yj)Qwp6{k=1eiCn(23!-4$n9X(67tbFGtJa zOFc6S)(NM2{ybpukmF4|;sr@;G{ zi zkSsyA{-nz3tOw)9=iRA+LA$Syw^#J~RNue=c3bDWdq*a~-~HJsK3mt9r%PYoug$}` z@yX90a5Fo<{C4toGuvTdvE-G**tI@HXV9rTCg?)SP<>2%J_NWuMbtPns0N>a{MFLp z^+r3%q2NC*p}v@7TppX2sS6-#AX)=9&=DGerL{vCT-IEBERp$n@d$q2NnE(zTq<;B z=g@!tDrOB|5V;tMMKWk59mvm-_4zwz&fyg@KK~q=II4hoD=(X^o9W+rk+hrkP4P2C z?*ZI)gaLE$783C11J?L_(E zN5^}iqll5LSSB-NqcFU@5U{WUqBIVY8}$Ayd=i)3Ic5ENd~iYghnoZ)Z`bsiUUg5t z-qi2Nzpw9i?oQ;tp>lvFZt7ovVXZ<&Rs4pw@vPx*huQ=TMH1E8OFnOxWz- zDA);PFLU^OuJ71Wy<3`f*Qldh1&B6+;xVilv4|nN0^*gesXnSFVZ@i#9*lrVFOsB9 z4+(-*@lITCPxwpWa%c5-iz3ksMMt#Ot^yjhl-4)^)F=djea{ab!#l9)!|ll`{q|F_ zzVcCCu&CwlV-*R;Wh+iY6<`!B7or~g=x*4OT0#ig07N$)G^A9f_vb#Rd`q}Q!6H-J&>HHg?*1b0rX$^P^oejeL$@DI%S95;sS6o~fYOayG+-`KXl zP4Rv1FAocTzU;Vq`47)BYJeCOK!7!B*Tx$ow=&1x>|UCMK|*7>=%DWXTx?+zHX}ABGZPk8BPKRxQ&v`P zHWm{z6LV886D~6*c1{)nzW>`EAl!poDF7Su|32-qXIXfnFE&&+AQ2(S{RST4Py1Zr z2Uw!Wsp5kPqY!yR;w$DuL!-wP)7)+NTyAm2xa{r?%J2AwpX(MahwpO9*O&lUFSTzE z{T6O3-5MwA`F#$mIl;bOn*al1A~JqMVqHbz+=JTR_~_pQd4BQ%`pScBw#1wDzkj!e z_@N2~Rg8f|6ma<1TytBJg+g>Y21}9A{5@yoJEsv%&o516^$?+Im~xmPBX&)2_0R@G zIjrwCeLU3+aKT0sP2N_Ur39Nap$@g^g*$yleoNmtfYFAiOIRGi<3_AYD2=}>3~iQv zig!0wA-e+{k?`O` zyYn2e@DL=r;~mlP;D@>;xiDgalpOgoyY=NlSD8?^$+)n^`>?nm8g}lIAhaS|U(EEoN%9LlIod)x&nyl|P0$}Ktk>?MBVDf6TlpbeKI0De` z1%I38AM}JfZ-C)IY?P_WLNkQ~{=iLWw=#vE*;L!&RsWya!G~8Zj)-HSKIFN#Rpsxu z^#&wh9Us;Q-^IIb$vu(vQ+^9&lpnyb50M$xd#qI%XP&344vn#oQA4L*yRa^9!$b4k zB&TJ}9eH#@Tz0QsF|<<#3;n{CVf!K&bZcCZ`@(OkLd8kj zU!F7l+Hn?e_IVn*U++3fg?Ss0=?|zzDTku%BZBr#w76F*?ji}e{Me9H8&iXRTUKT5 zNj*h*GBRPEXPU@t0LguA)sV33qy!1WfX7a#QV99oTGN$|x>D znhP_bL-8<_2DE&%r_8|XjPAGKkl zFF6(aaaylvc9}C4x@&;E7z%GFQc~L$JkRx*rELU8q9*O#oWsvOXXN-KKgvO&BNUiH zk!BTGLe*mznr;kPK{tW1huR0f+^*O)$-VM?Fg&GS@aPm2%v)WUXLg zC-?l7nYNIsjl#z_D~l^@2TdS2A^W3{!AWOHKCp&MGOhrLV|w20;#hmrKh0W96Pi2F;$T5O*UnAq4Ny9Huha3_mgf(a^b`T znvk(^^q-KHIMC)@cZ@|1)E8N-Lc)@6nbk zcDp7{l><`K!j2j8+8B8^1#O)w0nbvN>xnAcrqDVy-L=!EuSi4P)Q&ir2o{n{A@S;j zGJb;4GCB6<6op;D^M}eptyD0S6p!&S+cCu*ZpTU>`q$I0e6@YyySa#iea|TBD}6MW zirmV*@&Ge)V)G=R-ou0Jck?LVdaJcLGKF$4fzP50iFqcFzs-~a8kO7#FxfXoW6$xkC=am{7xC}0F8$NDTgZ;EX3Abs|!F3YQc6ia_5GRfp)BJH8 zfRORlkZtDj&pwIb|Eb}-*e5&W zlEXcP7#a+6r(YdbJoMh0cgXb?|LCPU`_QA&EoTFSYZZU7Rrh7SQSwMxrS4PiBJt`b z)?KG+s0bm_@2XdY1YU_P%PDvj%>SxC8}!MUW{&`!Nh_BE#8ie~!|iEYjq49bo%%;- z%}t+<`Xn~X4-?1dRAzlv1adq%TEW226}1kSo-}cGVmnVH)z@L_*PFwE`KHZl^@Y9^C1@_V0ycUMsBD6U$MhsA*6cSYWw*TInXaW)wWL)$zDW(ZB#1 zcsBbKcjXf~($%8fsO@(6OIP!0L*3&y7C6@TI{W?!|WTJW}r%)RlpRLN(6 zx)uv?IY6w)k9e#_AH1B-Z=}RIRa0qZU%vM~negY3swC`Ue&sb8{QwIL8YPCc&6ZA> z^HnGp__A`-omM3TvA_Xj`k@5#J)3PVoWRlG-AeUZyfSM{2!;nZ9`~i7jI3 zIqe-#ngFAFzAXa}_tFC-Mw)BqJYUXr@hAbw)UUdXu=2v_OF1Hg073akkKN&Wht^k| ze~m2C&o6Omu6VT=d_Sl##udNDU>mWVyd)TwA)ni-KkAa0+Tym#y(+Q`KYsk)9k%>6 z!PP-0Fj`qO$^MihCog}E2AT1%k8Bz$RK)a7n)E)~zI8eJGzBS)ke6|r3_EK0*$Omc zP5}CfOFi`06Z+5QiY42XT|whfl|`)=``E6oKn1uLMb7t~mgImj`^4&P@9!X0Gj(ST zXFHz5>Jf8RuCcilyRPxd%KM;z?dFKCfZFug?*S5L(O!Z`mCtP(@Ua(qtKny!Bb@>^ znycjE0q1ji+izu>YG7rUyteNz?SW^^;`{i*X4NIqP_3B6nKiy%*y=ofn80N5>W6I9 zHnPaNU!iALR-oond1wzdqdC(9BI@`=V7r$GbHkaSGe-;o-Ifj#+}=Keh&mB;=Q7hq zpMQb{K2`=14s2Y(ZKh8u3+gJz&c6g5#Ggd6g;ayq(`NAp}RIH?{uh z$X3J{-t%)W_ zr`Th2g`?}c-ofM23)AW53)!cn;qt4`$Y8`X{78*kxe6rtn7S3Y9+}AEuqzKya{iiF z8(4`nMBLvkKs%L#An%VQ+uh4)AQ{IstcdkDiFXz{$RVvx&OrZ>!Z;X;dA{3W?N&|! z$vuwvv$a%+V8_FDB9Zn8%iW7%&lY(|`LXKW*jH6VOaFzV!ynE{HQL~#pE={Um&@K& zJdZCP;nn?k15>}tZ(qoF)+@^-*536ZYM_o78Dcb+{1R(-eVgi4i(Y=3BxoD+7(Jp+ zjV%%EoMo6B2I#jh?se|dR`F@@9&Pl zkjN-2@!bv5Zj?I>Pw`Ec-!NeCoBo}@om1i%nZ)sGzy~4+iR<6t@PyDq%KCZUNP}1# ztnnj1^NEQasKsuq((6BL1GGd%htoL-+PHT5SrhHH?g*U6g|MAi&wV8 zcy+Vr{`-<5>sHW_K3JJ-W6%4VV2vG^Ej9a?*Wy+Aj(<2~7^k5%}B*iIBf+76>}n z{xFM}?1wp~3Iv@@*SENi>zFJ+AcxLlx)Y8&mxT$64|MtS6c$89hT)w$g;%}xz=`Vv zy;t}n2(?s>fTCL~@(Jd)u6@gQj4H-V*M99+*P)9K6KjvNuHgl?o?>u5<2RQsgx+~u z=he0}C_xG;*s@rR>_ePo*tU0L7%>|7lDZq&y)wG0dtXIID#OKx20ElM(il@+)iqUp zAqOtVrNSe=q>HN2{L;NL@%e2))k$K0$D1e;Vr?=VdbA6A-YKL?Gp;*)$Jc9FRj_6J ziwJuQMAGr8NpOfwAS3gA5k*#vZSV7}toKli?bqkoStVD}0XLZiM1-$itcsSuDYey+ z3!pRAFsV6s7{Fy}YEpA38$ia4XY!OwN@<^)wz)UPm z81uaU;9sn;D(J0L$7>P`(S?Wh)te0-zQsc2@+#k~3sS6ePv}dZX9ak|DmwZwB~hI)P4**j0dz)A}T3 zavmiJx$AQ8i-XD#m>FZaOBxcBHjsXXuU(&d*q6)-%sjw6900QbnQ&686iQTcu0v)c zUhG1x9LsMDX`Odmxs}V3dKd+4po|XEdaPY7#~hV-`zrPd;gN*YoTG0{;BwU7HA-n1 zHhezDcs17vK$Kio->5CQfb69F@eZm}V2fm<^NlgYdb}0yW%UkXJyn-?`x@*GfMbyO zndHSpA`#l>Cu`zAbG&4Z>SZkNUG|-1Z)pdM_yY?6(8tCsIx0Lp7Z&ya73dr`<2m|#4cg64!I%;w?SO+($bfKkjtjHE71ZU_?yZY=Gv`+}hb)BB6( zivS*KboHC!^`ZR@OPmU~F ztG${yO@y;7QbvASTkR0>3OKlX(JkCo*dk)||AoRQ7FlEnXAb^)i#~^u_ZG4_jSX#N{%h zTKL#0$`M2Ta~a7d~@oFM?~YO(91 z{nSMt4FAxvdLhya0~$KseF}m}jSDW5)l!W0v}YwRM7$JY-Pe=3{7saDN&5;ck2pc{ z0~GqG5?wLn%TQeWjFbU;4{+>#W zFw7X8p;VOjst6>@75aB9)*T_8@oTCrNoC-vUhqO1roB5kbF+AKw7vhS?jf76*I#PT zv-$zRb5#~1v&%7LUpI8os9&(5`Re7qjg7Iku;j%X061BE{#D2D7`l2Br1>iM0t3E@ zc{t<|&-Nyt+KUB=m`BqTW^CFAV$!M1(aPq^|Y=yT|ZoIsn^VXCg|BxQr< zA>pUyz{9V{Zac{f2#@GlQP}bs(&LS8CeV>Y-?sI@YH`o^OSZR`oZVr>)FAOHxKK-Q z$4z2HPPnb0IqrAI?xCyxIsMStt{6$2X-l-}lgl_t!eyuMwk0%6cnOCVg=n{{%-Rl} zg_oS+x)fITl#eWS&MoHW|2!VG9|9`Uk*SF5c*8o-=JmGTZIax`ccOMu0dEuriX^hm z9m2F*Sj%InQ49zi0EoA zi#h4yJ;Vfwpk=>d0xjCi%-6Y`UiuCUrsq*s zFL%x;=F20Y)R_HuM${DLmIjYxjmrFDahaHbN145-0mvOkd!`4mR3?DJdWsusI$SXB zBLK=AY_N}H`Fb@AX3{E^I*DY5i_&KGnt6|ke|>(>{(6qylF-hu0Uw7z+|ScotN6-$ zamwxUj*3E-)JJ174cAQ#sFQpUR*97&ab+JN=1wnlmyn_mbC;L;OJ=oNYo^%rUgeHa z^p{w@rC$w@z*S8ZJQ47VVNnfrvMNaW9vQ+sN88l>TqN8RZFXAe^|bxAPiAjXsg+!c zmy5`GcT3Z7XIBVR@ z1rFz3`XaZX%;enpQ)odBBi|R_&?DOm+>foqquxgd2Ab02UqXPnm5v*QNW?;0%tluP zR@GZgJOiKBUOf#Z{utqkq$oR113sfWgLZVo*|^j34^l177s`$@@IZu1`He~KH&-@z zukSq(C#(9q@Rh~K?zO|k0TKJB+wZ$LTbl>LijYXo*6qu-jlQ;yvqkB1UPar*%kALO zRGbm_07EuE5tswU{T`0CnHVm99#E$GyrV=nKKPy1x70s-nDJF0w3PjVb+6?2i|sT_ z{y=heiRM&6m&xAP-F?=-=_Y&3zP|$)LFRg@GmfiFkVm_>Q7ZFhA}1+OxLpb4eb)K> zh5T*7BACj2P>6<}!{slGfoMtD!4?<9$H|#tHNiheSsZyDlV{R5_5J$R zQvLx@7?&|IM=tnrWg02}r@+VG<+G>2^`-cMW~uuty?)U;yZc(~tlOU%%H1;W-;AI2 zW5DhhCn_-9>4w+6_Hwf>jBBCt?fK~%^P2czKIUjiqu$KX4C8Xl()rGS#|k>Hj)sYI z{ttK6PrX*|tEp4o)NNGq=b1^9V}8vF^xk;+vOBl#P6Q)3ddN?D_7+}H>ZWAO$k258 zMHvG0m$UtGBmJ&s2$g-5#n5zIF~ak&QoDMd*kC*(E{4w0WhNPYnk{v`F=lHho*5cj zuyj{}ZmhIi6`Q@*d*UZ;tJTQ2E82XgCV^v6?w&oxc<=sSCaa4^i$z(K4K&FMV4h(K z;FynsD!K$+$@e|~;z91ZF3c|0>KH9^bn3p=mBcZ!eA2(LmT|okQ5N|J~BF zrBCZK{mVJ))89H}@b2<$x@+6yD}F?xFL+d|Ud7Sq+&Y}o2A2``Yro_8a@>gmWrL0L z^2PsW=uiD=dYZ#&zp5AY~b*E3` z?|oU48V(i_PY|Ag`MYX6+4smF|8w6}o7o~Vs_q^d98Bvkg{ETdedfx)WSQJpLQMA) zpY`t_zOTSdAl3-om5e$8{M4+fAN|A7S3)vpOiMc6G|EvK3c)xFV=IaeufFG(E!AD~ zy8anR<@32_(?f~Eov}Ep6j?A2^n}!#EbiYZO$1mG-E*(Lz;FijJ|192?#reO zjjfo99QS<6yaxTZfMQt+hO&C>8FPZwtq&`tS@_EvZg>_ZF_39Tm4i233a$@J(=V0f z68@b&)p;)|_og2ob~nbpD~ygXRk~K4%K5eXqZDk2Zo;*eWLT0 z?$nbm`d5ag-iHWvz+79%>Qj5d@tt;k(&y14{P-V&4tM~Rw#aMF%eBjS_ zYzLNyUZ5>H<87-oE>Xfj` zIjV`+_+lwe!i>=XTUe(X-er-6RENBInrM|62Fb{zK|W6!#>rCEav% zu`9F}utS_0YZoeod8r4>`+Lr0XIC+M*4A`<6JR5&=(Vi>F^-Aa^<%`Uz7&*IG%iXz zoal_`b1~k@s2E&jEQ(rNyooBI>=3hy!z~$DPYPdG>8vjH(S)JKRpX4)IuBcwUTsjf zWlnv!W0;|tj;R{F!&n;^cDWH+1vixb$U`^*vdKa34pS%=)xq!(Zu?k^LGF8<^uB#( ze;H@{`i&Mr$JgZqV6mX51E1_1p)*P7RI>xx9U6+q9ceF$O!Xd7YfZc|b>1=?eoX|= zQ#BMHhJTFJKn$o z{59i3?j!@%m5uDPg(A(k(}6A^lusAr8d5kz!TN3Qu|gcW5SjL_^L8lJ!oO24cS$aw zBWir?Gz-dZN)i8r3;E|_mwMNd?WS<=kZUc|hK{bb@<%`VSv#}` zNr*GnhKISWw|uzp7Qyb$OW<2LXNQ40QMA^foIlA&-sqP4@4w*{(4VkltvV42Pac#u zL3KA!fq5)ue@K)?w7JB>z+zC*iq%T`l43A>JracK^`Z%va-0_J9Y~Jw@%qqvf zcu0}?B!mIs259J4!Q`X8;==^r*JPz=xA)4aLHLV0HtxuTcd2Y?-TxDKs6Tb(ACnB! zqMpacOr6oSOB`ATw_g*hb30Y4l4~i6KiF?14U#iDM2Fq}gAC8{x{as!D~)wI$S0kj z{S&TnPW)i7AO~%g6A;!tU&q6#W4?2#u|!F7_5^KWENiDr`or88G|g*Yb0R2+T>6Y8 zW0{6vRz-^){P5Hh?Ohz6HdA=m8VaYF>1Wl3y=35=uTJrVBchJsS41hl4a zf#=8$qc0Z!Q9$HM8rK?JJcrizy{Nv1g*u0|ALM#d5erH?o3NlR;g6}e4o(dslZFoO z*^^uJ1o@H8&KmB)%CnK9JaePQs=GP;fNhW2eb>BgQGHKFk4ilL&Y5w&qYb zUnr#O7fa|~@?){;s7Q_?JsX_b<_rHkRfmt=HOMzKw;736c9O&JDYMY`ZN`Nf15V!; z6b|zK{IOp6T^skqC5@M~lXr(7$}VCcJbeUdO<{Q9em(ywJfPiY`31@-wIcDzq=bJ- zC)o#R>r~sMBaXq4=+tuaCn`LF{Z$u33ZleT%6D1|igQ97H-mQQx-IzU2OGgcRXbt_ zDW~ezlT|jrBvL2;4bFk*)af7<{j;h|`%{!sgnqF-O!PwRI|AeyXSCj6#5T+J1KR|g z(pv$ElM%0|Bb2cfy_~2n%k|8H)FoeaF2JFKSDDUmt+ptRbRM49CAUUKrn~P4RbSy)~Yo1cZU( zM+ONGd`|VX1=((-sjFBpzw6XcrW=29aodAt_NlWPIOeobDjVI|ft7CeN#d@QbMq2B*XJz~8-pzX+h&1PK zTBD%UT;nXg_fY&wD%(FeIOE(tO($-W<0VND=UUKjw6B80W3JlHXx|swO+L(X$(7_m zEY>kb)%U87MBq7PUBU!PtDO(0%CLv|akvc&06r~`Qr^L7nFVZGHIaR3VAqxc})zr&OFI~d`mUHwWz4O!nkPt0J))vb(e>0!ASG< z#Wg%O>cdP=B&LZjLBD{m|3W>{tq?~ywi`iZ>ZCCO90QsxsNk_3hq1+V?9|oEKCL=c zY|vF8T+MFO$l~uL@$_zYe4VlvIY*yRok()zs1pq-+7n&v#4*Fz7`NpJo4FPoSK#PA zb2B)G%!y%!<1n_v5kOV-9>)DwyOiZ5-h6|Tngk;JI5`0_?cQg850hhEmY%cS9O$F+ zyO$i5x#-G9SJ7?tUk)MY7tT_FSu&0U0Tn3zzdVSlVt)`%<8k&dg8NmQ21o$WLXCvZ-g(j|LnU(R{nShZaEG{xju&YdgBd z4 zF%Gp!NzqedY>~W46ZCd)-q<1xOWXhgHTxO;D6zM>v^DHvp5dNhiR3{m8g^X%qS&{z z6+P^Jl2{^bPIm~Zik=`E-75O7=0g*0O>`@ML86{Ii}L()zWa#-T#2 zcwIE0)g-@Wyxg;Y{fAF$c5aPuFkALxyGpPH_hb+%aO#0wo<445LUFN`J`JehI^`t1 ze0Ee^vv@$OS}gP05-0m=TU}YL?)IC&FMM|DIu>K!Wr4sTUb`V}i`DOMg9AHqPmL`` zzQ6SgbmOoq(ZInHBU|^9YXnNf`e@@?vy*C0Cm0CUl4Qj-^)lB8)S@LzmL$MU&6l~v zf~rdYV|}kRII5<%*fSE7&2PU*9l`=Ixd!YQTwkcGzw_Y`>%tvO2^8ktU8qRE!>w4 zqxOr(@(bwPNdYr%Lh`eMfe#@2AjuD7E_UQO-EWQ8AO!FPo$*?fPppTrJCu-19%sB} zN1!z*FsKaR3j(HHuVDjL*~FtMmKZJR(|S!%@LrD)68~6xSEF5ArTeFqIZWtJ>#f!g zeQ*?LtW`sWBGB$;!HJ-W`Dx1N)&$Z@Nx705i!@c*(RJ5Z_Yx||D*TXU*)+tawAt!*f z3ZhT|=uVJ*aUsWp7hU9N-W4@Fw~gP=<8S|0O>%L3q+DTwQymqWf#V6!CcRDHYMr1L zjdE`=srTM!>n^U7-@JC#6Xi#lPpjSQ4Bxb@f1llSCc+kbd0x{BCQ%%uGfk zFMC$ppdCH+o|AU-i=lrH)pL&KZg&jNDFQf?Ln+Kk$@3hedFTo4et5+Q>q1NT=b6JT zYZ2H*KoWE5=5m_&Jg-|(a(zg87W^>#OJ3RLK4lVf*`q+@mk8m@f-kxz^X_$DJPd7p z{OhyE+g<$2v&LU~?mCMs%#Gr?3~jx3nM4+LQ@^y8g}cL&a`aB-*^&bCkKcb0F)_3M z4VN2Fyn^h?h;)6N#Xk|gjQcWDc7EuclvH|dXqIH5b5b&LhbL=qU`pIxWTh5j72coN yFgO1IPZDV5F#>BRhiTUQ7->F;gse7yLAD^nO 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 diff --git a/book_conclusion.html b/book_conclusion.html index 357fe2f..b6decac 100644 --- a/book_conclusion.html +++ b/book_conclusion.html @@ -297,7 +297,7 @@

Table of contents

- +
diff --git a/ci_cd.html b/ci_cd.html index ccbd993..2d40733 100644 --- a/ci_cd.html +++ b/ci_cd.html @@ -301,7 +301,7 @@

Table of contents

  • 15.4 Run a RAP using a dockerized dev env on GA
  • 15.5 Conclusion
  • - +
    diff --git a/fprog.html b/fprog.html index 2038d3d..415c27c 100644 --- a/fprog.html +++ b/fprog.html @@ -378,7 +378,7 @@

    Table of contents

  • 6.5 Conclusion
  • - +
    @@ -814,8 +814,8 @@

    chronicler::read_log(result)
    [1] "Complete log:"                                                                                
    -[2] "NOK! sqrt() ran unsuccessfully with following exception: NaNs produced at 2023-12-05 06:26:26"
    -[3] "Total running time: 0.000783681869506836 secs"                                                
    +[2] "NOK! sqrt() ran unsuccessfully with following exception: NaNs produced at 2023-12-06 09:05:17" +[3] "Total running time: 0.000826835632324219 secs"

    The {purrr} package also comes with function factories that you might find useful ({possibly}, {safely} and {quietly}).

    @@ -1678,7 +1678,7 @@

    function (x, ...) 
     UseMethod("print")
    -<bytecode: 0x5611aa8b6120>
    +<bytecode: 0x558bff2da0f8>
     <environment: namespace:base>
    @@ -1722,7 +1722,7 @@

    diff --git a/git.html b/git.html index dc2663c..225d618 100644 --- a/git.html +++ b/git.html @@ -335,7 +335,7 @@

    Table of contents

  • 4.4 Getting to know Github
  • 4.5 Conclusion
  • - +
    diff --git a/github.html b/github.html index 555b619..a74240c 100644 --- a/github.html +++ b/github.html @@ -359,7 +359,7 @@

    Table of contents

  • 5.2 Contributing to public repositories
  • 5.3 Further reading
  • - +
    diff --git a/index.html b/index.html index 59ffe7b..a38b3a6 100644 --- a/index.html +++ b/index.html @@ -301,7 +301,7 @@

    Table of contents

  • How using a few ideas from software engineering can help data scientists, analysts and researchers write reliable code
  • - +
    diff --git a/intro.html b/intro.html index 25698f9..0e6e8cc 100644 --- a/intro.html +++ b/intro.html @@ -359,7 +359,7 @@

    Table of contents

  • 1.5 Are there different types of reproducibility?
  • - +
    diff --git a/lit_prog.html b/lit_prog.html index 27cb3ac..d502f5f 100644 --- a/lit_prog.html +++ b/lit_prog.html @@ -362,7 +362,7 @@

    Table of contents

  • 7.4 Conclusion
  • - +
    diff --git a/packages.html b/packages.html index 2b008a9..1ee87b4 100644 --- a/packages.html +++ b/packages.html @@ -360,7 +360,7 @@

    Table of contents

  • 11.6 Conclusion
  • - +
    diff --git a/part1_conclusion.html b/part1_conclusion.html index 7e0adb2..78f1d0e 100644 --- a/part1_conclusion.html +++ b/part1_conclusion.html @@ -693,4 +693,4 @@

    8  \ No newline at end of file + \ No newline at end of file diff --git a/part1_intro.html b/part1_intro.html index 17a90ac..985be97 100644 --- a/part1_intro.html +++ b/part1_intro.html @@ -297,7 +297,7 @@

    Table of contents

    - +
    diff --git a/part2_conclusion.html b/part2_conclusion.html index 90a6795..bba0851 100644 --- a/part2_conclusion.html +++ b/part2_conclusion.html @@ -728,4 +728,4 @@

    16  \ No newline at end of file + \ No newline at end of file diff --git a/part2_intro.html b/part2_intro.html index 36f5326..d88a1d4 100644 --- a/part2_intro.html +++ b/part2_intro.html @@ -297,7 +297,7 @@

    Table of contents

    - +
    diff --git a/preface.html b/preface.html index 2f3be7d..1db6545 100644 --- a/preface.html +++ b/preface.html @@ -734,4 +734,4 @@

    Preface

    - \ No newline at end of file + \ No newline at end of file diff --git a/prerequisites.html b/prerequisites.html index 6b40c82..8da9258 100644 --- a/prerequisites.html +++ b/prerequisites.html @@ -331,7 +331,7 @@

    Table of contents

    - +
    diff --git a/project_rewrite.html b/project_rewrite.html index 2e2fef9..49b0cf4 100644 --- a/project_rewrite.html +++ b/project_rewrite.html @@ -333,7 +333,7 @@

    Table of contents

  • 9.2 An Rmd for analysing the data
  • 9.3 Conclusion
  • - +
    diff --git a/project_start.html b/project_start.html index 9739b35..1335a7c 100644 --- a/project_start.html +++ b/project_start.html @@ -360,7 +360,7 @@

    Table of contents

  • 3.5 Conclusion
  • - +
    diff --git a/references.html b/references.html index 7f6e72a..754742e 100644 --- a/references.html +++ b/references.html @@ -785,4 +785,4 @@

    References

    - \ No newline at end of file + \ No newline at end of file diff --git a/repro_cont.html b/repro_cont.html index d1c85d4..32917d5 100644 --- a/repro_cont.html +++ b/repro_cont.html @@ -366,7 +366,7 @@

    Table of contents

  • 14.8 Conclusion
  • - +
    diff --git a/repro_intro.html b/repro_intro.html index e64df1a..69ca105 100644 --- a/repro_intro.html +++ b/repro_intro.html @@ -357,7 +357,7 @@

    Table of contents

  • 10.2 Becoming an R-cheologist
  • 10.3 Conclusion
  • - +
    diff --git a/search.json b/search.json index f70e9c2..2448a27 100644 --- a/search.json +++ b/search.json @@ -214,7 +214,7 @@ "href": "fprog.html#writing-good-functions", "title": "6  Functional programming", "section": "6.2 Writing good functions", - "text": "6.2 Writing good functions\n\n6.2.1 Functions are first-class objects\nIn a functional programming language, functions are first-class objects. Contrary to what the name implies, this means that functions, especially the ones you define yourself, are nothing special. A function is an object like any other, and can thus be manipulated as such. Think of anything that you can do with any object in R, and you can do the same thing with a function. For example, let’s consider the +() function. It takes two numeric objects and returns their sum:\n\n1 + 5.3\n\n[1] 6.3\n\n# or alternatively: `+`(1, 5.3)\n\nYou can replace the numbers with functions that return numbers:\n\nsqrt(1) + log(5.3)\n\n[1] 2.667707\n\n\nIt’s also possible to define a function that explicitly takes another function as an input:\n\nh <- function(number, f){\n f(number)\n}\n\nYou can call then use h() as a wrapper for f():\n\nh(4, sqrt)\n\n[1] 2\n\nh(10, log10)\n\n[1] 1\n\n\nBecause h() takes another function as an argument, h() is called a higher-order function.\nIf you don’t know how many arguments f(), the function you’re wrapping, has, you can use the ...:\n\nh <- function(number, f, ...){\n f(number, ...)\n}\n\n... are simply a place-holder for any potential additional argument that f() might have:\n\nh(c(1, 2, NA, 3), mean, na.rm = TRUE)\n\n[1] 2\n\nh(c(1, 2, NA, 3), mean, na.rm = FALSE)\n\n[1] NA\n\n\nna.rm is an argument of mean(). As the developer of h(), I don’t necessarily know what f() might be, but even if I knew what f() would be and knew all its arguments, I might not want to list them all. So I can use ... instead. The following is also possible:\n\nw <- function(...){\n paste0(\"First argument: \", ..1,\n \", second argument: \", ..2,\n \", last argument: \", ..3)\n}\n\nw(1, 2, 3)\n\n[1] \"First argument: 1, second argument: 2, last argument: 3\"\n\n\nIf you want to learn more about ..., type ?dots in an R console.\nBecause functions are nothing special, you can also write functions that return functions. As an illustration, we’ll be writing a function that converts warnings to errors. This can be quite useful if you want your functions to fail early, which often makes debugging easier. For example, try running this:\n\nsqrt(-5)\n\nWarning in sqrt(-5): NaNs produced\n\n\n[1] NaN\n\n\nThis only raises a warning and returns NaN (Not a Number). This can be quite dangerous, especially when working non-interactively, which is what we will be doing a lot later on. It is much better if a pipeline fails early due to an error, than dragging a NaN value. This also happens with log10():\n\nlog10(-10)\n\nWarning: NaNs produced\n\n\n[1] NaN\n\n\nSo it could be useful to redefine these functions to raise an error instead, for example like this:\n\nstrict_sqrt <- function(x){\n\n if(x < 0) stop(\"x is negative\")\n\n sqrt(x)\n\n}\n\nThis function now throws an error for negative x:\n\nstrict_sqrt(-10)\n\nError in strict_sqrt(-10) : x is negative\nHowever, it can be quite tedious to redefine every function that we need in our pipeline, and remember, we don’t want to repeat ourselves. So, because functions are nothing special, we can define a function that takes a function as an argument, converts any warning thrown by that function into an error, and returns a new function. For example:\n\nstrictly <- function(f){\n function(...){\n tryCatch({\n f(...)\n },\n warning = function(warning)stop(\"Can't do that chief\"))\n }\n}\n\nThis function makes use of tryCatch() which catches warnings raised by an expression (in this example the expression is f(...)) and then raises an error instead with the stop() function. It is now possible to define new functions like this:\n\ns_sqrt <- strictly(sqrt)\n\n\ns_sqrt(-4)\n\nError in value[[3L]](cond) : Can't do that chief\n\ns_log <- strictly(log)\n\n\ns_log(-4)\n\nError in value[[3L]](cond) : Can't do that chief\nFunctions that return functions are called function factories and they’re incredibly useful. I use this so much that I’ve written a package, available on CRAN, called {chronicler}, that does this:\n\ns_sqrt <- chronicler::record(sqrt)\n\n\nresult <- s_sqrt(-4)\n\nresult\n\nNOK! Value computed unsuccessfully:\n---------------\nNothing\n\n---------------\nThis is an object of type `chronicle`.\nRetrieve the value of this object with pick(.c, \"value\").\nTo read the log of this object, call read_log(.c).\n\n\nBecause the expression above resulted in an error, Nothing is returned. Nothing is a special value defined in the {maybe} package (check it out, a very interesting package!). We can then even read a log to see what went wrong:\n\nchronicler::read_log(result)\n\n[1] \"Complete log:\" \n[2] \"NOK! sqrt() ran unsuccessfully with following exception: NaNs produced at 2023-12-05 06:26:26\"\n[3] \"Total running time: 0.000783681869506836 secs\" \n\n\nThe {purrr} package also comes with function factories that you might find useful ({possibly}, {safely} and {quietly}).\nIn part 2 we will also learn about assertive programming, another way of making our functions safer, as an alternative to using function factories.\n\n\n6.2.2 Optional arguments\nIt is possible to make functions’ arguments optional, by using NULL. For example:\n\ng <- function(x, y = NULL){\n if(is.null(y)){\n print(\"optional argument y is NULL\")\n x\n } else {\n if(y == 5) print(\"y is present\"); x+y\n }\n}\n\nCalling g(10) prints the message “Optional argument y is NULL”, and returns 10. Calling g(10, 5) however, prints “y is present” and returns 15. It is also possible to use missing():\n\ng <- function(x, y){\n if(missing(y)){\n print(\"optional argument y is missing\")\n x\n } else {\n if(y == 5) print(\"y is present\"); x+y\n }\n}\n\nI however prefer the first approach, because it is clearer which arguments are optional, which is not the case with the second approach, where you need to read the body of the function.\n\n\n6.2.3 Safe functions\nIt is important that your functions are safe and predictable. You should avoid writing functions that behave like the nchar() base function. Let’s see why this function is not safe:\n\nnchar(\"10000000\")\n\n[1] 8\n\n\nIt returns the expected result of 8. But what if I remove the quotes?\n\nnchar(10000000)\n\n[1] 5\n\n\nWhat is going on here? I’ll give you a hint: simply type 10000000 in the console:\n\n10000000\n\n[1] 1e+07\n\n\n10000000 gets represented as 1e+07 by R. This number in scientific notation gets then converted into the character “1e+07” by nchar(), and this conversion happens silently. nchar() then counts the number of characters, and correctly returns 5. The problem is that it doesn’t make sense to provide a number to a function that expects a character. This function should have returned an error message, or at the very least raised a warning that the number got converted into a character. Here is how you could rewrite nchar() to make it safer:\n\nnchar2 <- function(x, result = 0){\n\n if(!isTRUE(is.character(x))){\n stop(paste0(\"x should be of type 'character', but is of type '\",\n typeof(x), \"' instead.\"))\n } else if(x == \"\"){\n result\n } else {\n result <- result + 1\n split_x <- strsplit(x, split = \"\")[[1]]\n nchar2(paste0(split_x[-1],\n collapse = \"\"), result)\n }\n}\n\nThis function now returns an error message if the input is not a character:\n\nnchar2(10000000)\n\nError in nchar2(10000000) : x should be of type 'character', but is of type 'integer' instead.\nThis section is in a sense an introduction to assertive programming. As mentioned in the section on function factories, we will be learning about assertive programming in greater detail in part 2 of the book.\n\n\n6.2.4 Recursive functions\nYou may have noticed in the last lines of nchar2() (defined above) that nchar2() calls itself. A function that calls itself in its own body is called a recursive function. It is sometimes easier to define a function in its recursive form than in an iterative form. The most common example is the factorial function. However, there is an issue with recursive functions (in the R programming language, other programming languages may not have the same problem, like Haskell): while it is sometimes easier to write a function using a recursive algorithm than an iterative algorithm, like for the factorial function, recursive functions in R are quite slow. Let’s take a look at two definitions of the factorial function, one recursive, the other iterative:\n\nfact_iter <- function(n){\n result = 1\n for(i in 1:n){\n result = result * i\n }\n result\n}\n\nfact_recur <- function(n){\n if(n == 0 || n == 1){\n result = 1\n } else {\n n * fact_recur(n-1)\n }\n}\n\nUsing the {microbenchmark} package we can benchmark the code:\n\nmicrobenchmark::microbenchmark(\n fact_recur(50),\n fact_iter(50)\n)\n\nUnit: microseconds\n expr min lq mean median uq max neval\n fact_recur(50) 21.501 21.701 23.82701 21.901 22.0515 68.902 100\n fact_iter(50) 2.000 2.101 2.74599 2.201 2.3510 21.000 100\nWe see that the recursive factorial function is 10 times slower than the iterative version. In this particular example it doesn’t make much of a difference, because the functions only take microseconds to run. But if you’re working with more complex functions, this is a problem. If you want to keep using the recursive function and not switch to an iterative algorithm, there are ways to make them faster. The first is called trampolining. I won’t go into details, but if you’re interested, there is an R package that allows you to use trampolining with R, aptly called {trampoline}1. Another solution is using the {memoise}2 package. Again, I won’t go into details. So if you want to use and optimize recursive functions, take a look at these packages.\n\n\n6.2.5 Anonymous functions\nIt is possible to define a function and not give it a name. For example:\n\nfunction(x)(x+1)(10)\n\nSince R version 4.1, there is even a shorthand notation for anonymous functions:\n\n(\\(x)(x+1))(10)\n\nBecause we don’t name them, we cannot reuse them. So why is this useful? Anonymous functions are useful when you need to apply a function somewhere inside a pipe once, and don’t want to define a function just for this. This will become clearer once we learn about lists, but before that, let’s philosophize a bit.\n\n\n6.2.6 The Unix philosophy applied to R\n\nThis is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.\n\nDoug McIlroy, in A Quarter Century of Unix3\nWe can take inspiration from the Unix philosophy and rewrite it for our purposes:\nWrite functions that do one thing and do it well. Write functions that work together. Write functions that handle lists, because that is a universal interface.\nStrive for writing simple functions that only perform one task. Don’t hesitate to split a big function into smaller ones. Small functions that only perform one task are easier to maintain, test, document and debug. These smaller functions can then be chained using the |> operator. In other words, it is preferable to have something like:\na |> f() |> g() |> h()\nwhere a is for example a path to a data set, and where f(), g() and h() successively read, clean, and plot the data, than having something like:\nbig_function(a)\nthat does all the steps above in one go.\nThis idea of splitting the problem into smaller chunks, each chunk in turn split into even smaller units that can be handled by functions and then the results of these function combined into a final output is called composition.\nThe advantage of splitting big_function() into f(), g() and h() is that you can eat the elephant one bite at a time, and also reuse these smaller functions in other projects more easily. So what’s important is that you can make small functions work together by sharing a common interface. The list is usually a good candidate for this." + "text": "6.2 Writing good functions\n\n6.2.1 Functions are first-class objects\nIn a functional programming language, functions are first-class objects. Contrary to what the name implies, this means that functions, especially the ones you define yourself, are nothing special. A function is an object like any other, and can thus be manipulated as such. Think of anything that you can do with any object in R, and you can do the same thing with a function. For example, let’s consider the +() function. It takes two numeric objects and returns their sum:\n\n1 + 5.3\n\n[1] 6.3\n\n# or alternatively: `+`(1, 5.3)\n\nYou can replace the numbers with functions that return numbers:\n\nsqrt(1) + log(5.3)\n\n[1] 2.667707\n\n\nIt’s also possible to define a function that explicitly takes another function as an input:\n\nh <- function(number, f){\n f(number)\n}\n\nYou can call then use h() as a wrapper for f():\n\nh(4, sqrt)\n\n[1] 2\n\nh(10, log10)\n\n[1] 1\n\n\nBecause h() takes another function as an argument, h() is called a higher-order function.\nIf you don’t know how many arguments f(), the function you’re wrapping, has, you can use the ...:\n\nh <- function(number, f, ...){\n f(number, ...)\n}\n\n... are simply a place-holder for any potential additional argument that f() might have:\n\nh(c(1, 2, NA, 3), mean, na.rm = TRUE)\n\n[1] 2\n\nh(c(1, 2, NA, 3), mean, na.rm = FALSE)\n\n[1] NA\n\n\nna.rm is an argument of mean(). As the developer of h(), I don’t necessarily know what f() might be, but even if I knew what f() would be and knew all its arguments, I might not want to list them all. So I can use ... instead. The following is also possible:\n\nw <- function(...){\n paste0(\"First argument: \", ..1,\n \", second argument: \", ..2,\n \", last argument: \", ..3)\n}\n\nw(1, 2, 3)\n\n[1] \"First argument: 1, second argument: 2, last argument: 3\"\n\n\nIf you want to learn more about ..., type ?dots in an R console.\nBecause functions are nothing special, you can also write functions that return functions. As an illustration, we’ll be writing a function that converts warnings to errors. This can be quite useful if you want your functions to fail early, which often makes debugging easier. For example, try running this:\n\nsqrt(-5)\n\nWarning in sqrt(-5): NaNs produced\n\n\n[1] NaN\n\n\nThis only raises a warning and returns NaN (Not a Number). This can be quite dangerous, especially when working non-interactively, which is what we will be doing a lot later on. It is much better if a pipeline fails early due to an error, than dragging a NaN value. This also happens with log10():\n\nlog10(-10)\n\nWarning: NaNs produced\n\n\n[1] NaN\n\n\nSo it could be useful to redefine these functions to raise an error instead, for example like this:\n\nstrict_sqrt <- function(x){\n\n if(x < 0) stop(\"x is negative\")\n\n sqrt(x)\n\n}\n\nThis function now throws an error for negative x:\n\nstrict_sqrt(-10)\n\nError in strict_sqrt(-10) : x is negative\nHowever, it can be quite tedious to redefine every function that we need in our pipeline, and remember, we don’t want to repeat ourselves. So, because functions are nothing special, we can define a function that takes a function as an argument, converts any warning thrown by that function into an error, and returns a new function. For example:\n\nstrictly <- function(f){\n function(...){\n tryCatch({\n f(...)\n },\n warning = function(warning)stop(\"Can't do that chief\"))\n }\n}\n\nThis function makes use of tryCatch() which catches warnings raised by an expression (in this example the expression is f(...)) and then raises an error instead with the stop() function. It is now possible to define new functions like this:\n\ns_sqrt <- strictly(sqrt)\n\n\ns_sqrt(-4)\n\nError in value[[3L]](cond) : Can't do that chief\n\ns_log <- strictly(log)\n\n\ns_log(-4)\n\nError in value[[3L]](cond) : Can't do that chief\nFunctions that return functions are called function factories and they’re incredibly useful. I use this so much that I’ve written a package, available on CRAN, called {chronicler}, that does this:\n\ns_sqrt <- chronicler::record(sqrt)\n\n\nresult <- s_sqrt(-4)\n\nresult\n\nNOK! Value computed unsuccessfully:\n---------------\nNothing\n\n---------------\nThis is an object of type `chronicle`.\nRetrieve the value of this object with pick(.c, \"value\").\nTo read the log of this object, call read_log(.c).\n\n\nBecause the expression above resulted in an error, Nothing is returned. Nothing is a special value defined in the {maybe} package (check it out, a very interesting package!). We can then even read a log to see what went wrong:\n\nchronicler::read_log(result)\n\n[1] \"Complete log:\" \n[2] \"NOK! sqrt() ran unsuccessfully with following exception: NaNs produced at 2023-12-06 09:05:17\"\n[3] \"Total running time: 0.000826835632324219 secs\" \n\n\nThe {purrr} package also comes with function factories that you might find useful ({possibly}, {safely} and {quietly}).\nIn part 2 we will also learn about assertive programming, another way of making our functions safer, as an alternative to using function factories.\n\n\n6.2.2 Optional arguments\nIt is possible to make functions’ arguments optional, by using NULL. For example:\n\ng <- function(x, y = NULL){\n if(is.null(y)){\n print(\"optional argument y is NULL\")\n x\n } else {\n if(y == 5) print(\"y is present\"); x+y\n }\n}\n\nCalling g(10) prints the message “Optional argument y is NULL”, and returns 10. Calling g(10, 5) however, prints “y is present” and returns 15. It is also possible to use missing():\n\ng <- function(x, y){\n if(missing(y)){\n print(\"optional argument y is missing\")\n x\n } else {\n if(y == 5) print(\"y is present\"); x+y\n }\n}\n\nI however prefer the first approach, because it is clearer which arguments are optional, which is not the case with the second approach, where you need to read the body of the function.\n\n\n6.2.3 Safe functions\nIt is important that your functions are safe and predictable. You should avoid writing functions that behave like the nchar() base function. Let’s see why this function is not safe:\n\nnchar(\"10000000\")\n\n[1] 8\n\n\nIt returns the expected result of 8. But what if I remove the quotes?\n\nnchar(10000000)\n\n[1] 5\n\n\nWhat is going on here? I’ll give you a hint: simply type 10000000 in the console:\n\n10000000\n\n[1] 1e+07\n\n\n10000000 gets represented as 1e+07 by R. This number in scientific notation gets then converted into the character “1e+07” by nchar(), and this conversion happens silently. nchar() then counts the number of characters, and correctly returns 5. The problem is that it doesn’t make sense to provide a number to a function that expects a character. This function should have returned an error message, or at the very least raised a warning that the number got converted into a character. Here is how you could rewrite nchar() to make it safer:\n\nnchar2 <- function(x, result = 0){\n\n if(!isTRUE(is.character(x))){\n stop(paste0(\"x should be of type 'character', but is of type '\",\n typeof(x), \"' instead.\"))\n } else if(x == \"\"){\n result\n } else {\n result <- result + 1\n split_x <- strsplit(x, split = \"\")[[1]]\n nchar2(paste0(split_x[-1],\n collapse = \"\"), result)\n }\n}\n\nThis function now returns an error message if the input is not a character:\n\nnchar2(10000000)\n\nError in nchar2(10000000) : x should be of type 'character', but is of type 'integer' instead.\nThis section is in a sense an introduction to assertive programming. As mentioned in the section on function factories, we will be learning about assertive programming in greater detail in part 2 of the book.\n\n\n6.2.4 Recursive functions\nYou may have noticed in the last lines of nchar2() (defined above) that nchar2() calls itself. A function that calls itself in its own body is called a recursive function. It is sometimes easier to define a function in its recursive form than in an iterative form. The most common example is the factorial function. However, there is an issue with recursive functions (in the R programming language, other programming languages may not have the same problem, like Haskell): while it is sometimes easier to write a function using a recursive algorithm than an iterative algorithm, like for the factorial function, recursive functions in R are quite slow. Let’s take a look at two definitions of the factorial function, one recursive, the other iterative:\n\nfact_iter <- function(n){\n result = 1\n for(i in 1:n){\n result = result * i\n }\n result\n}\n\nfact_recur <- function(n){\n if(n == 0 || n == 1){\n result = 1\n } else {\n n * fact_recur(n-1)\n }\n}\n\nUsing the {microbenchmark} package we can benchmark the code:\n\nmicrobenchmark::microbenchmark(\n fact_recur(50),\n fact_iter(50)\n)\n\nUnit: microseconds\n expr min lq mean median uq max neval\n fact_recur(50) 21.501 21.701 23.82701 21.901 22.0515 68.902 100\n fact_iter(50) 2.000 2.101 2.74599 2.201 2.3510 21.000 100\nWe see that the recursive factorial function is 10 times slower than the iterative version. In this particular example it doesn’t make much of a difference, because the functions only take microseconds to run. But if you’re working with more complex functions, this is a problem. If you want to keep using the recursive function and not switch to an iterative algorithm, there are ways to make them faster. The first is called trampolining. I won’t go into details, but if you’re interested, there is an R package that allows you to use trampolining with R, aptly called {trampoline}1. Another solution is using the {memoise}2 package. Again, I won’t go into details. So if you want to use and optimize recursive functions, take a look at these packages.\n\n\n6.2.5 Anonymous functions\nIt is possible to define a function and not give it a name. For example:\n\nfunction(x)(x+1)(10)\n\nSince R version 4.1, there is even a shorthand notation for anonymous functions:\n\n(\\(x)(x+1))(10)\n\nBecause we don’t name them, we cannot reuse them. So why is this useful? Anonymous functions are useful when you need to apply a function somewhere inside a pipe once, and don’t want to define a function just for this. This will become clearer once we learn about lists, but before that, let’s philosophize a bit.\n\n\n6.2.6 The Unix philosophy applied to R\n\nThis is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.\n\nDoug McIlroy, in A Quarter Century of Unix3\nWe can take inspiration from the Unix philosophy and rewrite it for our purposes:\nWrite functions that do one thing and do it well. Write functions that work together. Write functions that handle lists, because that is a universal interface.\nStrive for writing simple functions that only perform one task. Don’t hesitate to split a big function into smaller ones. Small functions that only perform one task are easier to maintain, test, document and debug. These smaller functions can then be chained using the |> operator. In other words, it is preferable to have something like:\na |> f() |> g() |> h()\nwhere a is for example a path to a data set, and where f(), g() and h() successively read, clean, and plot the data, than having something like:\nbig_function(a)\nthat does all the steps above in one go.\nThis idea of splitting the problem into smaller chunks, each chunk in turn split into even smaller units that can be handled by functions and then the results of these function combined into a final output is called composition.\nThe advantage of splitting big_function() into f(), g() and h() is that you can eat the elephant one bite at a time, and also reuse these smaller functions in other projects more easily. So what’s important is that you can make small functions work together by sharing a common interface. The list is usually a good candidate for this." }, { "objectID": "fprog.html#lists-a-powerful-data-structure", @@ -228,7 +228,7 @@ "href": "fprog.html#functional-programming-in-r", "title": "6  Functional programming", "section": "6.4 Functional programming in R", - "text": "6.4 Functional programming in R\nUp until now I focused on general concepts rather than on specifics of the R programming language when it comes to functional programming. In this section, we will be focusing entirely on R-specific capabilities and packages for functional programming.\n\n6.4.1 Base capabilities\nR is a functional programming language (but not only), and as such it comes with many functions out of the box to write functional code. We have already discussed lapply() and Reduce(). You should know that depending on what you want to achieve, there are other functions that are similar to lapply(): apply(), sapply(), vapply(), mapply() and tapply(). There’s also Map() which is a wrapper around mapply(). Each function performs the same basic task of applying a function over all the elements of a list or list-like structure, but it can be hard to keep them apart and when you should use one over another. This is why {purrr}, which we will discuss in the next section, is quite an interesting alternative to base R’s offering.\nAnother one of the quintessential functional programming functions (alongside Reduce() and Map()) that ships with R is Filter(). If you know dplyr::filter() you should be familiar with the concept of filtering rows of a data frame where the elements of one particular column satisfy a predicate. Filter() works the same way, but focusing on lists instead of data frame:\n\nFilter(is.character,\n list(\n seq(1, 5),\n \"Hey\")\n )\n\n[[1]]\n[1] \"Hey\"\n\n\nThe call above only returns the elements where is.character() evaluates to TRUE.\nAnother useful function is Negate() which is a function factory that takes a boolean function as an input and returns the opposite boolean function. As an illustration, suppose that in the example above we wanted to get everything but the character:\n\nFilter(Negate(is.character),\n list(\n seq(1, 5),\n \"Hey\")\n )\n\n[[1]]\n[1] 1 2 3 4 5\n\n\nThere are some other functions like this that you might want to check out: type ?Negate in console to read more about them.\nSometimes you may need to run code with side-effects, but want to avoid any interaction between these side-effects and the global environment. For example, you might want to run some code that creates a plot and saves it to disk, or code that creates some data and writes them to disk. local() can be used for this. local() runs code in a temporary environment that gets discarded at the end:\n\nlocal({\n a <- 2\n})\n\nVariable a was created inside this local environment. Checking if it exists now yields FALSE:\n\nexists(\"a\")\n\n[1] FALSE\n\n\nWe will be using this technique later in the book to keep our scripts pure.\nBefore continuing with R packages that extend R’s functional programming capabilities it’s also important to stress that just as R is a functional programming language, it is also an object oriented language. In fact, R is what John Chambers called a functional OOP language (Chambers (2014)). I won’t delve too much into what this means (read Wickham (2019) for this), but as a short discussion, consider the print() function. Depending on what type of object the user gives it, it seems as if somehow print() knows what to do with it:\n\nprint(5)\n\n[1] 5\n\nprint(head(mtcars))\n\n mpg cyl disp hp drat wt qsec vs am\nMazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1\nMazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1\nDatsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1\nHornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0\nHornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0\nValiant 18.1 6 225 105 2.76 3.460 20.22 1 0\n gear carb\nMazda RX4 4 4\nMazda RX4 Wag 4 4\nDatsun 710 4 1\nHornet 4 Drive 3 1\nHornet Sportabout 3 2\nValiant 3 1\n\nprint(str(mtcars))\n\n'data.frame': 32 obs. of 11 variables:\n $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...\n $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...\n $ disp: num 160 160 108 258 360 ...\n $ hp : num 110 110 93 110 175 105 245 62 95 123 ...\n $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...\n $ wt : num 2.62 2.88 2.32 3.21 3.44 ...\n $ qsec: num 16.5 17 18.6 19.4 17 ...\n $ vs : num 0 0 1 1 0 1 0 1 1 1 ...\n $ am : num 1 1 1 0 0 0 0 0 0 0 ...\n $ gear: num 4 4 4 3 3 3 3 4 4 4 ...\n $ carb: num 4 4 1 1 2 1 4 2 2 4 ...\nNULL\n\n\nThis works by essentially mixing both functional and object-oriented programming, hence functional OOP. Let’s take a closer look at the source code of print() by simply typing print without brackets, into a console:\n\nprint\n\nfunction (x, ...) \nUseMethod(\"print\")\n<bytecode: 0x5611aa8b6120>\n<environment: namespace:base>\n\n\nQuite unexpectedly, the source code of print() is one line long and is just UseMethod(\"print\"). So all print() does is use a generic method called “print”. If your text editor has auto-completion enabled, you might see that there are actually many print() functions. For example, type print.data.frame into a console:\n\nprint.data.frame\n\nfunction (x, ..., digits = NULL, quote = FALSE, right = TRUE, \n row.names = TRUE, max = NULL) \n{\n n <- length(row.names(x))\n if (length(x) == 0L) {\n cat(sprintf(ngettext(n, \"data frame with 0 columns and %d row\", \n \"data frame with 0 columns and %d rows\"), n), \"\\n\", \n sep = \"\")\n }\n else if (n == 0L) {\n print.default(names(x), quote = FALSE)\n cat(gettext(\"<0 rows> (or 0-length row.names)\\n\"))\n }\n else {\n if (is.null(max)) \n max <- getOption(\"max.print\", 99999L)\n if (!is.finite(max)) \n stop(\"invalid 'max' / getOption(\\\"max.print\\\"): \", \n max)\n omit <- (n0 <- max%/%length(x)) < n\n m <- as.matrix(format.data.frame(if (omit) \n x[seq_len(n0), , drop = FALSE]\n else x, digits = digits, na.encode = FALSE))\n if (!isTRUE(row.names)) \n dimnames(m)[[1L]] <- if (isFALSE(row.names)) \n rep.int(\"\", if (omit) \n n0\n else n)\n else row.names\n print(m, ..., quote = quote, right = right, max = max)\n if (omit) \n cat(\" [ reached 'max' / getOption(\\\"max.print\\\") -- omitted\", \n n - n0, \"rows ]\\n\")\n }\n invisible(x)\n}\n<bytecode: 0x5611ac7150e8>\n<environment: namespace:base>\n\n\nThis is the print function for data.frame objects. So what print() does, is look at the class of its argument x, and then look for the right print function to call. In more traditional OOP languages, users would type something like:\n\nmtcars.print()\n\nIn these languages, objects encapsulate methods (the equivalent of our functions), so if mtcars is a data frame, it encapsulates a print() method that then does the printing. R is different, because classes and methods are kept separate. If a package developer creates a new object class, then the developer also must implement the required methods. For example in the {chronicler} package, the chronicler class is defined alongside the print.chronicler() function to print these objects.\nAll of this to say that if you want to extend R by writing packages, learning some OOP essentials is also important. But for data analysis, functional programming does the job perfectly well. To learn more about R’s different OOP systems (yes, R can do OOP in different ways and the one I sketched here is the simplest, but probably the most used as well), take a look at Wickham (2019).\n\n\n6.4.2 purrr\nThe {purrr} package, developed by Posit (formerly RStudio), contains many functions to make functional programming with R more smooth. In the previous section, we discussed the apply() family of function; they all do a very similar thing, which is looping over a list and applying a function to the elements of the list, but it is not quite easy to remember which one does what. Also, for some of these functions like apply(), the list argument comes first, and then the function, but in the case of mapply(), the function comes first. This type of inconsistencies can be frustrating. Another issue with these functions is that it is not always easy to know what type the output is going to be. List? Atomic vector? Something else?\n{purrr} solves this issue by offering the map() family of functions, which behave in a very consistent way. The basic function is called map() and we’ve already used it:\n\nmap(seq(1, 5), sqrt)\n\n[[1]]\n[1] 1\n\n[[2]]\n[1] 1.414214\n\n[[3]]\n[1] 1.732051\n\n[[4]]\n[1] 2\n\n[[5]]\n[1] 2.236068\n\n\nBut there are many interesting variants:\n\nmap_dbl(seq(1, 5), sqrt)\n\n[1] 1.000000 1.414214 1.732051 2.000000 2.236068\n\n\nmap_dbl() coerces the output to an atomic vector of doubles instead of a list of doubles. Then there’s:\n\nmap_chr(letters, toupper)\n\n [1] \"A\" \"B\" \"C\" \"D\" \"E\" \"F\" \"G\" \"H\" \"I\" \"J\" \"K\" \"L\" \"M\" \"N\"\n[15] \"O\" \"P\" \"Q\" \"R\" \"S\" \"T\" \"U\" \"V\" \"W\" \"X\" \"Y\" \"Z\"\n\n\nfor when the output needs to be an atomic vector of characters.\nThere are many others, so take a look at the documentation with ?map. There’s also walk() which is used if you’re only interested in the side-effect of the function (for example if the function takes paths as input and saves something to disk).\n{purrr} also has functions to replace Reduce(), simply called reduce() and accumulate(), and there are many, many other useful functions. Read through the documentation of the package4 and take the time to learn about all it has to offer.\n\n\n6.4.3 withr\n{withr} is a powerful package that makes it easy to “purify” functions that behave in a way that can cause problems. Remember the function from the introduction that randomly gave out a dish Bruno liked? Here it is again:\n\nh <- function(name, food_list = list()){\n\n food <- sample(c(\"lasagna\", \"cassoulet\", \"feijoada\"), 1)\n\n food_list <- append(food_list, food)\n\n print(paste0(name, \" likes \", food))\n\n food_list\n}\n\nFor the same input, this function may return different outputs so this function is not referentially transparent. So we improved the function by adding calls to set.seed() like this:\n\nh2 <- function(name, food_list = list(), seed = 123){\n\n # We set the seed, making sure that we get the same selection of food for a given seed\n set.seed(seed)\n food <- sample(c(\"lasagna\", \"cassoulet\", \"feijoada\"), 1)\n\n # We now need to unset the seed, because if we don't, guess what, the seed will stay set for the whole session!\n set.seed(NULL)\n\n food_list <- append(food_list, food)\n\n print(paste0(name, \" likes \", food))\n\n food_list\n}\n\nThe problem with this approach is that we need to modify our function. We can instead use withr::with_seed() to achieve the same effect:\n\nwithr::with_seed(seed = 123,\n h(\"Bruno\"))\n\n[1] \"Bruno likes feijoada\"\n\n\n[[1]]\n[1] \"feijoada\"\n\n\nIt is also easier to create a wrapper if needed:\n\nh3 <- function(..., seed){\n withr::with_seed(seed = seed,\n h(...))\n}\n\n\nh3(\"Bruno\", seed = 123)\n\n[1] \"Bruno likes feijoada\"\n\n\n[[1]]\n[1] \"feijoada\"\n\n\nIn a previous example we downloaded a dataset and loaded it into memory; we did so by first creating a temporary file, then downloading it and then loading it. Suppose that instead of loading this data into our session, we simply wanted to test whether the link was still working. We wouldn’t want to keep the loaded data in our session, so to avoid having to delete it again manually, we could use with_tempfile():\n\nwithr::with_tempfile(\"unemp\", {\n download.file(\n \"https://is.gd/l57cNX\",\n destfile = unemp)\n load(unemp)\n nrow(unemp)\n }\n)\n\n[1] 472\n\n\nThe data got downloaded, and then loaded, and then we computed the number of rows of the data, without touching the global environment, or state, of our current session.\nJust like for {purrr}, {withr} has many useful functions which I encourage you to familiarize yourself with5." + "text": "6.4 Functional programming in R\nUp until now I focused on general concepts rather than on specifics of the R programming language when it comes to functional programming. In this section, we will be focusing entirely on R-specific capabilities and packages for functional programming.\n\n6.4.1 Base capabilities\nR is a functional programming language (but not only), and as such it comes with many functions out of the box to write functional code. We have already discussed lapply() and Reduce(). You should know that depending on what you want to achieve, there are other functions that are similar to lapply(): apply(), sapply(), vapply(), mapply() and tapply(). There’s also Map() which is a wrapper around mapply(). Each function performs the same basic task of applying a function over all the elements of a list or list-like structure, but it can be hard to keep them apart and when you should use one over another. This is why {purrr}, which we will discuss in the next section, is quite an interesting alternative to base R’s offering.\nAnother one of the quintessential functional programming functions (alongside Reduce() and Map()) that ships with R is Filter(). If you know dplyr::filter() you should be familiar with the concept of filtering rows of a data frame where the elements of one particular column satisfy a predicate. Filter() works the same way, but focusing on lists instead of data frame:\n\nFilter(is.character,\n list(\n seq(1, 5),\n \"Hey\")\n )\n\n[[1]]\n[1] \"Hey\"\n\n\nThe call above only returns the elements where is.character() evaluates to TRUE.\nAnother useful function is Negate() which is a function factory that takes a boolean function as an input and returns the opposite boolean function. As an illustration, suppose that in the example above we wanted to get everything but the character:\n\nFilter(Negate(is.character),\n list(\n seq(1, 5),\n \"Hey\")\n )\n\n[[1]]\n[1] 1 2 3 4 5\n\n\nThere are some other functions like this that you might want to check out: type ?Negate in console to read more about them.\nSometimes you may need to run code with side-effects, but want to avoid any interaction between these side-effects and the global environment. For example, you might want to run some code that creates a plot and saves it to disk, or code that creates some data and writes them to disk. local() can be used for this. local() runs code in a temporary environment that gets discarded at the end:\n\nlocal({\n a <- 2\n})\n\nVariable a was created inside this local environment. Checking if it exists now yields FALSE:\n\nexists(\"a\")\n\n[1] FALSE\n\n\nWe will be using this technique later in the book to keep our scripts pure.\nBefore continuing with R packages that extend R’s functional programming capabilities it’s also important to stress that just as R is a functional programming language, it is also an object oriented language. In fact, R is what John Chambers called a functional OOP language (Chambers (2014)). I won’t delve too much into what this means (read Wickham (2019) for this), but as a short discussion, consider the print() function. Depending on what type of object the user gives it, it seems as if somehow print() knows what to do with it:\n\nprint(5)\n\n[1] 5\n\nprint(head(mtcars))\n\n mpg cyl disp hp drat wt qsec vs am\nMazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1\nMazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1\nDatsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1\nHornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0\nHornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0\nValiant 18.1 6 225 105 2.76 3.460 20.22 1 0\n gear carb\nMazda RX4 4 4\nMazda RX4 Wag 4 4\nDatsun 710 4 1\nHornet 4 Drive 3 1\nHornet Sportabout 3 2\nValiant 3 1\n\nprint(str(mtcars))\n\n'data.frame': 32 obs. of 11 variables:\n $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...\n $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...\n $ disp: num 160 160 108 258 360 ...\n $ hp : num 110 110 93 110 175 105 245 62 95 123 ...\n $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...\n $ wt : num 2.62 2.88 2.32 3.21 3.44 ...\n $ qsec: num 16.5 17 18.6 19.4 17 ...\n $ vs : num 0 0 1 1 0 1 0 1 1 1 ...\n $ am : num 1 1 1 0 0 0 0 0 0 0 ...\n $ gear: num 4 4 4 3 3 3 3 4 4 4 ...\n $ carb: num 4 4 1 1 2 1 4 2 2 4 ...\nNULL\n\n\nThis works by essentially mixing both functional and object-oriented programming, hence functional OOP. Let’s take a closer look at the source code of print() by simply typing print without brackets, into a console:\n\nprint\n\nfunction (x, ...) \nUseMethod(\"print\")\n<bytecode: 0x558bff2da0f8>\n<environment: namespace:base>\n\n\nQuite unexpectedly, the source code of print() is one line long and is just UseMethod(\"print\"). So all print() does is use a generic method called “print”. If your text editor has auto-completion enabled, you might see that there are actually many print() functions. For example, type print.data.frame into a console:\n\nprint.data.frame\n\nfunction (x, ..., digits = NULL, quote = FALSE, right = TRUE, \n row.names = TRUE, max = NULL) \n{\n n <- length(row.names(x))\n if (length(x) == 0L) {\n cat(sprintf(ngettext(n, \"data frame with 0 columns and %d row\", \n \"data frame with 0 columns and %d rows\"), n), \"\\n\", \n sep = \"\")\n }\n else if (n == 0L) {\n print.default(names(x), quote = FALSE)\n cat(gettext(\"<0 rows> (or 0-length row.names)\\n\"))\n }\n else {\n if (is.null(max)) \n max <- getOption(\"max.print\", 99999L)\n if (!is.finite(max)) \n stop(\"invalid 'max' / getOption(\\\"max.print\\\"): \", \n max)\n omit <- (n0 <- max%/%length(x)) < n\n m <- as.matrix(format.data.frame(if (omit) \n x[seq_len(n0), , drop = FALSE]\n else x, digits = digits, na.encode = FALSE))\n if (!isTRUE(row.names)) \n dimnames(m)[[1L]] <- if (isFALSE(row.names)) \n rep.int(\"\", if (omit) \n n0\n else n)\n else row.names\n print(m, ..., quote = quote, right = right, max = max)\n if (omit) \n cat(\" [ reached 'max' / getOption(\\\"max.print\\\") -- omitted\", \n n - n0, \"rows ]\\n\")\n }\n invisible(x)\n}\n<bytecode: 0x558c01117f28>\n<environment: namespace:base>\n\n\nThis is the print function for data.frame objects. So what print() does, is look at the class of its argument x, and then look for the right print function to call. In more traditional OOP languages, users would type something like:\n\nmtcars.print()\n\nIn these languages, objects encapsulate methods (the equivalent of our functions), so if mtcars is a data frame, it encapsulates a print() method that then does the printing. R is different, because classes and methods are kept separate. If a package developer creates a new object class, then the developer also must implement the required methods. For example in the {chronicler} package, the chronicler class is defined alongside the print.chronicler() function to print these objects.\nAll of this to say that if you want to extend R by writing packages, learning some OOP essentials is also important. But for data analysis, functional programming does the job perfectly well. To learn more about R’s different OOP systems (yes, R can do OOP in different ways and the one I sketched here is the simplest, but probably the most used as well), take a look at Wickham (2019).\n\n\n6.4.2 purrr\nThe {purrr} package, developed by Posit (formerly RStudio), contains many functions to make functional programming with R more smooth. In the previous section, we discussed the apply() family of function; they all do a very similar thing, which is looping over a list and applying a function to the elements of the list, but it is not quite easy to remember which one does what. Also, for some of these functions like apply(), the list argument comes first, and then the function, but in the case of mapply(), the function comes first. This type of inconsistencies can be frustrating. Another issue with these functions is that it is not always easy to know what type the output is going to be. List? Atomic vector? Something else?\n{purrr} solves this issue by offering the map() family of functions, which behave in a very consistent way. The basic function is called map() and we’ve already used it:\n\nmap(seq(1, 5), sqrt)\n\n[[1]]\n[1] 1\n\n[[2]]\n[1] 1.414214\n\n[[3]]\n[1] 1.732051\n\n[[4]]\n[1] 2\n\n[[5]]\n[1] 2.236068\n\n\nBut there are many interesting variants:\n\nmap_dbl(seq(1, 5), sqrt)\n\n[1] 1.000000 1.414214 1.732051 2.000000 2.236068\n\n\nmap_dbl() coerces the output to an atomic vector of doubles instead of a list of doubles. Then there’s:\n\nmap_chr(letters, toupper)\n\n [1] \"A\" \"B\" \"C\" \"D\" \"E\" \"F\" \"G\" \"H\" \"I\" \"J\" \"K\" \"L\" \"M\" \"N\"\n[15] \"O\" \"P\" \"Q\" \"R\" \"S\" \"T\" \"U\" \"V\" \"W\" \"X\" \"Y\" \"Z\"\n\n\nfor when the output needs to be an atomic vector of characters.\nThere are many others, so take a look at the documentation with ?map. There’s also walk() which is used if you’re only interested in the side-effect of the function (for example if the function takes paths as input and saves something to disk).\n{purrr} also has functions to replace Reduce(), simply called reduce() and accumulate(), and there are many, many other useful functions. Read through the documentation of the package4 and take the time to learn about all it has to offer.\n\n\n6.4.3 withr\n{withr} is a powerful package that makes it easy to “purify” functions that behave in a way that can cause problems. Remember the function from the introduction that randomly gave out a dish Bruno liked? Here it is again:\n\nh <- function(name, food_list = list()){\n\n food <- sample(c(\"lasagna\", \"cassoulet\", \"feijoada\"), 1)\n\n food_list <- append(food_list, food)\n\n print(paste0(name, \" likes \", food))\n\n food_list\n}\n\nFor the same input, this function may return different outputs so this function is not referentially transparent. So we improved the function by adding calls to set.seed() like this:\n\nh2 <- function(name, food_list = list(), seed = 123){\n\n # We set the seed, making sure that we get the same selection of food for a given seed\n set.seed(seed)\n food <- sample(c(\"lasagna\", \"cassoulet\", \"feijoada\"), 1)\n\n # We now need to unset the seed, because if we don't, guess what, the seed will stay set for the whole session!\n set.seed(NULL)\n\n food_list <- append(food_list, food)\n\n print(paste0(name, \" likes \", food))\n\n food_list\n}\n\nThe problem with this approach is that we need to modify our function. We can instead use withr::with_seed() to achieve the same effect:\n\nwithr::with_seed(seed = 123,\n h(\"Bruno\"))\n\n[1] \"Bruno likes feijoada\"\n\n\n[[1]]\n[1] \"feijoada\"\n\n\nIt is also easier to create a wrapper if needed:\n\nh3 <- function(..., seed){\n withr::with_seed(seed = seed,\n h(...))\n}\n\n\nh3(\"Bruno\", seed = 123)\n\n[1] \"Bruno likes feijoada\"\n\n\n[[1]]\n[1] \"feijoada\"\n\n\nIn a previous example we downloaded a dataset and loaded it into memory; we did so by first creating a temporary file, then downloading it and then loading it. Suppose that instead of loading this data into our session, we simply wanted to test whether the link was still working. We wouldn’t want to keep the loaded data in our session, so to avoid having to delete it again manually, we could use with_tempfile():\n\nwithr::with_tempfile(\"unemp\", {\n download.file(\n \"https://is.gd/l57cNX\",\n destfile = unemp)\n load(unemp)\n nrow(unemp)\n }\n)\n\n[1] 472\n\n\nThe data got downloaded, and then loaded, and then we computed the number of rows of the data, without touching the global environment, or state, of our current session.\nJust like for {purrr}, {withr} has many useful functions which I encourage you to familiarize yourself with5." }, { "objectID": "fprog.html#conclusion", diff --git a/targets.html b/targets.html index 19b594a..35e5cec 100644 --- a/targets.html +++ b/targets.html @@ -370,7 +370,7 @@

    Table of contents

  • 13.10 Conclusion
  • - +
    diff --git a/testing.html b/testing.html index a3660ce..c70302a 100644 --- a/testing.html +++ b/testing.html @@ -335,7 +335,7 @@

    Table of contents

  • 12.4 Code coverage
  • 12.5 Conclusion
  • - +