From 25a4f19ca54d2e3a385281b1a16f0a35219a20d6 Mon Sep 17 00:00:00 2001 From: tknecht Date: Fri, 10 Jun 2022 13:32:14 +0200 Subject: [PATCH 01/74] remove freezePane --- R/insert_worksheet.R | 3 --- 1 file changed, 3 deletions(-) diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 5113f2d..f083bb3 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -228,9 +228,6 @@ insert_worksheet <- function(data, workbook, sheetname="data",title="Title", } - #Friere oberste Zeilen ein - - openxlsx::freezePane(wb, sheet=i , firstActiveRow = datenbereich+1) # bodyStyle <- createStyle(border="TopBottom", borderColour = "#4F81BD") # addStyle(wb, sheet = 1, bodyStyle, rows = 2:6, cols = 1:11, gridExpand = TRUE) From 054ab06a6db8771c0196aba9257d331d2651cb6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Sch=C3=B6bitz?= Date: Tue, 2 Aug 2022 14:40:50 +0200 Subject: [PATCH 02/74] Change server data access to local files --- vignettes/Visualisierungen.Rmd | 13 ++++++++----- vignettes/daten/KTZH_00000544_00001031.csv | 16 ++++++++++++++++ vignettes/geodata.zip | Bin 548787 -> 0 bytes vignettes/map.png | Bin 308053 -> 156273 bytes 4 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 vignettes/daten/KTZH_00000544_00001031.csv delete mode 100644 vignettes/geodata.zip diff --git a/vignettes/Visualisierungen.Rmd b/vignettes/Visualisierungen.Rmd index ee4eed9..69db7d8 100644 --- a/vignettes/Visualisierungen.Rmd +++ b/vignettes/Visualisierungen.Rmd @@ -67,9 +67,9 @@ flush_left(p) Für Karten kann die Option `map` auf `TRUE` gesetzt werden. ```{r} -downloader::download("https://www.web.statistik.zh.ch/data/KTZH_151_Gemeinde2020.zip","geodata.zip") - -zip::unzip("geodata.zip") +# Data downloaded previously and stored +# downloader::download("https://www.web.statistik.zh.ch/data/KTZH_151_Gemeinde2020.zip","geodata.zip") +# zip::unzip("geodata.zip") shape <- sf::st_read("GEN_A4_GEMEINDEN_2020_shp") @@ -171,7 +171,10 @@ Wenn immer möglich sollten unterschiedliche Kategorien nicht nur mit unterschie __Beispiel : Liniengrafik__ ```{r} -data <- read.csv("https://www.web.statistik.zh.ch/ogd/data/ojuga/KANTON-ZUERICH_jugendstrafrechtspflege_geschlechter_verurteilungen.csv") %>% + +# Datenzugriff von: https://www.zh.ch/de/politik-staat/opendata.zhweb-noredirect.zhweb-cache.html?keywords=ogd#/datasets/544@oberjugendanwaltschaft-kanton-zuerich/distributions/1031 + +data <- read.csv("daten/KTZH_00000544_00001031.csv") %>% pivot_longer(cols=2:3) gg_ojuga <- ggplot(data, aes(Jahr, value ,color=name,linetype=name)) + @@ -197,7 +200,7 @@ Bei gewissen Grafiktypen kann die Unterscheidbarkeit von Kategorien auch durch d ```{r} library(ggrepel) -data <- read.csv("https://www.web.statistik.zh.ch/ogd/data/ojuga/KANTON-ZUERICH_jugendstrafrechtspflege_geschlechter_verurteilungen.csv") %>% +data <- read.csv("daten/KTZH_00000544_00001031.csv") %>% pivot_longer(cols=2:3) ggplot(data, aes(Jahr, value ,color=name)) + diff --git a/vignettes/daten/KTZH_00000544_00001031.csv b/vignettes/daten/KTZH_00000544_00001031.csv new file mode 100644 index 0000000..6f34394 --- /dev/null +++ b/vignettes/daten/KTZH_00000544_00001031.csv @@ -0,0 +1,16 @@ +Jahr,Maedchen,Knaben +2007,628,2628 +2008,929,3074 +2009,971,3076 +2010,927,2987 +2011,867,2983 +2012,686,2731 +2013,855,2952 +2014,1057,3095 +2015,888,2850 +2016,1065,3171 +2017,954,2880 +2018,1057,2923 +2019,950,2944 +2020,1025,2903 +2021,1351,3618 \ No newline at end of file diff --git a/vignettes/geodata.zip b/vignettes/geodata.zip deleted file mode 100644 index 00f73ed84a08c6d2bb233d766b13217508acee15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 548787 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

|WP=kkE>3ZM|^({AkseufeTC^UR=u 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

Wp&P0+zF1=6X+Tbp<@ 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

EUD#^{$Wu`X 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

pD`R|9n>xZKo8X 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 >i99sJUD=@Nq((&tT-48;iIA5W2 zb1H_s_*hqV!TK3U2!!FKgy5m!+zQy?dUpx0Pe-g;@peKunro^7~Spj&S|aWNaA-=TX!i@ z`uQsnkg%}_(dCoOeb5o_A2;X-(1qX1ZIi% z-ZgLAn~op4i3cA$nXC8hip6v_bCOe7pxH==7d9EXZ3)bSJsE5u$2!1@AFMvc2cT#N zjGXN*a6IeIhhrKWzLL@)HjB-MwHF&$5v;NxZHf%6#ckFC&zxCAMP*5RT{zf-}!EI+!=8HoXI!$2dLx2xepW! zeJy>l;2RA*;?=Q0I)YbY9){nu^F?2uxYsrYHM*n(zK4w5%p;tFMepm_^!KYsN9Auf z)ZECmX5=+vC!0Pm!v04KQW8US47>B-5UAlqpGe%${l&ZI0SC5so~4 z+nKzG01nRr#x*~Qqg|w@|H=a!44{t#M22kD6qv=@1G4dX_vW= zIenZ@Lk^7l$7O=WwsUCNEVU3BuLZ>u>fpCZN6AOs`58w!j(?ORm&D7a02a~D7(|)T z{--77>d^evG;&|^grCX5Hd|Fq+TsDGd-mA1xjx-Cl_oZ&-LO?5M;8n-;$a7UQ4V(< zRyxx9G_KnMKW@V*sR)G*%jlWwNKHFDn9ON0!TbZunm;e8#lk_1^$JUoxPfc5`t#hF zgd=t!QAK-Z&iup=;b&KJB89>@b02@w4J-j_y+Mw$t$l8*R=w>1JW4+Zg+>LwBQ@!H z4po=!0|o*+Rjy}-qEZgGCUv^6Q{^FK8qJ9~Q_~N09>WWY^^cX9^YTTsuFxRV@>^|? zFl99$_@fZ_L0KG3;R-{O^%5i4L@EcEn0+Gh+|yQ-e&a%dx6F32BWL9WpV@mMuS26U z`+9it*iVNO33&QmNo9r$Wq3*R$nS^D<8i__arh{NvJ*`qd&o z%P6b`LBtYWj<3CUc22%wpS*Cr()Z5cH!8ep>Lr2i{kXT5mpXz z@XWo6x+mS=(`_78xBu{%dUD?Sf@M3MC&I;Jrfr;`c>EMLu$NdQeY&JKvjvioSfa&~ z{dFqO%pi!GbvJFk`)8Xa?i3V2TPSi~PFT{VKWMT{(=;Dz+rb>#VvRZeEQroEI@B&q z*LX*ggFVXO)l%Zc$%-tVFHGcEfNh=0qlPjYe?Zv<5&$PX02r=(Wd@7`21vRS9NkII zbkqwhNVeo2a(I1R(!d!*#W$(sA-U9!yuOepoLNTsf@}C<>ZaA6PmH%gH*Ysc42Lk( zWSlMhiP9`pH|B<{cKL7xb$ov_>!^RE#J>S4T|tu+2TWJ} zu^S}oG@R3Xy(MT1dxvixGYC4e)tYq85X<&Y7O>y44q0~{3>=q}F3|isguSD}Tx(%6 z3GY~k*vT$t1hF}SNG9+qM78WDQZw>SaZmMai>8l(wWKNDZoTc7H4xu7-~pz>K5#pfV3~}AzN>7FVie{ z1q85zr|hMk{<}DExl?4%8kb=*w*y&A=NzgpD=_BTy6F*TaZ+}M$G8{ZU+}_^y>`_SPGMt zAbHbg)O3v%4QY&6y*U<@Xo)*+jL5hHlY_T6h_a{42#ob6s?UhDDb|;Vw1=+rCL-tu z_C%;U;1v44Q?PhIYS!19dnO#mkCk;xR+y9oquQUZx4$%I`Mp1V6n(Zzu!2o7RAc;G zy`+18xu?SYgH)v}ez;(#u2ki&&eQsT8g+gZtB18mn0Eg_9%YlDA7$uq_7>J{w>J{< zDbs7OS~-vB?zJ}LsLHlz2p-jQ-1{82W zdt_)`JclCYUL0X4gKY+ZVSNv_H&C;^IU3WG5Z9A=#H>SO%o8~D(pr}IZM%&z>87H5 zr1_8X9S7N46*#Mzi9>ZRJ{cV34SBSh6O{aL=U6zkDB$J~2cg^%>_};rXl~nXhuzP!FBQeP zXAL|jA9ct}@gd&@`2m$bLOBN(|7CH<^jh7fRy!og_ojXRh5o2DqyLHWC0H-O zG~VB?*wxI4vmu*w(<>inx3M~Z?A-6)2(t2+{c%HTR{kinlRF@L+e9h4Vdb>4${^7q z?=}iT(9B;EMy5)cUas*`x)MT6a=g=u=D{de($HhI;O=BTnAq&)v2Ys9RpOtuHGT#4 zsqhf~``wK>*cj@q&;S={(!nJ1_4xtIRD^bqD$9G;Qs}DIjO_Li>EGix9oFis#fn_Y1$&>@3aS-M^u}fro!-aM! z53j`j`wg}x(Qk#NrByzleJfQ4^nAwD$(KQYJ1nz8)^#K5e{=Pp^(00eB5(&#M?ndi zEn3;O*6MtSart@&B~-$rtm)~l?yL(dSOYeV6^tzyHSM1Ga}^TgZUDI&NIB!qH1*}X zJ)gvyCO!}=ovV6SAFIy@yap>KHP-9HC;a2D^Lt^o;6(`qjUueQ;6+{Y4iOh9nW+#t z;@VK`uSJ_H!t2)})DE!$i5m(_g-A*W7?ZbZSWK0_Hjj#BuafeBL0^7jGdtA6+SlN; z&?EM489Z`2?O2}sL1gVh{kA%f9_Or(s5?+Tj0L!80C^3#3Hl)^RO8|7#X+?ZReLWl z4ABDhNd#pz;>K`#IYg4x$$|Qt@@-wW+F4b^%vC;9cOs8P1lDTBP_XQP4{NB61LLeH zxVFp`QZkiyGZ-dej&&yAaRH|rZ0T{Jz?}Oq5{u)3ejcZDE{Z_zPYy6@Jv3xuL9f|&3E8i7i?y!&{)5Mvg90&>%!E(o?TIA+zN!4Q|9OXk zXZ!wnXV4BC^2FPH%jy#l@A{xR| zr~)K{Ht{Gly7RT%y28kXk^6^8FV3_bx~022(PKveYUCCX>{dOQZGaLUB^L?Mz(OV$ zNGX&Yt6eb~%7e}kmq(U{Yn%kDmf`DTay9On?)sr%u3V);IVsBEZP6Ahh}9Ay8cGQ? z&|n}6rY;xAU;OC|D=93f1j2}Zx4=4Y(4{f4Vml6`PWuySw(9LquygCm0Kjzsk%KDe zzp)b(rf6&abXbbg(r{^<@$^+T8wQ8nrN$7^gwZ`$(=iqi$^uCHftL?%ox^{+4{9saNg<#wr(}if_bUZu@4x9gtk+p;`pz=Di2c$$klW1H(%H0MP*a+ie((cWq zbK9Q_x}B!9`=FGhZkF1vfIVrx=>(6SuqL(L;{L~Tm=$!0t^Zq7hGP0uiUoG`rp+7# zO^|qwzezp11UEtrx4zT9X1{ZKn9tV4q)K?iUS#XuX7;Y$Y>#Aul;|aQ3RAQ_?ss&7 zh(DW0v{4Q!xwf0Gh!wu@#?NA9vh-AwY>!`-SgBMTjVA+ymY=xb}k9j!d(JArD9@3cUKRkWo=*F`EzQ z$2dO}`9`cE+UV*FftykGMkHk9_dkv6UVnqmJF zqf00QMo_Rr&lLQek#|tPes(3Pe~MW z8Adre2A&49UMvG&d5Wsd{848E7Q6*(XgQY1jvYBFMb(5HRF>thl+j>&zAFKG2+$bj zspJP#>kSZB4TO7M2;G?-(Mbr*-5{C&P9QSt(@mES>_akhF&JQtu=}#bK>zih3O*?Q zAST`T!%yKh&M$PbYsIif#PD^-I)qI1Cw3%2gpF;?+9pEH1H+i`;m1=mIa&mjD4vdy>M-^(Ctz!uqDx50!ouQCpeO29bb#- zOHC)#*Sim;N~K*q+CAa3!$S{OkeMX`uTZj*joJ@M|9f1)Wv=AkMw8$_+EN7r6zsmR zU4k0I=Au$LCpUoX_9a5*!Yu+G!-&+aIhHj0Qm?EzQ*ka)9*9Y*@$n9J01NU|9lF=T zfs*b6EIfWEV(p!|A($QlYzb9~Cy9VjG5H{a1y4^eVy1pT@GF4_SnPe~k&SA+iRl5*guuIzfDjq+BAt4+z2ndo^d%yCh~ ztv*Lc)q|}+_hK`NNoTwo2y9v7d}bQFIZc~?^c(t8=mAS^&Y5gvH~rAaLG5ovhEL*@ ztyR#Mw;&>FUBLIX$tMd}i=+FePGitkwbucwqRDVa9!Kc^LYDqNyUE7xnH0%0SZ1FDb4bRu`a6DE~siegLjM#L=Zc z*0j<#P7bIj*lwcMbu0e5BM#2{AenuKP#T;Nd0ZwT?7$Pk5T$}Mz}IAjptRE4bu*KS zf2b(-R+H_gNE<*Q2fme`&Z`}o_bs3I88ctY4J6oUqbRnZtTJdelz2f`p0a>sTxp>X z;aZ>S#7nC2iKe)uY=3H3I0=oud81+BcifC6qi^Q`_y8ghoI;P*8fakP>ctfw-+-_$ z#VI$fL&52foJfST73t=0G=`knl3HJYQrr$ayIU+7++tA~YFhsKHKirFHD$na=PB&b;izeni|T zQ89@`7=SD4hJGjT=ko$Tk9$X#eN~Cc0wetrf@Bbgdq@`{TX*|`NK>oHZ6J>qj@XXi z_o|i}gE%$MpAf$KrT%0r)}-zr`4@k010#q4klrX$iar`79yN7>lzR$HQITa087j~~ z1qvf_6)^iY$5M#i8G6qpqn@>)Y{pz+`)?r{dz@()@qn|RgB~4-xB27_338J0fPP%4 z%KD_zJi5}S#wH<`n>#r6@RLLHWwq!}RNbITZ3H?3uTrW7{cywW@`~PAD3hTk9qZ&t za4e3K1spl#zyhh0A4sVfoHcn3 zaw@<-oPW6Np!DBq;Wfb=1N?ty8JjMx{5I;90>mZ_cnX=XB=2D;B_`)6WQ1@zVa7VX zh*lrz;2|i3T=pfOejB&69B@WC5I*D6VBnN`>5J0!sDpN#fvH*JpfS1BA$O?%l%tVE z2B{#unYc90K2YR(DC9W0sz0sALI5l^*9bHo%Qh=@#^4DZ8aYX{4(Tz**j*zGT?mz* z9LBIMQcfw*n{VM~w|5n;R1u^AA}m;9CmoTwWml0WkRWp5_|MQw;Sp*-a6rQct+~(@ zWX9zQwObA`HKkWcU{{#F5uc1Nx z)gLagJI(v7(@JCF`dJ!Gb`-xt`vITGQWUwPv%>s^cg`VbI#~$L+;Jy%cJh>Wl8OLR&FjGMh zK)`HvTtcrN=m(f=ny|Fjt#tJ`TTBP@z2cfW^nX9D6HS6CX(nxBR0^wDV*$Zn=^u=R z#h4h-+Ajt{d6wCTB$(8aUPM7#Hfaw}II$orKSTu!SVcYtB#s0~IZ(QE{WNMs5vNAr zU>cT#H!q4o1qB2~Ryr(IQbr~Oar+{xIEv6y<$NBNa>6>=A9MD$GP+C$~OS`xoy{(?m&?3a*RWnQ!eIU3VI6D0gs1 zHG?LudTk@46sGH}=z~sHYfMhvy$+fJu>>Oc0E3$4@7aF+lfQxc;ET13^Iu4DHO*sdL=%wtRP`ie7eDHvcZn~&(RlEW*l=tODU#spLJX^~ zm{Tc0N+EZp)?*X>ro&X96|M242ld9i4v>alh2&kNu}8Ie~Km; z7UJa0;>tzK1k5i|TjGBJ-lKhfr0nA1-5ucL@PQxcTgS8No_avy@Dumd@;BJYduu-C$A*$%>pOl3oSx0O7}6So{P3fq zvX(p47HbOjD}g;DtqBHqT^XONVzPrlBzdB}wgIJllh9lCko^iop6d(&29>E1Jog)! z$1D1e$Ga&^M3Fz6_(1I&^>9xH?_{QR19cZEDugn;A@LLB6wo{gbHe2QF|st~4@?Yt zBGGPJ!t{Os&kTe^!OO33G8ZWf_;c*TO4wXI6fzbs*bWaXu#{kGM=&iv6ijji3p+$E zRRf&gb$I(YZG=Fr8}T#dQQj1m@@C6VLr`w_mliK*vBdPPW6Fi7@F}O0tg9`~pBD7w z-)Es#4(N8irZc$cZcm?o4!$kfa7G7>fZ9E7JxRi#H9Fo5yARa!XguBLc|A1IE6!j1 zno{3Q&F-+}r9nEdc>lFP*4#K(nV*$L5U)1Mh&WKG*vB}@k*dvMtePk!< zwX%RiTTf?**t5cS#&vW{zTqqkPk+z|D3G#~G@qII-9E(xr7Ly6BpHZWa|o33Jt2}F zTRsayfM85ENME2u7&kY4E3&S%2Vc<(Rehcs)MkdL6 z)T+Dh2;L9i-cra2qj$x9KU5Zf-VhmV?v(JjB+O6eCI!K2ni<@_#Fk)}ORBzQArxMn zhbTIiLCy0fn&l`7f`&>6=WP&y%X@#65zE?yk<3r@sT)muvK|K^nF_q*CMg9H70I?t zQB?hlT^~l&-Or`O*|6a2b-(lmCDZWwoH*CK=|)~C;P=bq&;{YkE{GWQm?p$s+?|&H zyZ~?*@hVJXgWu`8|H6cPwp%IGf6sXdr<{R1CBMEK^~^>@Pa2F7AGrUFux(L*q?)ED ziol@$Z)hx}h|CZ4O@yiit~7g5^OM?3qBZL?3KA&Y>~{Y)7DJcyj?EKP71|?svd%qg z2fu4uxmD#9k(oY=@UXKG%-V@Ew$CybBSAHsF4ueQ*n$1 zy7Fn^h;49dOOXAeLHJL&6FagGd7Q$rAh#??Lyfc}uHPKKC0}-AzV5KA)AdFA%Bpp* zE039jWsLOD{FUPTN4t_EDJ9o=50AD<_UI7-loXKs>>(!shTw4;Cnr3Y@{0qAjxZ*- z7=bICAdj!d36-`tz5Xzz?i%laOCku?z2Y63i&=RyYc_t%1`m?5bp#95pASOZ7fLJd z$|yKXuEV1LQVu2J{D!@vQqing>iKtx2ph!l|6KB4&rWUlfjM*18~4_eV%DI_BUh>f z3Ao))H*Ar^woo7(|8t>nh9_ys$+qHKAb$V`w{V4%b4OghTn}3kjH?y5od#p;_|XT) zl4=)Rtmy9tK8fQrpkFWPb(PFcI_nUcePP)=B=CmvM-d2HR zRv>6s#iNuT6qht%+t(Pq*DmatoGr{&EBz2MKz#DODD@17eb&OT^jmIbN1WDY zk2VCkJm>7@)(;i5H#9~jidsu6q=WB#d*NvY zyuB!s&GVZ9KV zrb$LtxX`VJZ^~+KK&wvTZQ1T{Q~2C1+Z5Q1mS3;d5?D|=+n^mtuk4xPC-!Jfe@9(q=qyQ{}FkGf*bjBk6R&E&4P#p41EEdfySW&b7x;-C% zQ&-LEf9So0wwDDN08FzYwtZyxK=y+v?`gfn55Vh$-2ipA7gwE76VX4{1`#WZpIs#! zpr#u?ApGeYY{ylFgLkGU%6t_>3;TJlb+STT9?Olaa(xVa5z5=-CqiiIx$6URzdDi2?oQh;f#)xgHBg6I6hth97Q?JeUfNEB00iNQxF=XLA5K4pX&O-oGyygqbKb{@P4Ag*u^ zh}n?0t7I0El}Ey+FOA{Vn}MxYunw3xTE@|=bl6%h`=&)@luyME2eE(o;p5uQ#7}=y zJ{h0mcJL~QptK_GTL9LMDK&?}5qfzr=9iTu9gX2CB6T}IQ#N^RfHQyYG&JX^60>{T zF_V&D_~G*SPxHy^y*N*%6Ok3-@<@W6qZATfqedx~%zC;4!`F4NLD87FbP#tbg%?Uz$QIwbb;Ff$JXm=BLjm;~Kf{pzDfpHDQBF z$qFp4h9mg-He}!tLO6vYS$qe;zzz`L!W_IU-p#sa@q+_xNOQ0rGt+2Sk1=V{)JXQu z51XN|trmBcp+~E3o}E=1vesvakDNu_J+mfV*qs%6jz;+0$_pLV6{5RRVmLzcs`sT^ zHqznSlP_mxQ+iU+nl6Q3~ zPin$urQysz|A!6$5@=%gLyLE2#XiJx(ikl(-T&n@ZcFF^@~P*2B~~a zPQ6K*ZF|mUtvnpye%puyPgm2IK!0HZJiO^l?KM{tDQj;K|w*kJ*Q?O zNJFg%bCs^2xT1xDqA0yf!65Qnw?t?~6O+kh7rcyAZ9zACxrVA4M5+^dM>vBF{x+&( z44BFyN7iLUEV0q8C(D+&4p<5$wMjnm=OXj11d(?@5UVcoId-M`I|$tpRB=*Ah zp_M&$qvd!n*&r6I=_b`8>xq$eFWYcr<18{EMA#Q^c#^R;Yfwp$#%no;ssf5%)OD;x z^FWeJjXP9BIG|xYxofQF6h=Bg>6${a*Ik}y0u#1U3*LpJI%D7`OJBNOs1gC}U~H02 z0%*}|pQa@~+xkz}5&LsU|Mys!DZyK4wc6W_NYb5ie=_(6aNK!!!x4Q|ZU>T8i0VE1 z__K6u`ZIj!R&Ue-32kNE;^it1$N69`t26B$;0v_BdzmwoF*)R+yUJg9jR$j=N%=46 zc5MXRGOx>}NtWGFvFd^{qTLj_8L0~)Q@J5=ze$une-yUY=_nvip!o!{rtnXz&J%A?2d`iQ zDFxaC#Dd67ku!wuG3?y%iZVH{fW8$sH8byCCrULO$$23y#{(>TJJ|8Al;?gNkgCdr;ef91*qW$v2!>o923W<` zsL1j~!LFweh5`KLAR_H_NQ8toZqC+P9|TGJ{8I5ua>GS#7t04jC50RMLCoClt6b5E zSUc=_*HBuOhV=c9+K>za#;jM|Bg#&adthl^L=t@+3|e2k)|=5S30 zMeM7C#dXsdX{kn*Nfp7XVp_+@fh$#dma?atDP3zH;$$wL@F;v?ale_~$K^uT-LRkh z+-E7CB2}=xI5>W}?x;WU#6c2X+aByT^R-4Qxmq26G-%V!l!RbJQ$Nfo-uvGHP~mry z|1C>a|71*6V<^w6L*{VC!TCn`HNB@mWMNct6e_humlZe9M zEv9s(ZGdpMRj7e1E&(;s^G;`Y<1G<#!?%HgNFk#L)s6~djl)(a^_q*LgD}f@;-|#{ zz4oMG^pXBh3g}8rr)lky0hqSkKyIFeH0NrRwW7~eYpIG4MansO3LyotU5Qh0%IE?Y z#EOubS`#5jX>A17df`FR-9<9+!|l)U+G92*nu;&9r6eLXG6 z&54iKiNu%tvzG_i65%#ZDj`=fd$v^}*STNfCe%o81&joB2KgliI?*<-%1%=;2&wa# za@GSYM1}9ma+F)32r><<@NkomLtyCi=T;D%)lNd-a%?|iU4Ay`yOuL3tCmMuo|xHq z9fBXTGr~)>pbr}3SIX0n6@~7{T3(XXYAkVG476k|nI$=%t!0^qXm(U{Yy0}MZUv_J ztGWpGs2IEXSIb`%OBZk1kA2h)!XOPwg~*&Xr9RD-v{U2XEh6D}QvVlnIh~y!pnW-= z*=O%x12j&LS82NCHYo2$EQ-Hv38M+VC(|@K$!FqHIX%<&=|72qFKh(MXk@LYMQNup z$5qVUMQZLR7!>?IW8FottuCdJ=(vHCZ!${DL>zgT^hNvg#~9~3PxDq}yDoKu%Z)Bc zSv&*E-g)yumK*|MV?)Eev&is>E01G>L#f4x$+W9G>$(~Ufjto^XvCq*4B;Jm7o41z zO2a#@Vj>N*&lb|rf944piDW;K=`PvvdNILLR|k+agK;5x$3^U8Sj*Q>yp-Ahf|gBO zzviJRE?Hfuu+gHnb8s#`@FRA8Z!O+JD89YCjUW?QhD<)y;wYsPPS;&{vygLX;m>H? zt}xwyiR;AP82roJq;%gVE5iTVJXgyz>9y<*?p%qX2wZk;Ja&A%;cM&|Kt#%x@O7oO z`Q`Ya=)cYLW{Nd?f}RkW%Xxb6gdf7UQ?}=UpPhW%u|ElO7F)h;yLrW5KKYTn-Y-05&xb%^24_LwyqlyeYdZQ};>50#J!?|t?UtDGGoez(z!)6=%XAJ2=s9z1JuLM>?a zk@Er}()d|~q#5UoE5@+YRj8xLXz~x}vId|dPLhJ(GaP4(Gf>?|kcAO~B^#=97TFC= z7BSryuVe&iONY}Yb?jzxJB{h44zyv8Iy1YfNBRm{qxs9UHk_wGzeAtCB_H-|m7hlQ#3xs^kO0u9^zu4%PH z+U?0M;1?^lE*})(*Gpm|VPEfO25eU9sr%OTh#c9tDo!Jo8Nc&54X?jMy(j~fmDpd) zh!zE@Gy{@?YPUmh+#*X1$LOZikRz8OOgTlAZ6A`Sx&%_?*pKWq#P@gPe?0$ps z3-g`%Ml8B{^ViWFsCCHM9+L(1ELK3GotfKHvU|9t1Qdo1!=z*Hc{}ed8CBK`O0IOt zK_V2y$x(3oOz(aDfdon+cRqDU9l>1dKVD)sO6hV_Uh!1PajH9>ILu#OE?a$xdZIQ& z%@jsr^A!D@=UZQBLQANJr|U`B<<)Sk*dY>oZ9_!2Xg4R4PW%4CDcI_s|5itpfBh$y zuP&hrIp6tIZpTOaJIjviXXuvjA~jc>mCSc<>~ZNK5;4;`VFjlC-; z$*Si;xRC4C_~~byE#S!po=^9X#crZCFEnwZ55={HsBITo*ntCFe%%48w|iJ}wL}Dr z34i`GXP>tppKpStDn2lg@U_jaJJBFcl1oVPB&6zdvrpT-o#cr-^GI`@qZR(+CkgZc z)1>qQpG_D<&T~q_wKkfAOnL(tprz-JvG$3i{)PPo#byx*L44vO(03paOw=D_Sgtw@ zx~N2|UGi9q5jJ{TuIb*}g(H^k5`Rk%i&_5^dQzvcp4y>JFNag=%P9`rjaJYP8Q%V_ zOIR0HTom%@Hb0oyWVF*06lWg`#uTp+a9P62Xfl7HT{U0%Sm*q|e#}0?-kUZ>m3blM zy@3+XySSmVS87b1^Uj|xIoC27?--EJ8$GfpYWQ~VbrO|6%u8p&lDDH9Xh1%nZ$fsl zn{&w)M7_-Dhkj8aA3Bc-=J15yXzR|pc@mz+O3JSzKHp(@UUepJyeT^B;8+Bx$QvWh zPp&{Rd&3B>t2VE}$9F!6VRE-SKOHm-q=+C^J!M%vz-7MTpRO;+8At5HBs*y%n7hoG z#sH%d8G3L!E<>#Ush?UEcMmbFjq5yt&7^qG21faBYb+8o(V|U111f|SPWBFz)U^xb ztwNU5%Aq7$q4OBjewJd8-?hrjuD8=1C=cYhUhY|8NZ4JR%m{cRPQ-rK$#GN2@iv<_ zMS7SOiWv6CCQ&lHGx;G`IDHC}p`%o=`pZgk%oy#Pp?ltHuJS-7_AX_$*UNdzqVjd6Bq* zSDj2Hfkt&>4ujvc64d*&YND*jO8)F^3G;eh?~aze)?&sDR=K;nW3+A0o?aQ?lAv ztORcu7gL2;71}t`_%jg7Qdp6%#cIGOS@i7@7rfteI2u}KJw#YyFTI`&$EJ|Ur+{Lq z)V~)M3E*J~ZPg=%Myd0b37X;fye@7a$aTewX07M&v$|fq^BJeOum1ZY>|JzO3s#zP zi2ztyNij(+D^Z-EFXetMkwlt%hpLfK-SkZgPQRh~W)E@IEyv&TttoH)!tDCDd{+uy z^eSNC;%&_u~5EXJ&db&O?&zt`LzdJyAR<#BI;nbfL@{QCAx8$>P97Hw@c* zdl(Us6zK-(p}R|IhVJg}?h>U_y1To(ySqzD8l=0P z+pm6p|2NNCyqHne0Qb4BQ+uDY7Z=vMD^~nq%OZpm>%c|>FociHrBf0$%j?4k3aeM; zd1MHQ6>?71lxzY@yGNBywoYE?g?WIJ2fsFHM+ zXqoIkdOq4cma85nif7oKxX-%@5}?)sD$m%QMP zVzzc8jb_23CWL5A_D`#@lzBSfFUhA=9axJD1rslV?og~#W)*_CGGyt7z(23-lra07 zqR8!%zG~+APWgxD0QaDk8-n9?A8tqf+w~7wYnlhpBVFN6KWt8NCzqWb?*sw{<1k?m z9CKQqW);RFP@3;}vVc^#;{e%yg`eXDGTJ6kto>32R@*auGLBI8rE&ilW>bY7)1agzWvVQSNmf@~KeitE~lV&F-W!gZ_a7N}HoxESsek;+Z6Pg*^Lj zjO6ubdt8qDlc)F`wj16CqrMkb%Ol8AnxB#zAwbi0+*meVFgn}{5t!1q@rw3u2Ino+ zuG}i%+hrt9T|hn)QljiJA#^-)q_McUc2`io`qxw<;G$R8vyHCxG(2wGjm{v(UFrtN zev0@5vMMojX=CbCT%m-zogu#xpPO>ldX1#SBZn$v0a6B;=gy;Q(UF3V zsDmhXAB@}?s?s3ju z{dzWC$z$%n${(JR+c>&w6Lmb2j4+K|_v7$??(;S+h-__xfRhe^FEs5S2VO~_T_{9;2W32exJH< zv&9e`F8Cfy@Q3TktC?D+%XE?CkK42Iq6eo*;Gzja;8ZPleSfc`npIQ=PjYVK1N$Qv z_pfb~VgD~r&O`FK>j9)e&p64;EHN}rDH=BQE^ycV?Yb8Y5+uNDk6r53xa-2jmj-BT zJbwI27yZNx%0C2F2rlqXGZ$Sk$v>ve*?H#%3k+!6*l?uu0J}4>9dL)GpAwvVk8Qa?p4lnjBDV%eYV;2%0&>VlRa_A_@UtH>GL4T}hVRh6 zU(;B4ytR^JR$tB+pj5()9O$S-D>(Z7+u7x0*-6&o1lxd(Di5b%d4Vp!^L9{_yV$yd z(6tSa)R|%no)63=mP`8V9s6)ZufkIjki0HVR9P9Xb3Ifu8(+tmOllT(-|>Nv@9DHi zUc02FWd#s_TP=-ko_i~Si`0?`G*JfaTR+5}n-TCuY~5TAHb92Wj}ewDF1O>C90VutGB41UayXK}xXoOF@%g~>N^&bTe{w|CgLc_w%`c9Crxuz7lfK0IVp zoH#;NQlRVj#&;e8U3_Xj=~`3!GBoy|a&k zhACjuAIyb$67e&guSlz^nEj?zs@7QgWCg`n5U#BYu;#24ik}F^o>#3RG%e=iqQ8aue7Un%`6M7tgTB=3y2cAn&|>!sDqg1w z`h+@<&tm09^aBCU-N`}3pG7LT>PN5m))k%aSJ8yIMeKZoX=;$ik>q3AHBm-{*nWJV zU$?NO6lQMogEJtj;@h3qFZleG@zBgTm()u%T&HjKxhvQl&%&?yLGY?6=aQ@bYmZW$ zyG9*08my8aJ}eD**1JsS$fF1%UU){-`ui0YKV3}i%Ha#64zWatwY6f4LwV$(93&YB}$Ltad}x- zjR8Zp&AJv&NHr7Kc=R6^KntrhS(7;5C|sKgDevLo;iZ1LJ!0Dv7Hl!k&0F!c2n6vd zKMPn6nxLO;FUG(wbRw3Dh}kX)Vu$H3aK58eFMlCXX4I=;B?DLmeY_2pCg9Rc&V>zHdV^78W9nJI(I;%bGtUuwXi#at3>+4fPiTO2!eDk8FqQ)7O z&v?hnuNax~NPEt|Wo!_4`u_`5wnMb*eb}5W0t#yG?WmMZWtXsy&atv;)M#-sANja@ zgv+cC;!aiHC^9OjTM0>)@Tdt9v2}HI9k6(`Nuj6HtGAHNrCcJ}n=i#ms)z5jDSkAy$0}$sdv>bq zl;t5@8>}fFATU#GY8uf23BWo5kYfDO?B@jXf`qRf>3B2VQM*yw@afxE2vNs%(LojX zaL$&n6HTp_6)bAK8lS6vmN?4(#1YHz{@_{h@TTMkRj$d;qLA2-X!W=g6RI89=?bdi z0n@VUiPB!r|C~;h_*<*LPRD$y{@H24Y3B2lF%8F}R92nCJCi!cr_YEO&kfck`T>g; zK4Hbt8=DBdcFDi97S*3aoOduKtdD-NW>36|LWJS>E^Y>!lSnuIdiA0RTd%~g@IE5` zS;IO=oyjb?Gj%HC0{l@jaq_R8_L2qAXBH|pMbAp2X4R(;EYhb(sy%yE{S}fepNgJ{ zeUC>~8rTt911j*VS!;Z>E$Br_=LCUPqOSE;lkOyf)f2@1;7On0$jCIq8BUfWeLA{s z?zUGh&hNae*SP4-Soy#V*RA090IFDRnS`0~xVjetEF9?_z#DK|!>ZYtPYtESd2An; z>_>{NJ;7PMdc#Hcgg^fa4z7Q4_7M{3iTmvdHO-J|+{!P!s*BUa|0W_dB~`2O`nerY z^SqN43uwlU8-TWftw_K#%lSNVa$bQtju?$tH|`NJ1G^JArELbEW?AVbK3<0c*$3rY zJxtv9&NDBb;&VKN9yzb^0g$SxFs}UMJ+(_vYQJh*f&dh9L7r&P{xT%nvq^R=(3qjf zbG=SDD#q=XEJD0iR|yR{W~xQ^f7=5@z53C^|61mA|2t%zDij09Q=x@hvnsb0M&7wa z#LBdCzw*zPY*x*c6x>#4RVb+0Bgez_$SU;0H9HA7f@dDN#`8{*c^;Acbe?H^CDv0O z@l{1*b?Ux~O*jrfLHb&te_>T>gJ&e8{%kkmF?jL}bwK!x&lLHL(KJp0vi64Z!B7$n zt7d4feh^f6mGGOMQE{K@CyQM}UZJ{iH+(e)Fnd(d>Dv7Ezr?DRe=>6d9w$@& zP-S?VwMgO;+gh1eNn`R@v-*;@K-SwYq6;(Y*nw5X_RF?*UUhV&_cQhtZlK)KJzqk+ zoG>?!a0G;!fFVo_IT#5ys6?wZ?{|*I+K5xKnum@sRq?3Xi;>ZP*9Sd{-}-;AdyD6n zmedr%Cmr~Vcbm|ysyoCZ>U+W(FxPEtml5os^*%6?oaITW7#K#=t1i2FP*as;?;NLI zuiN4XZlf=o0g8@*HW=HW9XWEqhhvWMcHPG(P5y9QGNS1u?e6HTso65Nn?vs@`9o{` zJNdBC425bC?ZRUYA^=s#%x6Gw0*V!M}Rp6cz3Zrm{jLjTg@E;k=6748a{#qJI70k1OS z6qp=+O_NN`%pLeye0KRftz{)87N>84_WCm_g|y-XTxx$X@Zyi^GH+*D7~+6bOzBcU zk!fBH1Dq)VZ$x^kWG;(=)2-g@^2;)1G;XHVol^b|_jvr~jUW0hkxaV+%%i z4~~yZRlv_BfJBxRl6R?9v0yLH9pXyW!w|u ziX~QQNZa2(h~5ihqwCt@C>qRfBAW#XTU`)`gn;F5aSZtC0F9Mx;2_Y@zh%xTFE2+p z`*jl3weaPlYnVzI9vMVlB+;sc!8%JefhuwPt$y&mxvB;1+bKzUD-!-v_05tOQ+E&Eumb9N7*SWWo6tdlL{^|s$#HcA9$Zpc8d-X6DM*TBKTognF#cEXKYn%!lo|EZERI`Fx9ztTx+RvvQ8^{=1% zWX5$9(4Pcsg=yt4R>N-#Sx2Ipk$2p;-LalD*5RJ(pWH=>Jbk9^57sUHWNMPV<_GEj zt=ivy2fZ@d3l)~cMVHLC(?4Vj=@lz-KquY&b$onWByYAO70-d2pfj?buJ7u%=5oKE zdDWwY1Fa>!X!SXtHJzA;a-u+O+Tfjk^mFWaa6|@4a^vSu{7hCO`M9FG)~y28DV#;U zlwk@8^Eu&xJI2H8K8C>1R3KnsMyBo0p{Bqavp)!lb!EDKWtRTBKrT83cbI~*5m{op z2+?W?W}(`2Q@L|{JtY)wFe!apuN6CUlq8CI`m-)r0fz14kak6U;zyu6^wa|&H9C=m z{Cov`pZ~B&CeY#hW!^S`4;HoK4ab}@nC*Hl;AeB`l-G?zgzTSLNGEc_B z5=^nZLd`3#3AnKGFIbrg-$5?k`3*_mqsj#X`t_&T0po(XZ-}KXUnL1VagXlTMZ>jy zH6ejq&*?X)_!Nre)Nc|GMK@L?gIcQiDo*O#oEoeV(V-ZM?l9gDwvDyU0k8GfGQjAB zE5Hupen4oK-{tlB_7=F!6Lj!$|DvMu*Z;CXB^zK@yIS5X1^K{}F0J-Se_Zl(^rc|k zFYcS@l_%|x6D`ArHo{t|DsSAbF6-Eowzit{s+cyk<&kKv*#1bC?K$gii$&iRPx`)k z=@6i0Zt0oWoi93Q7p&&i7n$j<&YRyrcC-$Tw9t4R>ea+u)u~7cHw6?~pP(PgA zblUz{ZeI3^&OkXM9aFZX?(}MTqMRKZihiOja8P1+;h}}USi9) zn`7JQcGQe!AtE}&y32V6YBi)B!&krR4imWLcxfYv0}=R_EzQm9UvGbgsd@Wq7QS1E zkaYO9>Z<&4WdsEjCR39@q==O!wgoqu6Vg}BI7=};&7ob!l(2=8f^A@jninmEo&6?| zmB7v|y0 zfq}D2oKi$J6%JGqTwrM~KA!&&`_A&MwgdcP=8-1iu?Gyx_r$Vs_L99LQfuJn!%x0bbseyKk-I3uVYwah)+Nzf7Bomy}=qD zFlSlNdpd$X9Ilqkss&<&CSA6Z;l|TP^b%*TsfI)alm^hn?Te#utuxC9qcWcAsqnDc zHV@^T2jw4*&%9SBcc6v(SDtMtkFz?d;&Z;R;`Xn}NDY$>mpKU5FN{1U(kip3_IP_8 zqdQ;yxq$5C&E4)VRnSZzE9bpswC#oYT;mO#kjThN#A;H%24VJotg?Zuv9}h8hq_mH zgoM=GSXjM+Hy6RvzFWFua&kK19(;)GVDN{Aw34@a}m8<=5?8La)Oz%u67 z`{&2o*CF4x@4Zv&<`e$It?2&G|6WHB@E+nAL`X&~1#3H6H*f!a1u2NsIHDvhuhGi!Om-C0(j_{SXN#X?f6tH5;5kD4K(>; zwZ}%bmoi`L-$=dgW~4F|<>COK+age)(T_fS?K`gh`yXQA_`K8M1}{HH2Y%OqWyxUj!WU2{Zh z(nS@NI?XiM-bP?QA;YvRU9_-|OIGT;V~HdvU{g9@+|F@LImuOPHK$QHpSqgv691i- zLH=~mUXOb!*l}T^>hsE7ShN17Le}UrlG8E#KKrY?@?M5T2bw}h)35q)QMc}&?sC0) zVyt#iW4%p*mzG9fjhX!RE*eiD_^iV2=K)i^oRX!K{_8@FM*rswS-)6#HS#zQC}I{7 zcWe@^CL`v3*+%7jcB$;_Yy6ci^GzukGYig4zy_a=mc1h#n>oe)l8o=RX#zc*(T9OE z-!oyOsN!4F5lU)ec=uYQLOKKrcE?v|YRn!5#9PMY7f?HTuj&{3DMSRz7mBO3YsP?; z^-yj>i?H+EwpRifZ|k( zNo!4LuhSa+TQVi8?jmZxm;}>(AOCQZ*N}%z_Nkw<=#ZKP0gh{061;P)f(fs^dr>r7 zjg-kEGL=QQO(9m`qIYe+SO#ElFaXaMl6lhK#z`?X#~oP#`|V2)hil_#m4lf0%6ckL zB~+Ao&nHv$C^)~3a8VF8O2bn$hVm_+5JEb`Ws7eYa8Puf1w2nGK>MlgAYuhb zZ%5RRo+V?`-+wjxW^_GjPjL20!RyD#Rec zLcZtX=5}#*a@twHOuxOt<94^2(S1O)7Ev!c>2r)jm4$eOHJT9Y(>T@5ro` zQ+ztHVB(u(5XvWk4;CTA_`}qh4>DO3yhwcr4}dW7_qda6gye=L5r_m(9&MrG7T4i$ z$$rhc2w8iMaiRHA!Y`IAtlj#MNcri|ZB5F=?dMlj%Bu8T$ ztPy+f_W8QTZqZ*N5s?t=KW)~J7TrK!X$;88+1{MCW6$`r^v$nfQM7(z*7&mAAIbut z^I9nN)6Y;9?cbOk;i%c6K~K74spZbM-|IjKH+ON5^xF_UJ?&R)Itb- z1n|mbaepS9*|EjIR8m%SqmpD)QOEln72~J{hwR+LQ!*tV`uqI=@iH^C`+aEQA&LEI zIC$i|S;0;UIREZH2(laSL-U5CFhzL?_~(|E?tjRe?}kBVVwvl=?hy5_5axX}OH(LG z+2)!#SV2SMaTqB6#>Z<7Sb?LG z&%+7Y$ggb0Te9VrNMb-4yNO%n|E}Na?4+1CrJa7$l>mz_LS2szYnzOJSF&$WL-PgN zj8q~KrU{o;r}#{3c9K&uPT7l&tzhZPoA=-IqbQf}@9E4--#gvMi3gLg3E@ca4Jdy4 zcK9N4Pz7cLKYO0;HgD)fk&QMM8_BXpWd?i_hKyCT#100|k zH^&O+X>LF2Lfq&SXEb?==ADbp?Sx3J(X^Nsie1{P1a#Sv553-5JW&mg=|duid69JW zW2H`A`c3dj>~CFi{aNXdDacy*NDny!HgV&e+sW_;J`GnDPviO}zyB5!l zcJwN#>{82oCBhLyArtsu5&|aKsfOb0xzT`S5XKYu1uK{M(s|Jv)f?U$B}>bpH=CCr z=RX816F^kgjtbrr*`x{tVRy&YinU-w4)E8=*ZgCc!Kfa(=lpFP)6mrcdX<;pq7(MF z+PT5K+-dL-Jl<%(h+ye&Cgn4 z{?WpBjgaDMw+pbG`5pk(6=-f|90yaRFPg60n0<2gfRNgq@`=!yX)kopvIHDZwZZ-q z2NghSTD!vpS-ZkiR8_Z))P@l~Et^#Jmyfod>dPk|Y4H2u7Ha*x9G54xiwf{nk;_9D zA%8pq5E?Fi7@NVNt2Pgs6cI?)b)|4_Gz%bndm+$Ie*-AQkHjsX>TVoS1 zd7H=V!R}CLq{T9WP-eG42|<)a9MLXX4JU(9Bnq+L5~G%Z9L|JNq7e$qY*mn$ZD8S= zhBdPF3ystLyw&%u>HG|}Xos=*?R+yr&!Sr1aYV}QR1@Y(XTFthXp6n9*@gvA(ez)! zLM=0wpW$RP!}ZL?rL@Wnsj_fv;WvK1JojXBWI2ynrE+&FyB9Gx=(K~22m$T#vn=$~ z=zkeXX;z2#-?|+lCzgwcQ`abLd0@lfHwU3&OdP){1xg~KIrH#dRud^01Y z{bb`8@l5}1&4*j=I_DJexSbuQP zej*XHrSG6shuZLaFQm?2Z%(ycV$v>EN41kB{HVDD&a=r=@OgjeAUYnSm!4X)X4);y zw;Kx=+DDdE&M*~gZ)sTlv6x2Y>!sxmiwm-hSQKQ?juOdmG@NwTM+ zPgN2^X#MH@tb*a;=Q^>&?RKM6N|$~7RjRK9y)IIk+O$I{n$d8=O6TS75281kz{YK0 zHS^2o@f}RNKP3`pT|T$!}3bTKko(*rc=4Qwy@^=hBjc2auM_nxoh(_aAtzFWWb zfdfCP3JvV=I?;tuTD{F~!%Ok#5bs$OKNdeRql$Q2O*Q(?;(bA>7Q!KhwYL>$TZ;C?4&my(erQ{? zPX3zFb5YHa|JB)Hu@ST`jCp=`fy`*fuDLYOeR5hcHlKM**vOt++k!&hqZ1ua`_R#!lBe_}MvkmyvneScd#};)Jb*)P7qe z5I1?N2kKNj)EpE9AJx(vdB#Ua_SJEc21)K1Z^6`}=5{)lqZm4iN2q;+=X-U}8Cj=@ z{cjq8s5d0$KWKdZ$=oe-vD$)cx9X6RK9boM(!}sV8Bch^_E0^*_m|LSSn>~HQLV25 zK~gNHSp{lkD)*$mGd?oyM+Tvs*KsOFU+l``gdxHh=N|7QErkjmri#3ee+J*MXm5Y8 zPm|FVkXV2eDtJ#3E%dNm!!K5JKn>|C?3j&|wx42GcvPqL>jdY*8S!9gbiu{$={WpX zG);U$&-tb4c68MdcK8VdOZd`oG3fqmSq*}X>oeW-7Y?sS%ADAT$w2<6&B2BCo4TSA z1sce_+1oJ2hG<~`*bb#!{d^*y?!1<0^-T*o<;&b?rL{iW5Q;&wFSJc9&y(E-|F~5^ zgV$XTVFbi!3SP|`g457t*ut^l&8@LB6;&ui{OQ&~XKBQOH*!H@?*8n?1alTyd=q$N z&~BLe6Lw~#a)2tgxDhp(41|;#E;^bUbvM4`SUeDo9`c_4qO&714yqeI|fN&6=kq(d1_S(-WGSnPZ2~ZDDWp8t?7UG_`*W zXQbh8XV`n&&okP%nVh>H;mu2{kCFG5?OJc>RKO-)Uu0RzO!`{;+c!NE)z z`&j&fj7oS7TKz7wIcJl0bdaCtV8F509zJs`m~W2zc7rNV(UrulARtvqa4NkJXNJ)^ z)l|>)i^Jfu)33J<9&HcH7G&^p* z6Wn=DW*6TS#KfuxEu~__jK0z!KPYmm;it`1nq{Ne**2yXzW5pjb7P8#HcBRkMvnjs)GR!xb_9jt~o!Ldz>C|F1$U z#cn_K38`M!yTtujB~YWbmKx=tKpt`j{qy(4MO#g9h)|Sy^}CEvK~C)!s61Mw|F{6L zzwVj0HDwer7Gct#G!*T`LkVfq2Qu(0JTra{9A$UK zv&?Zj;rO-V+`tG0Z2ALL)af&y^g3fc811~S=kwUJrujXDV3mg$G&g9OkzCt8+2Z;% zv*Y(0P3qC7VkFSR(e3za#AxR^n9D*IrlGV6T4`yKJgj=Sr{fWT==myR_Yk2V(c6NK zpBClQ?X}KNWQ`EU3e7WDmiyc+_EJ%Wb+_WU@~NXsoV}j52~QIjgeZ;^%>})-tSs5N z=XTu~m5O~AjdzKqvbwRXNGc5OQ6HDR(|4oT^Ii8CIjloeAK++nY^o0)E-eo{BI>hL z3MA2*21UftlD@N1p}rdcNs-40MID$G(fkXEs{R0B=zp1qDysK=g3ppTc}zw!-sM|X zG#uyh*;wT|^UwqcUJ|$Q560)1mBpy1QZra(B)V(b^$PxIT?#rR4SPfPNUb4-!^6b8 zK){N_Catjr&`RwMBXznU-_YcYa$sA(BGua{7 zsiDBsk{fLPLFP7f=+wTn2#H4Gf%`YZ%5cLQW-Q2l1~(ywr#k1V zSpV@MWzj0F(JHiIvQb}BSbH$FBt&utFv<7M1)Hal85#bviB!(ZnogbWUlMhQUCisB z9?$5|M-QJ~+@OL&{K@N|}G-Uuyh(Wf1Z0^K~?D`TxQUTmgwOOR)&yZ7FpssEh zBKF{JiX9eaoED4my~MH~DTP65*75m2a||u&nU)_I+Ld^H&FjQjoKU2%H)6>xc=kEQ zPa$OJH;d>QDAjt^f5D+1sjGR<_G%n&d9oP=>&DW_=swErCehgMPi7_DoUXsFbo!Ln zuhErE*2sFtv9Zjv#0k^TOAJg>n|8QsE6(g|0Q(^_m?*85n=&~^*zDu9Tzgr*p;eBk z7ltW(Z+h$fs!pRE*G#Q`G>k;|mmcV+Y8?IV$j?Iol$&^HmirsBlhH~l4wAhfCm(Eb zS~MK$uY{#-&o+f0_+`Hn7Weoao~2@$hCa>TqPRWcl5L+H2Aw@S!0Tj)?RvQnz*&~k zYdONFKfq~kJBQWuS1i-T)5TKf8M`b!@cfyS;X8|q^m*Dowb!~mjgxPvrYfBZU3|M% z1MUQ>*R@L~UwF|18(09*%?d}DTOE;iB)@jb%!M4Xhfx;CXrfGQm1OV=KaY3$QNGgk zq`pr>V#K(7PM}WDKk$nN3h35)T?|olJmk@Pnb|#{#xeFo&F1Fjnxhl-D#n*@Mnw`E zbPI{ge0Uuc=;r|_xv!723NmdQk1r};qcP3dW~+Z>QDbS{*C|voNYku+-!Zan#f#VJ zytpv!_x=j zx{zzYdOn0_T|-p@GrV`c*IJNTZtsXqUfN0Jei^S0Bj_1XVcL>A%ibx&XzjqA|Hv_m z;6%v7NPqm3rR*k3O}3}m0zH{;1?^z#iS~Dq9nqzm4rC4CjF|BcsXBMvnBzQv(%kFl z?enQj#QO=pz!iIXMK#B?#MHsce}%#yV0`LdD_DCsRSm&J0SU-E%=i3QmN_XR&P|7enLMkr$9~k;Kn6+ zk8z-z>SeaW`)Iwun!;cV7}uFFtN@xe6)~oV#B+`CH6by^DB)>-(Yze~(T~anu@4pX zRKobv^YI9P!dz=k99X{8n+3% zx5}HHc+)^IyWziQ$KGnNb-^?)68mat)WXrlbhONSW^*q|p z8M$X((U@kDDOXOI=-Q+m&?*e8(q`&^YTI-3;hZQYF&ZMiaO$!|@3s;`NdW7oNYP`PgXp>!=&;etg8-uMxKY?2 zt&c>;-AP9!ndz#&SIz6X@F}+8jP*TfS~KaYxA1~~!K8ycZ=!{;a^h*S`clh5GsC*V zma)y~i9^fz#iXHPMt^CvM7`#p5+MJVTLmf6;)MTxdq^>GapIvDHS$!!=KInh>px9h zRP!$5#c#xQo12&AC$l`p6?g z5huJ$snC$7pIJ|u&v1M-{v}R$3s8f`ReDG&sIyMpW_Y!44hM*>Y_nVgL?(h!VOA-2 z^g7&VC#J$isQ#PQbPnm^sT%~+wn#QL;TE;v>_MhNG6nmU9&+L9TSdmYi$fZSc%%O? zyN~*PLwN%K>yYUy0V68v;+^)O+EcX`H?$g{rUmlG)%+GagA=9O8Gp1a>UB}f>BcB> zfKJ?4^+B@I_-2oZFRO%Jr8n|6cL=RGmg&8DH%8SDVU|p@ayuCAIJeEF?1`qX)zUpi zOq(l1S3{2>b>^FE)I}>Ti*o$%D#66hwXNM^3-;q()uro~Uay$G8YKBdPQVV!8Z)^H`4Y~ zoah#+7)|@o4-Kz0tR!~&IR$cYN+QEv?to&Jk0%g?8;m_73NpOaGdLaca}j>f#|gjq z-2CPNmtVG?KHYkqw$;(ML56#geEGH?(5M=n7gVi3z!yc!c`gv+N1Bo|nj|S5og{9| zW73~A3Nnf2;EV~QC^7jZ6i*xF=Odev%3=1X{m$x1Md>ki4 zL~%M&KApoo^BkX=KGixDcB0j~e))Y#lQQ+8#^a~V>s*4Yl#(?b&hcdhbN+4FIR;vK zb*1E|+1hLZcJ(9F{#qm~9JH9{(|#a+JN8R1*qKjhA3xyr+n*^yO@wS|$noHJEg**_ z`%Hw)Ivl6pF~h7z(!Fo$Qo1Q0c@pvvr`nINRES_H>msXSDUnL36v-jd`|sl9$JqG% zrM1Oh1ESs?sIJ*=rSq>a{ULO=LIv2ztDq{43OyNC+G*`aht*@g;+A#soZJ01DvJIe zIQK}Z{wcs7I+uxGqVluve}38NjG?KUL`lLEQTYzP;a|MK27sMBXBDej5#Mi#E z*3=Oyp4X>K2Y|Nl^w^*HYQy=+UJ8YJu&qc!tE&$c>MWm zA~z;i;7R;`%L`oGD3SehBz-~jK)^+vVEZW}SW8s=7adC3D!F`$b}8{NKZLh+)86Y% zL&u4u(>v-z5NbP$Hcct=33L}eLlq3((fR0mhIM2wDNk5A?yNYf0*WXX8^{o zDzg&3o{Wwq!7v`b_tWioI&X{ZX~GAOyUjqIIrUe(N{1{jO?)Hb#}C#8fcEefE^D1s zURdC^N^qm_R=66|+>!5z61N0VJGW!19EQVr8_O};(1YSWC*oz9S+s*nVgBuwjVj3M z-V;A79xF4IS2F7nnd-ocC0mOloOl_&Ho@K1*7hv4r>BQK-r;8`CcV3$px^|u>3tr^ z1j)tz;kH$z_I(RupaMK}Vl~>}0YNLPBjoQ36T9SYVsO#a=H})E?Y8VSpjg?uP+eNg zxJy5^n@wco2|oCqg~5=LM=+${VniISTS+YujAzEv^xI7EDuzUWgkd*}vheyD_gFiY z!Dt%lwH$Dd-IJ4(9)w<3Q>U#j4@WcbcvSzWC`aJ#f8<;VcR-Tay>`AsYNk6r;ir_- z>*M?$ba>a07Lnbx1u4BZEQQOv9lEt@;U=Zjr4b>UCx{ZBV5KqI<_;SQ(<^)}M}lB# z`uEF5chKWfrLA70jzhwf`_fRD^E73PNx=*n_C-x;h+&eLxW`AZbk#@Gq~7-Lz0JEu zd*%%W1Zj0@=M7B8Q}1iSle-58gRpUMxZbAbjzOL}UcfXo6XfWXnFxOkHx6Qh>s{pu zeqb3|COtTmYNpzDOsJUDXce>)QtE`h#bL(F9!s#frkbh|;aHU!E0M@Jqnyr*sxubx}I!7>ORKD3|S zop0B@yu3`6s8l>a5I!yrI0OHj4(+{$bxD*L3vKKxTTPR}8KU;(i0GXVjvHP>n8|?h z^Qrp&@!Xv>%AAI3*GIH9v_>hHKpUCbna?v)l?vc*z@SWlw4rZ~kOp{4aHRt&63gJ_ zVRBLy*w-w$&g1jqnX@MS7cPRS(kA^^RMqDKv?EVV%IlgjgSoddTY1o2?%d7VpWL5Y z{@la;@Kb}h0yQaNTccL8@5Bs*u4Y$!jf25xH>*yi!;+UD5hoZ_wA?g;mZ}47GAWk$ z7@|vD6>-xn#AnVBBHk^zj+~5X_OD$+sje9K4spO9r|=^{1%xqH0Vh|+>K6~d7^wKO zbv{_Wn2=+>wM>tUQuLACp6h7%eE2x!9%C)8B-f%rY`!3f-Ck%7GD4;Q;s_M)T`FxH zcs3_b=!D+42w_x^qWFBXhN0lXqR*?rPcz*co*Nuzqt~>vyZJsKAfTO#hsV>3a}Ns- zPZE^peSY!=;8Qqn2~XpvpR|pELf!S>2S4R~zQ%#ifT44sswuuSmh{E)oz&$`l6(Lc z`Fy~GPL~CH(WFVgj&*f)kpOJe#goUEJzvq32)SC=5C~H9h9VIFF)1|gKu6iZHH61J zNOFs_+(apw1|3YZ0>fAwW~0#)Z99x$h4AYRuip)(2$WQ#pH5`wHPS%hR6-iXp}CZd zCCz6GvXpz?Go4vk#JQll5_6+BG9o!sk-!7e#wQ@)Yk*bwn=}io7W_Z^Wo2c>bVjm8 zs>PY%@FM9RFD^@4d!{CZ_Exk?UTkG-{1TP3wwe<3O z5D}l1Hco04XQ`uPj*k|%j*XA#(@B0NYRzzJqU(`68Qwo?*j2|d*4n+@zJD1wPd%A6 z|FX#?4){=Yc02+Cf|s#%V~)CCTUIqfi8cf0WuPkgN@4j_D)h9> z@nH=-GO1uF--LASyjhusCDyE1cgQ=2%H#J{J9ANMZxjBJvJEau&$b)g%nFi5=V(LDMJcm(){yMpHbo^fi{YsJ z49!m)ndiasBn3=j{s}uJ9}NO%kav)CPSzdNHj)67xBweMo>l;ApVkU)_CJ7-rl;+^ z?C+b#Jp@EV%8i^cgWc@T2!$e(aa2yq)7-md9bQ37non zl5^XjpV{XNOZX{lHPK>Q6IeMMv+r)#)g#4%YHnnpWE`}1N1$wkv)y~1lO*ff9hq+j z$38jNas(BxTvAR4$)Ivx*b>n0$dH?jhG0mHR!p$tPVtrm@y1bDR_c{aE4f$3D#w`x zyt(Sh%CP13(*g)dCTs>=-@ktcCY^NLJeaV67HGd+e_J-yfY?d@h4;9**AcSn=Rw2yTS4Rcp<#Ox0p zVrxW|XVZm7EqdMU%sErt`4|Y8(TyEXLnbh@zAU4~|FlDlJ>Tp3REGy#A$MaP5+xiG z^^CrYgb!j=+o)xGgJ^W9WfNN(jGEkC>gf`Q6yJB0gV?^^8bmWW!uw3yInf}?{)#F zHxzgV>GFpIDFboqpWHp5_?zC+|E#$R_Czvy;29dxA+x(5S-iK9P=3c41y!ddBa7o1 zu-s{IS9PY}N;opAg0pnZq0AasKI#|WbNKeOljOiiP@yR68n&arB zY#e|Pxy9$kWg~9nf=@K{G|~hbTUjfdtf~0z2 z-;-eSw#zl5s$!GNrNLOKjK0S(&ch#Tw%E|!Zcwf#5)S5!i|QPwnpN_{o(q@55LYt0 z)eNP~n*}@#p-unOzl`M;2{!a^olI-t>U!4!TsEzDd{Fxh>{uCtC+rMSP}=Uk7_j}L zD#&iz@In;hP{oe51-3QsK?KigRHEK+4M!hE4#*eQP%aZ8k$!@*$xaIK_>whXv!-Bcx^5V7WbeaRCM zwKFJKa#v*d<$H&BB|3x%iFD&Cm{n!-&MeH0+=2Dp+&ETQ4hxez2fI_e0AcxYkA#E- zzd0e^#?Y{r*KVuVdqc}6oN_x#f?#>Ss1&JeNb%c5oTn$!Ht(r1o81pheSV-MKr?t7 zOX4+~icpTOBZy0o@zUMIc3D|8@YrC)inuNwoy;3(ZjPKCOGU%JakXd=iTK$5y0Bs0 z1W^#*6MnrRVkqamB=t~$QY_hi#mo9oOEvLxW^Qh@ zX4MCUSu;4Up3>h$1s;hC*yPvJnt0R3*1~oC2pf6|ve=$Ro0F=xIwKWPg{#C`ts!g# zh!ky|4kN8vak(zLPR+aH$Q3{PtzlPKE-RCaJ)m3aQy|5gli(G*Wj{y5F;k5=m-N=M zjyA|Av#JrZ1R*2P;TUKW0+B!_g@yBPbGX+_;QumHTmk}bD^t^bjZU3+kVbD)lO#af zo6h)|PFck6+a9Flp6EODtwHZDLrdm(PxCqMXs&%x6IG3!P?i1|dybbM3?#FKr#x>! zIBS9D%pO(44O8Ja@SY4E`!)&Ia=5O?Cm;O@M^MsWoOy=G=asdfGBs~0XFZ{ry5d>X zsl$AiE`}>Kbp|Du3~XE~LxSkm`em-S3!pJL%#UQP5k06rf`V4+p9_He6?-M@{!hK} zL;kQ}{XuOzM&ejUP*?v5h)v}erWDR6{0?PmD`>ruVz4Gj&4Fe4UpeA*m=^zx{4f<01n1U0q>N%!i;C$)_I-PP)o zgMOc_n63P&suFy13xx`r5}eFZRy+$LUb)))#5vy4LV{whuF~In@<cJ|E) zr5Qc?o5S)1$su3{qZ7l?Z9=xeiOb)j-dOSI*HJR{jVxNjPKa-* z$)WuK>6i>$-45+eAeW5Mlh47@%z!=d-Gm0cbxN_z1LoQ?X^)JB5d`% zO_f`8Ph^UJlrj|3NszWHRjTaA0O@9+5b56>QxWCL#oza954_(qz(@5-3&5zt4IU{1 zToLMNxnoW*lj;1rN+0nxIA&nqWF~fbrS{e`@;~2DZ+B81Xl-?bx~LMmhus~yebwzO z9L{=hcqhu$&wfYJAr{@{t<}{Ro@MQZ>jOO0hVSbHg`sWUpC~j>XX8*1c*d2BvZuuN zOCoJ)foL1IIX#HIxD@HvTv79$a7aw$9Ac5&8Gr?2*_YICpxR zRsasYQ*R7ds#3C9V~yc&va7YYWn$$bT{h-l&pqgp;rb=%bpmxy*{G!&D0)l3VnZUM z6YsJ+n8fzv$kPiDH)elI!q>TzW3@f8$HtA60L*$b*LNH$C-<3@+e|aLcF{0 zL*SB{NLNRGiLsjcA+&p^L1+2kYhXH>cOnAoQB|IDNODND>Qb2YeVr-POye53RykRU zuAfP&+I9y%VPjptvT$Fe)4UmzNOwL(D&NOS>VW^yO|P}wFZzS0B6d!2WC%Jen$41< zGe0({*&Nj`Y8}NYUhxv{69B>ZoVEuyspS6(NgOkNl>OI>oW=Q*N?EzN-F0X$W7;CN zZGkkWu*MtSlI@V+1iqLq^7{e*B{;9(5RBH{o?mc`*CEDv6=ITYyO@sn>j;cy=ZWTO zN}$h-a9s|n(??u^%|)69DWD==_4P283^5${A9Sk`3hpI}fAG8p`As9O9NV}=?L`ly zAJNpop5i`j(U&$=tU)YDybf6h@Xl+Kd+DM` z_OGs58kSFs4wE0Bv(}DQbh7{*IlEfjh$|JR3JPo0U!0)}@w)GmT7$Nx3cBw<5vn-= z=}@Kq+z*MdZ51FedWM0%T<2Em27pYT#H}9nKJn}!&exu9`fKAULB$WquS*s3v6iFJvl zT~bu14!VsKUWnGH(KL|2Mi-C6^N4#thM|&3DH{hRja?A*zH-8(znSkS-p`_l6Q9nB z#9x1@!-P!`-t$z2&v^VV8z$tYl>N_5@m0BaDzA&xpv%(rbLLvRN~i1`!$*DRW|wl0 z^x&M|&FA*Y3)coU9U1L**GAh44>G^NQoz2P!KLcwTwc$(D!J++A#+LEN9#-L%T4O9 z!=VSk#=2?xZ(wU$wCrXpK5#o4?nW*}j&7(msKng9u!l(d9=*K${L+sOxx=R&t({N` z?Z%;&J^LES$=aS&3OR2P*51bFr^u*CXy#I3>I;>6r^8Ra^1uIS0UGWkDUdWXp$58v z=G}e3#M)>b>$V|ylbqDUglC5ve0Kq$(-m7{#ZBfh@BtxBr9)%%y}I!c9q?cRdaT9j zY>4-7pj+zk-;sobT<^KYZ0R%^6H1|c*wWKif;^JR$XBANwWL|UCg?q<@p5SkC}u8v zhG%>0Kau7Zc0Nz+(p6XL`aTN?|Kd*+;ZiI;IV~lwBPcSjPwmqL!Jf91n}5&P7@zY= z_w#>gNn`b5Z^C27Md(-To!kLu5x@BUq2ySqUuofT3e3T-zmO9h1F;`HrPk$)F0!p!dQK6*|yKd zWtpeGoNkvx32>Bq@=M(#^lwSC^F6>Uas*lXD$S>~@>;ESp(YCnz)l}-r3 zJ}7`npn|&Mv|it2>P+PpuOC$v1uiEm4EPP)*8&uu=j-%h-VPkrJ!Axp=*I=z@nvnj zZm{zaU_YWw37z&Y?$u;Q=tik7g4X0L^OnBm$kH1N#4ATk(h$I_J^_y@p-Wtfe20iI z=}P`SU|McCe&CF(@iF6W~}^lF5bF_m1Y2zCFB2JKqrk-9RIIzvOoX;D-R$eeOK8xx6q-jmBrkZz)#kp#G|jE z>?HFk4xPQUN1W%~wMw5)cU#i;R!0(wruuwuvpQSyt+P65m2AzbEcJ_;B^6zPF z_4Zvo+e7el> zltSQ&UjC-dB%;l}4yHIy(5-E90{)FlprYeS;O(9&(tPCeiz06eo`wQ3p4BbD!t@1K za(5*raq`2}Ck~m5NH9J$z%Y<{3KhxfkrWr5AV;2+#Z~pV$7b#%F{>CuZqFyrnYq?Q zNYxY31qbarK9&u6_$jR@735&Fd%QZNJnWV-I|Y;9OrSR(LImI_|Yf`Dnn3l>9D z3M@*eeUIq+bFqP#8;zGUeTy+r%h=OB!Y6{L{mHNQ-0X?t;DM48qqXuCQc#AFLh=jK zIGrp=Nan!cn0a2AMPXKevC6UDk&x*Es|>(L2PHY&6T|1wqIc&C(>biT#q7M}+NDwq ze}z&YTtS8;RsBs=B{oSzKhYLLVLthdSKZWI%h^2u%6+S}+5XNOEE;b9HIuBv#Tz;I z>Be(%tfa0Wu=|YIgUS@mr@EueIHe45kgJsUa3EI6iI_t>xD*pYK>BeIZG8&$)}iG+`?uCrjY>MKX`WvW zmX2RGR|}f2feImhh0%I0=EY9$^l z%SaI`i22$7zNdVyVPpYS__ViUqCJu@h-L$l&|A1PteFkEFR ze^f=BV%x&ijMo>w1_bX*>O6i*6jmis5w`N33aRDQ=CwT9hL_70c61PTWI+t z=9(3WWo47^xq@%Bvus%xs|)H~HjR_p`#DaOtGf;URYRRJc&Vt(3cGUy7RY^laby)_ zIr?Y6zn&=?<{=rLMcK*T7R(}HQd)DCkl=t^a?wUg8RDhV@hziQ$NDd+^Xffk*tfs) zOadF-xQ5<9-(-f%i=;?-?%Kp+Fo~bb=tHc*^UQbg0m-7+Q9+!OpE*SN) zo0p`zTt_fC(Oogn-UvJy0W-y+duJSWYbXRejm+n=Vv;F{-zWQC(mz`f5#Atv7qT-e z^teNm2y+^rN+C|uEsipO8m!%=t1Wd^acrnxy!NrW`o5%}X8Kk0DyMeNx94&)p^S@lYZv{lFLJm7tAz^-aWR;@SR<1`B&^ zrf}oT;WXHlK`HIMUH>81295XKkS)pC$b_xgLWU|W65Y_RYL12Xkc0|_vpjIvccef9 zV!gXWTQ5E4wRja{N9?S@@w;T(*#Y@@&(zSXEIO>5)cZqoA+Lg^mVeD3l7IB(5$&HV z4P)Kr>eQ{dBFiNm_=>G}7&53w<_L?FZic;Rn1|8r7JT%#W~+`E0+p;QmmnS&iHTKa z`%j46p>MkH@aR{FIn35eQv-LFltA4T0apU@nFafzfz9{o3M)w&ZkaiAJ z9&zr?T0}HGVuLh$fbLEzpQz#t>rQ1;mtd$n$25Pvl3S&3R=jj2x1juY7S$ALA$T+NYj1p_S(Y}hk=T9{l!y-$KVI1z5dHu zUk$wIYH8Ok!;RHR`U~6XO{+;Y9c5t>T)u`&m1qK50w0q!s2@ z_gw_H>dW)n<&P2;Hbu3WmKyR$W+hLj(`#z=da&OFina#cr`=E9`;!HREImZZGLLLJ zAIS@n(4AB6?HgHz%XgyUMf{-w{_l~ivy^*wzSMumM*8wCLm>I;ISc8Kix=rmaUdvNG?KEAC%W{AQOW_g1BV!sXq}g;*ONOGF9=1%6h4h_onRm7m8Hz_b25tIs z=U*}Xq|8okQ8O`xiAD`&&70Jm;HTY=BAS(z!n3m4rOCQ&CYF| zic_D*>E#Mi4QYk7hn#F76LhEiWXxUb#tqgwLgM6~_!{B-je`hjW?sCNbxxv&K$8*L z2hnSc`(;C_i)S;3qM4d3r1Ji&UVvwWbjOH!c^#29UDpc`L56^w&3IT%>GaGRUj?B6 z+Fu6rQT8tbx}F{@MWOKAPlasw;#NL+Xnj4Q6{Cc1{QCi+k2|ER2$bt$U+8qC;eHBJ zGAtfSr%wp`&Ya8Rq0MJ~I*mX@R01ylj20qv7 zDk`(zPH~QtEPsg8oRHSEXZhiaT`kO)Vs_edxKKNFgapoJu%nJps*OfYCs$7~dAi`* zWi*(@3Abe6((^EH3=j{ip*2UVMa^)(nltyUimA=6hRGewekRde@EgPFJ_^*4RAyB4 ze~C?UI{bN&a1H(VFzv}V-VW1l!BO=%s}NJKilocBHAqgI(xX$b2gUjr$G)V-V_V8; z*(WhM#7JpUE$sZNb8!+b6Pyd~-`6uGh0IkjIOXJ4kA&1wJyhGU6D+OoY5zUBX0iV} zxr+itaN#p=h{s@h{Yx`z#!{Yoda=9_M(dUOkY2eylyFHKdBt%vU&Yu*0d(Wx`KQ4Q zx&}4E_Iod$pw9zoJvxZmqoU`6^qd)4s^s`a}M>+=0)h7Nj2d0~!*yk)^h^Xu%H3gI7#Y ze~R@IUi4vIN&K2XZhPWfKY0VUjoOEn3M_{oSG4r%z3ZH7a-Aej$kpAj;raggfDXMG zurubr0lhj!X)Uq;J?h0uU=n8Zq0*Ip)@g>zn%AgB_F+7O!RtCbXQ<`q6(1Wa+F{V? zZVQDX$2q)YLzi*+ zN$79Rrc#{s1=fCj$!YI&1k~(lzj)RZ^m{yzCuzb3`f^pI@-(vMF8Tml_E$9ffXv86 zsv$G4MiG0OI;_lgg*<>-T2LJN23H4ICm(c@!W@h-^ZurqI<)^g-hqz-+{NRNp+rgD z@`IJ0!f!IGzQDHM6vx%iji3nBF8sxqRbl(s<=7=otaYuBw4`dyXGsj~zr5OuHXAWG zmx8PHr|fD6=T<&5TD%#)sg?FVH~cBPCWFg?z4P(mrOyO*JLa%~oUF7DK&*KIa-WI= zL49HC$EO-XE*aI33$|o1S3=`TuiE;n7E~C_n>}0qIMXcmW3S{A&((HI=!Pa>VbIFb zk-m6c*6cu!^CfzsH+PvDD3<2!5P$c&Iu-0ln_&bB!yi{lfkJCpSiZY6HoZ+wT}oyw ziC5Vdoae=Y%p8#JP2LtwS^cUAYUwRR#cGTUAnB!dnV6TqFEwZ9Sz>%2h1yWyHaahu zn?R(Kd{_MYc?nw=yiLbczAKCT;5R2@vO#rJC%PqGZ=8G~VUWKq!QMTXPs0nUS znCO;XU%90iixLv9Uvnj=q#xMoa?}x$spsveVjFGnDz#l`ZLo{6J$pDGX?^uF8mA<} zp?v3YQ3_4D7T3_`%FkL~=wtWmCnloWuI0JoGT-eK6Z#Ekq$bYH#PO=c_RE3$#Db&< zQY3gaGJ~kE_Q=mk8dhh&t>L1fo?k>C{yhx%1WQbpRcW73e&Pr=81b9rseJ&vyyXbBh)-N zF8;jv(*UJt1`@nc_X|6gFRxqeVUd3dt41!6;D6vT=sxuSkoOL-8Yk2eB82u*BkN!Z zZFE;h6(Jjhq1h64=C8R)0D=`9-wObQLBsTUZH=ckMAr%BA^!5Gn8_t6`S_TFIz}Zn zUFZ!-lq_@1&2+2Pf-AyLi)#nQtGCGDuw+Nq030x2rLvO^IE$1hDAuCDd9yk!^yFV6 z-E~{`uth36--+rnls0_gh{~E6iAyKVCepq=E;mEOwXHraYlaXsusA0y2ywCq7A)3> zrzs%fnJNzxSrPjj0*g?5B&mlDAsVD;OWW}ga1e!pYj+C#32 zeNuIv!fc9ja+0oyJz=b`0k6s02s!81J&6e^zBOU8gN!9N{9J6Jn;@_F#Su-;jilbX zBzzqgxWI}fY=Y1R-AZivCPCTBG+hTTIydxY6kI9UB!@2w){lDB!;sj!1qkS}D?%aF zQ@mIrSjrSw03G*sIuGX{n*_PWpn`zXHLRtpEl$YfI$)&odhz^?-rbAfhwjnSv+lv3 z@~{CW=EVpmiL^Jm=hfy#jtRfMft2KmAj;jgjfpvdNSS)S%XJ`EzBWDo{9CWl3S9ov z9UjsC`Sd2*gkHa)6F-eI>T?57O9+ zZ}zFY0*gQwYW`Ea1g>9YOb!^?k7!zgE2X9|P5JrxNRUu$Tv~|94Tw6=3Wqw;01ui& zLx3A9=Ec7ni}Z0$VBM~@=>Is0$wymN&{0kTxa;ATj0>FVSH!H4C$&m7aZ7MiBZ9=^ z1>3WBIJu|rF#?Jx%vUJboZ_Wic&jqDG)4_<`= zOegDR0<4Aqc9-PA7ulrXHo$npm-^=dwd$Vb>HUZo-J z<@u0*3u}|0M%y_`wkoznJ`U5Pf&C2ynVTpcYd%~3Nm`OaR7}$NJ{wvl4(EJN`>H3Tj4Mlw$QgC;=9nD6_WGn&Y_Ff{jRQ1OayP+jqEY`YH70Y@aBe)C&gOthOtj&D6CZdHoQ#(>4J02S8@`;Zzo*~u`_8*Q72sP5r_Q2z(fuE$-OKw z_-wPU6__jbEv>EzV_i{^dBi^{-0^t&7Jp0>vV`X1ybaX~$LL%1z^D&}JjY9&XLtk| zZePJNIw~>gdF`#PmHo>o4~|zDNIpaRN}#PooWM z;RoU&Q(N$Cg?1+oI_-Q{l*(4H3ZGnI>wsJ=8NXa?BnNOtNAGa78jd#mrp;3%Z2z(bj~JV4(=8ZX3CM zSkykn=4EcMAHGDP7paox%Sf8_84oWIwk9Z2rZ6DNk6tF7_oXi~K^^0`q+@SZSbAN` zNPzQaqs)CctD%aFwpmN}0OHUKh=Dh?2uF3Pe`Sm8^Qd(fpvNl~x&gRoK|K9htPR)x z+*7TnEosLN=l7O!Axf3>!&&czJq|W3x%jWqKR@R4Zr3Qb*R8%vioz$Ws3+0@5D~O}&s!sOw9qWcw|Sk|npK+Q0#5P72|kf6fKrJO9m^wBe`JE|%CxHXCg5(q zsPg>m7(z?4PL~ob^8wOOpXvHp9J(X__|D0;Q1kG*Bujh7PW?Lf71VcR!g)feoerPX z%4BYKUt%E~Evy0!*IK)D^!x3MTsgbHu^cpSXa({#0MMWrv)^d{_G*qCRsJr2vGMvd zt>FP0TzL~gCxiB+9#&bQ0oU&q91iy1z2RCx_28~dpbaF4UX`QnT2S! z8#=ciW1RRJ)H$pLWJ^ZEN>uj!w!^m?dVgO6&TfpgFZw<MMd2UXVtzn%@&(eENzPJUSPv6xZ2%)Ys{nG-}XY6uDeP^u> zOg+jHj`Cl&__Uyq_gmH_N_#bA`2VN*<$Pcntk5D+grL>{@>ffUftMpzMBmNNOC?jfs0XJcz(=9 zL<8cXjaz!%yas_8t%(keNmRqgl>}6#pLYnKx26JBj1_J+dh^t9SOupiJ)C_QxD)s^ z�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 Date: Tue, 2 Aug 2022 14:41:15 +0200 Subject: [PATCH 03/74] Adjust Arial capitalization --- R/theme_stat.r | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/R/theme_stat.r b/R/theme_stat.r index eac91b4..2128a01 100644 --- a/R/theme_stat.r +++ b/R/theme_stat.r @@ -35,22 +35,22 @@ theme_stat <- function(base_size = 11, axis.label.pos = "top", axis.lines = "x", color.title = palette[9] color.axis = palette[7] - theme_var <- ggplot2::theme_minimal(base_family = "arial") + + theme_var <- ggplot2::theme_minimal(base_family = "Arial") + # TEXTE ggplot2::theme( - text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "arial"), + text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial"), - plot.title = ggplot2::element_text(size = base_size*4/3, colour = color.title, face = "bold", family="arialblack"), - plot.subtitle = ggplot2::element_text(size = base_size, color = color.title, face = "plain", family = "arial"), - plot.caption = ggplot2::element_text(size = base_size, color = color.title, face = "plain", family = "arial", hjust = 0), + plot.title = ggplot2::element_text(size = base_size*4/3, colour = color.title, face = "bold", family="Arial Black"), + plot.subtitle = ggplot2::element_text(size = base_size, color = color.title, face = "plain", family = "Arial"), + plot.caption = ggplot2::element_text(size = base_size, color = color.title, face = "plain", family = "Arial", hjust = 0), - strip.text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "arial"), + strip.text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial"), - axis.title = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "arial"), - axis.text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "arial"), + axis.title = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial"), + axis.text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial"), - legend.title = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "arial"), - legend.text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "arial") + legend.title = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial"), + legend.text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial") ) # ACHSEN From b10766d1c2837e909c72670ab07d1f294641bca1 Mon Sep 17 00:00:00 2001 From: Thomas Lo Russo Date: Tue, 2 Aug 2022 16:52:58 +0200 Subject: [PATCH 04/74] update documentation --- R/datasetsXLSX.R | 2 +- man/datasetsXLSX.Rd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index f9efd13..4b8993b 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -41,7 +41,7 @@ #' datasets = list(dat1, dat2), #' titles = c("mtcars-Datensatz","PlantGrowth-Datensatz"), #' grouplines = list(c(1)), -#' group_names = list(c("name_of_second_header")), #produces a second header in the first sheet +#' group_names = list(c("name_of_second_header")), # adds a second header in the first sheet #' sources = c("Source: Henderson and Velleman (1981). #' Building multiple regression models interactively. Biometrics, 37, 391–411.", #' "Dobson, A. J. (1983) An Introduction to Statistical diff --git a/man/datasetsXLSX.Rd b/man/datasetsXLSX.Rd index c3ab28b..9646315 100644 --- a/man/datasetsXLSX.Rd +++ b/man/datasetsXLSX.Rd @@ -85,7 +85,7 @@ datasetsXLSX(file="twoDatasets", # '.xlsx' wird automatisch hinzugef\u00fcgt datasets = list(dat1, dat2), titles = c("mtcars-Datensatz","PlantGrowth-Datensatz"), grouplines = list(c(1)), - group_names = list(c("name_of_second_header")), #produces a second header in the first sheet + group_names = list(c("name_of_second_header")), # adds a second header in the first sheet sources = c("Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.", "Dobson, A. J. (1983) An Introduction to Statistical From a64d9309b1e513a184a2ee4e79f8b41175ce7417 Mon Sep 17 00:00:00 2001 From: awuermli Date: Tue, 15 Nov 2022 14:11:56 +0000 Subject: [PATCH 05/74] test --- R/col_stat.R | 37 +++++++------------------------------ 1 file changed, 7 insertions(+), 30 deletions(-) diff --git a/R/col_stat.R b/R/col_stat.R index c48cc89..597a3d3 100644 --- a/R/col_stat.R +++ b/R/col_stat.R @@ -12,8 +12,9 @@ library(scales) stattheme_data <- { x <- list() - #standard + x$stattheme_data$zhtest<- c("#009ee0", "#0070B4", "#7F3DA7", "#D40053", "#B01657", "#DC7700","#00797B", "#1A7F1F") + x$stattheme_data$zhcd<- c("#009ee0", "#0076bd", "#885ea0", "#e30059", "#e2001a","#ffcc00", "#00a1a3","#3ea743") ### 1. Ordinale / kategoriale Paletten @@ -21,6 +22,8 @@ stattheme_data <- { #Farbmatrixpaletten (horizontal) #standard + x$stattheme_data$zhinfografik<- c("#0070B4", "#00407C", "#00407C", "#00797B", "#8A8C00", "#00544C", "#DC7700", "#D93C1A", "#96170F", "#D40053", "#B01657", "#7A0049", "#9572D5", "#54268E", "#CCCCCC", "#949494", "#666666", "#333333" ) + x$stattheme_data$zhdarker<- c("#407B9F", "#409292", "#5F9463", "#B2A558", "#B77346", "#B24A4C", "#857091") x$stattheme_data$zhdark<- c("#3F8AB4", "#3FA5A5", "#65A96A", "#CEBE5B", "#D27F46", "#CD4B4E", "#9479A4") @@ -29,9 +32,8 @@ stattheme_data <- { x$stattheme_data$zhlight<- c("#5FA9D3", "#5FC3C3","#84C788", "#EDDD79", "#F29F64", "#EC686C", "#B399C3") - x$stattheme_data$zhpastel <- c( "#7FB9DD", "#7FCECE", "#9DD2A0", "#F1E494", "#F4B283", "#F1868B", "#C3ACCE") - x$stattheme_data$zhextralight <- c("#9FCBE5", "#9FDADA" ,"#B4DEB8", "#F3EBAE", "#F7C5A1", "#F3A5A7", "#D2C1DA") + # fgdfgd x$stattheme_data$zhultralight <- c("#BFDCED" ,"#BFE6E6", "#CDE9D0" ,"#F8F1CA" ,"#F9D8C0", "#F8C3C4", "#E0D6E6") @@ -43,25 +45,14 @@ stattheme_data <- { x$stattheme_data$zhblue <- c("#407B9F","#3F8AB4","#3F98CC","#5FA9D3","#7FB9DD","#9FCBE5","#BFDCED") - x$stattheme_data$zhbluemh<- c('#386a87','#528489','#699b8f','#7fb19d','#96c3b0','#add3cb','#c5dfed') - # x$stattheme_data$zhblue <- c('#407b9f','#4c97c1','#71b2d8','#a0cbe5','#d0e5f2') #x$stattheme_data$zhblue <- c('#407b9f','#71b2d8','#d0e5f2') x$stattheme_data$zhgreen <-c("#527F54", "#669F6A", "#7ABF7F","#90C993","#A5D3A9","#BBDFBF","#D2E9D3") - x$stattheme_data$zhturqoise <-c("#409292", "#3FA5A5", "#3FB8B8","#5FC3C3","#7FCECE","#9FDADA","#BFE6E6") - - x$stattheme_data$zhyellow<-c("#B2A558", "#CEBE5B", "#EBD760","#EDDD79","#F1E494","#F3EBAE","#F8F1CA") - x$stattheme_data$zhorange <-c("#B77346", "#D27F46", "#F08D47","#F29f64","#f4b283","#f7c5a1","#f9d8c0") - x$stattheme_data$zhred <- c('#983844','#b74451','#d84f60','#e76c7b','#ec8c99','#f1a8b2','#f6c5cb') - - x$stattheme_data$zhviolet <-c('#715f7a','#857190','#9a83a7','#af96bc','#c0acc9','#d0c2d8','#e3d9e6') - - x$stattheme_data$zhvioletmh<-c('#715f7a','#877375','#9a8874','#ae9e77','#c1b284','#d4c6a1','#e3d9e6') #diagonal palette @@ -73,26 +64,10 @@ stattheme_data <- { x$stattheme_data$zhbyg<- c( "#003B5E", "#006EB1" ,"#5FA9D5","#FFE16F","#C2D37B", "#86CEB8", "#56BFB9", "#9DB99E", "#656564") - x$stattheme_data$zhbyglight<- c("#2A5A78", "#2A85BE", "#79B7DC" ,"#FFE586" ,"#CCD991", "#99D6C3" ,"#72C9C4", "#ACC4AD" ,"#7E7E7D") - #zhlake x$stattheme_data$zhlake<-c("#002338","#004671","#0076BD","#3F94BA" ,"#7FB2B7", "#BFD0B4","#DAEBCC", "#FFEFB2") - x$stattheme_data$zhlakelight<-c("#2A4659", "#2A6487", "#2A8CC7", "#5FA5C5", "#93BEC3", "#C9D7BF" ,"#DFEDD3", "#FFF1BE") - - #likert-paletten - - #zhlikert Benchmarking mit Kantonsrot / Kantonsgr?n - '#e2001a', "#3ea743" - - x$stattheme_data$zhlikert5gr <- c( "#F09B7A", "#E93F53","#6EBD72", "#B3DA8A", "#F8F7A2") - - x$stattheme_data$zhlikert5br <- c("#F09B7A","#E93F53","#3F98CD", "#9BC7B7", "#F8F7A2") - - x$stattheme_data$zhlikert6gr <- c("#6EBD72", "#A5D485" ,"#DCEB98" ,"#f2a975", "#EF8872" ,"#E93F53") - - x$stattheme_data$zhlikert6br <- c("#3F98CD" ,"#7FB9DD", "#9FDADA", "#F7C5A1", "#EF8872", "#E93F53") - #BENCHMARKING-PALETTEN @@ -218,3 +193,5 @@ stattheme_pal <- function(palette = "default") { #' zhpal <- x$stattheme_data + + From 418d756b0f0bd79316dca3e1c0a4d4f741187070 Mon Sep 17 00:00:00 2001 From: awuermli Date: Tue, 15 Nov 2022 15:18:03 +0000 Subject: [PATCH 06/74] deactivate unused palettes --- R/col_stat.R | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/R/col_stat.R b/R/col_stat.R index 597a3d3..33e23ab 100644 --- a/R/col_stat.R +++ b/R/col_stat.R @@ -12,17 +12,18 @@ library(scales) stattheme_data <- { x <- list() - #standard - x$stattheme_data$zhtest<- c("#009ee0", "#0070B4", "#7F3DA7", "#D40053", "#B01657", "#DC7700","#00797B", "#1A7F1F") + #standard x$stattheme_data$zhcd<- c("#009ee0", "#0076bd", "#885ea0", "#e30059", "#e2001a","#ffcc00", "#00a1a3","#3ea743") + x$stattheme_data$zhtest<- c("#009ee0", "#0070B4", "#7F3DA7", "#D40053", "#B01657", "#DC7700","#00797B", "#1A7F1F") + ### 1. Ordinale / kategoriale Paletten #Farbmatrixpaletten (horizontal) #standard - x$stattheme_data$zhinfografik<- c("#0070B4", "#00407C", "#00407C", "#00797B", "#8A8C00", "#00544C", "#DC7700", "#D93C1A", "#96170F", "#D40053", "#B01657", "#7A0049", "#9572D5", "#54268E", "#CCCCCC", "#949494", "#666666", "#333333" ) + x$stattheme_data$zhinfografik<- c("#0070B4", "#00407C", "#00797B", "#8A8C00", "#00544C", "#DC7700", "#D93C1A", "#96170F", "#D40053", "#B01657", "#7A0049", "#9572D5", "#54268E", "#CCCCCC", "#949494", "#666666", "#333333" ) x$stattheme_data$zhdarker<- c("#407B9F", "#409292", "#5F9463", "#B2A558", "#B77346", "#B24A4C", "#857091") @@ -32,8 +33,9 @@ stattheme_data <- { x$stattheme_data$zhlight<- c("#5FA9D3", "#5FC3C3","#84C788", "#EDDD79", "#F29F64", "#EC686C", "#B399C3") + x$stattheme_data$zhpastel <- c( "#7FB9DD", "#7FCECE", "#9DD2A0", "#F1E494", "#F4B283", "#F1868B", "#C3ACCE") + x$stattheme_data$zhextralight <- c("#9FCBE5", "#9FDADA" ,"#B4DEB8", "#F3EBAE", "#F7C5A1", "#F3A5A7", "#D2C1DA") - # fgdfgd x$stattheme_data$zhultralight <- c("#BFDCED" ,"#BFE6E6", "#CDE9D0" ,"#F8F1CA" ,"#F9D8C0", "#F8C3C4", "#E0D6E6") @@ -45,14 +47,25 @@ stattheme_data <- { x$stattheme_data$zhblue <- c("#407B9F","#3F8AB4","#3F98CC","#5FA9D3","#7FB9DD","#9FCBE5","#BFDCED") + # x$stattheme_data$zhbluemh<- c('#386a87','#528489','#699b8f','#7fb19d','#96c3b0','#add3cb','#c5dfed') + # x$stattheme_data$zhblue <- c('#407b9f','#4c97c1','#71b2d8','#a0cbe5','#d0e5f2') #x$stattheme_data$zhblue <- c('#407b9f','#71b2d8','#d0e5f2') x$stattheme_data$zhgreen <-c("#527F54", "#669F6A", "#7ABF7F","#90C993","#A5D3A9","#BBDFBF","#D2E9D3") + # x$stattheme_data$zhturqoise <-c("#409292", "#3FA5A5", "#3FB8B8","#5FC3C3","#7FCECE","#9FDADA","#BFE6E6") + + # x$stattheme_data$zhyellow<-c("#B2A558", "#CEBE5B", "#EBD760","#EDDD79","#F1E494","#F3EBAE","#F8F1CA") + x$stattheme_data$zhorange <-c("#B77346", "#D27F46", "#F08D47","#F29f64","#f4b283","#f7c5a1","#f9d8c0") + x$stattheme_data$zhred <- c('#983844','#b74451','#d84f60','#e76c7b','#ec8c99','#f1a8b2','#f6c5cb') + + # x$stattheme_data$zhviolet <-c('#715f7a','#857190','#9a83a7','#af96bc','#c0acc9','#d0c2d8','#e3d9e6') + + # x$stattheme_data$zhvioletmh<-c('#715f7a','#877375','#9a8874','#ae9e77','#c1b284','#d4c6a1','#e3d9e6') #diagonal palette @@ -64,10 +77,26 @@ stattheme_data <- { x$stattheme_data$zhbyg<- c( "#003B5E", "#006EB1" ,"#5FA9D5","#FFE16F","#C2D37B", "#86CEB8", "#56BFB9", "#9DB99E", "#656564") + x$stattheme_data$zhbyglight<- c("#2A5A78", "#2A85BE", "#79B7DC" ,"#FFE586" ,"#CCD991", "#99D6C3" ,"#72C9C4", "#ACC4AD" ,"#7E7E7D") + #zhlake x$stattheme_data$zhlake<-c("#002338","#004671","#0076BD","#3F94BA" ,"#7FB2B7", "#BFD0B4","#DAEBCC", "#FFEFB2") + # x$stattheme_data$zhlakelight<-c("#2A4659", "#2A6487", "#2A8CC7", "#5FA5C5", "#93BEC3", "#C9D7BF" ,"#DFEDD3", "#FFF1BE") + + #likert-paletten + + #zhlikert Benchmarking mit Kantonsrot / Kantonsgr?n - '#e2001a', "#3ea743" + + x$stattheme_data$zhlikert5gr <- c( "#F09B7A", "#E93F53","#6EBD72", "#B3DA8A", "#F8F7A2") + + x$stattheme_data$zhlikert5br <- c("#F09B7A","#E93F53","#3F98CD", "#9BC7B7", "#F8F7A2") + + x$stattheme_data$zhlikert6gr <- c("#6EBD72", "#A5D485" ,"#DCEB98" ,"#f2a975", "#EF8872" ,"#E93F53") + + x$stattheme_data$zhlikert6br <- c("#3F98CD" ,"#7FB9DD", "#9FDADA", "#F7C5A1", "#EF8872", "#E93F53") + #BENCHMARKING-PALETTEN @@ -193,5 +222,3 @@ stattheme_pal <- function(palette = "default") { #' zhpal <- x$stattheme_data - - From b47c537bdcb8c397afd3b2fa4628ebda97a0a2d0 Mon Sep 17 00:00:00 2001 From: awuermli Date: Tue, 31 Jan 2023 12:21:47 +0000 Subject: [PATCH 07/74] various changes --- NEWS.md | 7 ++ R/col_stat.R | 8 +- R/display.statcol.all.R | 2 +- vignettes/Farbpaletten.Rmd | 179 +++++++++++++++++++++++++++++++++++++ vignettes/map.png | Bin 156273 -> 154721 bytes 5 files changed, 191 insertions(+), 5 deletions(-) create mode 100644 vignettes/Farbpaletten.Rmd diff --git a/NEWS.md b/NEWS.md index d4a14ea..0c99231 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,10 @@ +# statR 2.1.2 + +* implemented new color palettes +* removes old and not accessible palettes +* the documentation has been update + * bugs in the documentation fixed + # statR 2.1.1 * fix `datasetXLSX()` which generated broken Links in the index-sheet diff --git a/R/col_stat.R b/R/col_stat.R index 33e23ab..4fa1f85 100644 --- a/R/col_stat.R +++ b/R/col_stat.R @@ -16,14 +16,14 @@ stattheme_data <- { #standard x$stattheme_data$zhcd<- c("#009ee0", "#0076bd", "#885ea0", "#e30059", "#e2001a","#ffcc00", "#00a1a3","#3ea743") - x$stattheme_data$zhtest<- c("#009ee0", "#0070B4", "#7F3DA7", "#D40053", "#B01657", "#DC7700","#00797B", "#1A7F1F") + x$stattheme_data$zhwebaccent<- c("#009ee0", "#0070B4", "#7F3DA7", "#D40053", "#B01657", "#DC7700","#00797B", "#1A7F1F") ### 1. Ordinale / kategoriale Paletten #Farbmatrixpaletten (horizontal) #standard - x$stattheme_data$zhinfografik<- c("#0070B4", "#00407C", "#00797B", "#8A8C00", "#00544C", "#DC7700", "#D93C1A", "#96170F", "#D40053", "#B01657", "#7A0049", "#9572D5", "#54268E", "#CCCCCC", "#949494", "#666666", "#333333" ) + x$stattheme_data$zhwebdataViz<- c("#0070B4", "#00407C", "#00797B", "#8A8C00", "#00544C", "#DC7700", "#D93C1A", "#96170F", "#D40053", "#B01657", "#7A0049", "#9572D5", "#54268E", "#CCCCCC", "#949494", "#666666", "#333333" ) x$stattheme_data$zhdarker<- c("#407B9F", "#409292", "#5F9463", "#B2A558", "#B77346", "#B24A4C", "#857091") @@ -35,9 +35,9 @@ stattheme_data <- { x$stattheme_data$zhpastel <- c( "#7FB9DD", "#7FCECE", "#9DD2A0", "#F1E494", "#F4B283", "#F1868B", "#C3ACCE") - x$stattheme_data$zhextralight <- c("#9FCBE5", "#9FDADA" ,"#B4DEB8", "#F3EBAE", "#F7C5A1", "#F3A5A7", "#D2C1DA") + # x$stattheme_data$zhextralight <- c("#9FCBE5", "#9FDADA" ,"#B4DEB8", "#F3EBAE", "#F7C5A1", "#F3A5A7", "#D2C1DA") - x$stattheme_data$zhultralight <- c("#BFDCED" ,"#BFE6E6", "#CDE9D0" ,"#F8F1CA" ,"#F9D8C0", "#F8C3C4", "#E0D6E6") + # x$stattheme_data$zhultralight <- c("#BFDCED" ,"#BFE6E6", "#CDE9D0" ,"#F8F1CA" ,"#F9D8C0", "#F8C3C4", "#E0D6E6") #x$stattheme_data$zhpaired16<-c("#4684AA","#8CBFDD", "#469A9A","#8CD0D1", "#669F6A","#A5D3A9", "#CCAA1A","#F8DD6A", "#C37D4C" ,"#F1B892","#BE4654","#EC8C99", "#8D7899","#C6B4CE","#1B252B","#767C7F") diff --git a/R/display.statcol.all.R b/R/display.statcol.all.R index 153d169..1149824 100644 --- a/R/display.statcol.all.R +++ b/R/display.statcol.all.R @@ -26,7 +26,7 @@ display.statcol.all<-function() { gg1 <- ggplot2::ggplot(df, ggplot2::aes(x=pal_col, y=0, color=I(col)))+ ggplot2::geom_point(size=20,shape=15)+ ggplot2::facet_wrap(~palette, ncol=3,scales="free")+ - ggplot2::guides(color=FALSE)+ + ggplot2::guides(color="none")+ ggplot2::theme_minimal()+ ggplot2::theme(axis.ticks=ggplot2::element_blank(), axis.text=ggplot2::element_blank()) + diff --git a/vignettes/Farbpaletten.Rmd b/vignettes/Farbpaletten.Rmd new file mode 100644 index 0000000..0dbcf52 --- /dev/null +++ b/vignettes/Farbpaletten.Rmd @@ -0,0 +1,179 @@ +--- +title: "Farbpaletten" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Farbpaletten} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + + +```{r setup, warning = F, message = F} +library(statR) +library(dplyr) +library(ggplot2) +library(tidyr) +library(downloader) +library(zip) +library(sf) +library(dichromat) +library(ggrepel) +``` + +# Farbpaletten + +Das Farbpalettenobjekt `zhpal` enthält alle im Package vorhandenen Farbpaletten und ist mit dem geladenen `statR`-Package global verfügbar. + +Mit der Funktion `display.statcol.all()` können alle Farbpaletten angezeigt werden: + +```{r} +display.statcol.all() +``` + +Mit der Funktion `display()` kann man sich die Farben einer Palette anschauen: + +```{r} +display(zhpal$zhdiagonal) +``` + +Mit der Funktion `grDevices::colorRampPalette()` kann eine beliebige Anzahl Farbtöne basierend auf einer statR-Farbpalette erstellt werden: + +```{r} +#Mische 20 Farbtöne auf Basis der zhdiagonal-Palette +display(grDevices::colorRampPalette((zhpal$zhdiagonal),space="Lab")(20)) +``` + +Anwendungsbeispiel mit kategorialen Daten: + +```{r} +#verwende die Paletten für kategoriale Daten mittels 'scale_fill_manual' +ggplot(mpg, aes(class,fill = drv))+ + geom_bar()+ + theme_stat()+ + scale_fill_manual(values=zhpal$zhblue) +``` + +## Barrierefreie Grafiken + +Bei der Erstellung von Grafiken ist es besonders wichtig darauf zu achten, dass die Grafiken auch für Personen mit (Farb-)Sehschwächen und Sehbehinderungen interpretierbar sind. Um solche barrierefreie Grafiken zu erstellen, bieten sich im Allgemeinen verschiedene Strategien an: + +- Daten, die der Grafik zugrunde liegen, zusätzlich als csv oder -html-Tabelle einbinden + +- Einen Alternativtext (alt-Text) hinterlegen, der beschreibt, was auf der Grafik abgebildet ist und wo die Daten zu finden sind + +- Farbpaletten wählen, die für Farbsehschwächen optimiert sind + +- Die Grafik soll nicht ausschliesslich aufgrund einer Farbpalette interpretierbar sein + +- Die Komplexität der Grafiken sollte auf ein Minimum beschränkt werden + +Einige dieser Punkte können direkt bei der Erstellung der Grafiken in R berücksichtigt werden. + +### 1. Farbsehschwächen + +Damit Grafiken auch für Personen mit Farbsehschwächen möglichst gut interpretierbar sind, sollten Farben in Grafiken sowohl bezüglich der *Farbanteile* als auch der *Farbsättigung* variiert werden. Wenn möglich, sollten unterschiedliche Datenkategorien zudem nicht nur über die Farben sondern auch über unterschiedliche Darstellungsformen unterscheidbar sein (z.B. Schraffuren, Punkt- oder Linientypen; siehe 1.3). Auch die direkte Beschriftung von Kategorien bietet sich hier als Mittel an (siehe 1.4). + +### 1.2 Auswahl Farbpaletten + +In R können mit dem [dichromat-Package](https://cran.r-project.org/web/packages/dichromat/index.html) diverse Ausprägungen von Farbsehschwäche simuliert werden. Dies erlaubt es Farbpaletten auszuwählen, die möglichst farbsehschwächenfreundlich sind. + +```{r out.width="20%", out.height="20%"} +library(dichromat) +# Anzeige der Farbpalette zhdiagonal +display(zhpal$zhdiagonal) +# Simulation Grünsehschwäche (Deuteranomalie) +display(dichromat(zhpal$zhdiagonal)) +# Simulation Blaublindheit (Tritanopie) +display(dichromat(zhpal$zhdiagonal,type="tritan")) +``` + +Die Simulation kann auch anhand von Grafiken vorgenommen werden. + +```{r} +p <- ggplot(diamonds, aes(clarity, fill=cut)) + + geom_bar(position = "stack", width= 0.5) + +p + theme_stat() + + scale_fill_manual(values=dichromat(zhpal$zhdiagonal, type=c("tritan"))) +``` + +### 1.3 Form- oder Linientypen + +Wenn immer möglich sollten unterschiedliche Kategorien nicht nur mit unterschiedlichen Farben gekennzeichnet werden, sondern auch mit unterschiedlichen Schraffuren, Symbol- oder Linientypen (siehe: https://bbc.github.io/gel/components/infographics/#recommended-layout). Ja nach Grafiktyp eignen sich andere Ansätze: + +- __Liniendiagramme__: [Linientyp](https://ggplot2.tidyverse.org/reference/aes_linetype_size_shape.html) + +- __Säulen / Flächendiagramme__: [Linientyp](https://ggplot2.tidyverse.org/reference/aes_linetype_size_shape.html) oder [Flächenstruktur](Flächen schraffieren : https://coolbutuseless.github.io/package/ggpattern/articles/pattern-circle.html#the-density-aesthetic-as-a-mapped-aesthetic-1) + +- __Scatter / Punkte-Diagramm__: [Symbole](https://ggplot2.tidyverse.org/reference/aes_linetype_size_shape.html) + + Ab einer gewissen Anzahl an Kategorien, wird die Grafik unübersichtlich. + +__Beispiel : Liniengrafik__ + +```{r} + +# Datenzugriff von: https://www.zh.ch/de/politik-staat/opendata.zhweb-noredirect.zhweb-cache.html?keywords=ogd#/datasets/544@oberjugendanwaltschaft-kanton-zuerich/distributions/1031 + +data <- read.csv("daten/KTZH_00000544_00001031.csv") %>% + pivot_longer(cols=2:3) + +gg_ojuga <- ggplot(data, aes(Jahr, value ,color=name,linetype=name)) + + geom_line()+ + theme_stat() +``` + +__Beispiel : Säulendiagramm__ + +```{r} +ggplot(mpg, aes(class,fill = drv,linetype=drv))+ + geom_bar(col ="black")+ + theme_stat()+ + scale_fill_manual(values=zhpal$zhblue)+ + theme(legend.position="right", axis.text.x = element_text(angle=90,vjust = 0.5, hjust=0)) + +``` + +### 1.4 Direkte Beschriftung + +Bei gewissen Grafiktypen kann die Unterscheidbarkeit von Kategorien auch durch direkte Beschriftung verbessert werden. Das ´ggrepel´-package verfügt über die notwendigen Funktionen. Beispielsweise sorgt es dafür, dass die Beschriftungen nicht überlappen. + +```{r} +library(ggrepel) + +data <- read.csv("daten/KTZH_00000544_00001031.csv") %>% + pivot_longer(cols=2:3) + +ggplot(data, aes(Jahr, value ,color=name)) + + geom_text_repel(data=data %>% filter(Jahr==max(Jahr)), aes(label=name), direction = "y") + + geom_line()+ + theme_stat()+ + guides(color="none") +``` + + +# Grafiken fürs ZHWeb + +Bei Grafiken, welche auf [zh.ch](zh.ch) Publiziert werden sollen, gilt es folgendes zu berücksichtigen: + +- Maximale Bildgrösse 4000x4000 +- Grafik-Titel, Untertitel, Legende, Quelle und Alt-Text müssen direkt im CMS (Bild-Komponente) hinterlegt und nicht in die Grafik selber integriert werden + +```{r} + +ggplot(mpg, aes(class,fill = drv))+ + geom_bar()+ + theme_stat()+ + scale_fill_manual(values=zhpal$zhblue) + + +# ggsave(file = "zhweb_plot.png", width=18, height=8, unit="cm") + +``` diff --git a/vignettes/map.png b/vignettes/map.png index 7ec844783dbe1357fbb06c9f8166c0e3a7cacb2b..c09572fed24e302432ddc10549736bcbea5b428a 100644 GIT binary patch literal 154721 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

fm*4hv0b9d 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ⅆ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 literal 156273 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 dlUs_6>%7kWz_{x^b9yZb;8@Vn#>4na{{TN Date: Tue, 31 Jan 2023 13:56:48 +0000 Subject: [PATCH 08/74] changed documentation --- vignettes/Farbpaletten.Rmd | 5 +++-- vignettes/Visualisierungen.Rmd | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/vignettes/Farbpaletten.Rmd b/vignettes/Farbpaletten.Rmd index 0dbcf52..120ceee 100644 --- a/vignettes/Farbpaletten.Rmd +++ b/vignettes/Farbpaletten.Rmd @@ -165,13 +165,14 @@ Bei Grafiken, welche auf [zh.ch](zh.ch) Publiziert werden sollen, gilt es folgen - Maximale Bildgrösse 4000x4000 - Grafik-Titel, Untertitel, Legende, Quelle und Alt-Text müssen direkt im CMS (Bild-Komponente) hinterlegt und nicht in die Grafik selber integriert werden +- die Palette 'zhwebdataviz' enthält die Farben, die auf dem Web genutzt werden sollen +- die Palette 'zhwebaccent' enthält die Akkzentfarben des Designsystems. Diese sollten ber vor allem für Hintergründ everwendet werden und nicht für Visualisierungen, da sie nicht barrierefrei sind. ```{r} - ggplot(mpg, aes(class,fill = drv))+ geom_bar()+ theme_stat()+ - scale_fill_manual(values=zhpal$zhblue) + scale_fill_manual(values=zhpal$zhwebdataViz[11:13]) # ggsave(file = "zhweb_plot.png", width=18, height=8, unit="cm") diff --git a/vignettes/Visualisierungen.Rmd b/vignettes/Visualisierungen.Rmd index 69db7d8..80bd09d 100644 --- a/vignettes/Visualisierungen.Rmd +++ b/vignettes/Visualisierungen.Rmd @@ -89,6 +89,12 @@ ggsave("map.png") Das Farbpalettenobjekt `zhpal` enthält alle im Package vorhandenen Farbpaletten und ist mit dem geladenen `statR`-Package global verfügbar. +Mit der Funktion `display.statcol.all()` können alle vorhandenen Farbpaletten angezeigt werden: + +```{r} +display.statcol.all() +``` + Mit der Funktion `display()` kann man sich die Farben einer Palette anschauen: ```{r} @@ -134,7 +140,7 @@ Damit Grafiken auch für Personen mit Farbsehschwächen möglichst gut interpret ### 1.2 Auswahl Farbpaletten -In R können mit dem [dichromat-Package](https://cran.r-project.org/web/packages/dichromat/index.html) diverse Ausprägungen von Farbsehschwäche simuliert werden. Dies erlaubt es Farbpaletten auszuwählen, die möglichst farbsehschwächenfreundlich sind. +In R können mit dem [dichromat-Package](https://cran.r-project.org/web/packages/dichromat/index.html) diverse Ausprägungen von Farbsehschwäche simuliert werden. Dies erlaubt es Farbpaletten auszuwählen, die möglichst farbsehschwächenfreundlich sind. Je heller die Paletten sind, desto weniger geeingnet sind sie. Das trifft vor allem auf die Farbpaletten zhextralight oder zhultralight zu. ```{r out.width="20%", out.height="20%"} library(dichromat) @@ -213,17 +219,21 @@ ggplot(data, aes(Jahr, value ,color=name)) + # Grafiken fürs ZHWeb -Bei Grafiken, welche auf [zh.ch](zh.ch) Publiziert werden sollen, gilt es folgendes zu berücksichtigen: + +# Grafiken fürs ZHWeb + +Bei Grafiken, welche auf [zh.ch](zh.ch) publiziert werden sollen, gilt es folgendes zu berücksichtigen: - Maximale Bildgrösse 4000x4000 - Grafik-Titel, Untertitel, Legende, Quelle und Alt-Text müssen direkt im CMS (Bild-Komponente) hinterlegt und nicht in die Grafik selber integriert werden +- die Palette 'zhwebdataviz' enthält die Farben, die im Web genutzt werden sollen +- die Palette 'zhwebaccent' enthält die Akzentfarben des Designsystems. Diese sollten ber vor allem für Hintergründe verwendet werden und nicht für Visualisierungen, da sie nicht barrierefrei sind. ```{r} - ggplot(mpg, aes(class,fill = drv))+ geom_bar()+ theme_stat()+ - scale_fill_manual(values=zhpal$zhblue) + scale_fill_manual(values=zhpal$zhwebdataViz[11:13]) # ggsave(file = "zhweb_plot.png", width=18, height=8, unit="cm") From 49da0edbc2066ea7e90e08e5b1fefe2bf03d6ee0 Mon Sep 17 00:00:00 2001 From: awuermli Date: Wed, 8 Feb 2023 09:24:09 +0000 Subject: [PATCH 09/74] page update --- .Rbuildignore | 1 + .gitignore | 1 + DESCRIPTION | 6 +- docs/404.html | 124 +-- docs/LICENSE.html | 860 ++++-------------- docs/articles/Excel-Tabellen.html | 196 ++-- docs/articles/Sonstige_Funktionen.html | 153 ++-- docs/articles/Visualisierungen.html | 373 ++++---- .../figure-html/unnamed-chunk-10-1.png | Bin 48963 -> 26057 bytes .../figure-html/unnamed-chunk-12-1.png | Bin 49189 -> 56412 bytes .../figure-html/unnamed-chunk-13-1.png | Bin 25800 -> 50399 bytes .../figure-html/unnamed-chunk-5-1.png | Bin 6860 -> 50419 bytes .../figure-html/unnamed-chunk-6-1.png | Bin 7643 -> 6860 bytes .../figure-html/unnamed-chunk-7-1.png | Bin 25800 -> 7643 bytes .../figure-html/unnamed-chunk-8-1.png | Bin 6860 -> 25800 bytes .../figure-html/unnamed-chunk-9-1.png | Bin 26057 -> 6860 bytes docs/articles/html_report_template.html | 114 +-- docs/articles/index.html | 214 ++--- docs/authors.html | 186 ++-- docs/index.html | 101 +- docs/news/index.html | 273 ++---- docs/pkgdown.css | 83 +- docs/pkgdown.js | 4 +- docs/pkgdown.yml | 6 +- docs/reference/aXLSX.html | 349 +++---- docs/reference/datasetsXLSX.html | 513 +++++------ docs/reference/display.html | 260 ++---- docs/reference/display.statcol.all-1.png | Bin 51625 -> 50321 bytes docs/reference/display.statcol.all.html | 221 ++--- docs/reference/flush_left.html | 242 ++--- docs/reference/index.html | 203 +---- docs/reference/insert_metadata_sheet.html | 304 +++---- docs/reference/insert_worksheet.html | 320 +++---- docs/reference/insert_worksheet_nh.html | 350 +++---- docs/reference/interpolate2.html | 266 ++---- docs/reference/quickXLSX.html | 336 +++---- docs/reference/quick_sum.html | 297 +++--- docs/reference/splitXLSX.html | 346 +++---- docs/reference/theme_stat.html | 317 +++---- docs/reference/zhpal.html | 213 ++--- vignettes/Farbpaletten.Rmd | 180 ---- vignettes/Visualisierungen.Rmd | 2 +- vignettes/map.png | Bin 154721 -> 153210 bytes 43 files changed, 2482 insertions(+), 4932 deletions(-) delete mode 100644 vignettes/Farbpaletten.Rmd diff --git a/.Rbuildignore b/.Rbuildignore index 6ea0e36..8fb92de 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -6,3 +6,4 @@ ^man-roxygen$ ^index\.html$ ^vignettes$ +^_pkgdown\.yml$ diff --git a/.gitignore b/.gitignore index 09a72cb..10c71b2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .Rhistory .RData inst/doc +docs diff --git a/DESCRIPTION b/DESCRIPTION index ecbd49b..8271343 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -12,10 +12,9 @@ Depends: R (>= 3.3.0) License: GPL-3 Encoding: UTF-8 LazyData: true -RoxygenNote: 7.1.2 +RoxygenNote: 7.2.0 Imports: dplyr, - ggrepel, ggplot2, openxlsx, magrittr, @@ -32,5 +31,6 @@ URL: https://statistikzh.github.io/statR/ BugReports: https://github.com/statistikZH/statR/issues Suggests: knitr, - rmarkdown + rmarkdown, + ggrepel VignetteBuilder: knitr diff --git a/docs/404.html b/docs/404.html index b810d97..8d3115a 100644 --- a/docs/404.html +++ b/docs/404.html @@ -1,72 +1,32 @@ - - - - + + + + - Page not found (404) • statR - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - + + + - - -

+ + + - - -
+
+
-
- +
+ + - - diff --git a/docs/LICENSE.html b/docs/LICENSE.html index 1141107..46db12c 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -1,72 +1,17 @@ - - - - - - - -GNU General Public License • statR - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -GNU General Public License • statR - - - - - - - + + -
-
- -
- -
+
-
+

-1. Source Code

+1. Source Code

The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

@@ -277,9 +277,9 @@

The Corresponding Source for a work in source code form is that same work.

-
+

-2. Basic Permissions

+2. Basic Permissions

All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited @@ -302,9 +302,9 @@

conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

- @@ -198,17 +198,17 @@

Details

To use this theme in a R Markdown generated PDF document, insert `dev="cairo_pdf"` into `knitr::opts_chunk$set()`.

Examples

-
# \donttest{
-if (FALSE) {
-library(ggplot2)
-library(statR)
-
-ggplot(mpg, aes(class)) +
-geom_bar() +
-theme_stat() +
-labs(title = "Title")
-}# }
-
+
# \donttest{ +if (FALSE) { +library(ggplot2) +library(statR) + +ggplot(mpg, aes(class)) + +geom_bar() + +theme_stat() + +labs(title = "Title") +}# } +
@@ -166,7 +166,7 @@

Contents

From af9e44bae726bfb56acf9b7219cb37869aaf4971 Mon Sep 17 00:00:00 2001 From: Thomas Lo Russo Date: Wed, 1 Mar 2023 15:19:30 +0000 Subject: [PATCH 17/74] udpate documentation --- vignettes/Visualisierungen.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vignettes/Visualisierungen.Rmd b/vignettes/Visualisierungen.Rmd index 6578a20..e0d9ea3 100644 --- a/vignettes/Visualisierungen.Rmd +++ b/vignettes/Visualisierungen.Rmd @@ -71,7 +71,7 @@ flush_left(p) Für Karten kann die Option `map` auf `TRUE` gesetzt werden. ```{r} -# Datensatz mit politischen +# Bezug der Geodaten mit den Gemeindegrenzen (Stand 2020) downloader::download("https://www.web.statistik.zh.ch/ogd/daten/ressourcen/KTZH_00000151_00001653.zip","geodata.zip") zip::unzip("geodata.zip") From 9fb3ce87646f0344a59dcc703a26481e80ed4456 Mon Sep 17 00:00:00 2001 From: Thomas Lo Russo Date: Wed, 1 Mar 2023 15:26:16 +0000 Subject: [PATCH 18/74] add github action --- .Rbuildignore | 1 + .github/.gitignore | 1 + .github/workflows/R-CMD-check.yaml | 46 ++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 .github/.gitignore create mode 100644 .github/workflows/R-CMD-check.yaml diff --git a/.Rbuildignore b/.Rbuildignore index 6ea0e36..5f0d859 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -6,3 +6,4 @@ ^man-roxygen$ ^index\.html$ ^vignettes$ +^\.github$ diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 0000000..2d19fc7 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1 @@ +*.html diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 0000000..271d466 --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,46 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/master/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +name: R-CMD-check + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: macOS-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-pandoc@v1 + + - uses: r-lib/actions/setup-r@v1 + with: + r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v1 + with: + extra-packages: rcmdcheck + + - uses: r-lib/actions/check-r-package@v1 From 8b9a5604ceb64a538ac560ced305b97cb1081ca0 Mon Sep 17 00:00:00 2001 From: Thomas Lo Russo Date: Wed, 1 Mar 2023 15:39:50 +0000 Subject: [PATCH 19/74] switch to v2 --- .github/workflows/R-CMD-check.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 271d466..e23739c 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -31,16 +31,16 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: r-lib/actions/setup-pandoc@v1 + - uses: r-lib/actions/setup-pandoc@v2 - - uses: r-lib/actions/setup-r@v1 + - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} http-user-agent: ${{ matrix.config.http-user-agent }} use-public-rspm: true - - uses: r-lib/actions/setup-r-dependencies@v1 + - uses: r-lib/actions/setup-r-dependencies@v2 with: extra-packages: rcmdcheck - - uses: r-lib/actions/check-r-package@v1 + - uses: r-lib/actions/check-r-package@v2 From 60d8849c0df20bd5f83f8e98749bbbc14646e226 Mon Sep 17 00:00:00 2001 From: Thomas Lo Russo Date: Wed, 1 Mar 2023 15:41:12 +0000 Subject: [PATCH 20/74] github action badge added --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 1e5c159..5d38f11 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # statR + + [![R-CMD-check](https://github.com/statistikZH/statR/workflows/R-CMD-check/badge.svg)](https://github.com/statistikZH/statR/actions) + +

From a51575059b923a128628af0add078167c0842dbf Mon Sep 17 00:00:00 2001 From: Thomas Lo Russo Date: Wed, 1 Mar 2023 15:45:11 +0000 Subject: [PATCH 21/74] update --- .github/workflows/R-CMD-check.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index e23739c..db7c4b0 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -42,5 +42,6 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: extra-packages: rcmdcheck + extra-packages: downloader - uses: r-lib/actions/check-r-package@v2 From 169579ca8cc1b7b4aa0cc148ea9e0cdb101fd078 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Fri, 5 May 2023 11:21:58 +0000 Subject: [PATCH 22/74] Bugfix: error when providing path to logo. See https://github.com/statistikZH/statR/issues/52 --- R/datasetsXLSX.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index d5d60c2..7f226ae 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -294,7 +294,7 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, titles } else if(file.exists(logo)) { - openxlsx::insertImage(wb, i, logo, width = 2.145, height = 0.7865, + openxlsx::insertImage(wb, "Inhalt", logo, width = 2.145, height = 0.7865, units = "in") } if(!file.exists(logo)) { From 2f4fb25f551edc15cc77a3c2a305c1bf718390cc Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Fri, 5 May 2023 14:37:05 +0000 Subject: [PATCH 23/74] Fix for Issue https://github.com/statistikZH/statR/issues/53; some refactoring; documentation is WIP. --- .github/workflows/R-CMD-check.yaml | 1 - DESCRIPTION | 1 - NAMESPACE | 3 + R/datasetsXLSX.R | 375 +++++------------------------ R/insert_hyperlinks.R | 49 ++++ R/insert_image.R | 61 +++-- R/insert_index_sheet.R | 184 ++++++++++++++ R/quick_sum.r | 1 + R/styles.R | 31 +++ man/datasetsXLSX.Rd | 7 +- man/insert_hyperlinks.Rd | 29 +++ man/insert_index_sheet.Rd | 44 ++++ man/insert_worksheet_nh.Rd | 2 +- man/mainTitleStyle.Rd | 18 ++ 14 files changed, 458 insertions(+), 348 deletions(-) create mode 100644 R/insert_hyperlinks.R create mode 100644 R/insert_index_sheet.R create mode 100644 R/styles.R create mode 100644 man/insert_hyperlinks.Rd create mode 100644 man/insert_index_sheet.Rd create mode 100644 man/mainTitleStyle.Rd diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index db7c4b0..e23739c 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -42,6 +42,5 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: extra-packages: rcmdcheck - extra-packages: downloader - uses: r-lib/actions/check-r-package@v2 diff --git a/DESCRIPTION b/DESCRIPTION index 38a2beb..30e4b9b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -33,6 +33,5 @@ Suggests: knitr, rmarkdown, ggrepel, - tidyr, magrittr VignetteBuilder: knitr diff --git a/NAMESPACE b/NAMESPACE index 6c54239..2fd228b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -27,7 +27,10 @@ importFrom(ggplot2,theme) importFrom(ggplot2,theme_minimal) importFrom(ggplot2,unit) importFrom(grDevices,"colorRampPalette") +importFrom(grDevices,dev.off) +importFrom(grDevices,png) importFrom(graphics,"rect") +importFrom(rlang,":=") importFrom(stats,median) importFrom(stats,quantile) importFrom(stats,sd) diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index 7f226ae..ee12bfb 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -27,17 +27,15 @@ #' @param overwrite overwrites the existing excel files with the same file name. default to FALSE #' @keywords datasetsXLSX #' @export +#' @importFrom dplyr "%>%" #' @examples #'\donttest{ #' \dontrun{ -#' -#' -#' #'# Example with two datasets and no figure #'dat1 <- mtcars #'dat2 <- PlantGrowth #' -#'datasetsXLSX(file="twoDatasets", # '.xlsx' wird automatisch hinzugef\u00fcgt +#'datasetsXLSX(file="twoDatasets", #' datasets = list(dat1, dat2), #' titles = c("mtcars-Datensatz","PlantGrowth-Datensatz"), #' grouplines = list(c(1)), @@ -66,7 +64,7 @@ #'fig <- ggplot(mtcars, aes(x=disp))+ #' geom_histogram() #' -#'datasetsXLSX(file="twoDatasetsandFigure", # '.xlsx' wird automatisch hinzugef\u00fcgt +#'datasetsXLSX(file="twoDatasetsandFigure", #' datasets = list(dat1, dat2, fig), # fig als ggplot Objekt oder File Path #' titles = c("mtcars-Datensatz","PlantGrowth-Datensatz", "Histogramm"), #' plot_widths = c(5), @@ -89,8 +87,6 @@ #'} #'} - - datasetsXLSX <- function(file, datasets, titles, @@ -98,12 +94,12 @@ datasetsXLSX <- function(file, plot_heights = NULL, grouplines = NA, group_names = NA, - sources= "statzh", - metadata1=NA, + sources = "statzh", + metadata1 = NA, sheetnames, maintitle, titlesource = "statzh", - logo="statzh", + logo = "statzh", auftrag_id = NULL, contact = "statzh", homepage = "statzh", @@ -117,6 +113,7 @@ datasetsXLSX <- function(file, wb <- openxlsx::createWorkbook("data") + # Determine which elements of input list datasets correspond to dataframes. dataframes_index <- which(vapply(datasets, is.data.frame, TRUE)) dataframe_datasets <- datasets[dataframes_index] @@ -128,17 +125,28 @@ datasetsXLSX <- function(file, dataframe_group_names <- group_names[dataframes_index] + # Determine which elements of datasets correspond to objects of type gg, + # ggplot, histogram, or character (path input). plot_index <- which(vapply(datasets, function(x) length(setdiff(class(x), c("gg", "ggplot", "histogram", "character"))) == 0, TRUE)) plot_datasets <- datasets[plot_index] plot_sheetnames <- sheetnames[plot_index] - insert_index_sheet(wb, logo, contact, homepage, openinghours, titlesource, auftrag_id, maintitle) + # Insert the initial index sheet + insert_index_sheet(wb, + logo, + contact, + homepage, + openinghours, + titlesource, + auftrag_id, + maintitle) - if(length(dataframes_index) > 0){ - purrr::pwalk(list( + # Iterate along dataframes_index + if(length(dataframes_index) > 0){ + list( dataframe_datasets, dataframe_sheetnames, dataframe_titles, @@ -146,319 +154,52 @@ datasetsXLSX <- function(file, dataframe_metadata1, dataframe_grouplines, dataframe_group_names - ), - ~insert_worksheet_nh( - data = ..1, - wb = wb, - sheetname = ..2, - title = ..3, - source = ..4, - metadata = ..5, - grouplines = ..6, - group_names = ..7 - )) - + ) %>% + purrr::pwalk( + ~insert_worksheet_nh( + data = ..1, + wb = wb, + sheetname = ..2, + title = ..3, + source = ..4, + metadata = ..5, + grouplines = ..6, + group_names = ..7)) } - if(length(plot_index)>0){ - - temp_list <- purrr::pmap(list( + # Iterate along plot_index + if (length(plot_index) > 0){ + list( plot_datasets, plot_sheetnames, plot_widths, plot_heights - ), ~insert_worksheet_image( - image = ..1, - wb = wb, - sheetname = ..2, - width = ..3, - height = ..4)) - }else{ - temp_list <- NA + ) %>% + purrr::pmap( + ~insert_worksheet_image( + image = ..1, + wb = wb, + sheetname = ..2, + width = ..3, + height = ..4)) } - - hyperlink_table <- data.frame( + # Create a table of hyperlinks + data.frame( sheetnames = sheetnames, titles = titles, sheet_row = c(seq(15,15+length(sheetnames)-1)) - ) - - purrr::pwalk(hyperlink_table, ~insert_hyperlinks(wb, ..1, ..2, ..3)) - - openxlsx::saveWorkbook(wb, paste(file, ".xlsx", sep = ""), overwrite = overwrite) - - if(!is.na(temp_list)){ - purrr::walk(temp_list, unlink) - } -} - - -insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ - openxlsx::writeData(wb, - sheet = "Inhalt", - x = title, - xy = c("C", sheet_row) - ) - - openxlsx::addStyle(wb - ,sheet = "Inhalt" - ,style = hyperlink_style() - ,rows = sheet_row - ,cols = 3 - ) - - openxlsx::mergeCells(wb, sheet = "Inhalt", cols = 3:8, rows = sheet_row) - - worksheet <- wb$sheetOrder[1] - - field_t <- wb$worksheets[[worksheet]]$sheet_data$t - field_t[length(field_t)] <- 3 - - field_v <- wb$worksheets[[worksheet]]$sheet_data$v - field_v[length(field_v)] <- NA - - field_f <- wb$worksheets[[worksheet]]$sheet_data$f - field_f[length(field_f)] <- paste0("=HYPERLINK("#'",sheetname,"'!A1", "",title,"")") - - wb$worksheets[[worksheet]]$sheet_data$t <- as.integer(field_t) - wb$worksheets[[worksheet]]$sheet_data$v <- field_v - wb$worksheets[[worksheet]]$sheet_data$f <- field_f -} - - -hyperlink_style <- function(){ - openxlsx::createStyle( - fontName = "Calibri", - fontSize = 11, - fontColour = "blue", - textDecoration = "underline" - - ) -} - - -insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, titlesource, auftrag_id, maintitle){ - # Create index sheet - openxlsx::addWorksheet(wb,"Inhalt") - - # hide gridlines - openxlsx::showGridLines(wb - ,sheet = "Inhalt" - ,showGridLines = F - ) - - # set col widths - openxlsx::setColWidths(wb - ,"Inhalt" - ,cols = 1 - ,widths = 1 - ) - - # insert logo - - if(!is.null(logo)){ - - if(logo=="statzh") { - - logo <- paste0(.libPaths(),"/statR/extdata/Stempel_STAT-01.png") - - # - logo <- logo[file.exists(paste0(.libPaths(),"/statR/extdata/Stempel_STAT-01.png"))] - - openxlsx::insertImage(wb, - "Inhalt", - file=logo, - startRow = 2, - startCol = 2, - width = 2.5, - height = 0.9, - units = "in") - - } else if(logo == "zh"){ - - logo <- paste0(.libPaths(),"/statR/extdata/Stempel_Kanton_ZH.png") - - # - logo <- logo[file.exists(paste0(.libPaths(),"/statR/extdata/Stempel_Kanton_ZH.png"))] - - openxlsx::insertImage(wb, - "Inhalt", - file=logo, - startRow = 2, - startCol = 2, - width = 2.5, - height = 0.9, - units = "in") - - - } else if(file.exists(logo)) { - - openxlsx::insertImage(wb, "Inhalt", logo, width = 2.145, height = 0.7865, - units = "in") - } - if(!file.exists(logo)) { - - message("no logo found and / or added") - } - - } - - # contact - - if(!is.null(contact)){ - if(any(grepl(contact, pattern = "statzh"))) { - contact <- c("Datashop" - ,"Tel.: +41 43 259 75 00", - "datashop@statistik.zh.ch") - openxlsx::writeData(wb - ,sheet = "Inhalt" - ,contact - ,xy = c("O", 2) - ) - } else { - openxlsx::writeData(wb - ,sheet = "Inhalt" - ,contact - ,xy = c("O", 2)) - } - - } - - - if(!is.null(homepage)){ - - if(any(grepl(homepage, pattern = "statzh"))) { - - homepage <- "http://www.statistik.zh.ch" - class(homepage) <- 'hyperlink' - openxlsx::writeData(wb - ,"Inhalt" - ,x = homepage - ,xy = c("O", 5)) - } else { - class(homepage) <- 'hyperlink' - openxlsx::writeData(wb - ,"Inhalt" - ,x = homepage - ,xy = c("O", 5)) - } - - } - - - - if(!is.null(openinghours)){ - - if(any(grepl(openinghours, pattern = "statzh"))) { - - openinghours <- c("B\u00fcrozeiten" - ,"Montag bis Freitag" - ,"09:00 bis 12:00" - ,"13:00 bis 16:00") - - openxlsx::writeData(wb - ,sheet = "Inhalt" - ,openinghours - ,xy = c("R", 2) - - ) - - } else { - - openxlsx::writeData(wb - ,sheet = "Inhalt" - ,openinghours - ,xy = c("R", 2)) - - } - - } - - - # headerline - headerline <- openxlsx::createStyle(border="Bottom", borderColour = "#009ee0",borderStyle = getOption("openxlsx.borderStyle", "thick")) - openxlsx::addStyle(wb - ,"Inhalt" - ,headerline - ,rows = 6 - ,cols = 1:20 - ,gridExpand = TRUE - ,stack = TRUE - ) - - #Erstellungsdatum - openxlsx::writeData(wb - ,"Inhalt" - ,paste("Erstellt am " - ,format(Sys.Date(), format="%d.%m.%Y")) - ,xy = c("O", 8) - ) - - - if (!is.null(auftrag_id)){ - # Auftragsnummer - openxlsx::writeData(wb - ,sheet = "Inhalt" - ,paste("Auftragsnr.:", auftrag_id) - ,xy = c("O", 9) - ) - } - - # title - titleStyle <- openxlsx::createStyle(fontSize=20, textDecoration="bold",fontName="Arial", halign = "left") - openxlsx::addStyle(wb - ,"Inhalt" - ,titleStyle - ,rows = 10 - ,cols = 3 - ,gridExpand = TRUE - ) - - openxlsx::writeData(wb - ,"Inhalt" - ,x = maintitle - ,headerStyle=titleStyle - ,xy = c("C", 10) - ) - - - if(any(grepl(titlesource, pattern = "statzh"))){ - - # source - openxlsx::writeData(wb - ,"Inhalt" - ,"Quelle: Statistisches Amt des Kantons Z\u00fcrich" - ,xy = c("C", 11) - ) - - }else { - - openxlsx::writeData(wb - ,"Inhalt" - , titlesource - ,xy = c("C", 11)) - - } - - - - - # subtitle - subtitleStyle <- openxlsx::createStyle(fontSize=11, textDecoration="bold",fontName="Arial", halign = "left") - openxlsx::addStyle(wb - ,sheet = "Inhalt" - ,subtitleStyle - ,rows = 14 - ,cols = 3 - ,gridExpand = TRUE - ) - - openxlsx::writeData(wb - ,sheet = "Inhalt" - ,x = "Inhalt" - ,headerStyle=subtitleStyle - ,xy = c("C", 13) - ) - + ) %>% + purrr::pwalk( + ~insert_hyperlinks( + wb, + sheetname = ..1, + title = ..2, + sheet_row = ..3)) + + # Save workbook at path denoted by argument file + openxlsx::saveWorkbook( + wb, + file = paste(file, ".xlsx", sep = ""), + overwrite = overwrite) } diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R new file mode 100644 index 0000000..d55539d --- /dev/null +++ b/R/insert_hyperlinks.R @@ -0,0 +1,49 @@ +#' insert_hyperlinks +#' +#' Description +#' +#' @param wb Worksheet +#' @param sheetname Name of sheet +#' @param title Title +#' @param sheet_row Sheet row +#' @keywords datasetsXLSX +#' @examples +#'\donttest{ +#' \dontrun{ +#' +#'} +#'} +#' +insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ + openxlsx::writeData(wb, + sheet = "Inhalt", + x = title, + xy = c("C", sheet_row)) + + openxlsx::addStyle(wb, + sheet = "Inhalt", + style = hyperlinkStyle(), + rows = sheet_row, + cols = 3) + + openxlsx::mergeCells(wb, sheet = "Inhalt", cols = 3:8, rows = sheet_row) + + worksheet <- wb$sheetOrder[1] + + field_t <- wb$worksheets[[worksheet]]$sheet_data$t + field_t[length(field_t)] <- 3 + + field_v <- wb$worksheets[[worksheet]]$sheet_data$v + field_v[length(field_v)] <- NA + + field_f <- wb$worksheets[[worksheet]]$sheet_data$f + field_f[length(field_f)] <- paste0("=HYPERLINK("#'", + sheetname, + "'!A1", "", + title, + "")") + + wb$worksheets[[worksheet]]$sheet_data$t <- as.integer(field_t) + wb$worksheets[[worksheet]]$sheet_data$v <- field_v + wb$worksheets[[worksheet]]$sheet_data$f <- field_f +} diff --git a/R/insert_image.R b/R/insert_image.R index 8add3ab..bdf372c 100644 --- a/R/insert_image.R +++ b/R/insert_image.R @@ -9,6 +9,7 @@ #' @param width width of figure #' @param height height of figure #' @noRd +#' @importFrom grDevices png dev.off #' @examples #' # example #' \dontrun{ @@ -32,34 +33,48 @@ insert_worksheet_image = function(image, width, height){ - openxlsx::addWorksheet(wb, - sheetname, - gridLines = FALSE - ) -if(class(image) %in% c("gg", "ggplot")){ + openxlsx::addWorksheet( + wb, + sheetName = sheetname, + gridLines = FALSE) + + + if (class(image) == "character" ){ + image_path <- image + + } else if (class(image) %in% c("gg", "ggplot", "histogram")){ + # Allocate temporary file of type png to save the image to image_path <- tempfile(fileext = ".png") - #p2 <- image - ggplot2::ggsave( - image_path, - plot = image, - width = width, - height = height, - dpi = 300, - device = "png" - ) - } else if (class(image) == "character" ){ + # Handle case input object is of class histogram + if (class(image) == "histogram"){ + png( + image_path, + width = width, + height = height, + units = "in") + plot(image) + dev.off() - image_path <- image + } else { - } else{ - stop(" Plot muss als ggplot Objekt oder als Filepath vorliegen.") + # Handle case input object is of class gg or ggplot + ggplot2::ggsave( + image_path, + plot = image, + width = width, + height = height, + dpi = 300, + device = "png") + } + } else { + stop("Plot muss als ggplot Objekt oder als Filepath vorliegen.") } - + # Insert image openxlsx::insertImage( wb = wb, sheet = sheetname, @@ -72,8 +87,8 @@ if(class(image) %in% c("gg", "ggplot")){ dpi = 300 ) - return(image_path) - + # Delete temporary file if necessary + if (!is.character(image)){ + unlink(image_path) + } } - - diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R new file mode 100644 index 0000000..e5aa6f1 --- /dev/null +++ b/R/insert_index_sheet.R @@ -0,0 +1,184 @@ +#' insert_index_sheet() +#' +#' Description +#' +#' @param wb A workbook object as generated by openxlsx::createWorkbook() +#' @param logo Either statzh or zh, or path to logo file +#' @param contact Either "statzh" or a character string +#' @param homepage statzh or a character string with the URL +#' @param openinghours statzh or a character string or vector with opening hours +#' @param titlesource Character vector denoting the data source +#' @param auftrag_id Order ID +#' @param maintitle Main title +#' @keywords datasetsXLSX +#' @examples +#'\donttest{ +#' \dontrun{ +#'} +#'} + + +insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, + titlesource, auftrag_id, maintitle){ + # Create index sheet + openxlsx::addWorksheet(wb, sheetName = "Inhalt") + + # hide gridlines + openxlsx::showGridLines(wb, + sheet = "Inhalt", + showGridLines = FALSE + ) + + # set col widths + openxlsx::setColWidths(wb, + sheet = "Inhalt", + cols = 1, + widths = 1) + + # insert logo + + if(!is.null(logo)){ + if(logo %in% c("statzh", "zh")){ + logo <- paste0(path.package("statR"), + ifelse(logo == "statzh", + "/extdata/Stempel_STAT-01.png", + "/extdata/Stempel_Kanton_ZH.png")) + + openxlsx::insertImage(wb, + sheet = "Inhalt", + file = logo, + startRow = 2, + startCol = 2, + width = 2.5, + height = 0.9, + units = "in") + + } else if(file.exists(logo)) { + # Insert file at given path + openxlsx::insertImage(wb, + sheet = "Inhalt", + file = logo, + width = 2.145, + height = 0.7865, + units = "in") + } else { + # Input argument logo does not correspond to hardcoded values + # and no image file found at path + warning("No logo found") + } + } else { + message("No logo added") + } + + # Contact + if(!is.null(contact)){ + if(any(grepl(contact, pattern = "statzh"))) { + contact <- c("Datashop", "Tel.: +41 43 259 75 00", + "datashop@statistik.zh.ch") + + } + + openxlsx::writeData(wb, + sheet = "Inhalt", + x = contact, + xy = c("O", 2)) + } + + + if(!is.null(homepage)){ + if(any(grepl(homepage, pattern = "statzh"))) { + homepage <- "http://www.statistik.zh.ch" + } + + class(homepage) <- 'hyperlink' + openxlsx::writeData(wb, + sheet = "Inhalt", + x = homepage, + xy = c("O", 5)) + } + + + + if(!is.null(openinghours)){ + if(any(grepl(openinghours, pattern = "statzh"))) { + openinghours <- c("B\u00fcrozeiten", + "Montag bis Freitag", + "09:00 bis 12:00", + "13:00 bis 16:00") + } + + openxlsx::writeData(wb, + sheet = "Inhalt", + x = openinghours, + xy = c("R", 2)) + } + + # headerline + headerline <- openxlsx::createStyle(border = "Bottom", + borderColour = "#009ee0", + borderStyle = getOption("openxlsx.borderStyle", "thick")) + openxlsx::addStyle(wb, + sheet = "Inhalt", + style = headerline, + rows = 6, + cols = 1:20, + gridExpand = TRUE, + stack = TRUE) + + #Erstellungsdatum + openxlsx::writeData(wb, + sheet = "Inhalt", + x = paste("Erstellt am ", + format(Sys.Date(), format="%d.%m.%Y")), + xy = c("O", 8)) + + # Auftragsnummer + if (!is.null(auftrag_id)){ + openxlsx::writeData(wb, + sheet = "Inhalt", + paste("Auftragsnr.:", auftrag_id), + xy = c("O", 9)) + } + + # Maintitle + openxlsx::addStyle(wb, + sheet = "Inhalt", + style = mainTitleStyle(), + rows = 10, + cols = 3, + gridExpand = TRUE) + + openxlsx::writeData(wb, + sheet = "Inhalt", + x = maintitle, + headerStyle = mainTitleStyle(), + xy = c("C", 10)) + + + # source + if (!is.null(titlesource)){ + if(any(grepl(titlesource, pattern = "statzh"))){ + titlesource <- "Quelle: Statistisches Amt des Kantons Z\u00fcrich" + } + + openxlsx::writeData(wb, + sheet = "Inhalt", + x = titlesource, + xy = c("C", 11)) + } + + # subtitle + openxlsx::addStyle(wb, + sheet = "Inhalt", + style = subtitleStyle(), + rows = 14, + cols = 3, + gridExpand = TRUE) + + openxlsx::writeData(wb, + sheet = "Inhalt", + x = "Inhalt", + headerStyle = subtitleStyle(), + xy = c("C", 13)) + +} diff --git a/R/quick_sum.r b/R/quick_sum.r index 336eb89..4b64ce6 100644 --- a/R/quick_sum.r +++ b/R/quick_sum.r @@ -17,6 +17,7 @@ #' @keywords quick_sum #' @importFrom dplyr ungroup summarize group_by n #' @importFrom stats median quantile sd +#' @importFrom rlang := #' @export #' @examples #' diff --git a/R/styles.R b/R/styles.R new file mode 100644 index 0000000..f0fff2a --- /dev/null +++ b/R/styles.R @@ -0,0 +1,31 @@ +#' Style definitions +#' +#' Description +#' +#' @keywords styles +#' @examples +#'\donttest{ +#' \dontrun{ +#'} +#'} + +mainTitleStyle <- function(){ + openxlsx::createStyle(fontSize = 20, + textDecoration = "bold", + fontName = "Arial", + halign = "left") +} + +subtitleStyle <- function(){ + openxlsx::createStyle(fontSize=11, + textDecoration="bold", + fontName="Arial", + halign = "left") +} + +hyperlinkStyle <- function(){ + openxlsx::createStyle(fontName = "Calibri", + fontSize = 11, + fontColour = "blue", + textDecoration = "underline") +} diff --git a/man/datasetsXLSX.Rd b/man/datasetsXLSX.Rd index 9e040c7..400d374 100644 --- a/man/datasetsXLSX.Rd +++ b/man/datasetsXLSX.Rd @@ -74,14 +74,11 @@ save it as a ggplot object or indicate a file path to an existing file (possible \examples{ \donttest{ \dontrun{ - - - # Example with two datasets and no figure dat1 <- mtcars dat2 <- PlantGrowth -datasetsXLSX(file="twoDatasets", # '.xlsx' wird automatisch hinzugef\u00fcgt +datasetsXLSX(file="twoDatasets", datasets = list(dat1, dat2), titles = c("mtcars-Datensatz","PlantGrowth-Datensatz"), grouplines = list(c(1)), @@ -110,7 +107,7 @@ dat2 <- PlantGrowth fig <- ggplot(mtcars, aes(x=disp))+ geom_histogram() -datasetsXLSX(file="twoDatasetsandFigure", # '.xlsx' wird automatisch hinzugef\u00fcgt +datasetsXLSX(file="twoDatasetsandFigure", datasets = list(dat1, dat2, fig), # fig als ggplot Objekt oder File Path titles = c("mtcars-Datensatz","PlantGrowth-Datensatz", "Histogramm"), plot_widths = c(5), diff --git a/man/insert_hyperlinks.Rd b/man/insert_hyperlinks.Rd new file mode 100644 index 0000000..f4d65d9 --- /dev/null +++ b/man/insert_hyperlinks.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/insert_hyperlinks.R +\name{insert_hyperlinks} +\alias{insert_hyperlinks} +\title{insert_hyperlinks} +\usage{ +insert_hyperlinks(wb, sheetname, title, sheet_row) +} +\arguments{ +\item{wb}{Worksheet} + +\item{sheetname}{Name of sheet} + +\item{title}{Title} + +\item{sheet_row}{Sheet row} +} +\description{ +Description +} +\examples{ +\donttest{ +\dontrun{ + +} +} + +} +\keyword{datasetsXLSX} diff --git a/man/insert_index_sheet.Rd b/man/insert_index_sheet.Rd new file mode 100644 index 0000000..fda877f --- /dev/null +++ b/man/insert_index_sheet.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/insert_index_sheet.R +\name{insert_index_sheet} +\alias{insert_index_sheet} +\title{insert_index_sheet()} +\usage{ +insert_index_sheet( + wb, + logo, + contact, + homepage, + openinghours, + titlesource, + auftrag_id, + maintitle +) +} +\arguments{ +\item{wb}{A workbook object as generated by openxlsx::createWorkbook()} + +\item{logo}{Either statzh or zh, or path to logo file} + +\item{contact}{Either "statzh" or a character string} + +\item{homepage}{statzh or a character string with the URL} + +\item{openinghours}{statzh or a character string or vector with opening hours} + +\item{titlesource}{Character vector denoting the data source} + +\item{auftrag_id}{Order ID} + +\item{maintitle}{Main title} +} +\description{ +Description +} +\examples{ +\donttest{ +\dontrun{ +} +} +} +\keyword{datasetsXLSX} diff --git a/man/insert_worksheet_nh.Rd b/man/insert_worksheet_nh.Rd index 4c6217c..08a61be 100644 --- a/man/insert_worksheet_nh.Rd +++ b/man/insert_worksheet_nh.Rd @@ -28,7 +28,7 @@ insert_worksheet_nh( \item{metadata}{metadata-information to be included. Defaults to NA.} -\item{grouplines}{defaults to FALSE. Can be used to separate grouped variables visually.} +\item{grouplines}{defaults to NA. Can be used to separate grouped variables visually.} \item{group_names}{Name(s) of the second header(s). Format: List e.g list(c("title 1", "title 2", "title 3"))} } diff --git a/man/mainTitleStyle.Rd b/man/mainTitleStyle.Rd new file mode 100644 index 0000000..ca7c904 --- /dev/null +++ b/man/mainTitleStyle.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/styles.R +\name{mainTitleStyle} +\alias{mainTitleStyle} +\title{Style definitions} +\usage{ +mainTitleStyle() +} +\description{ +Description +} +\examples{ +\donttest{ +\dontrun{ +} +} +} +\keyword{styles} From cd7c8d038771269f64d5bcebe873584613947ff2 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Mon, 8 May 2023 14:44:20 +0000 Subject: [PATCH 24/74] Compacted code, standardized checks on input & format, documentation WIP --- R/add_additional_text.R | 37 +++++ R/get_groupline_index_by_pattern.R | 49 +++++++ R/insert_index_sheet.R | 80 +++-------- R/insert_metadata_sheet.R | 150 +++++++++++---------- R/insert_second_header.R | 53 ++++++++ R/insert_worksheet.R | 2 +- R/insert_worksheet_nh.R | 210 ++++++----------------------- R/process_input.R | 67 +++++++++ R/quickXLSX.R | 1 + R/splitXLSX.R | 1 + R/styles.R | 50 ++++++- 11 files changed, 394 insertions(+), 306 deletions(-) create mode 100644 R/add_additional_text.R create mode 100644 R/get_groupline_index_by_pattern.R create mode 100644 R/insert_second_header.R create mode 100644 R/process_input.R diff --git a/R/add_additional_text.R b/R/add_additional_text.R new file mode 100644 index 0000000..3647082 --- /dev/null +++ b/R/add_additional_text.R @@ -0,0 +1,37 @@ +#' add_additional_text() +#' +#' Insert text into an existing workbook object. Note that text is inserted +#' at first column index. +#' @param wb workbook object where text should be inserted +#' @param text Character vector of text to be inserted +#' @param sheetname Sheet where text should be inserted. +#' @param start_row Row from which to insert elements +#' @keywords add_additional_text +#' @examples +#' +#' # Generation of a spreadsheet +#' wb <- openxlsx::createWorkbook("hello") +#' +#' insert_metadata_sheet(wb, title = "Title of mtcars", metadata = c("Meta data information.")) + + +add_additional_text <- function(wb, text, sheetname, start_row){ + + rows = c(seq(start_row, start_row+length(text)-1)) + + openxlsx::addStyle(wb, + sheet = sheetname, + style = style_subtitle(), + rows = rows, + cols = 1, + gridExpand = TRUE) + + openxlsx::writeData(wb, + sheet = sheetname, + x = text, + colNames = F, + headerStyle=style_subtitle(), + startRow = start_row) + + return(max(rows)) +} diff --git a/R/get_groupline_index_by_pattern.R b/R/get_groupline_index_by_pattern.R new file mode 100644 index 0000000..d8a9a00 --- /dev/null +++ b/R/get_groupline_index_by_pattern.R @@ -0,0 +1,49 @@ +#' aXLSX() +#' +#' Function to export data from R to a formatted .xlsx-file. +#' +#' The data is exported +#' to the first sheet. Metadata information is exported to the second sheet. +#' +#' @param data data to be exported. +#' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. +#' @param title title to be put above the data in the worksheet. +#' @template shared_parameters +#' @keywords aXLSX +#' @examples +#' \donttest{ +#' \dontrun{ +#' # Beispiel anhand des Datensatzes 'mtcars' +#'dat <- mtcars +#' +#'aXLSX(data = dat, +#' title = "Motor trend car road tests", +#' file = "motor_trend_car_road_tests", # '.xlsx' is automatically added +#' source = "Source: Henderson and Velleman (1981). Building multiple +#' regression models interactively. +#' Biometrics, 37, 391–411.", +#' metadata = c("The data was extracted from the 1974 Motor Trend US +#' magazine and comprises fuel +#' consumption and 10 aspects of automobile design and performance +#' for 32 automobiles (1973–74 models)."), +#' contactdetails = "statzh", +#' grouplines = NA, +#' logo = "statzh", +#' author = "user") +#' } +#' } +get_groupline_index_by_pattern <- function(grouplines, data){ + + get_lowest_col <- function(groupline, data){ + groupline_numbers_single <- which(grepl(groupline, names(data))) + + out <- min(groupline_numbers_single) + + return(out) + } + + + groupline_numbers <- unlist(lapply(grouplines, function(x) get_lowest_col(x, data))) + + return(groupline_numbers) +} diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index e5aa6f1..adb4f5c 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -26,8 +26,7 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, # hide gridlines openxlsx::showGridLines(wb, sheet = "Inhalt", - showGridLines = FALSE - ) + showGridLines = FALSE) # set col widths openxlsx::setColWidths(wb, @@ -35,26 +34,11 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, cols = 1, widths = 1) - # insert logo - + ## Logo if(!is.null(logo)){ - if(logo %in% c("statzh", "zh")){ - logo <- paste0(path.package("statR"), - ifelse(logo == "statzh", - "/extdata/Stempel_STAT-01.png", - "/extdata/Stempel_Kanton_ZH.png")) + logo <- prep_logo(logo) - openxlsx::insertImage(wb, - sheet = "Inhalt", - file = logo, - startRow = 2, - startCol = 2, - width = 2.5, - height = 0.9, - units = "in") - - } else if(file.exists(logo)) { - # Insert file at given path + if (file.exists(logo)){ openxlsx::insertImage(wb, sheet = "Inhalt", file = logo, @@ -62,77 +46,53 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, height = 0.7865, units = "in") } else { - # Input argument logo does not correspond to hardcoded values - # and no image file found at path - warning("No logo found") + message("no logo found.") } - } else { - message("No logo added") } - # Contact - if(!is.null(contact)){ - if(any(grepl(contact, pattern = "statzh"))) { - contact <- c("Datashop", "Tel.: +41 43 259 75 00", - "datashop@statistik.zh.ch") - - } + ## Contact + if(!is.null(contact)){ openxlsx::writeData(wb, sheet = "Inhalt", - x = contact, + x = prep_contact(contact), xy = c("O", 2)) } if(!is.null(homepage)){ - if(any(grepl(homepage, pattern = "statzh"))) { - homepage <- "http://www.statistik.zh.ch" - } - - class(homepage) <- 'hyperlink' openxlsx::writeData(wb, sheet = "Inhalt", - x = homepage, + x = prep_homepage(homepage), xy = c("O", 5)) } - if(!is.null(openinghours)){ - if(any(grepl(openinghours, pattern = "statzh"))) { - openinghours <- c("B\u00fcrozeiten", - "Montag bis Freitag", - "09:00 bis 12:00", - "13:00 bis 16:00") - } - openxlsx::writeData(wb, sheet = "Inhalt", - x = openinghours, + x = prep_openinghours(openinghours), xy = c("R", 2)) } - # headerline - headerline <- openxlsx::createStyle(border = "Bottom", - borderColour = "#009ee0", - borderStyle = getOption("openxlsx.borderStyle", "thick")) + ## Headerline openxlsx::addStyle(wb, sheet = "Inhalt", - style = headerline, + style = style_headerline(), rows = 6, cols = 1:20, gridExpand = TRUE, stack = TRUE) - #Erstellungsdatum + + ## Erstellungsdatum openxlsx::writeData(wb, sheet = "Inhalt", x = paste("Erstellt am ", format(Sys.Date(), format="%d.%m.%Y")), xy = c("O", 8)) - # Auftragsnummer + ## Auftragsnummer if (!is.null(auftrag_id)){ openxlsx::writeData(wb, sheet = "Inhalt", @@ -140,7 +100,7 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, xy = c("O", 9)) } - # Maintitle + ## Maintitle openxlsx::addStyle(wb, sheet = "Inhalt", style = mainTitleStyle(), @@ -155,15 +115,11 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, xy = c("C", 10)) - # source + ## Source if (!is.null(titlesource)){ - if(any(grepl(titlesource, pattern = "statzh"))){ - titlesource <- "Quelle: Statistisches Amt des Kantons Z\u00fcrich" - } - openxlsx::writeData(wb, sheet = "Inhalt", - x = titlesource, + x = paste("Quelle:", prep_source(titlesource)), xy = c("C", 11)) } diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index 913af45..4cdb70e 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -20,91 +20,83 @@ #' insert_metadata_sheet(wb, title = "Title of mtcars", metadata = c("Meta data information.")) -insert_metadata_sheet <- function(wb, sheetname="Metadaten",title="Title", - source="statzh", metadata = NA, logo= "statzh", - contactdetails="statzh", author = "user") { +insert_metadata_sheet <- function(wb, sheetname = "Metadaten", + title = "Title", + source = "statzh", + metadata = NA, + logo = "statzh", + contactdetails = "statzh", + author = "user"){ - # number of metadata rows - n_metadata <- length(metadata) - - # warning if sheetname is longer than the limit imposed by excel (31 characters) - if(nchar(sheetname)>31){ - warning("sheetname is cut to 31 characters (limit imposed by MS-Excel)") - } - - suppressWarnings(openxlsx::addWorksheet(wb,paste(substr(sheetname,0,31)))) - # sheet name - i <- paste(substr(sheetname, 0, 31)) + sheetname <- check_sheetname(sheetname) + openxlsx::addWorksheet(wb, sheetName = sheetname) # Style definitions --------------------- - style_title <- openxlsx::createStyle(fontSize=14, textDecoration="bold",fontName="Arial") - style_subtitle <- openxlsx::createStyle(fontSize=12, textDecoration="bold",fontName="Arial") - style_header <- openxlsx::createStyle(border="Bottom", borderColour = "#009ee0", - borderStyle = getOption("openxlsx.borderStyle", "thick")) - style_wrap <- openxlsx::createStyle(wrapText = TRUE) - + style_subtitle <- openxlsx::createStyle(fontSize = 12, textDecoration = "bold", fontName = "Arial") # Fill Excel ----------------- ## Title - openxlsx::writeData(wb, sheet = i, title, headerStyle=style_title, startRow = 7) + openxlsx::writeData(wb, + sheet = sheetname, + x = title, + headerStyle = style_title(), + startRow = 7) ## Logo if(!is.null(logo)){ - - if(logo == "statzh") { - statzh <- paste0(.libPaths(),"/statR/extdata/Stempel_STAT-01.png") - openxlsx::insertImage(wb, i, statzh[1], width = 2.145, height = 0.7865, - units = "in") - } else if(logo == "zh"){ - zh <- paste0(.libPaths(),"/statR/extdata/Stempel_Kanton_ZH.png") - openxlsx::insertImage(wb, i, zh[1], width = 2.145, height = 0.7865, - units = "in") - } else if((logo != "statzh" | logo != "zh") & file.exists(logo)) { - openxlsx::insertImage(wb, i, logo, width = 2.145, height = 0.7865, + logo <- prep_logo(logo) + + if (file.exists(logo)){ + openxlsx::insertImage(wb, + sheet = sheetname, + file = logo, + width = 2.145, + height = 0.7865, units = "in") } else { - message("no logo found and / or added") + message("no logo found.") } } ## Contact details - if(contactdetails=="statzh"){ - - contactdetails <- c("Datashop, Tel: 0432597500", - "datashop@statistik.ji.zh.ch", - "http://www.statistik.zh.ch") - - } - - openxlsx::writeData(wb, sheet = i, - contactdetails, - headerStyle = style_wrap, + openxlsx::writeData(wb, + sheet = sheetname, + x = prep_contact(contactdetails), + headerStyle = style_wrap(), startRow = 2, startCol = 12) - if (length(contactdetails) > 3) { - warning("Contactdetails may overlap with other elements. To avoid this issue please do not include more than three elements in the contactdetails vector.") - } - ## Source - if(source == "statzh"){ - source <- "Statistisches Amt des Kantons Z\u00fcrich" - } - openxlsx::writeData(wb, sheet = i, "Datenquelle:", headerStyle=style_subtitle, startRow = 9) - openxlsx::writeData(wb, sheet = i, source, startRow = 10) + openxlsx::writeData(wb, + sheet = sheetname, + x = "Datenquelle:", + headerStyle = style_subtitle, + startRow = 9) + openxlsx::writeData(wb, + sheet = sheetname, + x = prep_source(source), + startRow = 10) + ## Metadata - openxlsx::writeData(wb, sheet = i, "Hinweise:", headerStyle=style_subtitle, startRow = 12) - openxlsx::writeData(wb, sheet = i, metadata, startRow =13) + openxlsx::writeData(wb, sheet = sheetname, + x = "Hinweise:", + headerStyle = style_subtitle, + startRow = 12) + openxlsx::writeData(wb, + sheet = sheetname, + x = prep_metadata(metadata), + startRow = 13) + ## User - if(author == "user"){ + if (author == "user"){ # for the local R setup - if(Sys.getenv("USERNAME")!="") { + if (Sys.getenv("USERNAME") != "") { contactperson <- stringr::str_sub(Sys.getenv("USERNAME"), start = 6, end = 7) } else { # for the R server setup @@ -114,18 +106,38 @@ insert_metadata_sheet <- function(wb, sheetname="Metadaten",title="Title", contactperson <- author } - #Aktualisierungsdatum - openxlsx::writeData(wb, sheet = i, paste("Aktualisiert am ", - format(Sys.Date(), format="%d.%m.%Y"), - " durch: ", contactperson), - startRow = 5, startCol=12) - # add formatting - openxlsx::addStyle(wb, sheet = i, style_header, rows = 5, cols = 1:26, gridExpand = TRUE, stack = TRUE) - openxlsx::addStyle(wb, sheet = i, style_title, rows = 7, cols = 1, gridExpand = TRUE) - openxlsx::addStyle(wb, sheet = i, style_subtitle, rows = 9, cols = 1, gridExpand = TRUE) - openxlsx::addStyle(wb, sheet = i, style_subtitle, rows = 12, cols = 1, gridExpand = TRUE) + ## Aktualisierungsdatum + openxlsx::writeData(wb, + sheet = sheetname, + x = paste("Aktualisiert am ", + format(Sys.Date(), format="%d.%m.%Y"), + " durch: ", + contactperson), + startRow = 5, + startCol = 12) - # remove gridlines - openxlsx::showGridLines(wb, sheet = i, showGridLines = FALSE) + ## add formatting + openxlsx::addStyle(wb, + sheet = sheetname, + style_headerline(), + rows = 5, + cols = 1:26, + gridExpand = TRUE, + stack = TRUE) + openxlsx::addStyle(wb, + sheet = sheetname, + style_title(), + rows = 7, + cols = 1, + gridExpand = TRUE) + openxlsx::addStyle(wb, + sheet = sheetname, + style = style_subtitle, + rows = c(9, 12), + cols = 1, + gridExpand = TRUE) + + ## remove gridlines + openxlsx::showGridLines(wb, sheet = sheetname, showGridLines = FALSE) } diff --git a/R/insert_second_header.R b/R/insert_second_header.R new file mode 100644 index 0000000..0ad74be --- /dev/null +++ b/R/insert_second_header.R @@ -0,0 +1,53 @@ +#' insert_second_header() +#' +#' Function to export data from R to a formatted .xlsx-file. +#' +#' The data is exported +#' to the first sheet. Metadata information is exported to the second sheet. +#' +#' @param data data to be exported. +#' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. +#' @param title title to be put above the data in the worksheet. +#' @template shared_parameters +#' @keywords aXLSX +#' @examples +#' \donttest{ +#' \dontrun{ +#' # Beispiel anhand des Datensatzes 'mtcars' +#'dat <- mtcars +#' +#'insert_second_header(wb, +#' sheetname, +#' data_start_row, +#' group_names, +#' grouplines, +#' data) +#' } +#' } +insert_second_header <- function(wb, sheetname, data_start_row, group_names, + grouplines, data){ + + if (is.character(grouplines)){ + groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) + + } else if (is.numeric(grouplines)){ + groupline_numbers <- grouplines + } + + openxlsx::addStyle(wb, + sheet = sheetname, + style = style_header(), + rows = data_start_row, + cols = 1:ncol(data) + ) + + purrr::walk2(groupline_numbers, + group_names, + ~openxlsx::writeData(wb, + sheet = sheetname, + x = .y, + startCol = .x, + colNames = F, + startRow = data_start_row) + ) +} diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index f083bb3..11f2afe 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -25,7 +25,7 @@ insert_worksheet <- function(data, workbook, sheetname="data",title="Title", source="statzh", metadata = NA, logo= "statzh", grouplines = FALSE, contactdetails="statzh", - author = "user") { + author = "user"){ # Metadata remarks <- if (any(is.na(metadata))) { diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index 80c0f84..5cdd05a 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -53,8 +53,7 @@ insert_worksheet_nh <- function(data, metadata = NA, grouplines = NA, group_names = NA -) { - +){ # number of data columns spalten <- ncol(data) @@ -62,38 +61,33 @@ insert_worksheet_nh <- function(data, # increase width of column names for better auto-fitting of column width colnames(data) <- paste0(colnames(data), " ", sep = "") - if(nchar(sheetname)>31){ - warning("sheetname is cut to 31 characters (limit imposed by MS-Excel)") - } + # Check length of sheetname + sheetname <- check_sheetname(sheetname) ## Add worksheet - sheetname <- paste(substr(sheetname,0,31)) - openxlsx::addWorksheet(wb, sheetname) - # fill in data --------------------------------------------------------------- ## Titel openxlsx::addStyle(wb, sheet = sheetname, - style_title(), + style = style_title(), rows = 1, cols = 1) openxlsx::writeData(wb, sheet = sheetname, - title, + x = title, headerStyle=style_title(), startRow = 1) ## Quelle sources_to_insert <- prep_source(source) - source_end_row <- add_additional_text(wb, sources_to_insert, sheetname, 2) - ##Metadata - if(!is.na(metadata)){ + ## Metadata + if (!is.na(metadata)){ metadata_to_insert <- prep_metadata(metadata) metadata_start_row <- source_end_row + 1 @@ -101,57 +95,55 @@ insert_worksheet_nh <- function(data, data_start_row <- metadata_end_row + 2 merge_end_row <- metadata_end_row - }else{ + + } else{ data_start_row <- source_end_row + 2 merge_end_row <- source_end_row } ### Metadaten zusammenmergen - purrr::walk(1:merge_end_row, ~openxlsx::mergeCells(wb, sheet = sheetname, cols = 1:26, rows = .)) - + purrr::walk(1:merge_end_row, + ~openxlsx::mergeCells(wb, + sheet = sheetname, + cols = 1:26, + rows = .)) # Zweite header Zeile einfügen - if(any(is.null(group_names))){ + if (any(is.null(group_names))){ group_names <- NA } - if(!any(is.na(group_names))){ + if (!any(is.na(group_names))){ insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) - data_start_row <- data_start_row + 1 } - # Daten - - - openxlsx::addStyle(wb - ,sheet = sheetname - ,style_header() - ,rows = data_start_row - ,cols = 1:spalten - ,gridExpand = TRUE - ,stack = TRUE - ) + openxlsx::addStyle(wb, + sheet = sheetname, + style = style_header(), + rows = data_start_row, + cols = 1:spalten, + gridExpand = TRUE, + stack = TRUE) openxlsx::writeData(wb, - sheet = sheetname - # ,as.data.frame(dpylr::ungroup()) - ,as.data.frame(dplyr::ungroup(data)) - ,rowNames = FALSE - ,startRow = data_start_row - ,withFilter = FALSE - ) + sheet = sheetname, + x = as.data.frame(dplyr::ungroup(data)), + rowNames = FALSE, + startRow = data_start_row, + withFilter = FALSE) if(is.null(grouplines)){ grouplines <- NA } if (any(!is.na(grouplines))){ - if(!any(is.na(group_names))){ + if (!any(is.na(group_names))){ data_start_row <- data_start_row - 1 data_end_row <- nrow(data)+data_start_row +1 - }else{ + + } else { data_end_row <- nrow(data)+data_start_row } @@ -160,21 +152,17 @@ insert_worksheet_nh <- function(data, if (is.numeric(grouplines)){ groupline_numbers <- grouplines - }else if(is.character(grouplines)){ - + } else if(is.character(grouplines)){ groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) - } - openxlsx::addStyle(wb - ,sheet = sheetname - ,style_leftline() - ,rows=data_start_row:data_end_row - ,cols = groupline_numbers - ,gridExpand = TRUE - ,stack = TRUE - ) - + openxlsx::addStyle(wb, + sheet = sheetname, + style = style_leftline(), + rows=data_start_row:data_end_row, + cols = groupline_numbers, + gridExpand = TRUE, + stack = TRUE) } # minmale Spaltenbreite definieren @@ -183,123 +171,3 @@ insert_worksheet_nh <- function(data, # automatische Spaltenbreite openxlsx::setColWidths(wb, sheet = sheetname, cols=1:spalten, widths = "auto", ignoreMergedCells = TRUE) } - - -get_groupline_index_by_pattern <- function(grouplines, data){ - - get_lowest_col <- function(groupline, data){ - groupline_numbers_single <- which(grepl(groupline, names(data))) - - out <- min(groupline_numbers_single) - - return(out) - } - - - groupline_numbers <- unlist(lapply(grouplines, function(x) get_lowest_col(x, data))) - - return(groupline_numbers) -} - - - -add_additional_text <- function(wb, text, sheetname, start_row){ - - rows = c(seq(start_row, start_row+length(text)-1)) - - openxlsx::addStyle(wb, - sheet = sheetname, - style_subtitle(), - rows = rows, - cols = 1, - gridExpand = TRUE - ) - openxlsx::writeData(wb, - sheet = sheetname, - x = text, - colNames = F, - headerStyle=style_subtitle(), - startRow = start_row - ) - - return(max(rows)) -} - -prep_source <- function(source){ - - source <- sub("statzh", "Statistisches Amt des Kantons Z\u00fcrich", source) - - sources = paste0("Quelle: ", paste0(source, collapse = "; ")) -} - - -prep_metadata <- function(metadata){ - - metadata = paste0("Metadaten: ", paste0(metadata, collapse = "; ")) - -} - - -style_title <- function(){ - openxlsx::createStyle( - fontSize=14, - textDecoration="bold", - fontName="Arial" - ) -} - - -style_subtitle <- function(){ - openxlsx::createStyle( - fontSize=11, - fontName="Calibri" - ) -} - -style_header <- function(){ - openxlsx::createStyle( - fontSize = 12, - fontName="Calibri", - fontColour = "#000000", - halign = "left", - border="Bottom", - borderColour = "#009ee0", - textDecoration = "bold" - ) -} - -style_leftline <- function(){ - openxlsx::createStyle( - border="Left", - borderColour = "#009ee0" - ) -} - - -insert_second_header <- function(wb, sheetname, data_start_row, group_names, grouplines, data){ - - if(is.character(grouplines)){ - groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) - }else if(is.numeric(grouplines)){ - groupline_numbers <- grouplines - } - - openxlsx::addStyle(wb, - sheet = sheetname, - style_header(), - rows = data_start_row, - cols = 1:ncol(data) - ) - - purrr::walk2(groupline_numbers,group_names, ~openxlsx::writeData(wb, - sheet = sheetname, - x = .y, - startCol = .x, - colNames = F, - startRow = data_start_row - )) - -} - - - diff --git a/R/process_input.R b/R/process_input.R new file mode 100644 index 0000000..77cb53a --- /dev/null +++ b/R/process_input.R @@ -0,0 +1,67 @@ + +check_sheetname <- function(sheetname){ + + if (nchar(sheetname) > 31){ + warning("sheetname is cut to 31 characters (limit imposed by MS-Excel)") + sheetname <- paste(substr(sheetname, 0, 31)) + } + + return(sheetname) +} + + +prep_source <- function(source){ + + source <- sub("statzh", "Statistisches Amt des Kantons Z\u00fcrich", source) + + return(paste0(source, collapse = "; ")) +} + + +prep_metadata <- function(metadata){ + + return(paste0("Metadaten: ", paste0(metadata, collapse = "; "))) +} + +prep_logo <- function(logo){ + + if(logo == "statzh") { + logo <- paste0(path.package("statR"),"/extdata/Stempel_STAT-01.png") + + } else if(logo == "zh"){ + logo <- paste0(path.package("statR"),"/extdata/Stempel_Kanton_ZH.png") + } + + return(logo) +} + +prep_contact <- function(contact){ + if (contact == "statzh"){ + contact <- c("Datashop", "Tel.: +41 43 259 75 00", + "datashop@statistik.zh.ch") + } else if (length(contact) > 3){ + warning("Contactdetails may overlap with other elements. To avoid this issue please do not include more than three elements in the contactdetails vector.") + } + + return(contact) +} + +prep_openinghours <- function(openinghours){ + if (openinghours == "statzh"){ + openinghours <- c("B\u00fcrozeiten", + "Montag bis Freitag", + "09:00 bis 12:00", + "13:00 bis 16:00") + } + + return(openinghours) +} + +prep_homepage <- function(homepage){ + if (homepage == "statzh"){ + homepage <- "http://www.statistik.zh.ch" + } + + class(homepage) <- 'hyperlink' + return(homepage) +} diff --git a/R/quickXLSX.R b/R/quickXLSX.R index 0ce6abe..edbfd07 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -37,6 +37,7 @@ quickXLSX <-function (data = NA, contactdetails="statzh", author = "user") { + warning("Deprecation") #create workbook wb <- openxlsx::createWorkbook(paste(file)) diff --git a/R/splitXLSX.R b/R/splitXLSX.R index 3aaf926..1e08763 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -41,6 +41,7 @@ splitXLSX <- function (data, contactdetails="statzh", author = "user") { + warning("Deprecation") data <- as.data.frame(data) # extract column name diff --git a/R/styles.R b/R/styles.R index f0fff2a..6f0db63 100644 --- a/R/styles.R +++ b/R/styles.R @@ -16,16 +16,60 @@ mainTitleStyle <- function(){ halign = "left") } +style_title <- function(){ + openxlsx::createStyle( + fontSize = 14, + textDecoration = "bold", + fontName = "Arial" + ) +} + subtitleStyle <- function(){ - openxlsx::createStyle(fontSize=11, - textDecoration="bold", - fontName="Arial", + openxlsx::createStyle(fontSize = 11, + textDecoration = "bold", + fontName = "Arial", halign = "left") } +style_subtitle <- function(){ + openxlsx::createStyle( + fontSize = 11, + fontName = "Calibri" + ) +} + hyperlinkStyle <- function(){ openxlsx::createStyle(fontName = "Calibri", fontSize = 11, fontColour = "blue", textDecoration = "underline") } + +style_header <- function(){ + openxlsx::createStyle( + fontSize = 12, + fontName = "Calibri", + fontColour = "#000000", + halign = "left", + border="Bottom", + borderColour = "#009ee0", + textDecoration = "bold" + ) +} + +style_headerline <- function(){ + openxlsx::createStyle(border = "Bottom", + borderColour = "#009ee0", + borderStyle = getOption("openxlsx.borderStyle", "thick")) +} + +style_leftline <- function(){ + openxlsx::createStyle( + border = "Left", + borderColour = "#009ee0" + ) +} + +style_wrap <- function() { + openxlsx::createStyle(wrapText = TRUE) +} From 212133e18b204611b8cd40172e88a5ac804e0397 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Tue, 9 May 2023 06:56:13 +0200 Subject: [PATCH 25/74] Improved documentation (use of @keyword internal for documentation of unexported helper functions). --- R/aXLSX.R | 54 ++++++++++++++------------- R/add_additional_text.R | 20 +++++----- R/datasetsXLSX.R | 39 +++++++++---------- R/display.R | 10 ++--- R/flush_left.r | 7 ++-- R/get_groupline_index_by_pattern.R | 40 ++++---------------- R/insert_hyperlinks.R | 24 ++++++------ R/insert_image.R | 49 +++++++++++++----------- R/insert_index_sheet.R | 18 ++++++--- R/insert_worksheet_nh.R | 60 +++++++++++++++--------------- R/process_input.R | 14 ++++++- R/quickXLSX.R | 44 ++++++++++++---------- R/splitXLSX.R | 44 +++++++++++----------- R/styles.R | 11 ++---- 14 files changed, 214 insertions(+), 220 deletions(-) diff --git a/R/aXLSX.R b/R/aXLSX.R index 73a1fb2..b2013da 100644 --- a/R/aXLSX.R +++ b/R/aXLSX.R @@ -14,44 +14,46 @@ #' @examples #' \donttest{ #' \dontrun{ -#' # Beispiel anhand des Datensatzes 'mtcars' -#'dat <- mtcars #' -#'aXLSX(data = dat, -#' title = "Motor trend car road tests", -#' file = "motor_trend_car_road_tests", # '.xlsx' is automatically added -#' source = "Source: Henderson and Velleman (1981). Building multiple -#' regression models interactively. -#' Biometrics, 37, 391–411.", -#' metadata = c("The data was extracted from the 1974 Motor Trend US -#' magazine and comprises fuel -#' consumption and 10 aspects of automobile design and performance -#' for 32 automobiles (1973–74 models)."), -#' contactdetails = "statzh", -#' grouplines = NA, -#' logo = "statzh", -#' author = "user") +#'aXLSX(data = mtcars, +#' title = "Motor trend car road tests", +#' file = "motor_trend_car_road_tests", +#' source = "Source: Henderson and Velleman (1981). Building multiple +#' regression models interactively. Biometrics, 37, 391–411.", +#' metadata = c("The data was extracted from the 1974 Motor Trend US +#' magazine and comprises fuel consumption and 10 aspects of automobile +#' design and performance for 32 automobiles (1973–74 models)."), +#' contactdetails = "statzh", +#' grouplines = NA, +#' logo = "statzh", +#' author = "user") #' } #' } -aXLSX <-function (data, file, title="Title", source="statzh", metadata = NA, - logo="statzh", grouplines = NA, contactdetails="statzh", - author = "user"){ +aXLSX <- function(data, + file, + title = "Title", + source = "statzh", + metadata = NA, + logo = "statzh", + grouplines = NA, + contactdetails = "statzh", + author = "user" +){ #create workbook wb <- openxlsx::createWorkbook(paste(file)) #insert data - insert_worksheet_nh(data, wb, title=title, source=source, metadata = NA, grouplines = grouplines) + insert_worksheet_nh(data, wb, title = title, source = source, + metadata = NA, grouplines = grouplines) # insert metadata - insert_metadata_sheet(wb, title=title, - source=source, metadata = metadata, logo= logo, - contactdetails=contactdetails, author = author) + insert_metadata_sheet(wb, title = title, source = source, + metadata = metadata, logo = logo, contactdetails = contactdetails, + author = author) #save workbook - openxlsx::saveWorkbook(wb, paste(file, ".xlsx", sep = ""), + openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) - - } diff --git a/R/add_additional_text.R b/R/add_additional_text.R index 3647082..4bfa610 100644 --- a/R/add_additional_text.R +++ b/R/add_additional_text.R @@ -1,21 +1,19 @@ #' add_additional_text() #' -#' Insert text into an existing workbook object. Note that text is inserted -#' at first column index. +#' @description Insert text into an existing workbook object. +#' @note: Text is inserted at first column index. #' @param wb workbook object where text should be inserted #' @param text Character vector of text to be inserted #' @param sheetname Sheet where text should be inserted. #' @param start_row Row from which to insert elements -#' @keywords add_additional_text -#' @examples -#' -#' # Generation of a spreadsheet -#' wb <- openxlsx::createWorkbook("hello") -#' -#' insert_metadata_sheet(wb, title = "Title of mtcars", metadata = c("Meta data information.")) - +#' @keywords internal -add_additional_text <- function(wb, text, sheetname, start_row){ +add_additional_text <- function( + wb, + text, + sheetname, + start_row +){ rows = c(seq(start_row, start_row+length(text)-1)) diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index ee12bfb..6ae752d 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -87,24 +87,25 @@ #'} #'} -datasetsXLSX <- function(file, - datasets, - titles, - plot_widths = NULL, - plot_heights = NULL, - grouplines = NA, - group_names = NA, - sources = "statzh", - metadata1 = NA, - sheetnames, - maintitle, - titlesource = "statzh", - logo = "statzh", - auftrag_id = NULL, - contact = "statzh", - homepage = "statzh", - openinghours = "statzh", - overwrite = F +datasetsXLSX <- function( + file, + datasets, + titles, + plot_widths = NULL, + plot_heights = NULL, + grouplines = NA, + group_names = NA, + sources = "statzh", + metadata1 = NA, + sheetnames, + maintitle, + titlesource = "statzh", + logo = "statzh", + auftrag_id = NULL, + contact = "statzh", + homepage = "statzh", + openinghours = "statzh", + overwrite = F ){ if(!any(is.na(group_names)) & any(is.na(grouplines))){ @@ -200,6 +201,6 @@ datasetsXLSX <- function(file, # Save workbook at path denoted by argument file openxlsx::saveWorkbook( wb, - file = paste(file, ".xlsx", sep = ""), + file = prep_filename(file), overwrite = overwrite) } diff --git a/R/display.R b/R/display.R index 3b8be77..33205cf 100644 --- a/R/display.R +++ b/R/display.R @@ -1,8 +1,6 @@ # display() - -#' display() -#' -#' preview colors in console +#' @description +#' Preview of colors specified from hex-codes #' @param col a vector of hex-code colors to be displayed #' @param border border color #' @param ... further arguments that can be passed to the plot()-function @@ -16,12 +14,10 @@ #' #example with a single hex-code #' display("#000000") -# Function -#Funktion um Paletten anzuzeigen display <- function(col, border = "light gray", ...){ n <- length(col) - plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, 1), + plot(0, 0, type = "n", xlim = c(0, 1), ylim = c(0, 1), axes = FALSE, xlab = "", ylab = "", ...) rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border) } diff --git a/R/flush_left.r b/R/flush_left.r index 1b49e4a..c332a66 100644 --- a/R/flush_left.r +++ b/R/flush_left.r @@ -1,10 +1,9 @@ -# flush_left: schiebt title, subtitle und caption an den linken Grafikrand +# flush_left(): -#' flush_left() -#' +#' @description #' Function to flush title, subtitle and caption to the lefthand side of the graphics device #' @param g ggplot object -#' @keywords flush left +#' @keywords flush_left, ggplot #' @importFrom ggplot2 ggplotGrob #' @export #' @examples diff --git a/R/get_groupline_index_by_pattern.R b/R/get_groupline_index_by_pattern.R index d8a9a00..e7c198e 100644 --- a/R/get_groupline_index_by_pattern.R +++ b/R/get_groupline_index_by_pattern.R @@ -1,37 +1,11 @@ -#' aXLSX() +#' get_groupline_index_by_pattern() #' -#' Function to export data from R to a formatted .xlsx-file. -#' -#' The data is exported -#' to the first sheet. Metadata information is exported to the second sheet. -#' -#' @param data data to be exported. -#' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. -#' @param title title to be put above the data in the worksheet. -#' @template shared_parameters -#' @keywords aXLSX -#' @examples -#' \donttest{ -#' \dontrun{ -#' # Beispiel anhand des Datensatzes 'mtcars' -#'dat <- mtcars -#' -#'aXLSX(data = dat, -#' title = "Motor trend car road tests", -#' file = "motor_trend_car_road_tests", # '.xlsx' is automatically added -#' source = "Source: Henderson and Velleman (1981). Building multiple -#' regression models interactively. -#' Biometrics, 37, 391–411.", -#' metadata = c("The data was extracted from the 1974 Motor Trend US -#' magazine and comprises fuel -#' consumption and 10 aspects of automobile design and performance -#' for 32 automobiles (1973–74 models)."), -#' contactdetails = "statzh", -#' grouplines = NA, -#' logo = "statzh", -#' author = "user") -#' } -#' } +#' @description +#' Function ... +#' @param grouplines ... +#' @param data ... +#' @keywords internal + get_groupline_index_by_pattern <- function(grouplines, data){ get_lowest_col <- function(groupline, data){ diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index d55539d..7c27b19 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -1,12 +1,13 @@ #' insert_hyperlinks #' -#' Description -#' +#' Function for inserting hyperlinks within an openxlsx Workbook +#' @description +#' A short description... #' @param wb Worksheet #' @param sheetname Name of sheet #' @param title Title #' @param sheet_row Sheet row -#' @keywords datasetsXLSX +#' @keywords internal, datasetsXLSX #' @examples #'\donttest{ #' \dontrun{ @@ -15,18 +16,15 @@ #'} #' insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ - openxlsx::writeData(wb, - sheet = "Inhalt", - x = title, - xy = c("C", sheet_row)) + openxlsx::writeData(wb, sheet = "Inhalt", x = title, + xy = c("C", sheet_row)) - openxlsx::addStyle(wb, - sheet = "Inhalt", - style = hyperlinkStyle(), - rows = sheet_row, - cols = 3) + openxlsx::addStyle(wb, sheet = "Inhalt", + style = hyperlinkStyle(), rows = sheet_row, + cols = 3) - openxlsx::mergeCells(wb, sheet = "Inhalt", cols = 3:8, rows = sheet_row) + openxlsx::mergeCells(wb, sheet = "Inhalt", cols = 3:8, + rows = sheet_row) worksheet <- wb$sheetOrder[1] diff --git a/R/insert_image.R b/R/insert_image.R index bdf372c..61fc67e 100644 --- a/R/insert_image.R +++ b/R/insert_image.R @@ -1,5 +1,9 @@ +#' insert_worksheet_image() +#' #' insert an image into a single worksheet -#' insert_image +#' @description +#' The import +#' @note #' #' @param image image or plot #' @param workbook workbook object to write new worksheet in @@ -8,38 +12,39 @@ #' @param startcol column coordinate of upper left corner of figure #' @param width width of figure #' @param height height of figure -#' @noRd #' @importFrom grDevices png dev.off +#' @keywords internal #' @examples -#' # example -#' \dontrun{ -#' export <- openxlsx::createWorkbook("export") +#' # ggplot object +#' #-------------- +#' wb <- openxlsx::createWorkbook() #' -#' insert_worksheet_image(image=plot(x = mtcars$wt, y = mtcars$mpg), -#' export, -#' "image", -#' startrow=2, -#' startcol=2, -#' width=3.5, -#' height=5.5 +#' insert_worksheet_image( +#' image, +#' wb, +#' "ggplot image" +#' width=3.5, +#' height=5.5 #' ) -#'openxlsx::saveWorkbook(export,"insert_worksheet_image.xlsx") #' -#'} - -insert_worksheet_image = function(image, - wb, - sheetname, - width, - height){ - +#' +#' \dontrun{ +#' openxlsx::saveWorkbook(export,"insert_worksheet_image.xlsx") +#' } +#' +insert_worksheet_image = function( + image, + wb, + sheetname, + width, + height +){ openxlsx::addWorksheet( wb, sheetName = sheetname, gridLines = FALSE) - if (class(image) == "character" ){ image_path <- image diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index adb4f5c..8435b30 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -1,7 +1,6 @@ #' insert_index_sheet() #' -#' Description -#' +#' @description Function which generates an index sheet inside an openxlsx workbook. #' @param wb A workbook object as generated by openxlsx::createWorkbook() #' @param logo Either statzh or zh, or path to logo file #' @param contact Either "statzh" or a character string @@ -10,7 +9,7 @@ #' @param titlesource Character vector denoting the data source #' @param auftrag_id Order ID #' @param maintitle Main title -#' @keywords datasetsXLSX +#' @keywords datasetsXLSX, openxlsx #' @examples #'\donttest{ #' \dontrun{ @@ -18,8 +17,17 @@ #'} -insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, - titlesource, auftrag_id, maintitle){ +insert_index_sheet <- function( + wb, + logo, + contact, + homepage, + openinghours, + titlesource, + auftrag_id, + maintitle +){ + # Create index sheet openxlsx::addWorksheet(wb, sheetName = "Inhalt") diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index 5cdd05a..8bafdf2 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -2,6 +2,11 @@ #' #' Function to add formatted worksheets without headers to an existing workbook #' +#' @description +#' +#' @note +#' The function does not write the result into a .xlsx file. A separate call +#' to openxlsx::saveWorkbook() is required. #' @param data data to be included in the XLSX-table. #' @param wb workbook object to write new worksheet in. #' @param title title of the table and the sheet @@ -10,49 +15,43 @@ #' @param metadata metadata-information to be included. Defaults to NA. #' @param grouplines defaults to NA. Can be used to separate grouped variables visually. #' @param group_names Name(s) of the second header(s). Format: List e.g list(c("title 1", "title 2", "title 3")) -#' @keywords insert_worksheet +#' @keywords insert_worksheet, openxlsx #' @export #' @importFrom dplyr "%>%" #' @examples #' -#' # create workbook -#' wb <- openxlsx::createWorkbook("hello") +#' ## Create workbook +#' export <- openxlsx::createWorkbook("export") #' -#' insert_worksheet_nh(mtcars[c(1:10),],wb,"mtcars",c(1:4),"carb",grouplines=c(1,5,6)) +#' ## insert a new worksheet +#' insert_worksheet_nh(head(mtcars), export, "data1", +#' title = "Title", source = "statzh", metadata = "Note: ...") #' -#'# create workbook -#' export <- openxlsx::createWorkbook("export") +#' ## insert a further worksheet +#' insert_worksheet_nh(tail(mtcars), export, "data2", +#' title = "Title", source = "statzh", metadata = "Note: ...") #' -#' # insert a new worksheet -#' insert_worksheet_nh(head(mtcars) -#' ,export -#' ,"data1" -#' ,title = "Title" -#' ,source = "Quelle: Statistisches Amt Kanton Z\u00fcrich" -#' ,metadata = "Bemerkung: ...") +#' ## insert a worksheet with group lines and second header +#' insert_worksheet_nh(data = head(mtcars), wb = export, +#' title = "grouplines", source = "statzh", metadata = c(1:4), +#' grouplines=c(1,5,6), group_names = "carb") #' -#' # insert a further worksheet -#' insert_worksheet_nh(tail(mtcars) -#' ,export -#' ,"data2" -#' ,title = "Title" -#' ,source = "Quelle: Statistisches Amt Kanton Z\u00fcrich" -#' ,metadata = "Bemerkung: ...") #'\dontrun{ -#' # save workbook +#' ## save workbook #' openxlsx::saveWorkbook(export,"example.xlsx") #'} # Function -insert_worksheet_nh <- function(data, - wb, - sheetname="Daten", - title="Title", - source="statzh", - metadata = NA, - grouplines = NA, - group_names = NA +insert_worksheet_nh <- function( + data, + wb, + sheetname = "Daten", + title = "Title", + source = "statzh", + metadata = NA, + grouplines = NA, + group_names = NA ){ # number of data columns @@ -169,5 +168,6 @@ insert_worksheet_nh <- function(data, options("openxlsx.minWidth" = 5) # automatische Spaltenbreite - openxlsx::setColWidths(wb, sheet = sheetname, cols=1:spalten, widths = "auto", ignoreMergedCells = TRUE) + openxlsx::setColWidths(wb, sheet = sheetname, cols = 1:spalten, + widths = "auto", ignoreMergedCells = TRUE) } diff --git a/R/process_input.R b/R/process_input.R index 77cb53a..baf0a1d 100644 --- a/R/process_input.R +++ b/R/process_input.R @@ -1,4 +1,8 @@ - +#' Functions for checking and transforming user input +#' +#' @Description Helper functions not intended to be called directly by users. +#' @keywords internal +#' check_sheetname <- function(sheetname){ if (nchar(sheetname) > 31){ @@ -9,6 +13,14 @@ check_sheetname <- function(sheetname){ return(sheetname) } +prep_filename <- function(filename){ + + if (!grepl(".xlsx", filename)){ + filename <- paste0(filename, ".xlsx") + } + + return(filename) +} prep_source <- function(source){ diff --git a/R/quickXLSX.R b/R/quickXLSX.R index edbfd07..e12a653 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -1,6 +1,10 @@ #' quickXLSX() #' #' Function to export data from R to a formatted .xlsx-spreadsheet. +#' @description +#' A short description... +#' @note +#' Will be deprecated in upcoming version. #' @param data data to be exported. #' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. #' @param title title to be put above the data in the worksheet. @@ -8,44 +12,44 @@ #' @keywords quickXLSX #' @export #' @examples -#' # Beispiel anhand des Datensatzes 'mtcars' -#'dat <- mtcars #' -#'quickXLSX(data = dat, +#'quickXLSX(data = mtcars, #' title = "Motor trend car road tests", -#' file = "motor_trend_car_road_tests", # '.xlsx' is automatically added +#' file = "motor_trend_car_road_tests", #' source = "Source: Henderson and Velleman (1981). Building multiple -#' regression models interactively. -#' Biometrics, 37, 391–411.", +#' regression models interactively. Biometrics, 37, 391–411.", #' metadata = c("The data was extracted from the 1974 Motor Trend US -#' magazine and comprises fuel -#' consumption and 10 aspects of automobile design and performance -#' for 32 automobiles (1973–74 models)."), +#' magazine and comprises fuel consumption and 10 aspects of automobile +#' design and performance for 32 automobiles (1973–74 models)."), #' contactdetails = "statzh", #' grouplines = FALSE, #' logo = "statzh", #' author = "user") #' -quickXLSX <-function (data = NA, - file, - title="Title", - source="statzh", - metadata = NA, - logo="statzh", - grouplines = FALSE, - contactdetails="statzh", - author = "user") { +quickXLSX <- function( + data = NA, + file, + title = "Title", + source = "statzh", + metadata = NA, + logo = "statzh", + grouplines = FALSE, + contactdetails = "statzh", + author = "user" +){ warning("Deprecation") #create workbook wb <- openxlsx::createWorkbook(paste(file)) #insert data - insert_worksheet(data=data, wb, title=title, source=source, metadata = metadata, logo=logo, grouplines = grouplines, contactdetails=contactdetails, author = author) + insert_worksheet(data = data, wb, title = title, source = source, + metadata = metadata, logo = logo, grouplines = grouplines, + contactdetails = contactdetails, author = author) #save workbook - openxlsx::saveWorkbook(wb, paste(file, ".xlsx", sep = ""), + openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) diff --git a/R/splitXLSX.R b/R/splitXLSX.R index 1e08763..52c3b20 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -1,20 +1,23 @@ #' splitXLSX() #' -#' Function to export data from R as formatted .xlsx-file and spread them over several worksheets based on a grouping variable (e.g., year). +#' Function to export data from R as formatted .xlsx-file and spread them over several worksheets +#' based on a grouping variable (e.g., year). +#' @description +#' A short description... +#' @note +#' May be deprecated in upcoming version. User should make sure that the grouping variable is of +#' binary, categorical or other types with a limited number of levels. #' @param data data to be exported. -#' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. +#' @param file file name of the output .xlsx-file. The extension is added automatically. #' @param sheetvar name of the variable used to split the data and spread them over several sheets. #' @param title title to be put above the data in the worksheet. the sheetvar subcategory is added in brackets. #' @template shared_parameters #' @keywords splitXLSX #' @export #' @examples -#' -#' dat <- mtcars -#' -#'splitXLSX(data = dat, +#'splitXLSX(data = mtcars, #' title = "Motor trend car road tests", -#' file = "motor_trend_car_road_tests", # '.xlsx' automatically added +#' file = "motor_trend_car_road_tests", #' sheetvar = cyl, #' source = "Source: Henderson and Velleman (1981), #' Building multiple regression models interactively. @@ -30,17 +33,18 @@ # Function -splitXLSX <- function (data, - file, - sheetvar, - title="Titel", - source="statzh", - metadata = NA, - logo="statzh", - grouplines = FALSE, - contactdetails="statzh", - author = "user") -{ +splitXLSX <- function ( + data, + file, + sheetvar, + title = "Titel", + source = "statzh", + metadata = NA, + logo = "statzh", + grouplines = FALSE, + contactdetails = "statzh", + author = "user" +){ warning("Deprecation") data <- as.data.frame(data) @@ -76,9 +80,7 @@ splitXLSX <- function (data, openxlsx::worksheetOrder(wb)<-rev(openxlsx::worksheetOrder(wb)) #save xlsx - openxlsx::saveWorkbook(wb, paste(file,".xlsx",sep=""), overwrite = TRUE) - - # rm(newworkbook,envir = .GlobalEnv) + openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) } diff --git a/R/styles.R b/R/styles.R index 6f0db63..4a70ccb 100644 --- a/R/styles.R +++ b/R/styles.R @@ -1,13 +1,8 @@ #' Style definitions #' -#' Description -#' -#' @keywords styles -#' @examples -#'\donttest{ -#' \dontrun{ -#'} -#'} +#' @Description +#' Functions which generate style objects. Not intended to be called directly by the user. +#' @keywords internal mainTitleStyle <- function(){ openxlsx::createStyle(fontSize = 20, From 45f077dc4133f27ef966c49cac339af792501a39 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Tue, 9 May 2023 15:27:53 +0000 Subject: [PATCH 26/74] Documentation, examples --- R/add_additional_text.R | 14 ++-- R/insert_image.R | 28 +++++--- R/insert_index_sheet.R | 148 ++++++++++++++------------------------ R/insert_metadata_sheet.R | 23 +++--- R/insert_worksheet.R | 6 ++ R/insert_worksheet_nh.R | 14 +--- R/process_input.R | 18 +++-- 7 files changed, 106 insertions(+), 145 deletions(-) diff --git a/R/add_additional_text.R b/R/add_additional_text.R index 4bfa610..fba1c5c 100644 --- a/R/add_additional_text.R +++ b/R/add_additional_text.R @@ -1,19 +1,15 @@ #' add_additional_text() #' -#' @description Insert text into an existing workbook object. -#' @note: Text is inserted at first column index. +#' @description +#' Insert text into an existing workbook object. +#' @note +#' Text is inserted at first column index. #' @param wb workbook object where text should be inserted #' @param text Character vector of text to be inserted #' @param sheetname Sheet where text should be inserted. #' @param start_row Row from which to insert elements #' @keywords internal - -add_additional_text <- function( - wb, - text, - sheetname, - start_row -){ +add_additional_text <- function(wb, text, sheetname, start_row){ rows = c(seq(start_row, start_row+length(text)-1)) diff --git a/R/insert_image.R b/R/insert_image.R index 61fc67e..92503ca 100644 --- a/R/insert_image.R +++ b/R/insert_image.R @@ -4,7 +4,8 @@ #' @description #' The import #' @note -#' +#' The function does not write the result into a .xlsx file. A separate call +#' to openxlsx::saveWorkbook() is required. #' @param image image or plot #' @param workbook workbook object to write new worksheet in #' @param sheetname name of the sheet tab @@ -19,20 +20,29 @@ #' #-------------- #' wb <- openxlsx::createWorkbook() #' -#' insert_worksheet_image( -#' image, -#' wb, -#' "ggplot image" -#' width=3.5, -#' height=5.5 -#' ) +#' # Add a geom_histogram() +#' +#' figure1 <- ggplot(mtcars, aes(x = disp)) + geom_histogram() +#' +#' insert_worksheet_image(image = figure1, wb, sheetname = "ggplot image", +#' width = 3.5, height = 5.5) +#' +#' # Add a base histogram +#' base_hist <- histogram(mtcars$disp) #' +#' insert_worksheet_image(image = base_hist, wb, sheetname = "Base histogram", +#' width = 3.5, height = 5.5) +#' +#' # Insert an existing image file +#' image_path <- paste0(path.package("statR"), "/extdata/Stempel_Kanton_ZH.png") +#' +#' insert_worksheet_image(image = image_path, wb, sheetname = "Existing image", +#' width = 3.5, height = 5.5) #' #' \dontrun{ #' openxlsx::saveWorkbook(export,"insert_worksheet_image.xlsx") #' } #' - insert_worksheet_image = function( image, wb, diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index 8435b30..96c094b 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -11,138 +11,94 @@ #' @param maintitle Main title #' @keywords datasetsXLSX, openxlsx #' @examples -#'\donttest{ +#' \donttest{ #' \dontrun{ -#'} -#'} - - -insert_index_sheet <- function( - wb, - logo, - contact, - homepage, - openinghours, - titlesource, - auftrag_id, - maintitle -){ - - # Create index sheet - openxlsx::addWorksheet(wb, sheetName = "Inhalt") +#' } +#' } +insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, + titlesource, auftrag_id, maintitle){ - # hide gridlines - openxlsx::showGridLines(wb, - sheet = "Inhalt", - showGridLines = FALSE) + ## Create index sheet + openxlsx::addWorksheet(wb, sheetName = "Inhalt") - # set col widths - openxlsx::setColWidths(wb, - sheet = "Inhalt", - cols = 1, - widths = 1) + ## Content + #----------- - ## Logo + ### Logo if(!is.null(logo)){ logo <- prep_logo(logo) if (file.exists(logo)){ - openxlsx::insertImage(wb, - sheet = "Inhalt", - file = logo, - width = 2.145, - height = 0.7865, - units = "in") + openxlsx::insertImage(wb, sheet = "Inhalt", file = logo, width = 2.145, + height = 0.7865, units = "in") } else { message("no logo found.") } } - ## Contact + ### Contact information if(!is.null(contact)){ - openxlsx::writeData(wb, - sheet = "Inhalt", - x = prep_contact(contact), + openxlsx::writeData(wb, sheet = "Inhalt", x = prep_contact(contact), xy = c("O", 2)) } - if(!is.null(homepage)){ - openxlsx::writeData(wb, - sheet = "Inhalt", - x = prep_homepage(homepage), + openxlsx::writeData(wb, sheet = "Inhalt", x = prep_homepage(homepage), xy = c("O", 5)) } - if(!is.null(openinghours)){ - openxlsx::writeData(wb, - sheet = "Inhalt", - x = prep_openinghours(openinghours), - xy = c("R", 2)) + openxlsx::writeData(wb, sheet = "Inhalt", + x = prep_openinghours(openinghours), xy = c("R", 2)) } - ## Headerline - openxlsx::addStyle(wb, - sheet = "Inhalt", - style = style_headerline(), - rows = 6, - cols = 1:20, - gridExpand = TRUE, - stack = TRUE) - - - ## Erstellungsdatum - openxlsx::writeData(wb, - sheet = "Inhalt", - x = paste("Erstellt am ", - format(Sys.Date(), format="%d.%m.%Y")), + ### Creation date + openxlsx::writeData(wb, sheet = "Inhalt", x = prep_creationdate(), xy = c("O", 8)) - ## Auftragsnummer + ### Order id if (!is.null(auftrag_id)){ - openxlsx::writeData(wb, - sheet = "Inhalt", - paste("Auftragsnr.:", auftrag_id), + openxlsx::writeData(wb, sheet = "Inhalt", x = prep_orderid(auftrag_id), xy = c("O", 9)) } - ## Maintitle - openxlsx::addStyle(wb, - sheet = "Inhalt", - style = mainTitleStyle(), - rows = 10, - cols = 3, - gridExpand = TRUE) + ### Title + openxlsx::writeData(wb, sheet = "Inhalt", x = maintitle, + headerStyle = mainTitleStyle(), xy = c("C", 10)) - openxlsx::writeData(wb, - sheet = "Inhalt", - x = maintitle, - headerStyle = mainTitleStyle(), - xy = c("C", 10)) - - - ## Source + ### Source if (!is.null(titlesource)){ - openxlsx::writeData(wb, - sheet = "Inhalt", - x = paste("Quelle:", prep_source(titlesource)), + openxlsx::writeData(wb, sheet = "Inhalt", x = prep_source(titlesource), xy = c("C", 11)) } - # subtitle - openxlsx::addStyle(wb, - sheet = "Inhalt", - style = subtitleStyle(), - rows = 14, - cols = 3, - gridExpand = TRUE) + ### Content caption + openxlsx::writeData(wb, sheet = "Inhalt", x = "Inhalt", + headerStyle = subtitleStyle(), xy = c("C", 13)) + + + ## Format + #----------------- + + ### Hide gridlines + openxlsx::showGridLines(wb, sheet = "Inhalt", showGridLines = FALSE) + + ### Set column widths + openxlsx::setColWidths(wb, sheet = "Inhalt", cols = 1, widths = 1) + + + ### Add Headerline + openxlsx::addStyle(wb, sheet = "Inhalt", style = style_headerline(), + rows = 6, cols = 1:20, gridExpand = TRUE, stack = TRUE) + + + ### Apply style to Maintitle + openxlsx::addStyle(wb, sheet = "Inhalt", style = mainTitleStyle(), rows = 10, + cols = 3, gridExpand = TRUE) - openxlsx::writeData(wb, - sheet = "Inhalt", - x = "Inhalt", - headerStyle = subtitleStyle(), - xy = c("C", 13)) + ### Apply style to Subtitle + openxlsx::addStyle(wb, sheet = "Inhalt", style = subtitleStyle(), rows = 14, + cols = 3, gridExpand = TRUE) } diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index 4cdb70e..7300d0a 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -10,23 +10,19 @@ #' @param contactdetails contact details of the data publisher. Defaults to "statzh". #' @param author defaults to the last two letters (initials) or numbers of the internal user name. #' @importFrom dplyr "%>%" -#' @keywords insert_metadata_sheet +#' @keywords insert_metadata_sheet, openxlsx #' @export #' @examples -#' #' # Generation of a spreadsheet #' wb <- openxlsx::createWorkbook("hello") #' #' insert_metadata_sheet(wb, title = "Title of mtcars", metadata = c("Meta data information.")) - - -insert_metadata_sheet <- function(wb, sheetname = "Metadaten", - title = "Title", - source = "statzh", - metadata = NA, - logo = "statzh", - contactdetails = "statzh", - author = "user"){ +#' \dontrun{ +#' openxlsx::saveWorkbook(wb,"insert_metadata_sheet.xlsx") +#' } +insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", + source = "statzh", metadata = NA, logo = "statzh", contactdetails = "statzh", + author = "user"){ sheetname <- check_sheetname(sheetname) openxlsx::addWorksheet(wb, sheetName = sheetname) @@ -36,11 +32,10 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", style_subtitle <- openxlsx::createStyle(fontSize = 12, textDecoration = "bold", fontName = "Arial") - # Fill Excel ----------------- + ## Fill Excel ----------------- ## Title - openxlsx::writeData(wb, - sheet = sheetname, + openxlsx::writeData(wb, sheet = sheetname, x = title, headerStyle = style_title(), startRow = 7) diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 11f2afe..e6da694 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -1,6 +1,12 @@ #' insert_worksheet() #' #' Function to add formatted worksheets to an existing .xlsx-workbook. +#' @description +#' +#' @note +#' Marked for deprecation in upcoming version. The function does not write the +#' result into a .xlsx file. A separate call to openxlsx::saveWorkbook() is +#' required. #' @param data data to be included. #' @param workbook workbook object to add new worksheet to. #' @param title title to be put above the data. diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index 8bafdf2..af41f6f 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -41,18 +41,8 @@ #' openxlsx::saveWorkbook(export,"example.xlsx") #'} -# Function - -insert_worksheet_nh <- function( - data, - wb, - sheetname = "Daten", - title = "Title", - source = "statzh", - metadata = NA, - grouplines = NA, - group_names = NA -){ +insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", + source = "statzh", metadata = NA, grouplines = NA, group_names = NA){ # number of data columns spalten <- ncol(data) diff --git a/R/process_input.R b/R/process_input.R index baf0a1d..2c6cf24 100644 --- a/R/process_input.R +++ b/R/process_input.R @@ -1,6 +1,7 @@ #' Functions for checking and transforming user input #' -#' @Description Helper functions not intended to be called directly by users. +#' @description +#' Helper functions not intended to be called directly by users. #' @keywords internal #' check_sheetname <- function(sheetname){ @@ -22,11 +23,10 @@ prep_filename <- function(filename){ return(filename) } -prep_source <- function(source){ +prep_source <- function(source, prefix = "Quelle:"){ source <- sub("statzh", "Statistisches Amt des Kantons Z\u00fcrich", source) - - return(paste0(source, collapse = "; ")) + return(paste("Quelle:", paste0(source, collapse = ";"))) } @@ -52,7 +52,7 @@ prep_contact <- function(contact){ contact <- c("Datashop", "Tel.: +41 43 259 75 00", "datashop@statistik.zh.ch") } else if (length(contact) > 3){ - warning("Contactdetails may overlap with other elements. To avoid this issue please do not include more than three elements in the contactdetails vector.") + warning("More than 3 elements in contactdetails, may overlap with other elements.") } return(contact) @@ -77,3 +77,11 @@ prep_homepage <- function(homepage){ class(homepage) <- 'hyperlink' return(homepage) } + +prep_creationdate <- function(prefix = "Erstellt am:", date_format = "%d.%m.%Y"){ + return(paste(prefix, format(Sys.Date(), format = date_format))) +} + +prep_orderid <- function(order_id, prefix = "Auftragsnr.:"){ + return(paste(prefix, order_id)) +} From 9e937976d4211c3d557d130936f846f5f80c10ba Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Wed, 10 May 2023 13:30:38 +0000 Subject: [PATCH 27/74] Improved documentation; examples checked --- DESCRIPTION | 7 ++- NAMESPACE | 13 ++++ R/aXLSX.R | 27 +++------ R/col_stat.R | 2 - R/datasetsXLSX.R | 49 +++++---------- R/display.R | 8 +-- R/display.statcol.all.R | 7 +-- R/flush_left.r | 24 ++++---- R/get_groupline_index_by_pattern.R | 8 +-- R/insert_hyperlinks.R | 11 +--- R/insert_image.R | 56 ++++++++--------- R/insert_index_sheet.R | 7 +-- R/insert_metadata_sheet.R | 80 +++++++----------------- R/insert_second_header.R | 26 ++++---- R/insert_worksheet.R | 2 - R/insert_worksheet_nh.R | 87 ++++++++++++--------------- R/interpolate.R | 25 ++++---- R/quick_sum.r | 40 ++++++------ R/splitXLSX.R | 19 ++---- R/styles.R | 2 +- man/aXLSX.Rd | 34 +++++------ man/add_additional_text.Rd | 24 ++++++++ man/check_sheetname.Rd | 12 ++++ man/display.Rd | 2 +- man/flush_left.Rd | 24 +++++--- man/get_groupline_index_by_pattern.Rd | 17 ++++++ man/insert_hyperlinks.Rd | 15 ++--- man/insert_index_sheet.Rd | 8 +-- man/insert_metadata_sheet.Rd | 13 ++-- man/insert_second_header.Rd | 47 +++++++++++++++ man/insert_worksheet.Rd | 5 ++ man/insert_worksheet_image.Rd | 74 +++++++++++++++++++++++ man/insert_worksheet_nh.Rd | 41 ++++++------- man/interpolate2.Rd | 5 +- man/mainTitleStyle.Rd | 18 ------ man/quickXLSX.Rd | 20 +++--- man/splitXLSX.Rd | 19 +++--- 37 files changed, 477 insertions(+), 401 deletions(-) create mode 100644 man/add_additional_text.Rd create mode 100644 man/check_sheetname.Rd create mode 100644 man/get_groupline_index_by_pattern.Rd create mode 100644 man/insert_second_header.Rd create mode 100644 man/insert_worksheet_image.Rd delete mode 100644 man/mainTitleStyle.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 30e4b9b..3f12c21 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -13,7 +13,7 @@ Depends: R (>= 3.3.0) License: GPL-3 Encoding: UTF-8 LazyData: true -RoxygenNote: 7.2.0 +RoxygenNote: 7.2.1 Imports: dplyr, ggplot2, @@ -25,12 +25,13 @@ Imports: rlang, scales, stringr, - tidyr, - purrr + purrr, + methods URL: https://statistikzh.github.io/statR/ BugReports: https://github.com/statistikZH/statR/issues Suggests: knitr, + tidyr, rmarkdown, ggrepel, magrittr diff --git a/NAMESPACE b/NAMESPACE index 2fd228b..8e244ca 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,6 +7,7 @@ export(display.statcol.all) export(flush_left) export(insert_metadata_sheet) export(insert_worksheet) +export(insert_worksheet_image) export(insert_worksheet_nh) export(interpolate2) export(quickXLSX) @@ -14,22 +15,34 @@ export(quick_sum) export(splitXLSX) export(theme_stat) export(zhpal) +import(ggplot2) importFrom(dplyr,"%>%") importFrom(dplyr,group_by) importFrom(dplyr,n) importFrom(dplyr,summarize) importFrom(dplyr,ungroup) +importFrom(ggplot2,aes) importFrom(ggplot2,continuous_scale) importFrom(ggplot2,element_blank) importFrom(ggplot2,element_line) importFrom(ggplot2,ggplotGrob) +importFrom(ggplot2,ggsave) +importFrom(ggplot2,labs) importFrom(ggplot2,theme) importFrom(ggplot2,theme_minimal) importFrom(ggplot2,unit) importFrom(grDevices,"colorRampPalette") +importFrom(grDevices,colorRampPalette) importFrom(grDevices,dev.off) importFrom(grDevices,png) importFrom(graphics,"rect") +importFrom(gridExtra,grid.arrange) +importFrom(methods,is) +importFrom(openxlsx,addWorksheet) +importFrom(openxlsx,insertImage) +importFrom(purrr,pmap) +importFrom(purrr,pwalk) +importFrom(purrr,walk) importFrom(rlang,":=") importFrom(stats,median) importFrom(stats,quantile) diff --git a/R/aXLSX.R b/R/aXLSX.R index b2013da..8380dc0 100644 --- a/R/aXLSX.R +++ b/R/aXLSX.R @@ -1,10 +1,10 @@ #' aXLSX() #' +#' @description #' Function to export data from R to a formatted .xlsx-file. -#' -#' The data is exported -#' to the first sheet. Metadata information is exported to the second sheet. -#' +#' @note +#' The data is exported to the first sheet. Metadata information is exported +#' to the second sheet. #' @param data data to be exported. #' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. #' @param title title to be put above the data in the worksheet. @@ -29,20 +29,12 @@ #' author = "user") #' } #' } - -aXLSX <- function(data, - file, - title = "Title", - source = "statzh", - metadata = NA, - logo = "statzh", - grouplines = NA, - contactdetails = "statzh", - author = "user" -){ +aXLSX <- function(data, file, title = "Title", source = "statzh", + metadata = NA, logo = "statzh", grouplines = NA, + contactdetails = "statzh", author = "user"){ #create workbook - wb <- openxlsx::createWorkbook(paste(file)) + wb <- openxlsx::createWorkbook() #insert data insert_worksheet_nh(data, wb, title = title, source = source, @@ -54,6 +46,5 @@ aXLSX <- function(data, author = author) #save workbook - openxlsx::saveWorkbook(wb, prep_filename(file), - overwrite = TRUE) + openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) } diff --git a/R/col_stat.R b/R/col_stat.R index 164d69f..6bd6770 100644 --- a/R/col_stat.R +++ b/R/col_stat.R @@ -1,7 +1,5 @@ # ------- Farbpaletten basierend auf Kantons-CI Farben ---------------- -library(scales) - #################### STAT ZH Farbpaletten #' Data used by the stat zh palettes diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index 6ae752d..07da896 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -28,6 +28,7 @@ #' @keywords datasetsXLSX #' @export #' @importFrom dplyr "%>%" +#' @importFrom purrr pwalk pmap #' @examples #'\donttest{ #' \dontrun{ @@ -87,32 +88,19 @@ #'} #'} -datasetsXLSX <- function( - file, - datasets, - titles, - plot_widths = NULL, - plot_heights = NULL, - grouplines = NA, - group_names = NA, - sources = "statzh", - metadata1 = NA, - sheetnames, - maintitle, - titlesource = "statzh", - logo = "statzh", - auftrag_id = NULL, - contact = "statzh", - homepage = "statzh", - openinghours = "statzh", - overwrite = F -){ +datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, + plot_heights = NULL, grouplines = NA, + group_names = NA, sources = "statzh", metadata1 = NA, + sheetnames, maintitle, titlesource = "statzh", + logo = "statzh", auftrag_id = NULL, + contact = "statzh", homepage = "statzh", + openinghours = "statzh", overwrite = F){ if(!any(is.na(group_names)) & any(is.na(grouplines))){ stop("if a second header is wanted, the grouplines have to be specified") } - wb <- openxlsx::createWorkbook("data") + wb <- openxlsx::createWorkbook() # Determine which elements of input list datasets correspond to dataframes. dataframes_index <- which(vapply(datasets, is.data.frame, TRUE)) @@ -128,21 +116,17 @@ datasetsXLSX <- function( # Determine which elements of datasets correspond to objects of type gg, # ggplot, histogram, or character (path input). - plot_index <- which(vapply(datasets, function(x) length(setdiff(class(x), c("gg", "ggplot", "histogram", "character"))) == 0, TRUE)) + plot_index <- which(vapply(datasets, function(x){ + length(setdiff(class(x), c("gg", "ggplot", "histogram", "character"))) == 0 + }, TRUE)) plot_datasets <- datasets[plot_index] plot_sheetnames <- sheetnames[plot_index] # Insert the initial index sheet - insert_index_sheet(wb, - logo, - contact, - homepage, - openinghours, - titlesource, - auftrag_id, - maintitle) + insert_index_sheet(wb, logo, contact, homepage, openinghours, titlesource, + auftrag_id, maintitle) # Iterate along dataframes_index @@ -199,8 +183,5 @@ datasetsXLSX <- function( sheet_row = ..3)) # Save workbook at path denoted by argument file - openxlsx::saveWorkbook( - wb, - file = prep_filename(file), - overwrite = overwrite) + openxlsx::saveWorkbook(wb, file = prep_filename(file), overwrite = overwrite) } diff --git a/R/display.R b/R/display.R index 33205cf..2f4ce14 100644 --- a/R/display.R +++ b/R/display.R @@ -1,5 +1,5 @@ -# display() -#' @description +#' display() +#' #' Preview of colors specified from hex-codes #' @param col a vector of hex-code colors to be displayed #' @param border border color @@ -13,11 +13,9 @@ #' display(zhpal$zhdiagonal) #' #example with a single hex-code #' display("#000000") - - display <- function(col, border = "light gray", ...){ n <- length(col) - plot(0, 0, type = "n", xlim = c(0, 1), ylim = c(0, 1), + plot(0, type = "n", xlim = c(0, 1), ylim = c(0, 1), axes = FALSE, xlab = "", ylab = "", ...) rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border) } diff --git a/R/display.statcol.all.R b/R/display.statcol.all.R index 1149824..891b90c 100644 --- a/R/display.statcol.all.R +++ b/R/display.statcol.all.R @@ -1,17 +1,14 @@ -# display.statcol.all() - #' display.statcol.all() #' #' Preview all Stat ZH palettes stored in the 'zhpal'-object #' @keywords display.statcol.all #' @export +#' @import ggplot2 #' @examples #' display.statcol.all() #' -# Function - -display.statcol.all<-function() { +display.statcol.all <- function(){ df <- data.frame(unlist(x$stattheme_data)) diff --git a/R/flush_left.r b/R/flush_left.r index c332a66..0068689 100644 --- a/R/flush_left.r +++ b/R/flush_left.r @@ -1,19 +1,19 @@ -# flush_left(): - -#' @description -#' Function to flush title, subtitle and caption to the lefthand side of the graphics device +#' flush_left(): +#' Function to flush title, subtitle and caption to the lefthand side of the +#' graphics device #' @param g ggplot object #' @keywords flush_left, ggplot -#' @importFrom ggplot2 ggplotGrob +#' @importFrom ggplot2 ggplotGrob labs aes +#' @importFrom gridExtra grid.arrange #' @export #' @examples -#'\dontrun{ -#' flush_left(ggplot(mtcars, aes( x = cyl))+ -#' geom_bar()+ -#' labs(title = "Titel", subtitle = "Untertitel", caption = "Datenquelle")) -#' } - - +#' library(ggplot2) +#' plt <- ggplot(mtcars, aes(x = cyl)) + +#' geom_bar() + +#' labs(title = "Cylinders", subtitle = "Bar chart", +#' caption = "mtcars") +#' +#' flush_left(plt) flush_left <- function(g){ xout <- ggplot2::ggplotGrob(g) diff --git a/R/get_groupline_index_by_pattern.R b/R/get_groupline_index_by_pattern.R index e7c198e..8bbfcec 100644 --- a/R/get_groupline_index_by_pattern.R +++ b/R/get_groupline_index_by_pattern.R @@ -1,7 +1,6 @@ #' get_groupline_index_by_pattern() #' -#' @description -#' Function ... +#' Derive groupline index by matching names #' @param grouplines ... #' @param data ... #' @keywords internal @@ -16,8 +15,9 @@ get_groupline_index_by_pattern <- function(grouplines, data){ return(out) } - - groupline_numbers <- unlist(lapply(grouplines, function(x) get_lowest_col(x, data))) + groupline_numbers <- unlist(lapply(grouplines, function(x){ + get_lowest_col(x, data) + })) return(groupline_numbers) } diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index 7c27b19..04a7997 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -1,4 +1,4 @@ -#' insert_hyperlinks +#' insert_hyperlinks() #' #' Function for inserting hyperlinks within an openxlsx Workbook #' @description @@ -7,14 +7,7 @@ #' @param sheetname Name of sheet #' @param title Title #' @param sheet_row Sheet row -#' @keywords internal, datasetsXLSX -#' @examples -#'\donttest{ -#' \dontrun{ -#' -#'} -#'} -#' +#' @keywords internal insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ openxlsx::writeData(wb, sheet = "Inhalt", x = title, xy = c("C", sheet_row)) diff --git a/R/insert_image.R b/R/insert_image.R index 92503ca..ccea9f3 100644 --- a/R/insert_image.R +++ b/R/insert_image.R @@ -1,77 +1,77 @@ #' insert_worksheet_image() -#' #' insert an image into a single worksheet -#' @description -#' The import #' @note #' The function does not write the result into a .xlsx file. A separate call #' to openxlsx::saveWorkbook() is required. #' @param image image or plot -#' @param workbook workbook object to write new worksheet in +#' @param wb workbook object to write new worksheet in #' @param sheetname name of the sheet tab #' @param startrow row coordinate of upper left corner of figure #' @param startcol column coordinate of upper left corner of figure #' @param width width of figure #' @param height height of figure +#' @export #' @importFrom grDevices png dev.off -#' @keywords internal +#' @importFrom methods is +#' @importFrom openxlsx addWorksheet insertImage +#' @importFrom ggplot2 ggsave +#' @keywords insert_worksheet_image #' @examples -#' # ggplot object -#' #-------------- +#' library(ggplot2) #' wb <- openxlsx::createWorkbook() #' #' # Add a geom_histogram() -#' -#' figure1 <- ggplot(mtcars, aes(x = disp)) + geom_histogram() +#' #-------------- +#' figure1 <- ggplot(mtcars, aes(x = disp)) + +#' geom_histogram() #' #' insert_worksheet_image(image = figure1, wb, sheetname = "ggplot image", #' width = 3.5, height = 5.5) #' #' # Add a base histogram -#' base_hist <- histogram(mtcars$disp) +#' #-------------- +#' base_hist <- hist(mtcars$disp) #' #' insert_worksheet_image(image = base_hist, wb, sheetname = "Base histogram", #' width = 3.5, height = 5.5) #' #' # Insert an existing image file +#' #-------------- #' image_path <- paste0(path.package("statR"), "/extdata/Stempel_Kanton_ZH.png") #' #' insert_worksheet_image(image = image_path, wb, sheetname = "Existing image", #' width = 3.5, height = 5.5) #' +#' # Export workbook +#' #-------------- #' \dontrun{ -#' openxlsx::saveWorkbook(export,"insert_worksheet_image.xlsx") +#' openxlsx::saveWorkbook(wb,"insert_worksheet_image.xlsx") #' } #' -insert_worksheet_image = function( - image, - wb, - sheetname, - width, - height -){ - openxlsx::addWorksheet( - wb, - sheetName = sheetname, - gridLines = FALSE) +insert_worksheet_image <- function(image, wb, sheetname, + startrow = 1, startcol = 1, + width, height){ + + openxlsx::addWorksheet(wb, sheetName = sheetname, gridLines = FALSE) - if (class(image) == "character" ){ + if (is(image, "character")){ image_path <- image - } else if (class(image) %in% c("gg", "ggplot", "histogram")){ + } else if (is(image, "gg") | is(image, "ggplot") | is(image, "histogram")){ # Allocate temporary file of type png to save the image to image_path <- tempfile(fileext = ".png") # Handle case input object is of class histogram - if (class(image) == "histogram"){ - png( + if (is(image, "histogram")){ + grDevices::png( image_path, width = width, height = height, - units = "in") + units = "in", + res = 300) plot(image) - dev.off() + grDevices::dev.off() } else { diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index 96c094b..fcbc95b 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -9,12 +9,7 @@ #' @param titlesource Character vector denoting the data source #' @param auftrag_id Order ID #' @param maintitle Main title -#' @keywords datasetsXLSX, openxlsx -#' @examples -#' \donttest{ -#' \dontrun{ -#' } -#' } +#' @keywords datasetsXLSX insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, titlesource, auftrag_id, maintitle){ diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index 7300d0a..f666a74 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -14,9 +14,9 @@ #' @export #' @examples #' # Generation of a spreadsheet -#' wb <- openxlsx::createWorkbook("hello") -#' -#' insert_metadata_sheet(wb, title = "Title of mtcars", metadata = c("Meta data information.")) +#' wb <- openxlsx::createWorkbook() +#' insert_metadata_sheet(wb, title = "Title of mtcars", +#' metadata = c("Meta data information.")) #' \dontrun{ #' openxlsx::saveWorkbook(wb,"insert_metadata_sheet.xlsx") #' } @@ -35,22 +35,16 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", ## Fill Excel ----------------- ## Title - openxlsx::writeData(wb, sheet = sheetname, - x = title, - headerStyle = style_title(), - startRow = 7) + openxlsx::writeData(wb, sheet = sheetname, x = title, + headerStyle = style_title(), startRow = 7) ## Logo if(!is.null(logo)){ logo <- prep_logo(logo) if (file.exists(logo)){ - openxlsx::insertImage(wb, - sheet = sheetname, - file = logo, - width = 2.145, - height = 0.7865, - units = "in") + openxlsx::insertImage(wb, sheet = sheetname, file = logo, + width = 2.145, height = 0.7865, units = "in") } else { message("no logo found.") } @@ -58,33 +52,20 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", ## Contact details - openxlsx::writeData(wb, - sheet = sheetname, - x = prep_contact(contactdetails), - headerStyle = style_wrap(), - startRow = 2, - startCol = 12) + openxlsx::writeData(wb, sheet = sheetname, x = prep_contact(contactdetails), + headerStyle = style_wrap(), startRow = 2, startCol = 12) ## Source - openxlsx::writeData(wb, - sheet = sheetname, - x = "Datenquelle:", - headerStyle = style_subtitle, - startRow = 9) - openxlsx::writeData(wb, - sheet = sheetname, - x = prep_source(source), + openxlsx::writeData(wb, sheet = sheetname, x = "Datenquelle:", + headerStyle = style_subtitle, startRow = 9) + openxlsx::writeData(wb, sheet = sheetname, x = prep_source(source), startRow = 10) ## Metadata - openxlsx::writeData(wb, sheet = sheetname, - x = "Hinweise:", - headerStyle = style_subtitle, - startRow = 12) - openxlsx::writeData(wb, - sheet = sheetname, - x = prep_metadata(metadata), + openxlsx::writeData(wb, sheet = sheetname, x = "Hinweise:", + headerStyle = style_subtitle, startRow = 12) + openxlsx::writeData(wb, sheet = sheetname, x = prep_metadata(metadata), startRow = 13) @@ -103,35 +84,20 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", ## Aktualisierungsdatum - openxlsx::writeData(wb, - sheet = sheetname, + openxlsx::writeData(wb, sheet = sheetname, x = paste("Aktualisiert am ", format(Sys.Date(), format="%d.%m.%Y"), " durch: ", contactperson), - startRow = 5, - startCol = 12) + startRow = 5, startCol = 12) ## add formatting - openxlsx::addStyle(wb, - sheet = sheetname, - style_headerline(), - rows = 5, - cols = 1:26, - gridExpand = TRUE, - stack = TRUE) - openxlsx::addStyle(wb, - sheet = sheetname, - style_title(), - rows = 7, - cols = 1, - gridExpand = TRUE) - openxlsx::addStyle(wb, - sheet = sheetname, - style = style_subtitle, - rows = c(9, 12), - cols = 1, - gridExpand = TRUE) + openxlsx::addStyle(wb, sheet = sheetname, style = style_headerline(), + rows = 5, cols = 1:26, gridExpand = TRUE, stack = TRUE) + openxlsx::addStyle(wb, sheet = sheetname, style = style_title(), + rows = 7, cols = 1, gridExpand = TRUE) + openxlsx::addStyle(wb, sheet = sheetname, style = style_subtitle, + rows = c(9, 12), cols = 1, gridExpand = TRUE) ## remove gridlines openxlsx::showGridLines(wb, sheet = sheetname, showGridLines = FALSE) diff --git a/R/insert_second_header.R b/R/insert_second_header.R index 0ad74be..627b2a4 100644 --- a/R/insert_second_header.R +++ b/R/insert_second_header.R @@ -2,26 +2,24 @@ #' #' Function to export data from R to a formatted .xlsx-file. #' -#' The data is exported -#' to the first sheet. Metadata information is exported to the second sheet. -#' -#' @param data data to be exported. -#' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. -#' @param title title to be put above the data in the worksheet. -#' @template shared_parameters -#' @keywords aXLSX +#' @note +#' The data is exported to the first sheet. Metadata information is exported to +#' the second sheet. +#' @param wb Workbook +#' @param sheetname Sheet name +#' @param data_start_row Row index for first row with data +#' @param group_names Group names +#' @param grouplines Group lines +#' @param data Data +#' @keywords internal #' @examples #' \donttest{ #' \dontrun{ #' # Beispiel anhand des Datensatzes 'mtcars' #'dat <- mtcars #' -#'insert_second_header(wb, -#' sheetname, -#' data_start_row, -#' group_names, -#' grouplines, -#' data) +#'insert_second_header(wb, sheetname, data_start_row, group_names, +#' grouplines, data) #' } #' } insert_second_header <- function(wb, sheetname, data_start_row, group_names, diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index e6da694..9712ba8 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -1,8 +1,6 @@ #' insert_worksheet() #' #' Function to add formatted worksheets to an existing .xlsx-workbook. -#' @description -#' #' @note #' Marked for deprecation in upcoming version. The function does not write the #' result into a .xlsx file. A separate call to openxlsx::saveWorkbook() is diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index af41f6f..b77c5eb 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -1,9 +1,6 @@ #' insert_worksheet_nh #' #' Function to add formatted worksheets without headers to an existing workbook -#' -#' @description -#' #' @note #' The function does not write the result into a .xlsx file. A separate call #' to openxlsx::saveWorkbook() is required. @@ -18,10 +15,11 @@ #' @keywords insert_worksheet, openxlsx #' @export #' @importFrom dplyr "%>%" +#' @importFrom purrr walk #' @examples #' #' ## Create workbook -#' export <- openxlsx::createWorkbook("export") +#' export <- openxlsx::createWorkbook() #' #' ## insert a new worksheet #' insert_worksheet_nh(head(mtcars), export, "data1", @@ -31,15 +29,16 @@ #' insert_worksheet_nh(tail(mtcars), export, "data2", #' title = "Title", source = "statzh", metadata = "Note: ...") #' +#' #' ## insert a worksheet with group lines and second header #' insert_worksheet_nh(data = head(mtcars), wb = export, -#' title = "grouplines", source = "statzh", metadata = c(1:4), -#' grouplines=c(1,5,6), group_names = "carb") +#' title = "grouplines", source = "statzh", metadata = "Note: ...", +#' grouplines = c(1,5,6), group_names = "carb") #' -#'\dontrun{ +#' \dontrun{ #' ## save workbook #' openxlsx::saveWorkbook(export,"example.xlsx") -#'} +#' } insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", source = "statzh", metadata = NA, grouplines = NA, group_names = NA){ @@ -57,30 +56,26 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", openxlsx::addWorksheet(wb, sheetname) - # fill in data --------------------------------------------------------------- - ## Titel - openxlsx::addStyle(wb, - sheet = sheetname, - style = style_title(), - rows = 1, - cols = 1) - openxlsx::writeData(wb, - sheet = sheetname, - x = title, - headerStyle=style_title(), - startRow = 1) - - ## Quelle + # Content + #--------- + + ## Title + openxlsx::addStyle(wb, sheet = sheetname, style = style_title(), + rows = 1, cols = 1) + openxlsx::writeData(wb, sheet = sheetname, x = title, + headerStyle=style_title(), startRow = 1) + + ## Source sources_to_insert <- prep_source(source) source_end_row <- add_additional_text(wb, sources_to_insert, sheetname, 2) - ## Metadata if (!is.na(metadata)){ metadata_to_insert <- prep_metadata(metadata) metadata_start_row <- source_end_row + 1 - metadata_end_row <- add_additional_text(wb, metadata_to_insert, sheetname, metadata_start_row) + metadata_end_row <- add_additional_text(wb, metadata_to_insert, sheetname, + metadata_start_row) data_start_row <- metadata_end_row + 2 merge_end_row <- metadata_end_row @@ -97,32 +92,28 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", cols = 1:26, rows = .)) - # Zweite header Zeile einfügen + ## Insert second header if (any(is.null(group_names))){ group_names <- NA } if (!any(is.na(group_names))){ - insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) + insert_second_header(wb, sheetname, data_start_row, group_names, + grouplines, data) data_start_row <- data_start_row + 1 } - # Daten - openxlsx::addStyle(wb, - sheet = sheetname, - style = style_header(), - rows = data_start_row, - cols = 1:spalten, - gridExpand = TRUE, - stack = TRUE) - - openxlsx::writeData(wb, - sheet = sheetname, + ## Data + openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), + rows = data_start_row, cols = 1:spalten, + gridExpand = TRUE, stack = TRUE) + + openxlsx::writeData(wb, sheet = sheetname, x = as.data.frame(dplyr::ungroup(data)), - rowNames = FALSE, - startRow = data_start_row, + rowNames = FALSE, startRow = data_start_row, withFilter = FALSE) + ## Grouplines if(is.null(grouplines)){ grouplines <- NA } @@ -136,8 +127,6 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", data_end_row <- nrow(data)+data_start_row } - - if (is.numeric(grouplines)){ groupline_numbers <- grouplines @@ -145,19 +134,19 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) } - openxlsx::addStyle(wb, - sheet = sheetname, - style = style_leftline(), - rows=data_start_row:data_end_row, - cols = groupline_numbers, - gridExpand = TRUE, + openxlsx::addStyle(wb, sheet = sheetname, style = style_leftline(), + rows = data_start_row:data_end_row, + cols = groupline_numbers, gridExpand = TRUE, stack = TRUE) } - # minmale Spaltenbreite definieren + # Format + #--------- + + ## Set minimum column width options("openxlsx.minWidth" = 5) - # automatische Spaltenbreite + ## Use automatic column width openxlsx::setColWidths(wb, sheet = sheetname, cols = 1:spalten, widths = "auto", ignoreMergedCells = TRUE) } diff --git a/R/interpolate.R b/R/interpolate.R index 8fb0a46..c53aafa 100644 --- a/R/interpolate.R +++ b/R/interpolate.R @@ -1,4 +1,3 @@ - #'interpolate2() #' #' Function to generate new color palettes by interpolation. @@ -8,25 +7,27 @@ #' @param number number of colors to be generated. #' @keywords interpolate2 #' @export +#' @importFrom grDevices colorRampPalette #' @examples #' #interpolate the 'zhblue'-palette with black and generate 7 new ones -#' interpolate2(palette = zhpal$zhblue, color = c("#000000"), degree = 3, number = 7) +#' interpolate2(palette = zhpal$zhblue, color = c("#000000"), degree = 3, +#' number = 7) #' +interpolate2 <- function(palette, color, degree, number){ -# Function + if (degree < 1 | degree > 7){ + stop("degree out of range. Provide integer between 1-7.") + } -#interpolate function -interpolate2<-function(palette, color = color, degree=degree,number=number){ newpalette <- c() for (i in palette) { - intcols <-c(i,color) - pal = grDevices::colorRampPalette(intcols) - # plotColors(pal, 7) - intcols<- pal(7) + intcols <- c(i, color) + pal <- grDevices::colorRampPalette(intcols) + intcols <- pal(7) newpalette[i] <- intcols[degree] } - pal = grDevices::colorRampPalette((newpalette),space="Lab") - scales::show_col(pal(number)) - pal(number) + + pal <- grDevices::colorRampPalette(newpalette, space = "Lab") + return(pal(number)) } diff --git a/R/quick_sum.r b/R/quick_sum.r index 4b64ce6..f0f821e 100644 --- a/R/quick_sum.r +++ b/R/quick_sum.r @@ -24,7 +24,11 @@ #' quick_sum(df=mtcars, var=cyl, mpg, vs, stats="all", protect=FALSE) -quick_sum <- function(df, var, ..., stats="all", protect=FALSE) { +quick_sum <- function(df, var, ..., stats = "all", protect = FALSE){ + if (!stats %in% c("mean", "base", "all")){ + stop("Please choose one of the following stats arguments: all, base, mean") + } + grps <- rlang::quos(...) var <- rlang::enquo(var) @@ -36,25 +40,24 @@ quick_sum <- function(df, var, ..., stats="all", protect=FALSE) { q75_name <- paste0("q75_", rlang::quo_name(var)) q90_name <- paste0("q90_", rlang::quo_name(var)) - if(protect==TRUE){ - n1 <- 3 - n2 <- 5 - }else{ - n1 <- 0 - n2 <- 0 - } + # Set lower limit for number of samples + n1 <- ifelse(protect, 3, 0) + n2 <- ifelse(protect, 5, 0) - if(stats%in%c("base")){df %>% + if(stats %in% c("base")){ + df %>% dplyr::group_by(!!!grps) %>% dplyr::summarise( Anzahl=dplyr::n(), - !!mean_name := ifelse(Anzahl<=n1,NA,mean(!!var, na.rm = T)), - !!q25_name := ifelse(Anzahl<=n2,NA,quantile(!!var, probs=0.25, na.rm = T)), + !!mean_name := ifelse(Anzahl <= n1, NA, mean(!!var, na.rm = T)), + !!q25_name := ifelse(Anzahl <=n2, NA, quantile(!!var, probs = 0.25, na.rm = T)), !!med_name := ifelse(Anzahl<=n1,NA,median(!!var, probs=0.5, na.rm = T)), !!q75_name := ifelse(Anzahl<=n2,NA,quantile(!!var, probs=0.75, na.rm = T)) )%>% - dplyr::ungroup()} - else if(stats%in%c("all")){df %>% + dplyr::ungroup() + + } else if (stats %in% c("all")){ + df %>% dplyr::group_by(!!!grps) %>% dplyr::summarise( Anzahl=dplyr::n(), @@ -66,14 +69,17 @@ quick_sum <- function(df, var, ..., stats="all", protect=FALSE) { !!q75_name := ifelse(Anzahl<=n2,NA,quantile(!!var, probs=0.75, na.rm = T)), !!q90_name := ifelse(Anzahl<=n2,NA,quantile(!!var, probs=0.9, na.rm = T)) )%>% - dplyr::ungroup()} - else if(stats%in%c("mean")){df %>% + dplyr::ungroup() + + } else if (stats %in% c("mean")){ + df %>% dplyr::group_by(!!!grps) %>% dplyr::summarise( Anzahl=dplyr::n(), !!mean_name := ifelse(Anzahl<=n1,NA,mean(!!var, na.rm = T)), !!sd_name := ifelse(Anzahl<=n2,NA,sd(!!var, na.rm = T)) )%>% - dplyr::ungroup()} - else {print("Please choose one of the following stats arguments: all, base, mean")} + dplyr::ungroup() + + } } diff --git a/R/splitXLSX.R b/R/splitXLSX.R index 52c3b20..e225566 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -31,20 +31,9 @@ #' logo = "statzh", #' author = "user") -# Function - -splitXLSX <- function ( - data, - file, - sheetvar, - title = "Titel", - source = "statzh", - metadata = NA, - logo = "statzh", - grouplines = FALSE, - contactdetails = "statzh", - author = "user" -){ +splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", + metadata = NA, logo = "statzh", grouplines = FALSE, + contactdetails = "statzh", author = "user"){ warning("Deprecation") data <- as.data.frame(data) @@ -77,7 +66,7 @@ splitXLSX <- function ( # -------------- - openxlsx::worksheetOrder(wb)<-rev(openxlsx::worksheetOrder(wb)) + openxlsx::worksheetOrder(wb) <- rev(openxlsx::worksheetOrder(wb)) #save xlsx openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) diff --git a/R/styles.R b/R/styles.R index 4a70ccb..3a77aea 100644 --- a/R/styles.R +++ b/R/styles.R @@ -1,8 +1,8 @@ #' Style definitions #' -#' @Description #' Functions which generate style objects. Not intended to be called directly by the user. #' @keywords internal +#' @noRd mainTitleStyle <- function(){ openxlsx::createStyle(fontSize = 20, diff --git a/man/aXLSX.Rd b/man/aXLSX.Rd index d429f98..a9a670e 100644 --- a/man/aXLSX.Rd +++ b/man/aXLSX.Rd @@ -38,30 +38,26 @@ aXLSX( \description{ Function to export data from R to a formatted .xlsx-file. } -\details{ -The data is exported -to the first sheet. Metadata information is exported to the second sheet. +\note{ +The data is exported to the first sheet. Metadata information is exported +to the second sheet. } \examples{ \donttest{ \dontrun{ -# Beispiel anhand des Datensatzes 'mtcars' -dat <- mtcars -aXLSX(data = dat, - title = "Motor trend car road tests", - file = "motor_trend_car_road_tests", # '.xlsx' is automatically added - source = "Source: Henderson and Velleman (1981). Building multiple - regression models interactively. - Biometrics, 37, 391–411.", - metadata = c("The data was extracted from the 1974 Motor Trend US - magazine and comprises fuel - consumption and 10 aspects of automobile design and performance - for 32 automobiles (1973–74 models)."), - contactdetails = "statzh", - grouplines = NA, - logo = "statzh", - author = "user") +aXLSX(data = mtcars, + title = "Motor trend car road tests", + file = "motor_trend_car_road_tests", + source = "Source: Henderson and Velleman (1981). Building multiple + regression models interactively. Biometrics, 37, 391–411.", + metadata = c("The data was extracted from the 1974 Motor Trend US + magazine and comprises fuel consumption and 10 aspects of automobile + design and performance for 32 automobiles (1973–74 models)."), + contactdetails = "statzh", + grouplines = NA, + logo = "statzh", + author = "user") } } } diff --git a/man/add_additional_text.Rd b/man/add_additional_text.Rd new file mode 100644 index 0000000..6599c32 --- /dev/null +++ b/man/add_additional_text.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/add_additional_text.R +\name{add_additional_text} +\alias{add_additional_text} +\title{add_additional_text()} +\usage{ +add_additional_text(wb, text, sheetname, start_row) +} +\arguments{ +\item{wb}{workbook object where text should be inserted} + +\item{text}{Character vector of text to be inserted} + +\item{sheetname}{Sheet where text should be inserted.} + +\item{start_row}{Row from which to insert elements} +} +\description{ +Insert text into an existing workbook object. +} +\note{ +Text is inserted at first column index. +} +\keyword{internal} diff --git a/man/check_sheetname.Rd b/man/check_sheetname.Rd new file mode 100644 index 0000000..6597981 --- /dev/null +++ b/man/check_sheetname.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/process_input.R +\name{check_sheetname} +\alias{check_sheetname} +\title{Functions for checking and transforming user input} +\usage{ +check_sheetname(sheetname) +} +\description{ +Helper functions not intended to be called directly by users. +} +\keyword{internal} diff --git a/man/display.Rd b/man/display.Rd index 794f016..226f8e6 100644 --- a/man/display.Rd +++ b/man/display.Rd @@ -14,7 +14,7 @@ display(col, border = "light gray", ...) \item{...}{further arguments that can be passed to the plot()-function} } \description{ -preview colors in console +Preview of colors specified from hex-codes } \examples{ #display can be used to preview all the palettes included in the 'zhpal'-list: diff --git a/man/flush_left.Rd b/man/flush_left.Rd index 60255cb..b479738 100644 --- a/man/flush_left.Rd +++ b/man/flush_left.Rd @@ -2,7 +2,9 @@ % Please edit documentation in R/flush_left.r \name{flush_left} \alias{flush_left} -\title{flush_left()} +\title{flush_left(): +Function to flush title, subtitle and caption to the lefthand side of the +graphics device} \usage{ flush_left(g) } @@ -10,14 +12,18 @@ flush_left(g) \item{g}{ggplot object} } \description{ -Function to flush title, subtitle and caption to the lefthand side of the graphics device +flush_left(): +Function to flush title, subtitle and caption to the lefthand side of the +graphics device } \examples{ -\dontrun{ -flush_left(ggplot(mtcars, aes( x = cyl))+ -geom_bar()+ -labs(title = "Titel", subtitle = "Untertitel", caption = "Datenquelle")) +library(ggplot2) +plt <- ggplot(mtcars, aes(x = cyl)) + + geom_bar() + + labs(title = "Cylinders", subtitle = "Bar chart", + caption = "mtcars") + +flush_left(plt) } -} -\keyword{flush} -\keyword{left} +\keyword{flush_left,} +\keyword{ggplot} diff --git a/man/get_groupline_index_by_pattern.Rd b/man/get_groupline_index_by_pattern.Rd new file mode 100644 index 0000000..5823704 --- /dev/null +++ b/man/get_groupline_index_by_pattern.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_groupline_index_by_pattern.R +\name{get_groupline_index_by_pattern} +\alias{get_groupline_index_by_pattern} +\title{get_groupline_index_by_pattern()} +\usage{ +get_groupline_index_by_pattern(grouplines, data) +} +\arguments{ +\item{grouplines}{...} + +\item{data}{...} +} +\description{ +Derive groupline index by matching names +} +\keyword{internal} diff --git a/man/insert_hyperlinks.Rd b/man/insert_hyperlinks.Rd index f4d65d9..af2401c 100644 --- a/man/insert_hyperlinks.Rd +++ b/man/insert_hyperlinks.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/insert_hyperlinks.R \name{insert_hyperlinks} \alias{insert_hyperlinks} -\title{insert_hyperlinks} +\title{insert_hyperlinks()} \usage{ insert_hyperlinks(wb, sheetname, title, sheet_row) } @@ -16,14 +16,9 @@ insert_hyperlinks(wb, sheetname, title, sheet_row) \item{sheet_row}{Sheet row} } \description{ -Description +A short description... } -\examples{ -\donttest{ -\dontrun{ - -} -} - +\details{ +Function for inserting hyperlinks within an openxlsx Workbook } -\keyword{datasetsXLSX} +\keyword{internal} diff --git a/man/insert_index_sheet.Rd b/man/insert_index_sheet.Rd index fda877f..1436e19 100644 --- a/man/insert_index_sheet.Rd +++ b/man/insert_index_sheet.Rd @@ -33,12 +33,6 @@ insert_index_sheet( \item{maintitle}{Main title} } \description{ -Description -} -\examples{ -\donttest{ -\dontrun{ -} -} +Function which generates an index sheet inside an openxlsx workbook. } \keyword{datasetsXLSX} diff --git a/man/insert_metadata_sheet.Rd b/man/insert_metadata_sheet.Rd index 11179ab..bd22444 100644 --- a/man/insert_metadata_sheet.Rd +++ b/man/insert_metadata_sheet.Rd @@ -36,10 +36,13 @@ insert_metadata_sheet( Function to add formatted metadata information to an existing .xlsx-workbook. } \examples{ - # Generation of a spreadsheet -wb <- openxlsx::createWorkbook("hello") - -insert_metadata_sheet(wb, title = "Title of mtcars", metadata = c("Meta data information.")) +wb <- openxlsx::createWorkbook() +insert_metadata_sheet(wb, title = "Title of mtcars", + metadata = c("Meta data information.")) +\dontrun{ +openxlsx::saveWorkbook(wb,"insert_metadata_sheet.xlsx") +} } -\keyword{insert_metadata_sheet} +\keyword{insert_metadata_sheet,} +\keyword{openxlsx} diff --git a/man/insert_second_header.Rd b/man/insert_second_header.Rd new file mode 100644 index 0000000..148ba28 --- /dev/null +++ b/man/insert_second_header.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/insert_second_header.R +\name{insert_second_header} +\alias{insert_second_header} +\title{insert_second_header()} +\usage{ +insert_second_header( + wb, + sheetname, + data_start_row, + group_names, + grouplines, + data +) +} +\arguments{ +\item{wb}{Workbook} + +\item{sheetname}{Sheet name} + +\item{data_start_row}{Row index for first row with data} + +\item{group_names}{Group names} + +\item{grouplines}{Group lines} + +\item{data}{Data} +} +\description{ +Function to export data from R to a formatted .xlsx-file. +} +\note{ +The data is exported to the first sheet. Metadata information is exported to +the second sheet. +} +\examples{ +\donttest{ +\dontrun{ +# Beispiel anhand des Datensatzes 'mtcars' +dat <- mtcars + +insert_second_header(wb, sheetname, data_start_row, group_names, + grouplines, data) +} +} +} +\keyword{internal} diff --git a/man/insert_worksheet.Rd b/man/insert_worksheet.Rd index fea078e..05b5d29 100644 --- a/man/insert_worksheet.Rd +++ b/man/insert_worksheet.Rd @@ -41,6 +41,11 @@ insert_worksheet( \description{ Function to add formatted worksheets to an existing .xlsx-workbook. } +\note{ +Marked for deprecation in upcoming version. The function does not write the +result into a .xlsx file. A separate call to openxlsx::saveWorkbook() is +required. +} \examples{ # Generation of a spreadsheet diff --git a/man/insert_worksheet_image.Rd b/man/insert_worksheet_image.Rd new file mode 100644 index 0000000..a711f49 --- /dev/null +++ b/man/insert_worksheet_image.Rd @@ -0,0 +1,74 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/insert_image.R +\name{insert_worksheet_image} +\alias{insert_worksheet_image} +\title{insert_worksheet_image() +insert an image into a single worksheet} +\usage{ +insert_worksheet_image( + image, + wb, + sheetname, + startrow = 1, + startcol = 1, + width, + height +) +} +\arguments{ +\item{image}{image or plot} + +\item{wb}{workbook object to write new worksheet in} + +\item{sheetname}{name of the sheet tab} + +\item{startrow}{row coordinate of upper left corner of figure} + +\item{startcol}{column coordinate of upper left corner of figure} + +\item{width}{width of figure} + +\item{height}{height of figure} +} +\description{ +insert_worksheet_image() +insert an image into a single worksheet +} +\note{ +The function does not write the result into a .xlsx file. A separate call +to openxlsx::saveWorkbook() is required. +} +\examples{ +library(ggplot2) +wb <- openxlsx::createWorkbook() + +# Add a geom_histogram() +#-------------- +figure1 <- ggplot(mtcars, aes(x = disp)) + + geom_histogram() + +insert_worksheet_image(image = figure1, wb, sheetname = "ggplot image", + width = 3.5, height = 5.5) + +# Add a base histogram +#-------------- +base_hist <- hist(mtcars$disp) + +insert_worksheet_image(image = base_hist, wb, sheetname = "Base histogram", + width = 3.5, height = 5.5) + +# Insert an existing image file +#-------------- +image_path <- paste0(path.package("statR"), "/extdata/Stempel_Kanton_ZH.png") + +insert_worksheet_image(image = image_path, wb, sheetname = "Existing image", + width = 3.5, height = 5.5) + +# Export workbook +#-------------- +\dontrun{ +openxlsx::saveWorkbook(wb,"insert_worksheet_image.xlsx") +} + +} +\keyword{insert_worksheet_image} diff --git a/man/insert_worksheet_nh.Rd b/man/insert_worksheet_nh.Rd index 08a61be..aba8850 100644 --- a/man/insert_worksheet_nh.Rd +++ b/man/insert_worksheet_nh.Rd @@ -35,34 +35,33 @@ insert_worksheet_nh( \description{ Function to add formatted worksheets without headers to an existing workbook } +\note{ +The function does not write the result into a .xlsx file. A separate call +to openxlsx::saveWorkbook() is required. +} \examples{ -# create workbook -wb <- openxlsx::createWorkbook("hello") +## Create workbook +export <- openxlsx::createWorkbook() + +## insert a new worksheet +insert_worksheet_nh(head(mtcars), export, "data1", + title = "Title", source = "statzh", metadata = "Note: ...") -insert_worksheet_nh(mtcars[c(1:10),],wb,"mtcars",c(1:4),"carb",grouplines=c(1,5,6)) +## insert a further worksheet +insert_worksheet_nh(tail(mtcars), export, "data2", + title = "Title", source = "statzh", metadata = "Note: ...") -# create workbook -export <- openxlsx::createWorkbook("export") -# insert a new worksheet -insert_worksheet_nh(head(mtcars) - ,export - ,"data1" - ,title = "Title" - ,source = "Quelle: Statistisches Amt Kanton Z\u00fcrich" - ,metadata = "Bemerkung: ...") +## insert a worksheet with group lines and second header +insert_worksheet_nh(data = head(mtcars), wb = export, + title = "grouplines", source = "statzh", metadata = "Note: ...", + grouplines = c(1,5,6), group_names = "carb") - # insert a further worksheet -insert_worksheet_nh(tail(mtcars) - ,export - ,"data2" - ,title = "Title" - ,source = "Quelle: Statistisches Amt Kanton Z\u00fcrich" - ,metadata = "Bemerkung: ...") \dontrun{ - # save workbook +## save workbook openxlsx::saveWorkbook(export,"example.xlsx") } } -\keyword{insert_worksheet} +\keyword{insert_worksheet,} +\keyword{openxlsx} diff --git a/man/interpolate2.Rd b/man/interpolate2.Rd index d80f9ac..a896462 100644 --- a/man/interpolate2.Rd +++ b/man/interpolate2.Rd @@ -4,7 +4,7 @@ \alias{interpolate2} \title{interpolate2()} \usage{ -interpolate2(palette, color = color, degree = degree, number = number) +interpolate2(palette, color, degree, number) } \arguments{ \item{palette}{a vector of colors to be interpolated} @@ -20,7 +20,8 @@ Function to generate new color palettes by interpolation. } \examples{ #interpolate the 'zhblue'-palette with black and generate 7 new ones -interpolate2(palette = zhpal$zhblue, color = c("#000000"), degree = 3, number = 7) +interpolate2(palette = zhpal$zhblue, color = c("#000000"), degree = 3, + number = 7) } \keyword{interpolate2} diff --git a/man/mainTitleStyle.Rd b/man/mainTitleStyle.Rd deleted file mode 100644 index ca7c904..0000000 --- a/man/mainTitleStyle.Rd +++ /dev/null @@ -1,18 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/styles.R -\name{mainTitleStyle} -\alias{mainTitleStyle} -\title{Style definitions} -\usage{ -mainTitleStyle() -} -\description{ -Description -} -\examples{ -\donttest{ -\dontrun{ -} -} -} -\keyword{styles} diff --git a/man/quickXLSX.Rd b/man/quickXLSX.Rd index f843f43..1863ddb 100644 --- a/man/quickXLSX.Rd +++ b/man/quickXLSX.Rd @@ -36,22 +36,24 @@ quickXLSX( \item{author}{defaults to last two letters (initials) or numbers of the user name.} } \description{ +A short description... +} +\details{ Function to export data from R to a formatted .xlsx-spreadsheet. } +\note{ +Will be deprecated in upcoming version. +} \examples{ -# Beispiel anhand des Datensatzes 'mtcars' -dat <- mtcars -quickXLSX(data = dat, +quickXLSX(data = mtcars, title = "Motor trend car road tests", - file = "motor_trend_car_road_tests", # '.xlsx' is automatically added + file = "motor_trend_car_road_tests", source = "Source: Henderson and Velleman (1981). Building multiple - regression models interactively. - Biometrics, 37, 391–411.", + regression models interactively. Biometrics, 37, 391–411.", metadata = c("The data was extracted from the 1974 Motor Trend US - magazine and comprises fuel - consumption and 10 aspects of automobile design and performance - for 32 automobiles (1973–74 models)."), + magazine and comprises fuel consumption and 10 aspects of automobile + design and performance for 32 automobiles (1973–74 models)."), contactdetails = "statzh", grouplines = FALSE, logo = "statzh", diff --git a/man/splitXLSX.Rd b/man/splitXLSX.Rd index 3080c37..79c60b4 100644 --- a/man/splitXLSX.Rd +++ b/man/splitXLSX.Rd @@ -20,7 +20,7 @@ splitXLSX( \arguments{ \item{data}{data to be exported.} -\item{file}{file name of the xlsx-file. The extension ".xlsx" is added automatically.} +\item{file}{file name of the output .xlsx-file. The extension is added automatically.} \item{sheetvar}{name of the variable used to split the data and spread them over several sheets.} @@ -39,15 +39,20 @@ splitXLSX( \item{author}{defaults to last two letters (initials) or numbers of the user name.} } \description{ -Function to export data from R as formatted .xlsx-file and spread them over several worksheets based on a grouping variable (e.g., year). +A short description... +} +\details{ +Function to export data from R as formatted .xlsx-file and spread them over several worksheets +based on a grouping variable (e.g., year). +} +\note{ +May be deprecated in upcoming version. User should make sure that the grouping variable is of +binary, categorical or other types with a limited number of levels. } \examples{ - -dat <- mtcars - -splitXLSX(data = dat, +splitXLSX(data = mtcars, title = "Motor trend car road tests", - file = "motor_trend_car_road_tests", # '.xlsx' automatically added + file = "motor_trend_car_road_tests", sheetvar = cyl, source = "Source: Henderson and Velleman (1981), Building multiple regression models interactively. From 2653e4dd9a34136cdb9dce18ad6a2ce74f09d81d Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Thu, 11 May 2023 16:35:43 +0000 Subject: [PATCH 28/74] Moved default info for STAT ZH into separate Rscript (not exported); unified checks for default input value "statzh" across functions. --- R/aXLSX.R | 32 +++--- R/add_additional_text.R | 18 +--- R/col_stat.R | 13 +-- R/display.R | 4 +- R/display.statcol.all.R | 24 +++-- R/flush_left.r | 12 +-- R/insert_hyperlinks.R | 3 +- R/insert_image.R | 56 +++++------ R/insert_index_sheet.R | 66 ++++--------- R/insert_metadata_sheet.R | 52 ++++------ R/insert_worksheet.R | 125 +++++++----------------- R/insert_worksheet_nh.R | 10 +- R/process_input.R | 201 ++++++++++++++++++++++++++++++++------ R/splitXLSX.R | 20 ++-- R/statzh_info.R | 28 ++++++ R/styles.R | 46 +++------ 16 files changed, 370 insertions(+), 340 deletions(-) create mode 100644 R/statzh_info.R diff --git a/R/aXLSX.R b/R/aXLSX.R index 8380dc0..a14100c 100644 --- a/R/aXLSX.R +++ b/R/aXLSX.R @@ -1,6 +1,5 @@ #' aXLSX() #' -#' @description #' Function to export data from R to a formatted .xlsx-file. #' @note #' The data is exported to the first sheet. Metadata information is exported @@ -12,21 +11,26 @@ #' @keywords aXLSX #' @export #' @examples +#' dataset <- mtcars +#' source_string <- paste("Source: Henderson and Velleman (1981).", +#' "Building multiple regression models interactively.", +#' "Biometrics, 37, 391–411.") +#' +#' metadata_string <- paste("The data was extracted from the 1974", +#' "Motor Trend US magazine and comprises fuel consumption and", +#' "10 aspects of automobile design and performance for 32 automobiles", +#' "(1973–74 models).") #' \donttest{ #' \dontrun{ -#' -#'aXLSX(data = mtcars, -#' title = "Motor trend car road tests", -#' file = "motor_trend_car_road_tests", -#' source = "Source: Henderson and Velleman (1981). Building multiple -#' regression models interactively. Biometrics, 37, 391–411.", -#' metadata = c("The data was extracted from the 1974 Motor Trend US -#' magazine and comprises fuel consumption and 10 aspects of automobile -#' design and performance for 32 automobiles (1973–74 models)."), -#' contactdetails = "statzh", -#' grouplines = NA, -#' logo = "statzh", -#' author = "user") +#' aXLSX(data = mtcars, +#' title = "Motor trend car road tests", +#' file = "motor_trend_car_road_tests", +#' source = source_string, +#' metadata = metadata_string, +#' contactdetails = "statzh", +#' grouplines = NA, +#' logo = "statzh", +#' author = "user") #' } #' } aXLSX <- function(data, file, title = "Title", source = "statzh", diff --git a/R/add_additional_text.R b/R/add_additional_text.R index fba1c5c..7e86b6c 100644 --- a/R/add_additional_text.R +++ b/R/add_additional_text.R @@ -11,21 +11,13 @@ #' @keywords internal add_additional_text <- function(wb, text, sheetname, start_row){ - rows = c(seq(start_row, start_row+length(text)-1)) + rows <- c(seq(start_row, start_row + length(text) - 1)) - openxlsx::addStyle(wb, - sheet = sheetname, - style = style_subtitle(), - rows = rows, - cols = 1, - gridExpand = TRUE) + openxlsx::addStyle(wb, sheet = sheetname, style = style_subtitle(), + rows = rows, cols = 1, gridExpand = TRUE) - openxlsx::writeData(wb, - sheet = sheetname, - x = text, - colNames = F, - headerStyle=style_subtitle(), - startRow = start_row) + openxlsx::writeData(wb, sheet = sheetname, x = text, colNames = F, + headerStyle = style_subtitle(), startRow = start_row) return(max(rows)) } diff --git a/R/col_stat.R b/R/col_stat.R index 6bd6770..df7f763 100644 --- a/R/col_stat.R +++ b/R/col_stat.R @@ -1,7 +1,8 @@ # ------- Farbpaletten basierend auf Kantons-CI Farben ---------------- #################### STAT ZH Farbpaletten - +#' stattheme_data +#' #' Data used by the stat zh palettes #' #' @format A \code{list}. @@ -193,26 +194,26 @@ stattheme_data <- { } -# stattheme_pal() - #' stattheme_pal() #' #' Stat ZH scales +#' @importFrom scales manual_pal #' @keywords stattheme_pal #' @noRd #' -#Funktion für Palettenauswahl (ord./kat.) +stattheme_pal <- function(palette = "default"){ -stattheme_pal <- function(palette = "default") { - if (palette %in% names(x$stattheme_data)) { + if (palette %in% names(x$stattheme_data)){ scales::manual_pal(unname( x$stattheme_data[[palette]])) + } else { stop(sprintf("palette %s not a valid statZH palette.", palette)) } } +#' zhpal #' Data used by the stat zh palettes #' #' @format A \code{list}. diff --git a/R/display.R b/R/display.R index 2f4ce14..22bd23d 100644 --- a/R/display.R +++ b/R/display.R @@ -15,7 +15,7 @@ #' display("#000000") display <- function(col, border = "light gray", ...){ n <- length(col) - plot(0, type = "n", xlim = c(0, 1), ylim = c(0, 1), - axes = FALSE, xlab = "", ylab = "", ...) + plot(0, type = "n", xlim = c(0, 1), ylim = c(0, 1), axes = FALSE, + xlab = "", ylab = "", ...) rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border) } diff --git a/R/display.statcol.all.R b/R/display.statcol.all.R index 891b90c..5e42477 100644 --- a/R/display.statcol.all.R +++ b/R/display.statcol.all.R @@ -14,22 +14,20 @@ display.statcol.all <- function(){ df$pal_col <- row.names(df) - colnames(df) <- c("col","pal_col") + colnames(df) <- c("col", "pal_col") - df$palette<-gsub('(.mid|.low|.high|.high|\\d$)','', df$pal_col) + df$palette <- gsub('(.mid|.low|.high|.high|\\d$)', '', df$pal_col) - df$palette<-gsub('\\d$','', df$palette) + df$palette <- gsub('\\d$','', df$palette) - gg1 <- ggplot2::ggplot(df, ggplot2::aes(x=pal_col, y=0, color=I(col)))+ - ggplot2::geom_point(size=20,shape=15)+ - ggplot2::facet_wrap(~palette, ncol=3,scales="free")+ - ggplot2::guides(color="none")+ - ggplot2::theme_minimal()+ - ggplot2::theme(axis.ticks=ggplot2::element_blank(), - axis.text=ggplot2::element_blank()) + - ggplot2::xlab("") + - ggplot2::ylab("") + gg1 <- ggplot2::ggplot(df, ggplot2::aes(x = pal_col, y = 0, color = I(col))) + + ggplot2::geom_point(size = 20, shape = 15) + + ggplot2::facet_wrap(~palette, ncol = 3, scales = "free") + + ggplot2::guides(color = "none") + + ggplot2::theme_minimal() + + ggplot2::theme(axis.ticks = ggplot2::element_blank(), + axis.text = ggplot2::element_blank()) + + ggplot2::labs(x = "", y = "") print(gg1) - } diff --git a/R/flush_left.r b/R/flush_left.r index 0068689..b751910 100644 --- a/R/flush_left.r +++ b/R/flush_left.r @@ -1,4 +1,5 @@ -#' flush_left(): +#' flush_left() +#' #' Function to flush title, subtitle and caption to the lefthand side of the #' graphics device #' @param g ggplot object @@ -7,21 +8,18 @@ #' @importFrom gridExtra grid.arrange #' @export #' @examples -#' library(ggplot2) -#' plt <- ggplot(mtcars, aes(x = cyl)) + -#' geom_bar() + -#' labs(title = "Cylinders", subtitle = "Bar chart", +#' plt <- ggplot2::ggplot(mtcars, ggplot2::aes(x = cyl)) + +#' ggplot2::geom_bar() + +#' ggplot2::labs(title = "Cylinders", subtitle = "Bar chart", #' caption = "mtcars") #' #' flush_left(plt) flush_left <- function(g){ xout <- ggplot2::ggplotGrob(g) - xout$layout$l[xout$layout$name == "title"] <- 1 xout$layout$l[xout$layout$name == "subtitle"] <- 1 xout$layout$l[xout$layout$name == "caption"] <- 1 - gridExtra::grid.arrange(xout) } diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index 04a7997..9191767 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -1,13 +1,12 @@ #' insert_hyperlinks() #' #' Function for inserting hyperlinks within an openxlsx Workbook -#' @description -#' A short description... #' @param wb Worksheet #' @param sheetname Name of sheet #' @param title Title #' @param sheet_row Sheet row #' @keywords internal +#' insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ openxlsx::writeData(wb, sheet = "Inhalt", x = title, xy = c("C", sheet_row)) diff --git a/R/insert_image.R b/R/insert_image.R index ccea9f3..80eece9 100644 --- a/R/insert_image.R +++ b/R/insert_image.R @@ -2,7 +2,9 @@ #' insert an image into a single worksheet #' @note #' The function does not write the result into a .xlsx file. A separate call -#' to openxlsx::saveWorkbook() is required. +#' to openxlsx::saveWorkbook() is required. A temporary file is created when +#' image refers to a gg, ggplot or histogram object. This file is deleted +#' afterwards. #' @param image image or plot #' @param wb workbook object to write new worksheet in #' @param sheetname name of the sheet tab @@ -48,11 +50,8 @@ #' openxlsx::saveWorkbook(wb,"insert_worksheet_image.xlsx") #' } #' -insert_worksheet_image <- function(image, wb, sheetname, - startrow = 1, startcol = 1, - width, height){ - - openxlsx::addWorksheet(wb, sheetName = sheetname, gridLines = FALSE) +insert_worksheet_image <- function(image, wb, sheetname, startrow = 3, + startcol = 3, width, height){ if (is(image, "character")){ image_path <- image @@ -64,46 +63,35 @@ insert_worksheet_image <- function(image, wb, sheetname, # Handle case input object is of class histogram if (is(image, "histogram")){ - grDevices::png( - image_path, - width = width, - height = height, - units = "in", - res = 300) + grDevices::png(image_path, width = width, height = height, units = "in", + res = 300) plot(image) grDevices::dev.off() } else { # Handle case input object is of class gg or ggplot - ggplot2::ggsave( - image_path, - plot = image, - width = width, - height = height, - dpi = 300, - device = "png") + ggplot2::ggsave(image_path, plot = image, width = width, height = height, + dpi = 300, device = "png") } } else { stop("Plot muss als ggplot Objekt oder als Filepath vorliegen.") } - # Insert image - openxlsx::insertImage( - wb = wb, - sheet = sheetname, - file = image_path, - width = width, - height = height, - startRow = 3, - startCol = 3, - units = "in", - dpi = 300 - ) + # Add new worksheet with image + #-------------- + if (file.exists(image_path)){ + openxlsx::addWorksheet(wb, sheetName = sheetname, gridLines = FALSE) + + openxlsx::insertImage(wb, sheet = sheetname, file = image_path, + width = width, height = height, startRow = startrow, + startCol = startcol, units = "in", dpi = 300) - # Delete temporary file if necessary - if (!is.character(image)){ - unlink(image_path) + if (!is.character(image)){ + unlink(image_path) + } + } else { + warning("Image not found.") } } diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index fcbc95b..d4153ff 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -16,11 +16,11 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, ## Create index sheet openxlsx::addWorksheet(wb, sheetName = "Inhalt") - ## Content + ## Insert content #----------- - ### Logo - if(!is.null(logo)){ + ### Logo ------------- + if (!is.null(logo)){ logo <- prep_logo(logo) if (file.exists(logo)){ @@ -31,69 +31,37 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, } } + ### Contact information --------- + writeDataIf(wb, sheet = "Inhalt", x = prep_contact(contact), xy = c("O", 2)) + writeDataIf(wb, sheet = "Inhalt", x = prep_homepage(homepage), xy = c("O", 5)) + writeDataIf(wb, sheet = "Inhalt", x = prep_openinghours(openinghours), + xy = c("R", 2)) - ### Contact information - if(!is.null(contact)){ - openxlsx::writeData(wb, sheet = "Inhalt", x = prep_contact(contact), - xy = c("O", 2)) - } - - if(!is.null(homepage)){ - openxlsx::writeData(wb, sheet = "Inhalt", x = prep_homepage(homepage), - xy = c("O", 5)) - } - - if(!is.null(openinghours)){ - openxlsx::writeData(wb, sheet = "Inhalt", - x = prep_openinghours(openinghours), xy = c("R", 2)) - } + ### Request information ----------- + openxlsx::writeData(wb, sheet = "Inhalt", x = prep_creationdate(), xy = c("O", 8)) + writeDataIf(wb, sheet = "Inhalt", x = prep_orderid(auftrag_id), xy = c("O", 9)) - ### Creation date - openxlsx::writeData(wb, sheet = "Inhalt", x = prep_creationdate(), - xy = c("O", 8)) - - ### Order id - if (!is.null(auftrag_id)){ - openxlsx::writeData(wb, sheet = "Inhalt", x = prep_orderid(auftrag_id), - xy = c("O", 9)) - } - - ### Title + ### Title, sources, and content caption ------------- openxlsx::writeData(wb, sheet = "Inhalt", x = maintitle, headerStyle = mainTitleStyle(), xy = c("C", 10)) - - ### Source - if (!is.null(titlesource)){ - openxlsx::writeData(wb, sheet = "Inhalt", x = prep_source(titlesource), - xy = c("C", 11)) - } - - ### Content caption - openxlsx::writeData(wb, sheet = "Inhalt", x = "Inhalt", - headerStyle = subtitleStyle(), xy = c("C", 13)) + writeDataIf(wb, sheet = "Inhalt", x = prep_source(titlesource), xy = c("C", 11)) + openxlsx::writeData(wb, sheet = "Inhalt", x = "Inhalt", headerStyle = subtitleStyle(), xy = c("C", 13)) ## Format #----------------- - ### Hide gridlines - openxlsx::showGridLines(wb, sheet = "Inhalt", showGridLines = FALSE) - - ### Set column widths + ### Set column width of first column to 1 and hide gridlines openxlsx::setColWidths(wb, sheet = "Inhalt", cols = 1, widths = 1) - + openxlsx::showGridLines(wb, sheet = "Inhalt", showGridLines = FALSE) ### Add Headerline openxlsx::addStyle(wb, sheet = "Inhalt", style = style_headerline(), rows = 6, cols = 1:20, gridExpand = TRUE, stack = TRUE) - - ### Apply style to Maintitle + ### Apply styles to Main Title and subtitles openxlsx::addStyle(wb, sheet = "Inhalt", style = mainTitleStyle(), rows = 10, cols = 3, gridExpand = TRUE) - - - ### Apply style to Subtitle openxlsx::addStyle(wb, sheet = "Inhalt", style = subtitleStyle(), rows = 14, cols = 3, gridExpand = TRUE) } diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index f666a74..e84e241 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -28,17 +28,9 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", openxlsx::addWorksheet(wb, sheetName = sheetname) - # Style definitions --------------------- + ## Content - style_subtitle <- openxlsx::createStyle(fontSize = 12, textDecoration = "bold", fontName = "Arial") - - ## Fill Excel ----------------- - - ## Title - openxlsx::writeData(wb, sheet = sheetname, x = title, - headerStyle = style_title(), startRow = 7) - - ## Logo + ### Logo ------------ if(!is.null(logo)){ logo <- prep_logo(logo) @@ -50,26 +42,23 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", } } - - ## Contact details + ### Contact details -------------- openxlsx::writeData(wb, sheet = sheetname, x = prep_contact(contactdetails), headerStyle = style_wrap(), startRow = 2, startCol = 12) - ## Source - openxlsx::writeData(wb, sheet = sheetname, x = "Datenquelle:", - headerStyle = style_subtitle, startRow = 9) - openxlsx::writeData(wb, sheet = sheetname, x = prep_source(source), - startRow = 10) + ### Title ----------------- + openxlsx::writeData(wb, sheet = sheetname, x = title, headerStyle = style_title(), startRow = 7) + ### Source ------------ + openxlsx::writeData(wb, sheet = sheetname, x = "Datenquelle:", headerStyle = style_subtitle2(), startRow = 9) + openxlsx::writeData(wb, sheet = sheetname, x = prep_source(source, prefix = NULL), startRow = 10) - ## Metadata - openxlsx::writeData(wb, sheet = sheetname, x = "Hinweise:", - headerStyle = style_subtitle, startRow = 12) - openxlsx::writeData(wb, sheet = sheetname, x = prep_metadata(metadata), - startRow = 13) + ### Metadata ---------- + openxlsx::writeData(wb, sheet = sheetname, x = "Hinweise:", headerStyle = style_subtitle2(), startRow = 12) + openxlsx::writeData(wb, sheet = sheetname, x = prep_metadata(metadata, prefix = NULL), startRow = 13) - ## User + ### User ----------- if (author == "user"){ # for the local R setup if (Sys.getenv("USERNAME") != "") { @@ -83,22 +72,21 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", } - ## Aktualisierungsdatum + ### Aktualisierungsdatum -------- openxlsx::writeData(wb, sheet = sheetname, - x = paste("Aktualisiert am ", - format(Sys.Date(), format="%d.%m.%Y"), - " durch: ", - contactperson), - startRow = 5, startCol = 12) + x = paste(prep_creationdate(prefix = "Aktualisiert am:"), + "durch:", contactperson), startRow = 5, startCol = 12) + + ## Format - ## add formatting + ### add formatting --------- openxlsx::addStyle(wb, sheet = sheetname, style = style_headerline(), rows = 5, cols = 1:26, gridExpand = TRUE, stack = TRUE) openxlsx::addStyle(wb, sheet = sheetname, style = style_title(), rows = 7, cols = 1, gridExpand = TRUE) - openxlsx::addStyle(wb, sheet = sheetname, style = style_subtitle, + openxlsx::addStyle(wb, sheet = sheetname, style = style_subtitle2(), rows = c(9, 12), cols = 1, gridExpand = TRUE) - ## remove gridlines + ## Remove gridlines ---------- openxlsx::showGridLines(wb, sheet = sheetname, showGridLines = FALSE) } diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 9712ba8..471109d 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -49,7 +49,7 @@ insert_worksheet <- function(data, workbook, sheetname="data",title="Title", #extrahiere colname # col_name <- rlang::enquo(sheetvar) - wb<-workbook + wb <- workbook # data-container from row 5 n_metadata <- length(metadata) @@ -63,7 +63,7 @@ insert_worksheet <- function(data, workbook, sheetname="data",title="Title", colnames(data) <- paste0(colnames(data), " ", sep = "") #position of contact details - contact = if(spalten>=6){ + contact <- if(spalten >= 6){ spalten-2 } else { 4 @@ -93,22 +93,11 @@ insert_worksheet <- function(data, workbook, sheetname="data",title="Title", wrap <- openxlsx::createStyle(wrapText = TRUE) - ### Loop for multiple years / worksheets ------------ - - # for (year in sheets){ - # - # #get index - # i<- which(sheets==year) - - # warning if sheetname is longer than the limit imposed by excel (31 characters) - if(nchar(sheetname)>31){warning("sheetname is cut to 31 characters (limit imposed by MS-Excel)")} + # Check length of sheetname + sheetname <- check_sheetname(sheetname) ## Add worksheet - # openxlsx::addWorksheet(wb,paste(substr(sheetname,0,31))) - - suppressWarnings(openxlsx::addWorksheet(wb,paste(substr(sheetname,0,31)))) - - i <- paste(substr(sheetname,0,31)) + openxlsx::addWorksheet(wb, sheetname) # Style --------------------- @@ -118,79 +107,42 @@ insert_worksheet <- function(data, workbook, sheetname="data",title="Title", # Titel & Untertitel ----------------- - #Logo - - if(!is.null(logo)){ - - if(logo == "statzh") { - - statzh <- paste0(.libPaths(),"/statR/extdata/Stempel_STAT-01.png") - openxlsx::insertImage(wb, i, statzh[1], width = 2.145, height = 0.7865, - units = "in") - } else if(logo == "zh"){ - - zh <- paste0(.libPaths(),"/statR/extdata/Stempel_Kanton_ZH.png") + ### Logo - openxlsx::insertImage(wb, i, zh[1], width = 2.145, height = 0.7865, - units = "in") - } else if((logo != "statzh" | logo != "zh") & file.exists(logo)) { + if (!is.null(logo)){ + logo <- prep_logo(logo) - openxlsx::insertImage(wb, i, logo, width = 2.145, height = 0.7865, - units = "in") + if (file.exists(logo)){ + openxlsx::insertImage(wb, sheet = "Inhalt", file = logo, width = 2.145, + height = 0.7865, units = "in") } else { - - message("no logo found and / or added") + message("no logo found.") } } - - - - #standard contactdetails - if(contactdetails=="statzh"){ - - contactdetails <- c("Datashop, Tel: 0432597500", - "datashop@statistik.ji.zh.ch", - "http://www.statistik.zh.ch") - - }else {contactdetails} - - if (length(contactdetails) > 3) { - warning("Contactdetails may overlap with other elements. To avoid this issue please do not include more than three elements in the contactdetails vector.") - } - - - if(source=="statzh"){ - - source="Quelle: Statistisches Amt des Kantons Z\u00fcrich" - - }else {source} - + # Standard contactdetails + contactdetails <- prep_contact(contactdetails, compact = TRUE) + source <- prep_source(source) #Titel - openxlsx::writeData(wb, sheet = i,title, headerStyle=titleStyle,startRow = 7) - + openxlsx::writeData(wb, sheet = sheetname,title, headerStyle=titleStyle,startRow = 7) ##Metadata - openxlsx::writeData(wb, sheet = i, metadata, headerStyle=subtitle, startRow = 8) + openxlsx::writeData(wb, sheet = sheetname, metadata, headerStyle=subtitle, startRow = 8) ##Quelle - openxlsx::writeData(wb, sheet = i, source, headerStyle=subtitle, startRow = 8+n_metadata) + openxlsx::writeData(wb, sheet = sheetname, source, headerStyle=subtitle, startRow = 8+n_metadata) # Metadaten zusammenmergen - purrr::walk(7:(7+length(metadata)+length(source)), ~openxlsx::mergeCells(wb, sheet = i, cols = 1:26, rows = .)) + purrr::walk(7:(7+length(metadata)+length(source)), ~openxlsx::mergeCells(wb, sheet = sheetname, cols = 1:26, rows = .)) # Kontaktdaten zusammenmergen - purrr::walk(2:5, ~openxlsx::mergeCells(wb, sheet = i, cols = contact:26, rows = .)) + purrr::walk(2:5, ~openxlsx::mergeCells(wb, sheet = sheetname, cols = contact:26, rows = .)) #Kontakt - openxlsx::writeData(wb, sheet = i, - contactdetails, - headerStyle = wrap, - startRow = 2, - startCol = contact) + openxlsx::writeData(wb, sheet = sheetname, contactdetails, headerStyle = wrap, startRow = 2, startCol = contact) # User-K\u00fcrzel f\u00fcr Kontaktinformationen if(author == "user"){ @@ -206,42 +158,39 @@ insert_worksheet <- function(data, workbook, sheetname="data",title="Title", } #Aktualisierungsdatum - openxlsx::writeData(wb, sheet = i, paste("Aktualisiert am ", + openxlsx::writeData(wb, sheet = sheetname, paste("Aktualisiert am ", format(Sys.Date(), format="%d.%m.%Y"), " durch: ", contactperson), - headerStyle=subtitle, startRow = 5, startCol=contact) + headerStyle = subtitle, startRow = 5, + startCol = contact) # Daten abf\u00fcllen - openxlsx::writeData(wb, sheet = i, as.data.frame(data%>%dplyr::ungroup()), rowNames = FALSE, startRow = datenbereich, withFilter = FALSE) + openxlsx::writeData(wb, sheet = sheetname, x = as.data.frame(data%>%dplyr::ungroup()), + rowNames = FALSE, startRow = datenbereich, withFilter = FALSE) + #F\u00fcge Formatierungen ein - openxlsx::addStyle(wb, sheet = i, headerline, rows = 5, cols = 1:spalten, gridExpand = TRUE,stack = TRUE) + openxlsx::addStyle(wb, sheet = sheetname, headerline, rows = 5, cols = 1:spalten, gridExpand = TRUE,stack = TRUE) - openxlsx::addStyle(wb, sheet = i, titleStyle, rows = 7, cols = 1, gridExpand = TRUE) + openxlsx::addStyle(wb, sheet = sheetname, titleStyle, rows = 7, cols = 1, gridExpand = TRUE) - # addStyle(wb, sheet = i, header1, rows = datenbereich, cols = 1:spalten, gridExpand = TRUE,stack = TRUE) + # addStyle(wb, sheet = sheetname, header1, rows = datenbereich, cols = 1:spalten, gridExpand = TRUE,stack = TRUE) - openxlsx::addStyle(wb, sheet = i, header, rows = datenbereich, cols = 1:spalten, gridExpand = TRUE,stack = TRUE) + openxlsx::addStyle(wb, sheet = sheetname, header, rows = datenbereich, cols = 1:spalten, gridExpand = TRUE,stack = TRUE) if (!is.null(grouplines)){ + datenbereich_end <- nrow(data) + datenbereich - datenbereich_end <-nrow(data)+datenbereich - - openxlsx::addStyle(wb, sheet = i, leftline, rows=datenbereich:datenbereich_end, cols = grouplines, gridExpand = TRUE,stack = TRUE) - + openxlsx::addStyle(wb, sheet = sheetname, leftline, + rows = datenbereich:datenbereich_end, + cols = grouplines, gridExpand = TRUE, stack = TRUE) } - - # bodyStyle <- createStyle(border="TopBottom", borderColour = "#4F81BD") - # addStyle(wb, sheet = 1, bodyStyle, rows = 2:6, cols = 1:11, gridExpand = TRUE) - # minmale Spaltenbreite definieren options("openxlsx.minWidth" = 5) # automatische Zellenspalten - openxlsx::setColWidths(wb, sheet = i, cols=1:spalten, widths = "auto", ignoreMergedCells = TRUE) ## set column width for row names column - - # newworkbook<<-wb - + openxlsx::setColWidths(wb, sheet = sheetname, cols = seq_along(colnames(data)), + widths = "auto", ignoreMergedCells = TRUE) } diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index b77c5eb..65631cd 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -105,7 +105,7 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", ## Data openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), - rows = data_start_row, cols = 1:spalten, + rows = data_start_row, cols = seq_along(colnames(data)), gridExpand = TRUE, stack = TRUE) openxlsx::writeData(wb, sheet = sheetname, @@ -114,17 +114,17 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", withFilter = FALSE) ## Grouplines - if(is.null(grouplines)){ + if (is.null(grouplines)){ grouplines <- NA } if (any(!is.na(grouplines))){ if (!any(is.na(group_names))){ data_start_row <- data_start_row - 1 - data_end_row <- nrow(data)+data_start_row +1 + data_end_row <- nrow(data) + data_start_row + 1 } else { - data_end_row <- nrow(data)+data_start_row + data_end_row <- nrow(data) + data_start_row } if (is.numeric(grouplines)){ @@ -147,6 +147,6 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", options("openxlsx.minWidth" = 5) ## Use automatic column width - openxlsx::setColWidths(wb, sheet = sheetname, cols = 1:spalten, + openxlsx::setColWidths(wb, sheet = sheetname, cols = seq_along(colnames(data)), widths = "auto", ignoreMergedCells = TRUE) } diff --git a/R/process_input.R b/R/process_input.R index 2c6cf24..611693b 100644 --- a/R/process_input.R +++ b/R/process_input.R @@ -1,56 +1,152 @@ -#' Functions for checking and transforming user input +#' check_sheetname() #' -#' @description #' Helper functions not intended to be called directly by users. +#' @note +#' MS Excel imposes a character limit of 31 characters for sheetnames. By default, +#' this function truncates sheetnames accordingly and raises a warning. If shorten +#' is set to FALSE, an error is raised instead. +#' @param sheetname A character string with the name for an XLSX worksheet +#' @param shorten A boolean whether to return shortened string or raise an error. Default: TRUE +#' @returns A character string #' @keywords internal +#' @noRd #' -check_sheetname <- function(sheetname){ +check_sheetname <- function(sheetname, shorten = TRUE){ - if (nchar(sheetname) > 31){ - warning("sheetname is cut to 31 characters (limit imposed by MS-Excel)") - sheetname <- paste(substr(sheetname, 0, 31)) + short_name <- paste(substr(sheetname, 0, 31)) + + if (short_name != sheetname){ + if (shorten) { + warning("sheetname is truncated to 31 characters") + } else { + stop("sheetname exceeds character limit of MS-Excel)") + } } - return(sheetname) + return(short_name) } -prep_filename <- function(filename){ +#' writeDataIf() +#' +#' Writes data to worksheet conditionally +#' @param wb Workbook object +#' @param sheet Sheetname +#' @param x Input to be written to worksheet +#' @param xy Position where input should be written to +#' @param condition_fun A function which returns a boolean and takes x as input. Default: function(x) !is.null(x) +#' @keywords internal +#' @noRd +#' +writeDataIf <- function(wb, sheet, x, xy, condition_fun = function(x) !is.null(x)){ + if (condition_fun(x)){ + openxlsx::writeData(wb, sheet, x, xy = xy) + } else { + message("Skipped write because x is NULL") + } +} + +#' prep_filename() +#' +#' Ensure that file extension is added to filename. +#' @param filename A character string with the filename +#' @param extension A character string with the file extension. Defaults to ".xlsx" +#' @returns A character string +#' @keywords internal +#' @noRd +#' +prep_filename <- function(filename, extension = ".xlsx"){ if (!grepl(".xlsx", filename)){ - filename <- paste0(filename, ".xlsx") + filename <- paste0(filename, extension) } return(filename) } -prep_source <- function(source, prefix = "Quelle:"){ +#' prep_source() +#' +#' Concatenate sources +#' @param source A character vector with source information +#' @param prefix A character string with the prefix. Default: "Quelle: " +#' @param sep A character string with the separator for sources. Default: ";" +#' @returns A character string +#' @keywords internal +#' @noRd +#' +prep_source <- function(source, prefix = "Quelle: ", sep = ";"){ + + # Replace "statzh" entries + source <- sub("statzh", statzh_name, source) + + cat_source <- paste0(source, collapse = sep) + + if (!is.null(prefix)){ + cat_source <- paste0(prefix, cat_source) + } - source <- sub("statzh", "Statistisches Amt des Kantons Z\u00fcrich", source) - return(paste("Quelle:", paste0(source, collapse = ";"))) + return(cat_source) } +#------------------- +#' prep_metadata() +#' +#' Concatenate metadata +#' @param metadata A character vector with metadata information +#' @param extension A character string with the prefix. Default: "Metadaten: ". +#' @param sep A character string with the separator for metadata. Default: ";" +#' @returns A character string +#' @keywords internal +#' @noRd +#' +prep_metadata <- function(metadata, prefix = "Metadaten: ", sep = ";"){ -prep_metadata <- function(metadata){ + cat_metadata <- paste0(metadata, collapse = sep) + + if (!is.null(prefix)){ + cat_metadata <- paste0(prefix, cat_metadata) + } - return(paste0("Metadaten: ", paste0(metadata, collapse = "; "))) + return(cat_metadata) } +#----------------- +#' prep_logo() +#' +#' Replace default values "zh" and "statzh" with the file path to the +#' respective logo, otherwise returns the input value. +#' @param logo A character string with the file path +#' @returns A character string +#' @keywords internal +#' @noRd +#' prep_logo <- function(logo){ - if(logo == "statzh") { - logo <- paste0(path.package("statR"),"/extdata/Stempel_STAT-01.png") - - } else if(logo == "zh"){ - logo <- paste0(path.package("statR"),"/extdata/Stempel_Kanton_ZH.png") + if (logo == "statzh"){ + logo <- statzh_logo + } else if (logo == "zh"){ + logo <- zh_logo } return(logo) } -prep_contact <- function(contact){ +#----------------- +#' prep_contact() +#' +#' Replace default values "zh" and "statzh" with the contact information of +#' the Statistics Office of Canton Zurich, otherwise returns the input value. +#' @note +#' Raises a warning if the input has more than 3 elements. +#' @param contact A character vector with contact information +#' @param compact A boolean which controls the format of the contact information. Default: FALSE +#' @returns A character vector +#' @keywords internal +#' @noRd +#' +prep_contact <- function(contact, compact = FALSE){ + if (contact == "statzh"){ - contact <- c("Datashop", "Tel.: +41 43 259 75 00", - "datashop@statistik.zh.ch") + contact <- ifelse(compact, statzh_contact_compact, statzh_contact) } else if (length(contact) > 3){ warning("More than 3 elements in contactdetails, may overlap with other elements.") } @@ -58,30 +154,75 @@ prep_contact <- function(contact){ return(contact) } +#----------------- +#' prep_contact() +#' +#' Replace default values "zh" and "statzh" with the contact information of +#' the Statistics Office of Canton Zurich, otherwise returns the input value. +#' @note +#' Raises a warning if the input has more than 3 elements. +#' @param contact A character vector with contact information +#' @returns A character vector +#' @keywords internal +#' @noRd +#' prep_openinghours <- function(openinghours){ if (openinghours == "statzh"){ - openinghours <- c("B\u00fcrozeiten", - "Montag bis Freitag", - "09:00 bis 12:00", - "13:00 bis 16:00") + openinghours <- statzh_openinghours } return(openinghours) } -prep_homepage <- function(homepage){ +#----------------- +#' prep_homepage() +#' +#' Replace default values "zh" and "statzh" with the homepage of +#' the Statistics Office of Canton Zurich, otherwise returns the input value. +#' @note +#' Converts input to 'hyperlink' object. +#' @param homepage A character string +#' @param as_hyperlink A boolean, controls whether input is converted to 'hyperlink'. Default: TRUE +#' @returns A character string or a 'hyperlink' object depending on the value of as_hyperlink. +#' @keywords internal +#' @noRd +#' +prep_homepage <- function(homepage, as_hyperlink = TRUE){ if (homepage == "statzh"){ - homepage <- "http://www.statistik.zh.ch" + homepage <- statzh_homepage + } + + if (as_hyperlink){ + class(homepage) <- 'hyperlink' } - class(homepage) <- 'hyperlink' return(homepage) } +#----------------- +#' prep_creationdate() +#' +#' @param prefix A character string, defaults to "Erstellt am:" +#' @param date_format A character string for the date_format. Default: "%d.%m.%Y". +#' @returns A character vector +#' @keywords internal +#' @seealso format +#' @noRd +#' prep_creationdate <- function(prefix = "Erstellt am:", date_format = "%d.%m.%Y"){ - return(paste(prefix, format(Sys.Date(), format = date_format))) + creation_date <- format(Sys.Date(), format = date_format) + return(paste(prefix, creation_date)) } +#----------------- +#' prep_orderid() +#' +#' @param order_id An integer +#' @param prefix A character string, defaults to "Auftragsnr.:" +#' @returns A character vector +#' @keywords internal +#' @noRd +#' prep_orderid <- function(order_id, prefix = "Auftragsnr.:"){ return(paste(prefix, order_id)) } diff --git a/R/splitXLSX.R b/R/splitXLSX.R index e225566..fa9094e 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -41,7 +41,7 @@ splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", col_name <- rlang::enquo(sheetvar) # create workbook - wb <- openxlsx::createWorkbook(file) + wb <- openxlsx::createWorkbook() # get values of the variable that is used to split the data sheetvalues <- unique(data[, c(deparse(substitute(sheetvar)))]) @@ -51,14 +51,16 @@ splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", # get data into worksheets insert_worksheet(as.data.frame(data %>% dplyr::filter((!!col_name) == - sheetvalue) %>% ungroup()), wb, sheetname = sheetvalue, + sheetvalue) %>% ungroup()), + wb, + sheetname = sheetvalue, #shared params - title=paste0(title, " (", deparse(substitute(sheetvar)), ": ", sheetvalue, ")"), - source=source, + title = paste0(title, " (", deparse(substitute(sheetvar)), ": ", sheetvalue, ")"), + source = source, metadata = metadata, - logo=logo, + logo = logo, grouplines = grouplines, - contactdetails=contactdetails, + contactdetails = contactdetails, author = author) @@ -72,9 +74,3 @@ splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) } - - - - - - diff --git a/R/statzh_info.R b/R/statzh_info.R new file mode 100644 index 0000000..b35da48 --- /dev/null +++ b/R/statzh_info.R @@ -0,0 +1,28 @@ +#################### STAT ZH Farbpaletten +#' statzh_info +#' +#' Commonly used info for the Statistical Office of Canton Zurich +#' +#' @format A \code{list}. +#' @noRd +#' +statzh_info <- { + # Contact info + #--------------- + statzh_name <- "Statistisches Amt des Kantons Z\u00fcrich" + statzh_department <- "Datashop" + statzh_phone <- "Tel.: +41 43 259 75 00" + statzh_email <- "datashop@statistik.zh.ch" + statzh_homepage <- "http://www.statistik.zh.ch" + + statzh_contact <- c(statzh_department, statzh_phone, statzh_email) + statzh_contact_compact <- c(paste(statzh_department, statzh_phone, sep = ", "), + statzh_email, statzh_homepage) + statzh_openinghours <- c("B\u00fcrozeiten", "Montag bis Freitag", "09:00 bis 12:00", "13:00 bis 16:00") + + # Logo paths + #-------------- + statzh_logo <- paste0(path.package("statR"), "/extdata/Stempel_STAT-01.png") + zh_logo <- paste0(path.package("statR"), "/extdata/Stempel_Kanton_ZH.png") + +} diff --git a/R/styles.R b/R/styles.R index 3a77aea..db40848 100644 --- a/R/styles.R +++ b/R/styles.R @@ -5,64 +5,44 @@ #' @noRd mainTitleStyle <- function(){ - openxlsx::createStyle(fontSize = 20, - textDecoration = "bold", - fontName = "Arial", + openxlsx::createStyle(fontSize = 20, textDecoration = "bold", fontName = "Arial", halign = "left") } style_title <- function(){ - openxlsx::createStyle( - fontSize = 14, - textDecoration = "bold", - fontName = "Arial" - ) + openxlsx::createStyle(fontSize = 14, textDecoration = "bold", fontName = "Arial") } subtitleStyle <- function(){ - openxlsx::createStyle(fontSize = 11, - textDecoration = "bold", - fontName = "Arial", + openxlsx::createStyle(fontSize = 11, textDecoration = "bold", fontName = "Arial", halign = "left") } style_subtitle <- function(){ - openxlsx::createStyle( - fontSize = 11, - fontName = "Calibri" - ) + openxlsx::createStyle(fontSize = 11, fontName = "Calibri") +} + +style_subtitle2 <- function(){ + openxlsx::createStyle(fontSize = 12, textDecoration = "bold", fontName = "Arial") } hyperlinkStyle <- function(){ - openxlsx::createStyle(fontName = "Calibri", - fontSize = 11, - fontColour = "blue", + openxlsx::createStyle(fontName = "Calibri", fontSize = 11, fontColour = "blue", textDecoration = "underline") } style_header <- function(){ - openxlsx::createStyle( - fontSize = 12, - fontName = "Calibri", - fontColour = "#000000", - halign = "left", - border="Bottom", - borderColour = "#009ee0", - textDecoration = "bold" - ) + openxlsx::createStyle(fontSize = 12, fontName = "Calibri", fontColour = "#000000", + halign = "left", border="Bottom", borderColour = "#009ee0", textDecoration = "bold") } style_headerline <- function(){ - openxlsx::createStyle(border = "Bottom", - borderColour = "#009ee0", + openxlsx::createStyle(border = "Bottom", borderColour = "#009ee0", borderStyle = getOption("openxlsx.borderStyle", "thick")) } style_leftline <- function(){ - openxlsx::createStyle( - border = "Left", - borderColour = "#009ee0" - ) + openxlsx::createStyle(border = "Left", borderColour = "#009ee0") } style_wrap <- function() { From fb28208905c74340003988aa0783c1dd718c4ac0 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Fri, 12 May 2023 14:46:45 +0000 Subject: [PATCH 29/74] Documentation; started to unify insert_worksheet and insert_worksheet_mh --- R/aXLSX.R | 39 ++++--- R/add_additional_text.R | 25 +++-- R/datasetsXLSX.R | 52 ++++++++-- R/insert_hyperlinks.R | 9 +- R/insert_index_sheet.R | 1 - R/insert_second_header.R | 33 +++--- R/insert_worksheet.R | 218 ++++++++++++++++++--------------------- R/insert_worksheet_nh.R | 61 ++++++----- R/process_input.R | 88 +++++++++++----- R/quickXLSX.R | 41 +++----- R/quick_sum.r | 36 +++++-- R/splitXLSX.R | 61 ++++++----- R/styles.R | 13 ++- 13 files changed, 384 insertions(+), 293 deletions(-) diff --git a/R/aXLSX.R b/R/aXLSX.R index a14100c..f3da124 100644 --- a/R/aXLSX.R +++ b/R/aXLSX.R @@ -1,15 +1,21 @@ #' aXLSX() #' -#' Function to export data from R to a formatted .xlsx-file. -#' @note -#' The data is exported to the first sheet. Metadata information is exported -#' to the second sheet. +#' @description Function to export data from R to a formatted .xlsx-file. The +#' data is exported to the first sheet. Metadata information is exported to +#' the second sheet. +#' #' @param data data to be exported. +#' #' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. +#' #' @param title title to be put above the data in the worksheet. +#' #' @template shared_parameters +#' #' @keywords aXLSX +#' #' @export +#' #' @examples #' dataset <- mtcars #' source_string <- paste("Source: Henderson and Velleman (1981).", @@ -33,22 +39,23 @@ #' author = "user") #' } #' } -aXLSX <- function(data, file, title = "Title", source = "statzh", - metadata = NA, logo = "statzh", grouplines = NA, - contactdetails = "statzh", author = "user"){ +aXLSX <- function(data, file, title = "Title", source = "statzh", metadata = NA, + logo = "statzh", grouplines = NA, contactdetails = "statzh", + author = "user"){ - #create workbook + ## Initialize Workbook object wb <- openxlsx::createWorkbook() - #insert data - insert_worksheet_nh(data, wb, title = title, source = source, - metadata = NA, grouplines = grouplines) + ## Content + ### insert data ----- + insert_worksheet_nh(data, wb, title = title, source = source, metadata = NA, + grouplines = grouplines) - # insert metadata - insert_metadata_sheet(wb, title = title, source = source, - metadata = metadata, logo = logo, contactdetails = contactdetails, - author = author) + ### insert metadata ------- + insert_metadata_sheet(wb, title = title, source = source, metadata = metadata, + logo = logo, contactdetails = contactdetails, + author = author) - #save workbook + ## Write workbook to disk openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) } diff --git a/R/add_additional_text.R b/R/add_additional_text.R index 7e86b6c..fc1bf04 100644 --- a/R/add_additional_text.R +++ b/R/add_additional_text.R @@ -1,23 +1,30 @@ #' add_additional_text() #' -#' @description -#' Insert text into an existing workbook object. -#' @note -#' Text is inserted at first column index. -#' @param wb workbook object where text should be inserted +#' @description Insert text into an existing workbook object. Text is inserted +#' at column index 1. +#' +#' @returns Integer corresponding to the final row index +#' +#' @param wb Workbook object where text should be inserted +#' #' @param text Character vector of text to be inserted -#' @param sheetname Sheet where text should be inserted. +#' +#' @param sheetname Name of the worksheet where text should be inserted. +#' #' @param start_row Row from which to insert elements +#' #' @keywords internal add_additional_text <- function(wb, text, sheetname, start_row){ rows <- c(seq(start_row, start_row + length(text) - 1)) + # Write data + openxlsx::writeData(wb, sheet = sheetname, x = text, colNames = FALSE, + headerStyle = style_subtitle(), startRow = start_row) + + # Apply style openxlsx::addStyle(wb, sheet = sheetname, style = style_subtitle(), rows = rows, cols = 1, gridExpand = TRUE) - openxlsx::writeData(wb, sheet = sheetname, x = text, colNames = F, - headerStyle = style_subtitle(), startRow = start_row) - return(max(rows)) } diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index 07da896..2faa5ca 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -1,34 +1,65 @@ #' datasetsXLSX() #' -#' Function to export several datasets and/or figures from R to an .xlsx-file. The function creates an overview sheet and separate sheets -#' for each dataset/figure. +#' @description Function to export several datasets and/or figures from R to an +#' .xlsx-file. The function creates an overview sheet and separate sheets for +#' each dataset/figure. #' -#' When including figures, the heights and widths need to be specified as a vector. For example, say you have one dataset and two figures -#' that you would like to export. widths = c(5,6) then suggests that the first figure will be 5 inches wide, the second 6. To include a figure either -#' save it as a ggplot object or indicate a file path to an existing file (possible formats: png, jpg, bmp). +#' @details When including figures, the heights and widths need to be specified +#' as a vector. For example, say you have one dataset and two figures that you +#' would like to export. widths = c(5,6) then suggests that the first figure +#' will be 5 inches wide, the second 6. To include a figure either save it as +#' a ggplot object or indicate a file path to an existing file +#' (possible formats: png, jpg, bmp). +#' +#' @param file file name of the spreadsheet. The extension ".xlsx" is added +#' automatically. #' -#' @param file file name of the spreadsheet. The extension ".xlsx" is added automatically. #' @param maintitle Title to be put on the first (overview) sheet. +#' #' @param datasets datasets or plots to be included. +#' #' @param plot_widths width of figure in inch (1 inch = 2.54 cm). See details. +#' #' @param plot_heights height of figure in inch (1 inch = 2.54 cm). See details. +#' #' @param sheetnames names of the sheet tabs. +#' #' @param titles titles of the different sheets. -#' @param logo file path to the logo to be included in the index-sheet. Can be "statzh" or "zh". Defaults to "statzh". +#' +#' @param logo file path to the logo to be included in the index-sheet. Can be +#' "statzh" or "zh". Defaults to "statzh". +#' #' @param titlesource source to be mentioned on the title sheet beneath the title +#' #' @param sources source of the data. Defaults to "statzh". +#' #' @param metadata1 metadata information to be included. Defaults to NA. +#' #' @param auftrag_id order number. +#' #' @param contact contact information on the title sheet. Defaults to "statzh" +#' #' @param homepage web address to be put on the title sheet. Default to "statzh" -#' @param openinghours openinghours written on the title sheet. Defaults to Data Shop +#' +#' @param openinghours openinghours written on the title sheet. +#' Defaults to Data Shop +#' #' @param grouplines Column for second header(s). Format: List e.g list(c(2,4,6)) -#' @param group_names Name(s) of the second header(s). Format: List e.g list(c("title 1", "title 2", "title 3")) -#' @param overwrite overwrites the existing excel files with the same file name. default to FALSE +#' +#' @param group_names Name(s) of the second header(s). Format: List e.g +#' list(c("title 1", "title 2", "title 3")) +#' +#' @param overwrite overwrites the existing excel files with the same file name. +#' default to FALSE +#' #' @keywords datasetsXLSX +#' #' @export +#' #' @importFrom dplyr "%>%" +#' #' @importFrom purrr pwalk pmap +#' #' @examples #'\donttest{ #' \dontrun{ @@ -87,7 +118,6 @@ #' overwrite = T) #'} #'} - datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, plot_heights = NULL, grouplines = NA, group_names = NA, sources = "statzh", metadata1 = NA, diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index 9191767..09e314a 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -1,10 +1,15 @@ #' insert_hyperlinks() #' -#' Function for inserting hyperlinks within an openxlsx Workbook -#' @param wb Worksheet +#' @description Function for inserting hyperlinks within an openxlsx Workbook +#' +#' @param wb Workbook object +#' #' @param sheetname Name of sheet +#' #' @param title Title +#' #' @param sheet_row Sheet row +#' #' @keywords internal #' insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index d4153ff..5c3c54c 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -17,7 +17,6 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, openxlsx::addWorksheet(wb, sheetName = "Inhalt") ## Insert content - #----------- ### Logo ------------- if (!is.null(logo)){ diff --git a/R/insert_second_header.R b/R/insert_second_header.R index 627b2a4..4120c9e 100644 --- a/R/insert_second_header.R +++ b/R/insert_second_header.R @@ -1,16 +1,19 @@ #' insert_second_header() #' -#' Function to export data from R to a formatted .xlsx-file. +#' @description Function to add a second header row #' -#' @note -#' The data is exported to the first sheet. Metadata information is exported to -#' the second sheet. #' @param wb Workbook +#' #' @param sheetname Sheet name +#' #' @param data_start_row Row index for first row with data +#' #' @param group_names Group names +#' #' @param grouplines Group lines +#' #' @param data Data +#' #' @keywords internal #' @examples #' \donttest{ @@ -32,20 +35,12 @@ insert_second_header <- function(wb, sheetname, data_start_row, group_names, groupline_numbers <- grouplines } - openxlsx::addStyle(wb, - sheet = sheetname, - style = style_header(), - rows = data_start_row, - cols = 1:ncol(data) - ) + # Write data ------- + purrr::walk2(groupline_numbers, group_names, + ~openxlsx::writeData(wb, sheet = sheetname, x = .y, startCol = .x, + colNames = FALSE, startRow = data_start_row)) - purrr::walk2(groupline_numbers, - group_names, - ~openxlsx::writeData(wb, - sheet = sheetname, - x = .y, - startCol = .x, - colNames = F, - startRow = data_start_row) - ) + # Apply style --------- + openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), + rows = data_start_row, cols = 1:ncol(data)) } diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 471109d..e255c71 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -1,20 +1,36 @@ #' insert_worksheet() #' -#' Function to add formatted worksheets to an existing .xlsx-workbook. -#' @note -#' Marked for deprecation in upcoming version. The function does not write the -#' result into a .xlsx file. A separate call to openxlsx::saveWorkbook() is -#' required. +#' @description Function to add formatted worksheets to an existing +#' .xlsx-workbook. +#' +#' @note Marked for deprecation in upcoming version. The function does not write +#' the result into a .xlsx file. A separate call to openxlsx::saveWorkbook() is +#' required. +#' #' @param data data to be included. +#' #' @param workbook workbook object to add new worksheet to. +#' #' @param title title to be put above the data. +#' #' @param sheetname name of the sheet tab. +#' #' @param source source of the data. Defaults to "statzh". +#' #' @param metadata metadata information to be included. Defaults to NA. -#' @param logo path of the file to be included as logo (png / jpeg / svg). Defaults to "statzh" -#' @param contactdetails contact details of the data publisher. Defaults to "statzh". -#' @param grouplines defaults to FALSE. Can be used to separate grouped variables visually. -#' @param author defaults to the last two letters (initials) or numbers of the internal user name. +#' +#' @param logo path of the file to be included as logo (png / jpeg / svg). +#' Defaults to "statzh" +#' +#' @param contactdetails contact details of the data publisher. Defaults to +#' "statzh". +#' +#' @param grouplines defaults to FALSE. Can be used to separate grouped +#' variables visually. +#' +#' @param author defaults to the last two letters (initials) or numbers of the +#' internal user name. +#' #' @importFrom dplyr "%>%" #' @keywords insert_worksheet #' @export @@ -23,126 +39,80 @@ #' # Generation of a spreadsheet #' wb <- openxlsx::createWorkbook("hello") #' -#' insert_worksheet(data = mtcars[c(1:10),], workbook = wb, title = "mtcars", sheetname = "carb") - - -insert_worksheet <- function(data, workbook, sheetname="data",title="Title", - source="statzh", metadata = NA, logo= "statzh", - grouplines = FALSE, contactdetails="statzh", +#' insert_worksheet(data = head(mtcars), workbook = wb, title = "mtcars", +#' sheetname = "carb") +#' +insert_worksheet <- function(data, workbook, sheetname = "data", title = "Title", + source = "statzh", metadata = NA, logo = "statzh", + grouplines = FALSE, contactdetails = "statzh", author = "user"){ - # Metadata - remarks <- if (any(is.na(metadata))) { - "Bemerkungen:" - } - else if (any(metadata == "HAE")) { - "Die Zahlen der letzten drei Jahre sind provisorisch." - } - else { - metadata - } - - - #Zahlenformat: Tausendertrennzeichen - # options("openxlsx.numFmt" = "#,###0") + # Check length of sheetname + sheetname <- check_sheetname(sheetname) - #extrahiere colname - # col_name <- rlang::enquo(sheetvar) + # Add worksheet + openxlsx::addWorksheet(workbook, sheetname) - wb <- workbook - # data-container from row 5 - n_metadata <- length(metadata) + # Process input ---------- - datenbereich = 9 + n_metadata + 3 + ## Contactdetails & position + contactdetails <- prep_contact(contactdetails, compact = TRUE) + contact_pos <- max(ncol(data) - 2, 4) - #define width of the area in which data is contained for formatting - spalten = ncol(data) + ## Source information + source <- prep_source(source) - # increase width of colnames for better auto-fitting of column width - colnames(data) <- paste0(colnames(data), " ", sep = "") + ## Metadata - #position of contact details - contact <- if(spalten >= 6){ - spalten-2 + if (any(is.na(metadata))) { + remarks <- "Bemerkungen:" + } else if (any(metadata == "HAE")) { + remarks <- "Die Zahlen der letzten drei Jahre sind provisorisch." } else { - 4 + remarks <- metadata } - #styles - titleStyle <- openxlsx::createStyle(fontSize=14, textDecoration="bold",fontName="Arial") - - subtitle <- openxlsx::createStyle(fontSize=12, textDecoration="italic",fontName="Arial") - - header <- openxlsx::createStyle(fontSize = 12, fontColour = "#000000", halign = "left", border="Bottom", borderColour = "#009ee0",textDecoration = "bold") - - # header1 <- createStyle(fontSize = 14, fontColour = "#FFFFFF", halign = "center", - # fgFill = "#3F98CC", border="TopBottom", borderColour = "#4F81BD") - - # header2 <- createStyle(fontSize = 12, fontColour = "#FFFFFF", halign = "center", - # fgFill = "#407B9F", border="TopBottom", borderColour = "#4F81BD") - - headerline <- openxlsx::createStyle(border="Bottom", borderColour = "#009ee0",borderStyle = getOption("openxlsx.borderStyle", "thick")) - - #Linien - bottomline <- openxlsx::createStyle(border="Bottom", borderColour = "#009ee0") - - leftline <- openxlsx::createStyle(border="Left", borderColour = "#4F81BD") - - #wrap - wrap <- openxlsx::createStyle(wrapText = TRUE) - - - # Check length of sheetname - sheetname <- check_sheetname(sheetname) - - ## Add worksheet - openxlsx::addWorksheet(wb, sheetname) - - - # Style --------------------- - - #title,subtitle & Header - - - # Titel & Untertitel ----------------- - - ### Logo + #-------- + # Insert content + ## Logo if (!is.null(logo)){ logo <- prep_logo(logo) if (file.exists(logo)){ - openxlsx::insertImage(wb, sheet = "Inhalt", file = logo, width = 2.145, + openxlsx::insertImage(workbook, sheet = "Inhalt", file = logo, width = 2.145, height = 0.7865, units = "in") } else { message("no logo found.") } } - # Standard contactdetails - contactdetails <- prep_contact(contactdetails, compact = TRUE) - source <- prep_source(source) - - - #Titel - openxlsx::writeData(wb, sheet = sheetname,title, headerStyle=titleStyle,startRow = 7) - - ##Metadata - openxlsx::writeData(wb, sheet = sheetname, metadata, headerStyle=subtitle, startRow = 8) + ## Titel + openxlsx::writeData(workbook, sheet = sheetname, x = title, startRow = 7, + headerStyle = style_title()) + n_metadata <- length(metadata) + datenbereich <- 9 + n_metadata + 3 + openxlsx::writeData(workbook, sheet = sheetname, x = metadata, startRow = 8, + headerStyle = style_subtitle3()) - ##Quelle - openxlsx::writeData(wb, sheet = sheetname, source, headerStyle=subtitle, startRow = 8+n_metadata) + ### Quelle + openxlsx::writeData(workbook, sheet = sheetname, x = source, startRow = 8 + n_metadata, + headerStyle = style_subtitle3()) # Metadaten zusammenmergen - purrr::walk(7:(7+length(metadata)+length(source)), ~openxlsx::mergeCells(wb, sheet = sheetname, cols = 1:26, rows = .)) - # Kontaktdaten zusammenmergen - purrr::walk(2:5, ~openxlsx::mergeCells(wb, sheet = sheetname, cols = contact:26, rows = .)) + purrr::walk(7:(7 + length(metadata) + length(source)), + ~openxlsx::mergeCells(wb, sheet = sheetname, cols = 1:26, rows = .)) + + ### Contact information + purrr::walk(2:5, ~openxlsx::mergeCells(wb, sheet = sheetname, + cols = contact_pos:26, rows = .)) + openxlsx::writeData(wb, sheet = sheetname, x = contactdetails, + startCol = contact_pos, startRow = 2, headerStyle = style_wrap()) - #Kontakt - openxlsx::writeData(wb, sheet = sheetname, contactdetails, headerStyle = wrap, startRow = 2, startCol = contact) + ### Aktualisierungsdatum # User-K\u00fcrzel f\u00fcr Kontaktinformationen if(author == "user"){ @@ -157,40 +127,52 @@ insert_worksheet <- function(data, workbook, sheetname="data",title="Title", contactperson <- author } - #Aktualisierungsdatum - openxlsx::writeData(wb, sheet = sheetname, paste("Aktualisiert am ", - format(Sys.Date(), format="%d.%m.%Y"), - " durch: ", contactperson), - headerStyle = subtitle, startRow = 5, - startCol = contact) + openxlsx::writeData(wb, sheet = sheetname, + x = paste(prep_creationdate("Aktualisiert am"), + "durch:", contactperson), + startCol = contact_pos, startRow = 5, + headerStyle = style_subtitle3()) - # Daten abf\u00fcllen - openxlsx::writeData(wb, sheet = sheetname, x = as.data.frame(data%>%dplyr::ungroup()), - rowNames = FALSE, startRow = datenbereich, withFilter = FALSE) + # Insert data -------- + ## increase width of colnames for better auto-fitting of column width + colnames(data) <- paste0(colnames(data), " ", sep = "") - #F\u00fcge Formatierungen ein + openxlsx::writeData(wb, sheet = sheetname, + x = as.data.frame(data %>% dplyr::ungroup()), + startRow = datenbereich, rowNames = FALSE, + withFilter = FALSE) - openxlsx::addStyle(wb, sheet = sheetname, headerline, rows = 5, cols = 1:spalten, gridExpand = TRUE,stack = TRUE) + #----------------------- + # Apply styles - openxlsx::addStyle(wb, sheet = sheetname, titleStyle, rows = 7, cols = 1, gridExpand = TRUE) + ## Title + openxlsx::addStyle(wb, sheet = sheetname, style = style_title(), + rows = 7, cols = 1, gridExpand = TRUE) - # addStyle(wb, sheet = sheetname, header1, rows = datenbereich, cols = 1:spalten, gridExpand = TRUE,stack = TRUE) + ## Data header + openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), + rows = datenbereich, cols = 1:ncol(data), + gridExpand = TRUE, stack = TRUE) - openxlsx::addStyle(wb, sheet = sheetname, header, rows = datenbereich, cols = 1:spalten, gridExpand = TRUE,stack = TRUE) + ## Headerline + openxlsx::addStyle(wb, sheet = sheetname, style = style_headerline(), + rows = 5, cols = 1:ncol(data), gridExpand = TRUE, + stack = TRUE) + ## Grouplines if (!is.null(grouplines)){ datenbereich_end <- nrow(data) + datenbereich - openxlsx::addStyle(wb, sheet = sheetname, leftline, + openxlsx::addStyle(wb, sheet = sheetname, style = style_leftline(), rows = datenbereich:datenbereich_end, cols = grouplines, gridExpand = TRUE, stack = TRUE) } - # minmale Spaltenbreite definieren + ## minmale Spaltenbreite definieren options("openxlsx.minWidth" = 5) - # automatische Zellenspalten - openxlsx::setColWidths(wb, sheet = sheetname, cols = seq_along(colnames(data)), + ## automatische Zellenspalten + openxlsx::setColWidths(wb, sheet = sheetname, cols = 1:ncol(data), widths = "auto", ignoreMergedCells = TRUE) } diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index 65631cd..0221725 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -1,23 +1,36 @@ #' insert_worksheet_nh #' -#' Function to add formatted worksheets without headers to an existing workbook -#' @note -#' The function does not write the result into a .xlsx file. A separate call -#' to openxlsx::saveWorkbook() is required. +#' @description Function to add formatted worksheets without headers to an +#' existing workbook +#' +#' @note The function does not write the result into a .xlsx file. A separate +#' call to `openxlsx::saveWorkbook()` is required. +#' #' @param data data to be included in the XLSX-table. +#' #' @param wb workbook object to write new worksheet in. +#' #' @param title title of the table and the sheet +#' #' @param sheetname name of the sheet-tab. +#' #' @param source source of the data. Defaults to "statzh". +#' #' @param metadata metadata-information to be included. Defaults to NA. +#' #' @param grouplines defaults to NA. Can be used to separate grouped variables visually. -#' @param group_names Name(s) of the second header(s). Format: List e.g list(c("title 1", "title 2", "title 3")) +#' +#' @param group_names Name(s) of the second header(s). +#' Format: List e.g list(c("title 1", "title 2", "title 3")) +#' #' @keywords insert_worksheet, openxlsx -#' @export +#' #' @importFrom dplyr "%>%" #' @importFrom purrr walk -#' @examples #' +#' @export +#' +#' @examples #' ## Create workbook #' export <- openxlsx::createWorkbook() #' @@ -29,7 +42,6 @@ #' insert_worksheet_nh(tail(mtcars), export, "data2", #' title = "Title", source = "statzh", metadata = "Note: ...") #' -#' #' ## insert a worksheet with group lines and second header #' insert_worksheet_nh(data = head(mtcars), wb = export, #' title = "grouplines", source = "statzh", metadata = "Note: ...", @@ -39,13 +51,9 @@ #' ## save workbook #' openxlsx::saveWorkbook(export,"example.xlsx") #' } - insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", source = "statzh", metadata = NA, grouplines = NA, group_names = NA){ - # number of data columns - spalten <- ncol(data) - # increase width of column names for better auto-fitting of column width colnames(data) <- paste0(colnames(data), " ", sep = "") @@ -60,10 +68,8 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", #--------- ## Title - openxlsx::addStyle(wb, sheet = sheetname, style = style_title(), - rows = 1, cols = 1) openxlsx::writeData(wb, sheet = sheetname, x = title, - headerStyle=style_title(), startRow = 1) + headerStyle = style_title(), startRow = 1) ## Source sources_to_insert <- prep_source(source) @@ -87,10 +93,7 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", ### Metadaten zusammenmergen purrr::walk(1:merge_end_row, - ~openxlsx::mergeCells(wb, - sheet = sheetname, - cols = 1:26, - rows = .)) + ~openxlsx::mergeCells(wb, sheet = sheetname, cols = 1:26, rows = .)) ## Insert second header if (any(is.null(group_names))){ @@ -104,15 +107,23 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", } ## Data - openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), - rows = data_start_row, cols = seq_along(colnames(data)), - gridExpand = TRUE, stack = TRUE) - openxlsx::writeData(wb, sheet = sheetname, x = as.data.frame(dplyr::ungroup(data)), rowNames = FALSE, startRow = data_start_row, withFilter = FALSE) + #----------------------- + # Apply styles + + ## Title + openxlsx::addStyle(wb, sheet = sheetname, style = style_title(), + rows = 1, cols = 1) + + ## Data header + openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), + rows = data_start_row, cols = 1:ncol(data), + gridExpand = TRUE, stack = TRUE) + ## Grouplines if (is.null(grouplines)){ grouplines <- NA @@ -130,7 +141,7 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", if (is.numeric(grouplines)){ groupline_numbers <- grouplines - } else if(is.character(grouplines)){ + } else if (is.character(grouplines)){ groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) } @@ -147,6 +158,6 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", options("openxlsx.minWidth" = 5) ## Use automatic column width - openxlsx::setColWidths(wb, sheet = sheetname, cols = seq_along(colnames(data)), + openxlsx::setColWidths(wb, sheet = sheetname, cols = 1:ncol(data), widths = "auto", ignoreMergedCells = TRUE) } diff --git a/R/process_input.R b/R/process_input.R index 611693b..8a5ffbb 100644 --- a/R/process_input.R +++ b/R/process_input.R @@ -1,12 +1,17 @@ +#----------------- #' check_sheetname() #' -#' Helper functions not intended to be called directly by users. -#' @note -#' MS Excel imposes a character limit of 31 characters for sheetnames. By default, -#' this function truncates sheetnames accordingly and raises a warning. If shorten -#' is set to FALSE, an error is raised instead. +#' @description Function which truncates a sheet name to 31 characters +#' +#' @details MS Excel imposes a character limit of 31 characters for sheetnames. +#' By default, this function truncates sheetnames accordingly and raises a +#' warning. If shorten is set to FALSE, an error is raised instead. +#' #' @param sheetname A character string with the name for an XLSX worksheet -#' @param shorten A boolean whether to return shortened string or raise an error. Default: TRUE +#' +#' @param shorten A boolean whether to return shortened string or raise an error. +#' Default: TRUE +#' #' @returns A character string #' @keywords internal #' @noRd @@ -26,18 +31,29 @@ check_sheetname <- function(sheetname, shorten = TRUE){ return(short_name) } +#----------------- #' writeDataIf() #' -#' Writes data to worksheet conditionally +#' @description A wrapper around openxlsx::writeData conditioned on the result of +#' condition_fun(x). By default, `condition_fun <- function(x) !is.null(x)` is +#' used to verify that the input is not NULL. +#' #' @param wb Workbook object +#' #' @param sheet Sheetname +#' #' @param x Input to be written to worksheet +#' #' @param xy Position where input should be written to -#' @param condition_fun A function which returns a boolean and takes x as input. Default: function(x) !is.null(x) +#' +#' @param condition_fun A function which returns a boolean and takes x as input. +#' Default: function(x) !is.null(x) +#' #' @keywords internal #' @noRd #' writeDataIf <- function(wb, sheet, x, xy, condition_fun = function(x) !is.null(x)){ + if (condition_fun(x)){ openxlsx::writeData(wb, sheet, x, xy = xy) } else { @@ -45,6 +61,7 @@ writeDataIf <- function(wb, sheet, x, xy, condition_fun = function(x) !is.null(x } } +#----------------- #' prep_filename() #' #' Ensure that file extension is added to filename. @@ -63,13 +80,19 @@ prep_filename <- function(filename, extension = ".xlsx"){ return(filename) } +#----------------- #' prep_source() #' -#' Concatenate sources +#' @description Concatenate vector of sources into a formatted string +#' #' @param source A character vector with source information +#' #' @param prefix A character string with the prefix. Default: "Quelle: " +#' #' @param sep A character string with the separator for sources. Default: ";" +#' #' @returns A character string +#' #' @keywords internal #' @noRd #' @@ -90,11 +113,16 @@ prep_source <- function(source, prefix = "Quelle: ", sep = ";"){ #------------------- #' prep_metadata() #' -#' Concatenate metadata +#' @description Concatenate metadata into a formatted string. +#' #' @param metadata A character vector with metadata information +#' #' @param extension A character string with the prefix. Default: "Metadaten: ". +#' #' @param sep A character string with the separator for metadata. Default: ";" +#' #' @returns A character string +#' #' @keywords internal #' @noRd #' @@ -112,9 +140,11 @@ prep_metadata <- function(metadata, prefix = "Metadaten: ", sep = ";"){ #----------------- #' prep_logo() #' -#' Replace default values "zh" and "statzh" with the file path to the -#' respective logo, otherwise returns the input value. +#' @description Replace default values "zh" and "statzh" with the file path to +#' the respective logo (included in /extdata), otherwise returns the input value. +#' #' @param logo A character string with the file path +#' #' @returns A character string #' @keywords internal #' @noRd @@ -155,18 +185,20 @@ prep_contact <- function(contact, compact = FALSE){ } #----------------- -#' prep_contact() +#' prep_openinghours() +#' +#' @description Replace default values "zh" and "statzh" with the opening hours +#' of the Statistics Office of Canton Zurich, otherwise returns +#' the input value. +#' +#' @param openinghours A character vector with opening hours. #' -#' Replace default values "zh" and "statzh" with the contact information of -#' the Statistics Office of Canton Zurich, otherwise returns the input value. -#' @note -#' Raises a warning if the input has more than 3 elements. -#' @param contact A character vector with contact information #' @returns A character vector #' @keywords internal #' @noRd #' prep_openinghours <- function(openinghours){ + if (openinghours == "statzh"){ openinghours <- statzh_openinghours } @@ -177,17 +209,23 @@ prep_openinghours <- function(openinghours){ #----------------- #' prep_homepage() #' -#' Replace default values "zh" and "statzh" with the homepage of -#' the Statistics Office of Canton Zurich, otherwise returns the input value. -#' @note -#' Converts input to 'hyperlink' object. +#' @description Replace default values "zh" and "statzh" with the homepage of +#' the Statistics Office of Canton Zurich, otherwise returns the input value. +#' +#' @note Converts input to 'hyperlink' object if as_hyperlink is TRUE (default). +#' #' @param homepage A character string -#' @param as_hyperlink A boolean, controls whether input is converted to 'hyperlink'. Default: TRUE -#' @returns A character string or a 'hyperlink' object depending on the value of as_hyperlink. +#' +#' @param as_hyperlink A boolean, controls whether input is converted to +#' 'hyperlink'. Default: TRUE +#' +#' @returns A character string or a 'hyperlink' object depending on the value of +#' as_hyperlink. #' @keywords internal #' @noRd #' prep_homepage <- function(homepage, as_hyperlink = TRUE){ + if (homepage == "statzh"){ homepage <- statzh_homepage } @@ -210,6 +248,7 @@ prep_homepage <- function(homepage, as_hyperlink = TRUE){ #' @noRd #' prep_creationdate <- function(prefix = "Erstellt am:", date_format = "%d.%m.%Y"){ + creation_date <- format(Sys.Date(), format = date_format) return(paste(prefix, creation_date)) } @@ -224,5 +263,6 @@ prep_creationdate <- function(prefix = "Erstellt am:", date_format = "%d.%m.%Y") #' @noRd #' prep_orderid <- function(order_id, prefix = "Auftragsnr.:"){ + return(paste(prefix, order_id)) } diff --git a/R/quickXLSX.R b/R/quickXLSX.R index e12a653..e9dc14c 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -1,13 +1,16 @@ #' quickXLSX() #' -#' Function to export data from R to a formatted .xlsx-spreadsheet. -#' @description -#' A short description... -#' @note -#' Will be deprecated in upcoming version. +#' @description Function to export data from R to a formatted .xlsx-spreadsheet. +#' +#' @note Will be deprecated in upcoming version. +#' #' @param data data to be exported. -#' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. +#' +#' @param file file name of the xlsx-file. The extension ".xlsx" is added +#' automatically. +#' #' @param title title to be put above the data in the worksheet. + #' @template shared_parameters #' @keywords quickXLSX #' @export @@ -26,32 +29,20 @@ #' logo = "statzh", #' author = "user") #' - -quickXLSX <- function( - data = NA, - file, - title = "Title", - source = "statzh", - metadata = NA, - logo = "statzh", - grouplines = FALSE, - contactdetails = "statzh", - author = "user" -){ +quickXLSX <- function(data = NA, file, title = "Title", source = "statzh", + metadata = NA, logo = "statzh", grouplines = FALSE, + contactdetails = "statzh", author = "user"){ warning("Deprecation") - #create workbook - wb <- openxlsx::createWorkbook(paste(file)) + # Create workbook + wb <- openxlsx::createWorkbook() - #insert data + # Insert data insert_worksheet(data = data, wb, title = title, source = source, metadata = metadata, logo = logo, grouplines = grouplines, contactdetails = contactdetails, author = author) #save workbook - openxlsx::saveWorkbook(wb, prep_filename(file), - overwrite = TRUE) - - + openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) } diff --git a/R/quick_sum.r b/R/quick_sum.r index f0f821e..f90e575 100644 --- a/R/quick_sum.r +++ b/R/quick_sum.r @@ -1,29 +1,45 @@ #' quick_sum() #' -#' Function for simple (grouped) descriptive analyses. +#' @description Function for simple (grouped) descriptive analyses. #' -#' If stats is set to "all" (the default), the following descriptive statistics are computed per category of the grouping variable(s): mean, standard deviation, -#' 10\%-quantile, 25\%-quantile, median, 75\%-quantile, 90\%-quantile. -#' If stats is set to "base", the mean, 25\%-quantile, median, and 75\%-quantile are returned. -#' stats = "mean" computes the mean and the standard deviation. +#' @details If stats is set to "all" (the default), the following descriptive +#' statistics are computed per category of the grouping variable(s): mean, +#' standard deviation, 10\%-quantile, 25\%-quantile, median, 75\%-quantile, +#' 90\%-quantile. #' -#' If protect is set to TRUE, the mean and the median is only computed for variables/variable categories with four or more observations. For <4 observations, the function returns NA for the respective variable/category. The other descriptives are only computed if there are at least 6 observations per variable (category). +#' If stats is set to "base", the mean, 25\%-quantile, median, and 75\%-quantile +#' are returned. +#' +#' stats = "mean" computes the mean and the standard deviation. +#' +#' If protect is set to TRUE, the mean and the median is only computed for +#' variables/variable categories with four or more observations. For <4 +#' observations, the function returns NA for the respective variable/category. +#' The other descriptives are only computed if there are at least 6 observations +#' per variable (category). #' #' @param df dataframe +#' #' @param var variables to be aggregated +#' #' @param ... grouping variables -#' @param stats Which descriptive statistics should be computed? Can be "all", "base", or "mean". See details. +#' +#' @param stats Which descriptive statistics should be computed? Can be "all", +#' "base", or "mean". See details. +#' #' @param protect Apply data protection, can be TRUE or FALSE. See details. +#' #' @keywords quick_sum +#' #' @importFrom dplyr ungroup summarize group_by n #' @importFrom stats median quantile sd #' @importFrom rlang := +#' #' @export -#' @examples #' +#' @examples #' quick_sum(df=mtcars, var=cyl, mpg, vs, stats="all", protect=FALSE) - - +#' quick_sum <- function(df, var, ..., stats = "all", protect = FALSE){ if (!stats %in% c("mean", "base", "all")){ stop("Please choose one of the following stats arguments: all, base, mean") diff --git a/R/splitXLSX.R b/R/splitXLSX.R index fa9094e..f8b5bce 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -1,16 +1,24 @@ +#' #' splitXLSX() #' -#' Function to export data from R as formatted .xlsx-file and spread them over several worksheets -#' based on a grouping variable (e.g., year). -#' @description -#' A short description... -#' @note -#' May be deprecated in upcoming version. User should make sure that the grouping variable is of -#' binary, categorical or other types with a limited number of levels. +#' @description Function to export data from R as formatted .xlsx-file and spread +#' them over several worksheets based on a grouping variable (e.g., year). +#' +#' @note May be deprecated in upcoming version. User should make sure that the +#' grouping variable is of binary, categorical or other types with a limited +#' number of levels. +#' #' @param data data to be exported. -#' @param file file name of the output .xlsx-file. The extension is added automatically. -#' @param sheetvar name of the variable used to split the data and spread them over several sheets. -#' @param title title to be put above the data in the worksheet. the sheetvar subcategory is added in brackets. +#' +#' @param file file name of the output .xlsx-file. The extension is added +#' automatically. +#' +#' @param sheetvar name of the variable used to split the data and spread them +#' over several sheets. +#' +#' @param title title to be put above the data in the worksheet. the sheetvar +#' subcategory is added in brackets. +#' #' @template shared_parameters #' @keywords splitXLSX #' @export @@ -35,39 +43,28 @@ splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", metadata = NA, logo = "statzh", grouplines = FALSE, contactdetails = "statzh", author = "user"){ warning("Deprecation") - data <- as.data.frame(data) - - # extract column name - col_name <- rlang::enquo(sheetvar) # create workbook wb <- openxlsx::createWorkbook() # get values of the variable that is used to split the data + data <- as.data.frame(data) + sheettitle <- paste0(title, " (", deparse(substitute(sheetvar)), ": ", + sheetvalue, ")") sheetvalues <- unique(data[, c(deparse(substitute(sheetvar)))]) + col_name <- rlang::enquo(sheetvar) # loop to split values of the variable used to split the data for (sheetvalue in sheetvalues) { - - # get data into worksheets - insert_worksheet(as.data.frame(data %>% dplyr::filter((!!col_name) == - sheetvalue) %>% ungroup()), - wb, - sheetname = sheetvalue, - #shared params - title = paste0(title, " (", deparse(substitute(sheetvar)), ": ", sheetvalue, ")"), - source = source, - metadata = metadata, - logo = logo, - grouplines = grouplines, - contactdetails = contactdetails, - author = author) - - + data %>% + dplyr::filter((!!col_name) == sheetvalue) %>% + dplyr::ungroup() %>% + insert_worksheet(wb, sheetname = sheetvalue, title = sheettitle, + source = source, metadata = metadata, logo = logo, + grouplines = grouplines, contactdetails = contactdetails, + author = author) } - # -------------- - openxlsx::worksheetOrder(wb) <- rev(openxlsx::worksheetOrder(wb)) #save xlsx diff --git a/R/styles.R b/R/styles.R index db40848..20f23b7 100644 --- a/R/styles.R +++ b/R/styles.R @@ -26,8 +26,12 @@ style_subtitle2 <- function(){ openxlsx::createStyle(fontSize = 12, textDecoration = "bold", fontName = "Arial") } +style_subtitle3 <- function(){ + openxlsx::createStyle(fontSize = 12, textDecoration = "italic", fontName = "Arial") +} + hyperlinkStyle <- function(){ - openxlsx::createStyle(fontName = "Calibri", fontSize = 11, fontColour = "blue", + openxlsx::createStyle(fontSize = 11, fontName = "Calibri", fontColour = "blue", textDecoration = "underline") } @@ -36,15 +40,22 @@ style_header <- function(){ halign = "left", border="Bottom", borderColour = "#009ee0", textDecoration = "bold") } + +# Linien -------------- style_headerline <- function(){ openxlsx::createStyle(border = "Bottom", borderColour = "#009ee0", borderStyle = getOption("openxlsx.borderStyle", "thick")) } +style_bottomline <- function(){ + openxlsx::createStyle(border="Bottom", borderColour = "#009ee0") +} + style_leftline <- function(){ openxlsx::createStyle(border = "Left", borderColour = "#009ee0") } +# Linewrap text --------- style_wrap <- function() { openxlsx::createStyle(wrapText = TRUE) } From fcb8cbdd6a79514d0cade504052357e5aac54569 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Mon, 15 May 2023 16:00:53 +0000 Subject: [PATCH 30/74] Daily commit; reorganized insert_worksheet() for better legibility --- R/insert_hyperlinks.R | 11 +-- R/insert_metadata_sheet.R | 16 +--- R/insert_worksheet.R | 160 +++++++++++++++++--------------------- R/process_input.R | 27 ++++++- R/quickXLSX.R | 1 - R/splitXLSX.R | 1 - 6 files changed, 105 insertions(+), 111 deletions(-) diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index 09e314a..ecfdcaa 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -13,15 +13,12 @@ #' @keywords internal #' insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ - openxlsx::writeData(wb, sheet = "Inhalt", x = title, - xy = c("C", sheet_row)) + openxlsx::writeData(wb, sheet = "Inhalt", x = title, xy = c("C", sheet_row)) - openxlsx::addStyle(wb, sheet = "Inhalt", - style = hyperlinkStyle(), rows = sheet_row, - cols = 3) + openxlsx::addStyle(wb, sheet = "Inhalt", style = hyperlinkStyle(), + rows = sheet_row, cols = 3) - openxlsx::mergeCells(wb, sheet = "Inhalt", cols = 3:8, - rows = sheet_row) + openxlsx::mergeCells(wb, sheet = "Inhalt", rows = sheet_row, cols = 3:8) worksheet <- wb$sheetOrder[1] diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index e84e241..bde8019 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -58,24 +58,12 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", openxlsx::writeData(wb, sheet = sheetname, x = prep_metadata(metadata, prefix = NULL), startRow = 13) - ### User ----------- - if (author == "user"){ - # for the local R setup - if (Sys.getenv("USERNAME") != "") { - contactperson <- stringr::str_sub(Sys.getenv("USERNAME"), start = 6, end = 7) - } else { - # for the R server setup - contactperson <- stringr::str_sub(Sys.getenv("USER"), start = 6, end = 7) - } - } else { - contactperson <- author - } - ### Aktualisierungsdatum -------- openxlsx::writeData(wb, sheet = sheetname, x = paste(prep_creationdate(prefix = "Aktualisiert am:"), - "durch:", contactperson), startRow = 5, startCol = 12) + "durch:", prep_username(author)), + startRow = 5, startCol = 12) ## Format diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index e255c71..2781016 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -1,11 +1,10 @@ #' insert_worksheet() #' -#' @description Function to add formatted worksheets to an existing -#' .xlsx-workbook. +#' @description Function to insert a formatted worksheet into an existing +#' Workbook object. #' -#' @note Marked for deprecation in upcoming version. The function does not write -#' the result into a .xlsx file. A separate call to openxlsx::saveWorkbook() is -#' required. +#' @note The function does not write the result into a .xlsx file. +#' A separate call to openxlsx::saveWorkbook() is required. #' #' @param data data to be included. #' @@ -47,132 +46,119 @@ insert_worksheet <- function(data, workbook, sheetname = "data", title = "Title" grouplines = FALSE, contactdetails = "statzh", author = "user"){ - # Check length of sheetname + # Process input (substitute default values) ----- sheetname <- check_sheetname(sheetname) + source <- prep_source(source) + metadata <- prep_metadata(metadata) + logo <- prep_logo(logo) + contactdetails <- prep_contact(contactdetails) + creationdate <- prep_creationdate("Aktualisiert am") + author <- prep_username(author) - # Add worksheet - openxlsx::addWorksheet(workbook, sheetname) + # Determine start/end rows of content blocks ----- + contact_start_row <- 2 + contact_end_row <- contact_start_row + length(contactdetails) + title_start_row <- contact_end_row + 2 + metadata_start_row <- title_start_row + 1 + source_start_row <- metadata_start_row + length(metadata) + source_end_row <- source_start_row + length(source) + data_start_row <- source_end_row + 3 + data_end_row <- data_start_row + nrow(data) - # Process input ---------- - ## Contactdetails & position - contactdetails <- prep_contact(contactdetails, compact = TRUE) - contact_pos <- max(ncol(data) - 2, 4) + # Determine column boundaries ------- + + contact_start_col <- max(ncol(data) - 2, 4) + contact_end_col <- 26 + + # Initialize new worksheet ------ + openxlsx::addWorksheet(workbook, sheetname) - ## Source information - source <- prep_source(source) - ## Metadata + # Insert logo, contact info, title, metadata, and sources into worksheet -------- - if (any(is.na(metadata))) { - remarks <- "Bemerkungen:" - } else if (any(metadata == "HAE")) { - remarks <- "Die Zahlen der letzten drei Jahre sind provisorisch." + ### Logo + if (!is.null(logo) && file.exists(logo)){ + openxlsx::insertImage(workbook, sheet = "Inhalt", file = logo, + width = 2.145, height = 0.7865, units = "in") } else { - remarks <- metadata + message("no logo found.") } - #-------- - # Insert content + ### Contact information + purrr::walk(contact_start_row:contact_end_row, + ~openxlsx::mergeCells(wb, sheet = sheetname, + cols = contact_start_col:contact_end_col, + rows = .)) - ## Logo - if (!is.null(logo)){ - logo <- prep_logo(logo) + openxlsx::writeData(wb, sheet = sheetname, x = contactdetails, + startCol = contact_start_col, startRow = contact_start_row, + headerStyle = style_wrap()) - if (file.exists(logo)){ - openxlsx::insertImage(workbook, sheet = "Inhalt", file = logo, width = 2.145, - height = 0.7865, units = "in") - } else { - message("no logo found.") - } - } - ## Titel - openxlsx::writeData(workbook, sheet = sheetname, x = title, startRow = 7, + ### Creation date + openxlsx::writeData(wb, sheet = sheetname, x = paste(creationdate, author), + startCol = contact_start_col, startRow = contact_end_row + 1, + headerStyle = style_subtitle3()) + + ### Title + openxlsx::writeData(workbook, sheet = sheetname, x = title, startRow = title_start_row, headerStyle = style_title()) - n_metadata <- length(metadata) - datenbereich <- 9 + n_metadata + 3 - openxlsx::writeData(workbook, sheet = sheetname, x = metadata, startRow = 8, + ### Metadata + openxlsx::writeData(workbook, sheet = sheetname, x = metadata, startRow = metadata_start_row, headerStyle = style_subtitle3()) - ### Quelle - openxlsx::writeData(workbook, sheet = sheetname, x = source, startRow = 8 + n_metadata, + ### Source + openxlsx::writeData(workbook, sheet = sheetname, x = source, startRow = source_start_row, headerStyle = style_subtitle3()) - # Metadaten zusammenmergen - purrr::walk(7:(7 + length(metadata) + length(source)), - ~openxlsx::mergeCells(wb, sheet = sheetname, cols = 1:26, rows = .)) + ### Merge cells with title, metadata, and sources to ensure that they're displayed properly + purrr::walk(title_start_row:source_end_row, + ~openxlsx::mergeCells(wb, sheet = sheetname, + cols = 1:contact_end_col, rows = .)) - ### Contact information - purrr::walk(2:5, ~openxlsx::mergeCells(wb, sheet = sheetname, - cols = contact_pos:26, rows = .)) - - openxlsx::writeData(wb, sheet = sheetname, x = contactdetails, - startCol = contact_pos, startRow = 2, headerStyle = style_wrap()) - - ### Aktualisierungsdatum - - # User-K\u00fcrzel f\u00fcr Kontaktinformationen - if(author == "user"){ - # f\u00fcr das lokale R - if(Sys.getenv("USERNAME")!="") { - contactperson <- stringr::str_sub(Sys.getenv("USERNAME"), start = 6, end = 7) - } else { - # f\u00fcr den R-server - contactperson <- stringr::str_sub(Sys.getenv("USER"), start = 6, end = 7) - } - } else { - contactperson <- author - } - - openxlsx::writeData(wb, sheet = sheetname, - x = paste(prep_creationdate("Aktualisiert am"), - "durch:", contactperson), - startCol = contact_pos, startRow = 5, - headerStyle = style_subtitle3()) # Insert data -------- - ## increase width of colnames for better auto-fitting of column width + ### Pad colnames using whitespaces for better auto-fitting of column width colnames(data) <- paste0(colnames(data), " ", sep = "") + ### Write data openxlsx::writeData(wb, sheet = sheetname, x = as.data.frame(data %>% dplyr::ungroup()), - startRow = datenbereich, rowNames = FALSE, - withFilter = FALSE) + startRow = data_start_row, + rowNames = FALSE, withFilter = FALSE) - #----------------------- - # Apply styles - ## Title + # Apply styles ------- + + ### Title openxlsx::addStyle(wb, sheet = sheetname, style = style_title(), - rows = 7, cols = 1, gridExpand = TRUE) + rows = title_start_row, cols = 1, gridExpand = TRUE) - ## Data header + ### Data header openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), - rows = datenbereich, cols = 1:ncol(data), + rows = data_start_row, cols = 1:ncol(data), gridExpand = TRUE, stack = TRUE) - ## Headerline + ### Headerline openxlsx::addStyle(wb, sheet = sheetname, style = style_headerline(), - rows = 5, cols = 1:ncol(data), gridExpand = TRUE, + rows = contact_end_row, cols = 1:ncol(data), gridExpand = TRUE, stack = TRUE) - ## Grouplines + ### Grouplines if (!is.null(grouplines)){ - datenbereich_end <- nrow(data) + datenbereich - openxlsx::addStyle(wb, sheet = sheetname, style = style_leftline(), - rows = datenbereich:datenbereich_end, - cols = grouplines, gridExpand = TRUE, stack = TRUE) + rows = data_start_row:data_end_row, cols = grouplines, + gridExpand = TRUE, stack = TRUE) } - ## minmale Spaltenbreite definieren + ### Define minimum column width options("openxlsx.minWidth" = 5) - ## automatische Zellenspalten + ### Use automatic columnwidth for columns with data openxlsx::setColWidths(wb, sheet = sheetname, cols = 1:ncol(data), widths = "auto", ignoreMergedCells = TRUE) } diff --git a/R/process_input.R b/R/process_input.R index 8a5ffbb..41d0f0a 100644 --- a/R/process_input.R +++ b/R/process_input.R @@ -96,7 +96,7 @@ prep_filename <- function(filename, extension = ".xlsx"){ #' @keywords internal #' @noRd #' -prep_source <- function(source, prefix = "Quelle: ", sep = ";"){ +prep_source <- function(source){ # Replace "statzh" entries source <- sub("statzh", statzh_name, source) @@ -266,3 +266,28 @@ prep_orderid <- function(order_id, prefix = "Auftragsnr.:"){ return(paste(prefix, order_id)) } + + +#----------------- +#' prep_username() +#' +#' @param author Name of author +#' @returns A character string with the username +#' @keywords internal +#' @noRd +#' +prep_username <- function(author){ + + if (author != "user"){ + return(author) + } + + if(Sys.getenv("USERNAME") != ""){ + author <- stringr::str_sub(Sys.getenv("USERNAME"), start = 6, end = 7) + + } else { + author <- stringr::str_sub(Sys.getenv("USER"), start = 6, end = 7) + } + + return(author) +} diff --git a/R/quickXLSX.R b/R/quickXLSX.R index e9dc14c..ea47cdd 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -33,7 +33,6 @@ quickXLSX <- function(data = NA, file, title = "Title", source = "statzh", metadata = NA, logo = "statzh", grouplines = FALSE, contactdetails = "statzh", author = "user"){ - warning("Deprecation") # Create workbook wb <- openxlsx::createWorkbook() diff --git a/R/splitXLSX.R b/R/splitXLSX.R index f8b5bce..1906fce 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -42,7 +42,6 @@ splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", metadata = NA, logo = "statzh", grouplines = FALSE, contactdetails = "statzh", author = "user"){ - warning("Deprecation") # create workbook wb <- openxlsx::createWorkbook() From cadbdd03a98f3b117033daf423ae2f891f6ca34e Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Tue, 16 May 2023 16:35:58 +0000 Subject: [PATCH 31/74] Simplified and cleaned up functions; renamed and reworked helper functions --- R/aXLSX.R | 18 +-- R/datasetsXLSX.R | 28 ++-- R/helper.R | 222 +++++++++++++++++++++++++++++ R/insert_index_sheet.R | 94 +++++++----- R/insert_metadata_sheet.R | 76 +++++----- R/insert_worksheet.R | 97 +++++-------- R/insert_worksheet_nh.R | 104 +++++--------- R/process_input.R | 293 -------------------------------------- R/quickXLSX.R | 15 +- R/splitXLSX.R | 18 +-- R/statzh_info.R | 8 +- 11 files changed, 420 insertions(+), 553 deletions(-) create mode 100644 R/helper.R delete mode 100644 R/process_input.R diff --git a/R/aXLSX.R b/R/aXLSX.R index f3da124..bf4f688 100644 --- a/R/aXLSX.R +++ b/R/aXLSX.R @@ -3,19 +3,12 @@ #' @description Function to export data from R to a formatted .xlsx-file. The #' data is exported to the first sheet. Metadata information is exported to #' the second sheet. -#' #' @param data data to be exported. -#' #' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. -#' #' @param title title to be put above the data in the worksheet. -#' #' @template shared_parameters -#' #' @keywords aXLSX -#' #' @export -#' #' @examples #' dataset <- mtcars #' source_string <- paste("Source: Henderson and Velleman (1981).", @@ -43,19 +36,18 @@ aXLSX <- function(data, file, title = "Title", source = "statzh", metadata = NA, logo = "statzh", grouplines = NA, contactdetails = "statzh", author = "user"){ - ## Initialize Workbook object + # Initialize Workbook object ------- wb <- openxlsx::createWorkbook() - ## Content - ### insert data ----- + # Insert data ----- insert_worksheet_nh(data, wb, title = title, source = source, metadata = NA, grouplines = grouplines) - ### insert metadata ------- + # Insert metadata ------- insert_metadata_sheet(wb, title = title, source = source, metadata = metadata, logo = logo, contactdetails = contactdetails, author = author) - ## Write workbook to disk - openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) + # Write workbook to disk -------- + openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) } diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index 2faa5ca..fcc8d6c 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -130,11 +130,14 @@ datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, stop("if a second header is wanted, the grouplines have to be specified") } + # Initialize new Workbook ------ wb <- openxlsx::createWorkbook() - # Determine which elements of input list datasets correspond to dataframes. + + # Determine which elements of input list datasets correspond to dataframes. ------- dataframes_index <- which(vapply(datasets, is.data.frame, TRUE)) + # Index from input lists using dataframes_index ----------- dataframe_datasets <- datasets[dataframes_index] dataframe_sheetnames <- sheetnames[dataframes_index] dataframe_titles <- titles[dataframes_index] @@ -145,21 +148,21 @@ datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, # Determine which elements of datasets correspond to objects of type gg, - # ggplot, histogram, or character (path input). + # ggplot, histogram, or character (path input). -------- plot_index <- which(vapply(datasets, function(x){ length(setdiff(class(x), c("gg", "ggplot", "histogram", "character"))) == 0 }, TRUE)) + # Index from input lists using plot_index ------- plot_datasets <- datasets[plot_index] plot_sheetnames <- sheetnames[plot_index] - # Insert the initial index sheet - insert_index_sheet(wb, logo, contact, homepage, openinghours, titlesource, - auftrag_id, maintitle) + # Insert the initial index sheet ---------- + insert_index_sheet(wb, logo, contact, homepage, openinghours, titlesource, auftrag_id, maintitle) - # Iterate along dataframes_index + # Insert datasets according to dataframes_index ------- if(length(dataframes_index) > 0){ list( dataframe_datasets, @@ -182,7 +185,8 @@ datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, group_names = ..7)) } - # Iterate along plot_index + + # Insert images according to plot_index -------- if (length(plot_index) > 0){ list( plot_datasets, @@ -199,11 +203,12 @@ datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, height = ..4)) } - # Create a table of hyperlinks + + # Create a table of hyperlinks in index sheet (assumed to be "Index") ------ data.frame( sheetnames = sheetnames, titles = titles, - sheet_row = c(seq(15,15+length(sheetnames)-1)) + sheet_row = c(seq(15, 15 + length(sheetnames) - 1)) ) %>% purrr::pwalk( ~insert_hyperlinks( @@ -212,6 +217,7 @@ datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, title = ..2, sheet_row = ..3)) - # Save workbook at path denoted by argument file - openxlsx::saveWorkbook(wb, file = prep_filename(file), overwrite = overwrite) + + # Save workbook at path denoted by argument file --------- + openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = overwrite) } diff --git a/R/helper.R b/R/helper.R new file mode 100644 index 0000000..507c161 --- /dev/null +++ b/R/helper.R @@ -0,0 +1,222 @@ +#' verifyInputSheetname() +#' +#' @description Function which truncates a sheetname to 31 characters +#' @details MS Excel imposes a character limit of 31 characters for names of +#' worksheets. This function truncates sheetnames accordingly and notify the +#' user via a message. +#' @param sheetname A character string with the name for an XLSX worksheet +#' @returns A character string +#' @keywords internal +#' @noRd +verifyInputSheetname <- function(sheetname){ + if (nchar(sheetname) > 31){ + message("sheetname truncated at 31 characters to satisfy MS-Excel limit.") + } + + return(substr(sheetname, 0, 31)) +} + + +#' verifyInputFilename() +#' +#' @description Function which adds a file extension to a filename if missing . +#' @param filename A character string with the filename +#' @param extension A character string with the file extension. Defaults to ".xlsx" +#' @returns A character string +#' @keywords internal +#' @noRd +verifyInputFilename <- function(filename, extension = ".xlsx"){ + regex_pattern <- paste0(extension,"$") + paste0(gsub(regex_pattern, "", filename), extension) +} + + +#' verifyDataUngrouped() +#' +#' @description Function which checks if a data.frame is a grouped_df, in which +#' case it calls dplyr::ungroup(). +#' @param data A character string with the filename +#' @returns A data.frame +#' @keywords internal +#' @noRd +verifyDataUngrouped <- function(data){ + if (!dplyr::is_grouped_df(data)){ + return(data) + } + + return(dplyr::ungroup(data)) +} + +#' inputHelperSource() +#' +#' @description Substitute default value "statzh" with official title +#' @param source A character vector with source information +#' @param prefix A character string giving prepended to the sources +#' @param collapse Separator for collapsing multiple sources with +#' @returns A character string +#' @keywords internal +#' @noRd +#' +inputHelperSource <- function(source, prefix = NULL, collapse = NULL){ + source <- sub("statzh", statzh_name, source) + + if (all(is.na(source))){ + return(source) + } + + if (!is.null(collapse)){ + return(paste0(prefix, paste0(source, collapse = collapse))) + } + + return(c(prefix, source)) +} + + +#' inputHelperMetadata() +#' +#' @description Concatenate metadata into a formatted string. +#' @param metadata A character vector with metadata information +#' @param extension A character string with the prefix. Default: "Metadaten: ". +#' @param collapse A character string with the separator for metadata. Default: ";" +#' @returns A character vector if +#' @keywords internal +#' @noRd +inputHelperMetadata <- function(metadata, prefix = NULL, collapse = NULL){ + + if (all(is.na(metadata))){ + return(metadata) + } + + if (!is.null(collapse)){ + return(paste0(prefix, paste0(metadata, collapse = collapse))) + } + + return(c(prefix, metadata)) +} + + +#' inputHelperLogoPath() +#' +#' @description Replace default values "zh" and "statzh" with the file path to +#' the respective logo (included in /extdata), otherwise returns the input value. +#' @param logo A character string with the file path +#' @returns A character string +#' @keywords internal +#' @noRd +inputHelperLogoPath <- function(logo){ + if (is.null(logo)){ + message("No logo added.") + + } else if (logo == "statzh"){ + logo <- paste0(find.package("statR"), "/extdata/", statzh_logo) + + } else if (logo == "zh"){ + logo <- paste0(find.package("statR"), "/extdata/", zh_logo) + } + + return(logo) +} + + +#' inputHelperContactInfo() +#' +#' @description Replaces default value "statzh" with the contact information of +#' the Statistics Office of Canton Zurich, otherwise returns the input value. +#' @param contact A character vector with contact information +#' @param compact A boolean which controls the format of the contact information. Default: FALSE +#' @returns A character vector +#' @keywords internal +#' @noRd +inputHelperContactInfo <- function(contact, compact = FALSE){ + + if (contact == "statzh"){ + contact <- ifelse(compact, statzh_contact_compact, statzh_contact) + } + + return(contact) +} + + +#' inputHelperOfficeHours() +#' +#' @description Replace default value "statzh" with the office hours +#' of the Statistics Office of Canton Zurich, otherwise returns +#' the input value. +#' @param openinghours A character vector with opening hours. +#' @returns A character vector +#' @keywords internal +#' @noRd +#' +inputHelperOfficeHours <- function(openinghours){ + if (openinghours == "statzh"){ + openinghours <- statzh_openinghours + } + + return(openinghours) +} + + +#' inputHelperHomepage() +#' +#' @description Replace default values "zh" and "statzh" with the homepage of +#' the Statistics Office of Canton Zurich, otherwise returns the input value. +#' @note Converts input to 'hyperlink' object. +#' @param homepage A character string +#' @returns A character string or a 'hyperlink' object +#' @keywords internal +#' @noRd +#' +inputHelperHomepage <- function(homepage){ + sub("statzh", statzh_homepage, homepage) + class(homepage) <- 'hyperlink' + + return(homepage) +} + + +#' înputHelperDateCreated() +#' +#' @description Returns current date as a string with format specified by date_format +#' @param prefix A Prefix to prepend to the date. Default to NULL +#' @param date_format A character string for the date_format. Default: "%d.%m.%Y". +#' @returns A character vector +#' @keywords internal +#' @seealso format +#' @noRd +inputHelperDateCreated <- function(prefix = NULL, date_format = "%d.%m.%Y"){ + paste0(prefix, format(Sys.Date(), format = date_format)) +} + + +#' înputHelperOrderNumber() +#' +#' @description Returns current date as a string with format specified by date_format +#' @param prefix A Prefix to prepend to the date. Default to NULL +#' @returns A character vector +#' @keywords internal +#' @seealso format +#' @noRd +inputHelperOrderNumber <- function(order_num, prefix = NULL){ + paste0(prefix, order_num) +} + +#' inputHelperAuthorName() +#' +#' @description Function extracts initials from global environment if +#' input is 'user', otherwise passes on the input. +#' @param author Name of author +#' @param prefix A character string to prepend to the result +#' @returns A character string with the username +#' @keywords internal +#' @noRd +#' +inputHelperAuthorName <- function(author, prefix = NULL){ + if (author == "user"){ + sys_vals <- c(Sys.getenv("USERNAME"), Sys.getenv("USER")) + author_name <- sys_vals[which(sys_vals != "")[1]] + author <- stringr::str_sub(author_name, start = 6, end = 7) + } + + return(paste0(prefix, author)) +} + diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index 5c3c54c..34acd3b 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -13,54 +13,72 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, titlesource, auftrag_id, maintitle){ - ## Create index sheet - openxlsx::addWorksheet(wb, sheetName = "Inhalt") + # Hardcoded ---------- + index_sheet_name <- "Inhalt" + toc_caption <- "Inhalt" - ## Insert content - ### Logo ------------- + # Initialize new worksheet as index sheet ------ + openxlsx::addWorksheet(wb, index_sheet_name) + + + # Process input (substitute default values) ----- + contactdetails <- inputHelperContactInfo(contactdetails) + + + # Determine start/end rows of content blocks ----- + contact_start_row <- 2 + contact_end_row <- contact_start_row + length(c(contact, homepage)) + request_start_row <- contact_end_row + 2 + title_start_row <- request_start_row + 2 + source_start_row <- title_start_row + 1 + index_start_row <- source_start_row + 2 + + + # Insert logo ---------- + logo <- inputHelperLogoPath(logo) + if (!is.null(logo)){ - logo <- prep_logo(logo) - - if (file.exists(logo)){ - openxlsx::insertImage(wb, sheet = "Inhalt", file = logo, width = 2.145, - height = 0.7865, units = "in") - } else { - message("no logo found.") - } + openxlsx::insertImage(wb, index_sheet_name, logo, 2.145, 0.7865, "in") } - ### Contact information --------- - writeDataIf(wb, sheet = "Inhalt", x = prep_contact(contact), xy = c("O", 2)) - writeDataIf(wb, sheet = "Inhalt", x = prep_homepage(homepage), xy = c("O", 5)) - writeDataIf(wb, sheet = "Inhalt", x = prep_openinghours(openinghours), - xy = c("R", 2)) - ### Request information ----------- - openxlsx::writeData(wb, sheet = "Inhalt", x = prep_creationdate(), xy = c("O", 8)) - writeDataIf(wb, sheet = "Inhalt", x = prep_orderid(auftrag_id), xy = c("O", 9)) + # Insert contact info, title, metadata, and sources into worksheet -------- + + ### Contact information + contact_info <- c(contact, inputHelperHomepage(homepage)) + openxlsx::writeData(wb, index_sheet_name, contact_info, xy = c("O", contact_start_row)) - ### Title, sources, and content caption ------------- - openxlsx::writeData(wb, sheet = "Inhalt", x = maintitle, - headerStyle = mainTitleStyle(), xy = c("C", 10)) - writeDataIf(wb, sheet = "Inhalt", x = prep_source(titlesource), xy = c("C", 11)) - openxlsx::writeData(wb, sheet = "Inhalt", x = "Inhalt", headerStyle = subtitleStyle(), xy = c("C", 13)) + ### Office hours + openxlsx::writeData(wb, index_sheet_name, inputHelperOfficeHours(openinghours), xy = c("R", contact_start_row)) + ### Request information + request_info <- c(inputHelperDateCreated(prefix = "Erstellt am: "), + inputHelperOrderNumber(auftrag_id, prefix = "Auftragsnr.:")) - ## Format - #----------------- + openxlsx::writeData(wb, index_sheet_name, request_info, xy = c("O", request_start_row)) - ### Set column width of first column to 1 and hide gridlines - openxlsx::setColWidths(wb, sheet = "Inhalt", cols = 1, widths = 1) - openxlsx::showGridLines(wb, sheet = "Inhalt", showGridLines = FALSE) + ### Title + openxlsx::writeData(wb, index_sheet_name, maintitle, xy = c("C", title_start_row)) + openxlsx::addStyle(wb, index_sheet_name, style_maintitle(), title_start_row, 3) + + ### Source + openxlsx::writeData(wb, index_sheet_name, source, xy = c("C", source_start_row)) + + ### Table of content caption + openxlsx::writeData(wb, index_sheet_name, toc_caption, xy = c("C", index_start_row)) + openxlsx::addStyle(wb, index_sheet_name, subtitleStyle(), index_start_row, 3) + + + # Format --------- + + ### Set column width of first column to 1 + openxlsx::setColWidths(wb, index_sheet_name, 1, 1) + + ### Hide gridlines + openxlsx::showGridLines(wb, index_sheet_name, FALSE) ### Add Headerline - openxlsx::addStyle(wb, sheet = "Inhalt", style = style_headerline(), - rows = 6, cols = 1:20, gridExpand = TRUE, stack = TRUE) - - ### Apply styles to Main Title and subtitles - openxlsx::addStyle(wb, sheet = "Inhalt", style = mainTitleStyle(), rows = 10, - cols = 3, gridExpand = TRUE) - openxlsx::addStyle(wb, sheet = "Inhalt", style = subtitleStyle(), rows = 14, - cols = 3, gridExpand = TRUE) + openxlsx::addStyle(wb, index_sheet_name, style_headerline(), contact_end_row + 1, 1:20, gridExpand = TRUE, stack = TRUE) + } diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index bde8019..4ac8eda 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -24,57 +24,57 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", source = "statzh", metadata = NA, logo = "statzh", contactdetails = "statzh", author = "user"){ - sheetname <- check_sheetname(sheetname) - openxlsx::addWorksheet(wb, sheetName = sheetname) + # Process input (substitute default values) ----- + contactdetails <- inputHelperContactInfo(contactdetails) - ## Content + # Determine start/end rows of content blocks ----- + contact_start_row <- 2 + contact_end_row <- contact_start_row + length(c(contactdetails, homepage)) + title_start_row <- contact_end_row + 2 + source_start_row <- title_start_row + 1 + source_end_row <- source_start_row + length(source) + 1 + metadata_start_row <- source_end_row + 1 - ### Logo ------------ + + # Add a new worksheet ------ + sheetname <- verifyInputSheetname(sheetname) + openxlsx::addWorksheet(wb, sheetname) + + + # Insert logo -------- + logo <- inputHelperLogoPath(logo) if(!is.null(logo)){ - logo <- prep_logo(logo) - - if (file.exists(logo)){ - openxlsx::insertImage(wb, sheet = sheetname, file = logo, - width = 2.145, height = 0.7865, units = "in") - } else { - message("no logo found.") - } + openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, "in") } - ### Contact details -------------- - openxlsx::writeData(wb, sheet = sheetname, x = prep_contact(contactdetails), - headerStyle = style_wrap(), startRow = 2, startCol = 12) - ### Title ----------------- - openxlsx::writeData(wb, sheet = sheetname, x = title, headerStyle = style_title(), startRow = 7) + # Insert contact info, title, metadata, and sources into worksheet -------- - ### Source ------------ - openxlsx::writeData(wb, sheet = sheetname, x = "Datenquelle:", headerStyle = style_subtitle2(), startRow = 9) - openxlsx::writeData(wb, sheet = sheetname, x = prep_source(source, prefix = NULL), startRow = 10) + ### Contact info + contact_info <- c(contactdetails, inputHelperHomepage(homepage)) + openxlsx::writeData(wb, sheetname, contactdetails, startCol = 12, startRow = contact_start_row) - ### Metadata ---------- - openxlsx::writeData(wb, sheet = sheetname, x = "Hinweise:", headerStyle = style_subtitle2(), startRow = 12) - openxlsx::writeData(wb, sheet = sheetname, x = prep_metadata(metadata, prefix = NULL), startRow = 13) + ### Request information + request_info <- paste(inputHelperDateCreated(prefix = "Aktualisiert am: "), + inputHelperAuthorName(author, prefix = "durch: ")) + openxlsx::writeData(wb, sheetname, request_info, startCol = 12, startRow = contact_end_row + 1) + ### Title + openxlsx::writeData(wb, sheetname, title, startRow = title_start_row) + openxlsx::addStyle(wb, sheetname, style_title(), rows = title_start_row, cols = 1) + ### Source and metadata + openxlsx::writeData(wb, sheetname, inputHelperSource(source, prefix = "Datenquelle:"), startRow = source_start_row) + openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata, prefix = "Hinweise:"), startRow = metadata_start_row) + openxlsx::addStyle(wb, sheetname, style_subtitle2(), rows = c(source_start_row, metadata_start_row), cols = 1) - ### Aktualisierungsdatum -------- - openxlsx::writeData(wb, sheet = sheetname, - x = paste(prep_creationdate(prefix = "Aktualisiert am:"), - "durch:", prep_username(author)), - startRow = 5, startCol = 12) - ## Format + # Format ---------- - ### add formatting --------- - openxlsx::addStyle(wb, sheet = sheetname, style = style_headerline(), - rows = 5, cols = 1:26, gridExpand = TRUE, stack = TRUE) - openxlsx::addStyle(wb, sheet = sheetname, style = style_title(), - rows = 7, cols = 1, gridExpand = TRUE) - openxlsx::addStyle(wb, sheet = sheetname, style = style_subtitle2(), - rows = c(9, 12), cols = 1, gridExpand = TRUE) + ### Headerline + openxlsx::addStyle(wb, sheetname, style_headerline(), rows = contact_end_row + 2, cols = 1:26, gridExpand = TRUE, stack = TRUE) - ## Remove gridlines ---------- - openxlsx::showGridLines(wb, sheet = sheetname, showGridLines = FALSE) + ### Hide gridlines + openxlsx::showGridLines(wb, sheetname, FALSE) } diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 2781016..4f1de56 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -2,34 +2,22 @@ #' #' @description Function to insert a formatted worksheet into an existing #' Workbook object. -#' #' @note The function does not write the result into a .xlsx file. #' A separate call to openxlsx::saveWorkbook() is required. -#' #' @param data data to be included. -#' #' @param workbook workbook object to add new worksheet to. -#' #' @param title title to be put above the data. -#' #' @param sheetname name of the sheet tab. -#' #' @param source source of the data. Defaults to "statzh". -#' #' @param metadata metadata information to be included. Defaults to NA. -#' #' @param logo path of the file to be included as logo (png / jpeg / svg). #' Defaults to "statzh" -#' #' @param contactdetails contact details of the data publisher. Defaults to #' "statzh". -#' #' @param grouplines defaults to FALSE. Can be used to separate grouped #' variables visually. -#' #' @param author defaults to the last two letters (initials) or numbers of the #' internal user name. -#' #' @importFrom dplyr "%>%" #' @keywords insert_worksheet #' @export @@ -47,13 +35,12 @@ insert_worksheet <- function(data, workbook, sheetname = "data", title = "Title" author = "user"){ # Process input (substitute default values) ----- - sheetname <- check_sheetname(sheetname) - source <- prep_source(source) - metadata <- prep_metadata(metadata) - logo <- prep_logo(logo) - contactdetails <- prep_contact(contactdetails) - creationdate <- prep_creationdate("Aktualisiert am") - author <- prep_username(author) + sheetname <- verifyInputSheetname(sheetname) + source <- inputHelperSource(source) + metadata <- inputHelperMetadata(metadata) + contactdetails <- inputHelperContactInfo(contactdetails) + creationdate <- inputHelperDateCreated(prefix = "Aktualisiert am: ") + author <- inputHelperAuthorName(author, prefix = "durch: ") # Determine start/end rows of content blocks ----- @@ -72,52 +59,48 @@ insert_worksheet <- function(data, workbook, sheetname = "data", title = "Title" contact_start_col <- max(ncol(data) - 2, 4) contact_end_col <- 26 + # Initialize new worksheet ------ openxlsx::addWorksheet(workbook, sheetname) - # Insert logo, contact info, title, metadata, and sources into worksheet -------- + # Insert logo ------ + logo <- inputHelperLogoPath(logo) - ### Logo - if (!is.null(logo) && file.exists(logo)){ - openxlsx::insertImage(workbook, sheet = "Inhalt", file = logo, - width = 2.145, height = 0.7865, units = "in") - } else { - message("no logo found.") + if (!is.null(logo)){ + openxlsx::insertImage(workbook, "Inhalt", logo, 2.145, 0.7865, "in") } + + # Insert contact info, title, metadata, and sources into worksheet -------- + ### Contact information + + openxlsx::writeData(wb, sheetname, contactdetails, contact_start_col, contact_start_row, headerStyle = style_wrap()) purrr::walk(contact_start_row:contact_end_row, - ~openxlsx::mergeCells(wb, sheet = sheetname, - cols = contact_start_col:contact_end_col, + ~openxlsx::mergeCells(wb, sheetname, contact_start_col:contact_end_col, rows = .)) - openxlsx::writeData(wb, sheet = sheetname, x = contactdetails, - startCol = contact_start_col, startRow = contact_start_row, - headerStyle = style_wrap()) - + openxlsx::addStyle(wb, sheetname, style_headerline(), contact_end_row, 1:ncol(data), + gridExpand = TRUE, stack = TRUE) ### Creation date - openxlsx::writeData(wb, sheet = sheetname, x = paste(creationdate, author), - startCol = contact_start_col, startRow = contact_end_row + 1, + openxlsx::writeData(wb, sheetname, paste(creationdate, author), contact_start_col, contact_end_row + 1, headerStyle = style_subtitle3()) ### Title - openxlsx::writeData(workbook, sheet = sheetname, x = title, startRow = title_start_row, - headerStyle = style_title()) + openxlsx::writeData(workbook, sheetname, title, startRow = title_start_row) + openxlsx::addStyle(wb, sheetname, style_title(), title_start_row, 1, gridExpand = TRUE) ### Metadata - openxlsx::writeData(workbook, sheet = sheetname, x = metadata, startRow = metadata_start_row, - headerStyle = style_subtitle3()) + openxlsx::writeData(workbook, sheetname, metadata, startRow = metadata_start_row, headerStyle = style_subtitle3()) ### Source - openxlsx::writeData(workbook, sheet = sheetname, x = source, startRow = source_start_row, - headerStyle = style_subtitle3()) + openxlsx::writeData(workbook, sheetname, source, startRow = source_start_row, headerStyle = style_subtitle3()) ### Merge cells with title, metadata, and sources to ensure that they're displayed properly purrr::walk(title_start_row:source_end_row, - ~openxlsx::mergeCells(wb, sheet = sheetname, - cols = 1:contact_end_col, rows = .)) + ~openxlsx::mergeCells(wb, sheetname, 1:contact_end_col, rows = .)) # Insert data -------- @@ -126,39 +109,23 @@ insert_worksheet <- function(data, workbook, sheetname = "data", title = "Title" colnames(data) <- paste0(colnames(data), " ", sep = "") ### Write data - openxlsx::writeData(wb, sheet = sheetname, - x = as.data.frame(data %>% dplyr::ungroup()), - startRow = data_start_row, + openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), startRow = data_start_row, rowNames = FALSE, withFilter = FALSE) - - # Apply styles ------- - - ### Title - openxlsx::addStyle(wb, sheet = sheetname, style = style_title(), - rows = title_start_row, cols = 1, gridExpand = TRUE) - - ### Data header - openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), - rows = data_start_row, cols = 1:ncol(data), + openxlsx::addStyle(wb, sheetname, style_header(), data_start_row, 1:ncol(data), gridExpand = TRUE, stack = TRUE) - ### Headerline - openxlsx::addStyle(wb, sheet = sheetname, style = style_headerline(), - rows = contact_end_row, cols = 1:ncol(data), gridExpand = TRUE, - stack = TRUE) - ### Grouplines + # Format --------- + if (!is.null(grouplines)){ - openxlsx::addStyle(wb, sheet = sheetname, style = style_leftline(), - rows = data_start_row:data_end_row, cols = grouplines, - gridExpand = TRUE, stack = TRUE) + openxlsx::addStyle(wb, sheetname, style_leftline(), data_start_row:data_end_row, + grouplines, gridExpand = TRUE, stack = TRUE) } ### Define minimum column width options("openxlsx.minWidth" = 5) ### Use automatic columnwidth for columns with data - openxlsx::setColWidths(wb, sheet = sheetname, cols = 1:ncol(data), - widths = "auto", ignoreMergedCells = TRUE) + openxlsx::setColWidths(wb, sheetname, 1:ncol(data), "auto", ignoreMergedCells = TRUE) } diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index 0221725..d2b0f3e 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -2,34 +2,21 @@ #' #' @description Function to add formatted worksheets without headers to an #' existing workbook -#' #' @note The function does not write the result into a .xlsx file. A separate #' call to `openxlsx::saveWorkbook()` is required. -#' #' @param data data to be included in the XLSX-table. -#' #' @param wb workbook object to write new worksheet in. -#' #' @param title title of the table and the sheet -#' #' @param sheetname name of the sheet-tab. -#' #' @param source source of the data. Defaults to "statzh". -#' #' @param metadata metadata-information to be included. Defaults to NA. -#' #' @param grouplines defaults to NA. Can be used to separate grouped variables visually. -#' #' @param group_names Name(s) of the second header(s). #' Format: List e.g list(c("title 1", "title 2", "title 3")) -#' #' @keywords insert_worksheet, openxlsx -#' #' @importFrom dplyr "%>%" #' @importFrom purrr walk -#' #' @export -#' #' @examples #' ## Create workbook #' export <- openxlsx::createWorkbook() @@ -52,36 +39,36 @@ #' openxlsx::saveWorkbook(export,"example.xlsx") #' } insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", - source = "statzh", metadata = NA, grouplines = NA, group_names = NA){ + source = "statzh", metadata = NA, grouplines = NA, + group_names = NA){ - # increase width of column names for better auto-fitting of column width - colnames(data) <- paste0(colnames(data), " ", sep = "") - # Check length of sheetname - sheetname <- check_sheetname(sheetname) + # Process input (substitute default values) ----- + sheetname <- verifyInputSheetname(sheetname) + source <- inputHelperSource(source, prefix = "Quelle: ", collapse = "; ") + metadata <- inputHelperMetadata(metadata, prefix = "Metadaten: ", collapse = "; ") + - ## Add worksheet + # Initialize new worksheet ------ openxlsx::addWorksheet(wb, sheetname) - # Content - #--------- + # Insert title, metadata, and sources into worksheet -------- - ## Title - openxlsx::writeData(wb, sheet = sheetname, x = title, - headerStyle = style_title(), startRow = 1) + ### Title + openxlsx::writeData(wb, sheetname, title) + openxlsx::addStyle(wb, sheetname, style_title(), 1, 1) - ## Source - sources_to_insert <- prep_source(source) + ### Source + sources_to_insert <- inputHelperSource(source) source_end_row <- add_additional_text(wb, sources_to_insert, sheetname, 2) - ## Metadata + ### Metadata if (!is.na(metadata)){ - metadata_to_insert <- prep_metadata(metadata) + metadata_to_insert <- inputHelperMetadata(metadata) metadata_start_row <- source_end_row + 1 - metadata_end_row <- add_additional_text(wb, metadata_to_insert, sheetname, - metadata_start_row) + metadata_end_row <- add_additional_text(wb, metadata_to_insert, sheetname, metadata_start_row) data_start_row <- metadata_end_row + 2 merge_end_row <- metadata_end_row @@ -91,44 +78,30 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", merge_end_row <- source_end_row } - ### Metadaten zusammenmergen - purrr::walk(1:merge_end_row, - ~openxlsx::mergeCells(wb, sheet = sheetname, cols = 1:26, rows = .)) + ### Merge cells with title, metadata, and sources to ensure that they're displayed properly + purrr::walk(1:merge_end_row, ~openxlsx::mergeCells(wb, sheetname, 1:26, rows = .)) - ## Insert second header - if (any(is.null(group_names))){ - group_names <- NA - } + # Insert data -------- + + ### Insert second header if (!any(is.na(group_names))){ - insert_second_header(wb, sheetname, data_start_row, group_names, - grouplines, data) + insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) data_start_row <- data_start_row + 1 } - ## Data - openxlsx::writeData(wb, sheet = sheetname, - x = as.data.frame(dplyr::ungroup(data)), - rowNames = FALSE, startRow = data_start_row, - withFilter = FALSE) - - #----------------------- - # Apply styles + ### Pad colnames using whitespaces for better auto-fitting of column width + colnames(data) <- paste0(colnames(data), " ", sep = "") - ## Title - openxlsx::addStyle(wb, sheet = sheetname, style = style_title(), - rows = 1, cols = 1) + ### Write data after checking for leftover grouping + openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), startRow = data_start_row, + rowNames = FALSE, withFilter = FALSE) + openxlsx::addStyle(wb, sheetname, style_header(), data_start_row, 1:ncol(data), gridExpand = TRUE, stack = TRUE) - ## Data header - openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), - rows = data_start_row, cols = 1:ncol(data), - gridExpand = TRUE, stack = TRUE) - ## Grouplines - if (is.null(grouplines)){ - grouplines <- NA - } + # Apply styles -------- + ### Grouplines if (any(!is.na(grouplines))){ if (!any(is.na(group_names))){ data_start_row <- data_start_row - 1 @@ -145,19 +118,14 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) } - openxlsx::addStyle(wb, sheet = sheetname, style = style_leftline(), - rows = data_start_row:data_end_row, - cols = groupline_numbers, gridExpand = TRUE, - stack = TRUE) + openxlsx::addStyle(wb, sheetname, style_leftline(), data_start_row:data_end_row, groupline_numbers, gridExpand = TRUE, stack = TRUE) } - # Format - #--------- + # Format -------- - ## Set minimum column width + ### Define minimum column width options("openxlsx.minWidth" = 5) - ## Use automatic column width - openxlsx::setColWidths(wb, sheet = sheetname, cols = 1:ncol(data), - widths = "auto", ignoreMergedCells = TRUE) + ### Use automatic column width for columns with data + openxlsx::setColWidths(wb, sheetname, 1:ncol(data), "auto", ignoreMergedCells = TRUE) } diff --git a/R/process_input.R b/R/process_input.R deleted file mode 100644 index 41d0f0a..0000000 --- a/R/process_input.R +++ /dev/null @@ -1,293 +0,0 @@ -#----------------- -#' check_sheetname() -#' -#' @description Function which truncates a sheet name to 31 characters -#' -#' @details MS Excel imposes a character limit of 31 characters for sheetnames. -#' By default, this function truncates sheetnames accordingly and raises a -#' warning. If shorten is set to FALSE, an error is raised instead. -#' -#' @param sheetname A character string with the name for an XLSX worksheet -#' -#' @param shorten A boolean whether to return shortened string or raise an error. -#' Default: TRUE -#' -#' @returns A character string -#' @keywords internal -#' @noRd -#' -check_sheetname <- function(sheetname, shorten = TRUE){ - - short_name <- paste(substr(sheetname, 0, 31)) - - if (short_name != sheetname){ - if (shorten) { - warning("sheetname is truncated to 31 characters") - } else { - stop("sheetname exceeds character limit of MS-Excel)") - } - } - - return(short_name) -} - -#----------------- -#' writeDataIf() -#' -#' @description A wrapper around openxlsx::writeData conditioned on the result of -#' condition_fun(x). By default, `condition_fun <- function(x) !is.null(x)` is -#' used to verify that the input is not NULL. -#' -#' @param wb Workbook object -#' -#' @param sheet Sheetname -#' -#' @param x Input to be written to worksheet -#' -#' @param xy Position where input should be written to -#' -#' @param condition_fun A function which returns a boolean and takes x as input. -#' Default: function(x) !is.null(x) -#' -#' @keywords internal -#' @noRd -#' -writeDataIf <- function(wb, sheet, x, xy, condition_fun = function(x) !is.null(x)){ - - if (condition_fun(x)){ - openxlsx::writeData(wb, sheet, x, xy = xy) - } else { - message("Skipped write because x is NULL") - } -} - -#----------------- -#' prep_filename() -#' -#' Ensure that file extension is added to filename. -#' @param filename A character string with the filename -#' @param extension A character string with the file extension. Defaults to ".xlsx" -#' @returns A character string -#' @keywords internal -#' @noRd -#' -prep_filename <- function(filename, extension = ".xlsx"){ - - if (!grepl(".xlsx", filename)){ - filename <- paste0(filename, extension) - } - - return(filename) -} - -#----------------- -#' prep_source() -#' -#' @description Concatenate vector of sources into a formatted string -#' -#' @param source A character vector with source information -#' -#' @param prefix A character string with the prefix. Default: "Quelle: " -#' -#' @param sep A character string with the separator for sources. Default: ";" -#' -#' @returns A character string -#' -#' @keywords internal -#' @noRd -#' -prep_source <- function(source){ - - # Replace "statzh" entries - source <- sub("statzh", statzh_name, source) - - cat_source <- paste0(source, collapse = sep) - - if (!is.null(prefix)){ - cat_source <- paste0(prefix, cat_source) - } - - return(cat_source) -} - -#------------------- -#' prep_metadata() -#' -#' @description Concatenate metadata into a formatted string. -#' -#' @param metadata A character vector with metadata information -#' -#' @param extension A character string with the prefix. Default: "Metadaten: ". -#' -#' @param sep A character string with the separator for metadata. Default: ";" -#' -#' @returns A character string -#' -#' @keywords internal -#' @noRd -#' -prep_metadata <- function(metadata, prefix = "Metadaten: ", sep = ";"){ - - cat_metadata <- paste0(metadata, collapse = sep) - - if (!is.null(prefix)){ - cat_metadata <- paste0(prefix, cat_metadata) - } - - return(cat_metadata) -} - -#----------------- -#' prep_logo() -#' -#' @description Replace default values "zh" and "statzh" with the file path to -#' the respective logo (included in /extdata), otherwise returns the input value. -#' -#' @param logo A character string with the file path -#' -#' @returns A character string -#' @keywords internal -#' @noRd -#' -prep_logo <- function(logo){ - - if (logo == "statzh"){ - logo <- statzh_logo - } else if (logo == "zh"){ - logo <- zh_logo - } - - return(logo) -} - -#----------------- -#' prep_contact() -#' -#' Replace default values "zh" and "statzh" with the contact information of -#' the Statistics Office of Canton Zurich, otherwise returns the input value. -#' @note -#' Raises a warning if the input has more than 3 elements. -#' @param contact A character vector with contact information -#' @param compact A boolean which controls the format of the contact information. Default: FALSE -#' @returns A character vector -#' @keywords internal -#' @noRd -#' -prep_contact <- function(contact, compact = FALSE){ - - if (contact == "statzh"){ - contact <- ifelse(compact, statzh_contact_compact, statzh_contact) - } else if (length(contact) > 3){ - warning("More than 3 elements in contactdetails, may overlap with other elements.") - } - - return(contact) -} - -#----------------- -#' prep_openinghours() -#' -#' @description Replace default values "zh" and "statzh" with the opening hours -#' of the Statistics Office of Canton Zurich, otherwise returns -#' the input value. -#' -#' @param openinghours A character vector with opening hours. -#' -#' @returns A character vector -#' @keywords internal -#' @noRd -#' -prep_openinghours <- function(openinghours){ - - if (openinghours == "statzh"){ - openinghours <- statzh_openinghours - } - - return(openinghours) -} - -#----------------- -#' prep_homepage() -#' -#' @description Replace default values "zh" and "statzh" with the homepage of -#' the Statistics Office of Canton Zurich, otherwise returns the input value. -#' -#' @note Converts input to 'hyperlink' object if as_hyperlink is TRUE (default). -#' -#' @param homepage A character string -#' -#' @param as_hyperlink A boolean, controls whether input is converted to -#' 'hyperlink'. Default: TRUE -#' -#' @returns A character string or a 'hyperlink' object depending on the value of -#' as_hyperlink. -#' @keywords internal -#' @noRd -#' -prep_homepage <- function(homepage, as_hyperlink = TRUE){ - - if (homepage == "statzh"){ - homepage <- statzh_homepage - } - - if (as_hyperlink){ - class(homepage) <- 'hyperlink' - } - - return(homepage) -} - -#----------------- -#' prep_creationdate() -#' -#' @param prefix A character string, defaults to "Erstellt am:" -#' @param date_format A character string for the date_format. Default: "%d.%m.%Y". -#' @returns A character vector -#' @keywords internal -#' @seealso format -#' @noRd -#' -prep_creationdate <- function(prefix = "Erstellt am:", date_format = "%d.%m.%Y"){ - - creation_date <- format(Sys.Date(), format = date_format) - return(paste(prefix, creation_date)) -} - -#----------------- -#' prep_orderid() -#' -#' @param order_id An integer -#' @param prefix A character string, defaults to "Auftragsnr.:" -#' @returns A character vector -#' @keywords internal -#' @noRd -#' -prep_orderid <- function(order_id, prefix = "Auftragsnr.:"){ - - return(paste(prefix, order_id)) -} - - -#----------------- -#' prep_username() -#' -#' @param author Name of author -#' @returns A character string with the username -#' @keywords internal -#' @noRd -#' -prep_username <- function(author){ - - if (author != "user"){ - return(author) - } - - if(Sys.getenv("USERNAME") != ""){ - author <- stringr::str_sub(Sys.getenv("USERNAME"), start = 6, end = 7) - - } else { - author <- stringr::str_sub(Sys.getenv("USER"), start = 6, end = 7) - } - - return(author) -} diff --git a/R/quickXLSX.R b/R/quickXLSX.R index ea47cdd..f2a7887 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -1,21 +1,15 @@ #' quickXLSX() #' #' @description Function to export data from R to a formatted .xlsx-spreadsheet. -#' #' @note Will be deprecated in upcoming version. -#' #' @param data data to be exported. -#' #' @param file file name of the xlsx-file. The extension ".xlsx" is added #' automatically. -#' #' @param title title to be put above the data in the worksheet. - #' @template shared_parameters #' @keywords quickXLSX #' @export #' @examples -#' #'quickXLSX(data = mtcars, #' title = "Motor trend car road tests", #' file = "motor_trend_car_road_tests", @@ -28,20 +22,19 @@ #' grouplines = FALSE, #' logo = "statzh", #' author = "user") -#' quickXLSX <- function(data = NA, file, title = "Title", source = "statzh", metadata = NA, logo = "statzh", grouplines = FALSE, contactdetails = "statzh", author = "user"){ - # Create workbook + # Create workbook -------- wb <- openxlsx::createWorkbook() - # Insert data + # Insert data -------- insert_worksheet(data = data, wb, title = title, source = source, metadata = metadata, logo = logo, grouplines = grouplines, contactdetails = contactdetails, author = author) - #save workbook - openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) + # Save workbook + openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) } diff --git a/R/splitXLSX.R b/R/splitXLSX.R index 1906fce..de9c277 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -3,22 +3,16 @@ #' #' @description Function to export data from R as formatted .xlsx-file and spread #' them over several worksheets based on a grouping variable (e.g., year). -#' #' @note May be deprecated in upcoming version. User should make sure that the #' grouping variable is of binary, categorical or other types with a limited #' number of levels. -#' #' @param data data to be exported. -#' #' @param file file name of the output .xlsx-file. The extension is added #' automatically. -#' #' @param sheetvar name of the variable used to split the data and spread them #' over several sheets. -#' #' @param title title to be put above the data in the worksheet. the sheetvar #' subcategory is added in brackets. -#' #' @template shared_parameters #' @keywords splitXLSX #' @export @@ -38,22 +32,22 @@ #' grouplines = FALSE, #' logo = "statzh", #' author = "user") - splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", metadata = NA, logo = "statzh", grouplines = FALSE, contactdetails = "statzh", author = "user"){ - # create workbook + # create workbook ------ wb <- openxlsx::createWorkbook() - # get values of the variable that is used to split the data + + # get values of the variable that is used to split the data ------- data <- as.data.frame(data) sheettitle <- paste0(title, " (", deparse(substitute(sheetvar)), ": ", sheetvalue, ")") sheetvalues <- unique(data[, c(deparse(substitute(sheetvar)))]) col_name <- rlang::enquo(sheetvar) - # loop to split values of the variable used to split the data + # loop to split values of the variable used to split the data ----- for (sheetvalue in sheetvalues) { data %>% dplyr::filter((!!col_name) == sheetvalue) %>% @@ -66,7 +60,7 @@ splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", openxlsx::worksheetOrder(wb) <- rev(openxlsx::worksheetOrder(wb)) - #save xlsx - openxlsx::saveWorkbook(wb, prep_filename(file), overwrite = TRUE) + # Save xlsx ------ + openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) } diff --git a/R/statzh_info.R b/R/statzh_info.R index b35da48..b8cfbdb 100644 --- a/R/statzh_info.R +++ b/R/statzh_info.R @@ -20,9 +20,9 @@ statzh_info <- { statzh_email, statzh_homepage) statzh_openinghours <- c("B\u00fcrozeiten", "Montag bis Freitag", "09:00 bis 12:00", "13:00 bis 16:00") - # Logo paths - #-------------- - statzh_logo <- paste0(path.package("statR"), "/extdata/Stempel_STAT-01.png") - zh_logo <- paste0(path.package("statR"), "/extdata/Stempel_Kanton_ZH.png") + # Logo filenames (located in /extdata/ folder) + #------------- + statzh_logo <- "Stempel_STAT-01.png" + zh_logo <- "Stempel_Kanton_ZH.png" } From c9a91c05e6b170174e92bf5f315dfc4b2a62b6b9 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Wed, 17 May 2023 12:24:20 +0000 Subject: [PATCH 32/74] No more errors in examples --- NAMESPACE | 1 + R/checks.R | 12 ++++ R/datasetsXLSX.R | 122 ++++++++++------------------------ R/insert_hyperlinks.R | 21 ++---- R/insert_metadata_sheet.R | 16 ++--- R/insert_worksheet.R | 95 +++++++++++++------------- R/insert_worksheet_nh.R | 12 +--- R/quickXLSX.R | 4 +- R/splitXLSX.R | 18 ++--- man/aXLSX.Rd | 37 ++++++----- man/add_additional_text.Rd | 13 ++-- man/check_sheetname.Rd | 12 ---- man/datasetsXLSX.Rd | 37 +++++++---- man/flush_left.Rd | 12 ++-- man/insert_hyperlinks.Rd | 5 +- man/insert_second_header.Rd | 6 +- man/insert_worksheet.Rd | 33 +++++---- man/insert_worksheet_image.Rd | 8 ++- man/insert_worksheet_nh.Rd | 12 ++-- man/quickXLSX.Rd | 8 +-- man/quick_sum.Rd | 24 +++++-- man/splitXLSX.Rd | 21 +++--- man/zhpal.Rd | 4 +- 23 files changed, 239 insertions(+), 294 deletions(-) create mode 100644 R/checks.R delete mode 100644 man/check_sheetname.Rd diff --git a/NAMESPACE b/NAMESPACE index 8e244ca..104730d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -44,6 +44,7 @@ importFrom(purrr,pmap) importFrom(purrr,pwalk) importFrom(purrr,walk) importFrom(rlang,":=") +importFrom(scales,manual_pal) importFrom(stats,median) importFrom(stats,quantile) importFrom(stats,sd) diff --git a/R/checks.R b/R/checks.R new file mode 100644 index 0000000..536d86c --- /dev/null +++ b/R/checks.R @@ -0,0 +1,12 @@ +#' checkGroupOptionCompatibility() +#' +#' @description Check if group_names and grouplines match +#' @param group_names A character vector with group names +#' @param grouplines A character or integer vector of columns to put grouplines at +#' @keywords internal +#' @noRd +checkGroupOptionCompatibility <- function(group_names, grouplines){ + if (any(!is.na(group_names)) & all(is.na(grouplines))){ + stop("For a second header, the grouplines must be specified") + } +} diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index fcc8d6c..8fe4dea 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -3,63 +3,39 @@ #' @description Function to export several datasets and/or figures from R to an #' .xlsx-file. The function creates an overview sheet and separate sheets for #' each dataset/figure. -#' #' @details When including figures, the heights and widths need to be specified #' as a vector. For example, say you have one dataset and two figures that you #' would like to export. widths = c(5,6) then suggests that the first figure #' will be 5 inches wide, the second 6. To include a figure either save it as #' a ggplot object or indicate a file path to an existing file #' (possible formats: png, jpg, bmp). -#' #' @param file file name of the spreadsheet. The extension ".xlsx" is added #' automatically. -#' #' @param maintitle Title to be put on the first (overview) sheet. -#' #' @param datasets datasets or plots to be included. -#' #' @param plot_widths width of figure in inch (1 inch = 2.54 cm). See details. -#' #' @param plot_heights height of figure in inch (1 inch = 2.54 cm). See details. -#' #' @param sheetnames names of the sheet tabs. -#' #' @param titles titles of the different sheets. -#' #' @param logo file path to the logo to be included in the index-sheet. Can be #' "statzh" or "zh". Defaults to "statzh". -#' #' @param titlesource source to be mentioned on the title sheet beneath the title -#' #' @param sources source of the data. Defaults to "statzh". -#' -#' @param metadata1 metadata information to be included. Defaults to NA. -#' +#' @param metadata metadata information to be included. Defaults to NA. #' @param auftrag_id order number. -#' #' @param contact contact information on the title sheet. Defaults to "statzh" -#' #' @param homepage web address to be put on the title sheet. Default to "statzh" -#' #' @param openinghours openinghours written on the title sheet. #' Defaults to Data Shop -#' #' @param grouplines Column for second header(s). Format: List e.g list(c(2,4,6)) -#' #' @param group_names Name(s) of the second header(s). Format: List e.g #' list(c("title 1", "title 2", "title 3")) -#' #' @param overwrite overwrites the existing excel files with the same file name. #' default to FALSE -#' #' @keywords datasetsXLSX -#' #' @export -#' #' @importFrom dplyr "%>%" -#' #' @importFrom purrr pwalk pmap -#' #' @examples #'\donttest{ #' \dontrun{ @@ -77,7 +53,7 @@ #' Building multiple regression models interactively. Biometrics, 37, 391–411.", #' "Dobson, A. J. (1983) An Introduction to Statistical #' Modelling. London: Chapman and Hall."), -#' metadata1 = c("Bemerkungen zum mtcars-Datensatz: x", +#' metadata = c("Bemerkungen zum mtcars-Datensatz: x", #' "Bemerkungen zum PlantGrowth-Datensatz: x"), #' sheetnames = c("Autos","Blumen"), #' maintitle = "Autos und Pflanzen", @@ -105,7 +81,7 @@ #' Building multiple regression models interactively. Biometrics, 37, 391–411.", #' "Source: Dobson, A. J. (1983) An Introduction to #' Statistical Modelling. London: Chapman and Hall."), -#' metadata1 = c("Bemerkungen zum mtcars-Datensatz: x", +#' metadata = c("Bemerkungen zum mtcars-Datensatz: x", #' "Bemerkungen zum PlantGrowth-Datensatz: x"), #' sheetnames = c("Autos","Blumen", "Histogramm"), #' maintitle = "Autos und Pflanzen", @@ -120,102 +96,76 @@ #'} datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, plot_heights = NULL, grouplines = NA, - group_names = NA, sources = "statzh", metadata1 = NA, + group_names = NA, sources = "statzh", metadata = NA, sheetnames, maintitle, titlesource = "statzh", logo = "statzh", auftrag_id = NULL, contact = "statzh", homepage = "statzh", openinghours = "statzh", overwrite = F){ - if(!any(is.na(group_names)) & any(is.na(grouplines))){ - stop("if a second header is wanted, the grouplines have to be specified") - } + # Run checks on arguments ------ + checkGroupOptionCompatibility(group_names, grouplines) # Initialize new Workbook ------ wb <- openxlsx::createWorkbook() - # Determine which elements of input list datasets correspond to dataframes. ------- + # Create indexes of which inputs correspond to data.frames or plots----- dataframes_index <- which(vapply(datasets, is.data.frame, TRUE)) - # Index from input lists using dataframes_index ----------- + implemented_plot_types <- c("gg", "ggplot", "histogram", "character") + plot_index <- which(vapply(datasets, function(x) class(x) %in% implemented_plot_types, TRUE)) + + # Index from input lists using index ----------- + ### data.frames dataframe_datasets <- datasets[dataframes_index] dataframe_sheetnames <- sheetnames[dataframes_index] dataframe_titles <- titles[dataframes_index] dataframe_sources <- sources[dataframes_index] - dataframe_metadata1 <- metadata1[dataframes_index] + dataframe_metadata <- metadata[dataframes_index] dataframe_grouplines <- grouplines[dataframes_index] dataframe_group_names <- group_names[dataframes_index] - - # Determine which elements of datasets correspond to objects of type gg, - # ggplot, histogram, or character (path input). -------- - plot_index <- which(vapply(datasets, function(x){ - length(setdiff(class(x), c("gg", "ggplot", "histogram", "character"))) == 0 - }, TRUE)) - - # Index from input lists using plot_index ------- + ### Plots plot_datasets <- datasets[plot_index] plot_sheetnames <- sheetnames[plot_index] # Insert the initial index sheet ---------- - insert_index_sheet(wb, logo, contact, homepage, openinghours, titlesource, auftrag_id, maintitle) + insert_index_sheet(wb, logo, contact, homepage, openinghours, titlesource, + auftrag_id, maintitle) # Insert datasets according to dataframes_index ------- if(length(dataframes_index) > 0){ - list( - dataframe_datasets, - dataframe_sheetnames, - dataframe_titles, - dataframe_sources, - dataframe_metadata1, - dataframe_grouplines, - dataframe_group_names - ) %>% - purrr::pwalk( - ~insert_worksheet_nh( - data = ..1, - wb = wb, - sheetname = ..2, - title = ..3, - source = ..4, - metadata = ..5, - grouplines = ..6, - group_names = ..7)) + list(dataframe_datasets, + dataframe_sheetnames, + dataframe_titles, + dataframe_sources, + dataframe_metadata, + dataframe_grouplines, + dataframe_group_names) %>% + purrr::pwalk(~insert_worksheet_nh(data = ..1, wb = wb, sheetname = ..2, + title = ..3, source = ..4, metadata = ..5, + grouplines = ..6, group_names = ..7)) } # Insert images according to plot_index -------- if (length(plot_index) > 0){ - list( - plot_datasets, - plot_sheetnames, - plot_widths, - plot_heights - ) %>% - purrr::pmap( - ~insert_worksheet_image( - image = ..1, - wb = wb, - sheetname = ..2, - width = ..3, - height = ..4)) + list(plot_datasets, + plot_sheetnames, + plot_widths, + plot_heights) %>% + purrr::pmap(~insert_worksheet_image(image = ..1, wb = wb, sheetname = ..2, + width = ..3, height = ..4)) } # Create a table of hyperlinks in index sheet (assumed to be "Index") ------ - data.frame( - sheetnames = sheetnames, - titles = titles, - sheet_row = c(seq(15, 15 + length(sheetnames) - 1)) - ) %>% - purrr::pwalk( - ~insert_hyperlinks( - wb, - sheetname = ..1, - title = ..2, - sheet_row = ..3)) + data.frame(sheetnames = sheetnames, + titles = titles, + sheet_row = seq(15, 15 + length(sheetnames) - 1)) %>% + purrr::pwalk(~insert_hyperlinks(wb, sheetname = ..1, title = ..2, sheet_row = ..3)) # Save workbook at path denoted by argument file --------- diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index ecfdcaa..612cde7 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -1,25 +1,17 @@ #' insert_hyperlinks() #' #' @description Function for inserting hyperlinks within an openxlsx Workbook -#' #' @param wb Workbook object -#' #' @param sheetname Name of sheet -#' #' @param title Title -#' #' @param sheet_row Sheet row -#' #' @keywords internal -#' insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ - openxlsx::writeData(wb, sheet = "Inhalt", x = title, xy = c("C", sheet_row)) - - openxlsx::addStyle(wb, sheet = "Inhalt", style = hyperlinkStyle(), - rows = sheet_row, cols = 3) - + openxlsx::writeData(wb, "Inhalt", title, xy = c("C", sheet_row)) + openxlsx::addStyle(wb, "Inhalt", hyperlinkStyle(), sheet_row, cols = 3) openxlsx::mergeCells(wb, sheet = "Inhalt", rows = sheet_row, cols = 3:8) + # Set up hyperlink ------- worksheet <- wb$sheetOrder[1] field_t <- wb$worksheets[[worksheet]]$sheet_data$t @@ -29,11 +21,8 @@ insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ field_v[length(field_v)] <- NA field_f <- wb$worksheets[[worksheet]]$sheet_data$f - field_f[length(field_f)] <- paste0("=HYPERLINK("#'", - sheetname, - "'!A1", "", - title, - "")") + field_f[length(field_f)] <- paste0("=HYPERLINK("#'", sheetname, + "'!A1", "", title, "")") wb$worksheets[[worksheet]]$sheet_data$t <- as.integer(field_t) wb$worksheets[[worksheet]]$sheet_data$v <- field_v diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index 4ac8eda..d11b0bb 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -24,13 +24,12 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", source = "statzh", metadata = NA, logo = "statzh", contactdetails = "statzh", author = "user"){ - # Process input (substitute default values) ----- contactdetails <- inputHelperContactInfo(contactdetails) # Determine start/end rows of content blocks ----- contact_start_row <- 2 - contact_end_row <- contact_start_row + length(c(contactdetails, homepage)) + contact_end_row <- contact_start_row + length(contactdetails) title_start_row <- contact_end_row + 2 source_start_row <- title_start_row + 1 source_end_row <- source_start_row + length(source) + 1 @@ -52,13 +51,12 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", # Insert contact info, title, metadata, and sources into worksheet -------- ### Contact info - contact_info <- c(contactdetails, inputHelperHomepage(homepage)) - openxlsx::writeData(wb, sheetname, contactdetails, startCol = 12, startRow = contact_start_row) + openxlsx::writeData(wb, sheetname, contactdetails, 12, contact_start_row) ### Request information - request_info <- paste(inputHelperDateCreated(prefix = "Aktualisiert am: "), - inputHelperAuthorName(author, prefix = "durch: ")) - openxlsx::writeData(wb, sheetname, request_info, startCol = 12, startRow = contact_end_row + 1) + info_string <- paste(inputHelperDateCreated(prefix = "Aktualisiert am: "), + inputHelperAuthorName(author, prefix = "durch: ")) + openxlsx::writeData(wb, sheetname, info_string, 12, contact_end_row + 1) ### Title openxlsx::writeData(wb, sheetname, title, startRow = title_start_row) @@ -67,13 +65,13 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", ### Source and metadata openxlsx::writeData(wb, sheetname, inputHelperSource(source, prefix = "Datenquelle:"), startRow = source_start_row) openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata, prefix = "Hinweise:"), startRow = metadata_start_row) - openxlsx::addStyle(wb, sheetname, style_subtitle2(), rows = c(source_start_row, metadata_start_row), cols = 1) + openxlsx::addStyle(wb, sheetname, style_subtitle2(), c(source_start_row, metadata_start_row), 1) # Format ---------- ### Headerline - openxlsx::addStyle(wb, sheetname, style_headerline(), rows = contact_end_row + 2, cols = 1:26, gridExpand = TRUE, stack = TRUE) + openxlsx::addStyle(wb, sheetname, style_headerline(), contact_end_row + 2, 1:26, gridExpand = TRUE, stack = TRUE) ### Hide gridlines openxlsx::showGridLines(wb, sheetname, FALSE) diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 4f1de56..a12fed5 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -5,7 +5,7 @@ #' @note The function does not write the result into a .xlsx file. #' A separate call to openxlsx::saveWorkbook() is required. #' @param data data to be included. -#' @param workbook workbook object to add new worksheet to. +#' @param wb workbook object to add new worksheet to. #' @param title title to be put above the data. #' @param sheetname name of the sheet tab. #' @param source source of the data. Defaults to "statzh". @@ -22,85 +22,78 @@ #' @keywords insert_worksheet #' @export #' @examples +#' # Initialize an empty Workbook +#' wb <- openxlsx::createWorkbook() #' -#' # Generation of a spreadsheet -#' wb <- openxlsx::createWorkbook("hello") +#' insert_worksheet(data = head(mtcars), +#' wb = wb, +#' title = "mtcars", +#' sheetname = "carb") #' -#' insert_worksheet(data = head(mtcars), workbook = wb, title = "mtcars", -#' sheetname = "carb") -#' -insert_worksheet <- function(data, workbook, sheetname = "data", title = "Title", +insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", source = "statzh", metadata = NA, logo = "statzh", grouplines = FALSE, contactdetails = "statzh", author = "user"){ # Process input (substitute default values) ----- - sheetname <- verifyInputSheetname(sheetname) - source <- inputHelperSource(source) - metadata <- inputHelperMetadata(metadata) contactdetails <- inputHelperContactInfo(contactdetails) - creationdate <- inputHelperDateCreated(prefix = "Aktualisiert am: ") - author <- inputHelperAuthorName(author, prefix = "durch: ") + # Determine start/end rows, row and column extents of content blocks ----- - # Determine start/end rows of content blocks ----- + ### Contact information contact_start_row <- 2 + contact_start_col <- max(ncol(data) - 2, 4) + contact_end_col <- 26 contact_end_row <- contact_start_row + length(contactdetails) + contact_column_extent <- contact_start_col:contact_end_col + contact_rows_extent <- contact_start_row:(contact_end_row + 1) + + ### Descriptives title_start_row <- contact_end_row + 2 - metadata_start_row <- title_start_row + 1 - source_start_row <- metadata_start_row + length(metadata) - source_end_row <- source_start_row + length(source) - data_start_row <- source_end_row + 3 + source_start_row <- title_start_row + 1 + metadata_start_row <- source_start_row + length(source) + metadata_end_row <- metadata_start_row + length(metadata) + descriptives_column_extent <- 1:contact_end_col + descriptives_row_extent <- title_start_row:metadata_end_row + + ### Data + data_start_row <- metadata_end_row + 3 data_end_row <- data_start_row + nrow(data) - - - # Determine column boundaries ------- - - contact_start_col <- max(ncol(data) - 2, 4) - contact_end_col <- 26 + data_row_extent <- data_start_row:data_end_row # Initialize new worksheet ------ - openxlsx::addWorksheet(workbook, sheetname) + sheetname <- verifyInputSheetname(sheetname) + openxlsx::addWorksheet(wb, sheetname) # Insert logo ------ logo <- inputHelperLogoPath(logo) if (!is.null(logo)){ - openxlsx::insertImage(workbook, "Inhalt", logo, 2.145, 0.7865, "in") + openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, "in") } - # Insert contact info, title, metadata, and sources into worksheet -------- - - ### Contact information - + # Insert contact info, date created, and author ----- + ### Contact info openxlsx::writeData(wb, sheetname, contactdetails, contact_start_col, contact_start_row, headerStyle = style_wrap()) - purrr::walk(contact_start_row:contact_end_row, - ~openxlsx::mergeCells(wb, sheetname, contact_start_col:contact_end_col, - rows = .)) - - openxlsx::addStyle(wb, sheetname, style_headerline(), contact_end_row, 1:ncol(data), - gridExpand = TRUE, stack = TRUE) ### Creation date - openxlsx::writeData(wb, sheetname, paste(creationdate, author), contact_start_col, contact_end_row + 1, - headerStyle = style_subtitle3()) + infostring <- paste(inputHelperDateCreated(prefix = "Aktualisiert am: "), inputHelperAuthorName(author, prefix = "durch: ")) + openxlsx::writeData(wb, sheetname, infostring, contact_start_col, contact_end_row + 1, headerStyle = style_subtitle3()) + + # Insert descriptives into worksheet -------- ### Title - openxlsx::writeData(workbook, sheetname, title, startRow = title_start_row) + openxlsx::writeData(wb, sheetname, title, startRow = title_start_row) openxlsx::addStyle(wb, sheetname, style_title(), title_start_row, 1, gridExpand = TRUE) - ### Metadata - openxlsx::writeData(workbook, sheetname, metadata, startRow = metadata_start_row, headerStyle = style_subtitle3()) - ### Source - openxlsx::writeData(workbook, sheetname, source, startRow = source_start_row, headerStyle = style_subtitle3()) + openxlsx::writeData(wb, sheetname, inputHelperSource(source), startRow = source_start_row, headerStyle = style_subtitle3()) - ### Merge cells with title, metadata, and sources to ensure that they're displayed properly - purrr::walk(title_start_row:source_end_row, - ~openxlsx::mergeCells(wb, sheetname, 1:contact_end_col, rows = .)) + ### Metadata + openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), startRow = metadata_start_row, headerStyle = style_subtitle3()) # Insert data -------- @@ -117,10 +110,18 @@ insert_worksheet <- function(data, workbook, sheetname = "data", title = "Title" # Format --------- + ### Horizontally merge cells to ensure that contact entries are displayed properly + purrr::walk(contact_rows_extent, ~openxlsx::mergeCells(wb, sheetname, contact_column_extent, rows = .)) + + ### Insert headerline after contacts ------ + openxlsx::addStyle(wb, sheetname, style_headerline(), contact_end_row + 1, 1:ncol(data), gridExpand = TRUE, stack = TRUE) + + ### Horizontally merge cells containing descriptive info to ensure that they're displayed properly + purrr::walk(descriptives_row_extent, ~openxlsx::mergeCells(wb, sheetname, descriptives_column_extent, rows = .)) + ### Grouplines if (!is.null(grouplines)){ - openxlsx::addStyle(wb, sheetname, style_leftline(), data_start_row:data_end_row, - grouplines, gridExpand = TRUE, stack = TRUE) + openxlsx::addStyle(wb, sheetname, style_leftline(), data_row_extent, grouplines, gridExpand = TRUE, stack = TRUE) } ### Define minimum column width diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index d2b0f3e..f297541 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -42,14 +42,8 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", source = "statzh", metadata = NA, grouplines = NA, group_names = NA){ - - # Process input (substitute default values) ----- - sheetname <- verifyInputSheetname(sheetname) - source <- inputHelperSource(source, prefix = "Quelle: ", collapse = "; ") - metadata <- inputHelperMetadata(metadata, prefix = "Metadaten: ", collapse = "; ") - - # Initialize new worksheet ------ + sheetname <- verifyInputSheetname(sheetname) openxlsx::addWorksheet(wb, sheetname) @@ -83,7 +77,6 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", # Insert data -------- - ### Insert second header if (!any(is.na(group_names))){ insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) @@ -94,8 +87,7 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", colnames(data) <- paste0(colnames(data), " ", sep = "") ### Write data after checking for leftover grouping - openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), startRow = data_start_row, - rowNames = FALSE, withFilter = FALSE) + openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), startRow = data_start_row, rowNames = FALSE, withFilter = FALSE) openxlsx::addStyle(wb, sheetname, style_header(), data_start_row, 1:ncol(data), gridExpand = TRUE, stack = TRUE) diff --git a/R/quickXLSX.R b/R/quickXLSX.R index f2a7887..7da721d 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -30,11 +30,11 @@ quickXLSX <- function(data = NA, file, title = "Title", source = "statzh", wb <- openxlsx::createWorkbook() # Insert data -------- - insert_worksheet(data = data, wb, title = title, source = source, + insert_worksheet(data, wb, "Inhalt", title = title, source = source, metadata = metadata, logo = logo, grouplines = grouplines, contactdetails = contactdetails, author = author) - # Save workbook + # Save workbook--------- openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) } diff --git a/R/splitXLSX.R b/R/splitXLSX.R index de9c277..8a1e066 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -1,4 +1,3 @@ -#' #' splitXLSX() #' #' @description Function to export data from R as formatted .xlsx-file and spread @@ -39,28 +38,23 @@ splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", # create workbook ------ wb <- openxlsx::createWorkbook() - # get values of the variable that is used to split the data ------- data <- as.data.frame(data) - sheettitle <- paste0(title, " (", deparse(substitute(sheetvar)), ": ", - sheetvalue, ")") sheetvalues <- unique(data[, c(deparse(substitute(sheetvar)))]) col_name <- rlang::enquo(sheetvar) # loop to split values of the variable used to split the data ----- - for (sheetvalue in sheetvalues) { - data %>% + for (sheetvalue in sheetvalues){ + sheettitle <- paste0(title, " (", deparse(substitute(sheetvar)), ": ", sheetvalue, ")") + verifyDataUngrouped(data) %>% dplyr::filter((!!col_name) == sheetvalue) %>% - dplyr::ungroup() %>% - insert_worksheet(wb, sheetname = sheetvalue, title = sheettitle, - source = source, metadata = metadata, logo = logo, - grouplines = grouplines, contactdetails = contactdetails, - author = author) + insert_worksheet(wb, verifyInputSheetname(sheetvalue), sheettitle, source, + metadata, logo, grouplines, contactdetails, author) } + # Reverse order openxlsx::worksheetOrder(wb) <- rev(openxlsx::worksheetOrder(wb)) # Save xlsx ------ openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) - } diff --git a/man/aXLSX.Rd b/man/aXLSX.Rd index a9a670e..4d2490b 100644 --- a/man/aXLSX.Rd +++ b/man/aXLSX.Rd @@ -36,28 +36,31 @@ aXLSX( \item{author}{defaults to last two letters (initials) or numbers of the user name.} } \description{ -Function to export data from R to a formatted .xlsx-file. -} -\note{ -The data is exported to the first sheet. Metadata information is exported -to the second sheet. +Function to export data from R to a formatted .xlsx-file. The + data is exported to the first sheet. Metadata information is exported to + the second sheet. } \examples{ +dataset <- mtcars +source_string <- paste("Source: Henderson and Velleman (1981).", + "Building multiple regression models interactively.", + "Biometrics, 37, 391–411.") + +metadata_string <- paste("The data was extracted from the 1974", + "Motor Trend US magazine and comprises fuel consumption and", + "10 aspects of automobile design and performance for 32 automobiles", + "(1973–74 models).") \donttest{ \dontrun{ - aXLSX(data = mtcars, - title = "Motor trend car road tests", - file = "motor_trend_car_road_tests", - source = "Source: Henderson and Velleman (1981). Building multiple - regression models interactively. Biometrics, 37, 391–411.", - metadata = c("The data was extracted from the 1974 Motor Trend US - magazine and comprises fuel consumption and 10 aspects of automobile - design and performance for 32 automobiles (1973–74 models)."), - contactdetails = "statzh", - grouplines = NA, - logo = "statzh", - author = "user") + title = "Motor trend car road tests", + file = "motor_trend_car_road_tests", + source = source_string, + metadata = metadata_string, + contactdetails = "statzh", + grouplines = NA, + logo = "statzh", + author = "user") } } } diff --git a/man/add_additional_text.Rd b/man/add_additional_text.Rd index 6599c32..aeb531a 100644 --- a/man/add_additional_text.Rd +++ b/man/add_additional_text.Rd @@ -7,18 +7,19 @@ add_additional_text(wb, text, sheetname, start_row) } \arguments{ -\item{wb}{workbook object where text should be inserted} +\item{wb}{Workbook object where text should be inserted} \item{text}{Character vector of text to be inserted} -\item{sheetname}{Sheet where text should be inserted.} +\item{sheetname}{Name of the worksheet where text should be inserted.} \item{start_row}{Row from which to insert elements} } -\description{ -Insert text into an existing workbook object. +\value{ +Integer corresponding to the final row index } -\note{ -Text is inserted at first column index. +\description{ +Insert text into an existing workbook object. Text is inserted + at column index 1. } \keyword{internal} diff --git a/man/check_sheetname.Rd b/man/check_sheetname.Rd deleted file mode 100644 index 6597981..0000000 --- a/man/check_sheetname.Rd +++ /dev/null @@ -1,12 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/process_input.R -\name{check_sheetname} -\alias{check_sheetname} -\title{Functions for checking and transforming user input} -\usage{ -check_sheetname(sheetname) -} -\description{ -Helper functions not intended to be called directly by users. -} -\keyword{internal} diff --git a/man/datasetsXLSX.Rd b/man/datasetsXLSX.Rd index 400d374..ee5a289 100644 --- a/man/datasetsXLSX.Rd +++ b/man/datasetsXLSX.Rd @@ -13,7 +13,7 @@ datasetsXLSX( grouplines = NA, group_names = NA, sources = "statzh", - metadata1 = NA, + metadata = NA, sheetnames, maintitle, titlesource = "statzh", @@ -26,7 +26,8 @@ datasetsXLSX( ) } \arguments{ -\item{file}{file name of the spreadsheet. The extension ".xlsx" is added automatically.} +\item{file}{file name of the spreadsheet. The extension ".xlsx" is added +automatically.} \item{datasets}{datasets or plots to be included.} @@ -38,11 +39,12 @@ datasetsXLSX( \item{grouplines}{Column for second header(s). Format: List e.g list(c(2,4,6))} -\item{group_names}{Name(s) of the second header(s). Format: List e.g list(c("title 1", "title 2", "title 3"))} +\item{group_names}{Name(s) of the second header(s). Format: List e.g +list(c("title 1", "title 2", "title 3"))} \item{sources}{source of the data. Defaults to "statzh".} -\item{metadata1}{metadata information to be included. Defaults to NA.} +\item{metadata}{metadata information to be included. Defaults to NA.} \item{sheetnames}{names of the sheet tabs.} @@ -50,7 +52,8 @@ datasetsXLSX( \item{titlesource}{source to be mentioned on the title sheet beneath the title} -\item{logo}{file path to the logo to be included in the index-sheet. Can be "statzh" or "zh". Defaults to "statzh".} +\item{logo}{file path to the logo to be included in the index-sheet. Can be +"statzh" or "zh". Defaults to "statzh".} \item{auftrag_id}{order number.} @@ -58,18 +61,24 @@ datasetsXLSX( \item{homepage}{web address to be put on the title sheet. Default to "statzh"} -\item{openinghours}{openinghours written on the title sheet. Defaults to Data Shop} +\item{openinghours}{openinghours written on the title sheet. +Defaults to Data Shop} -\item{overwrite}{overwrites the existing excel files with the same file name. default to FALSE} +\item{overwrite}{overwrites the existing excel files with the same file name. +default to FALSE} } \description{ -Function to export several datasets and/or figures from R to an .xlsx-file. The function creates an overview sheet and separate sheets -for each dataset/figure. +Function to export several datasets and/or figures from R to an + .xlsx-file. The function creates an overview sheet and separate sheets for + each dataset/figure. } \details{ -When including figures, the heights and widths need to be specified as a vector. For example, say you have one dataset and two figures -that you would like to export. widths = c(5,6) then suggests that the first figure will be 5 inches wide, the second 6. To include a figure either -save it as a ggplot object or indicate a file path to an existing file (possible formats: png, jpg, bmp). +When including figures, the heights and widths need to be specified + as a vector. For example, say you have one dataset and two figures that you + would like to export. widths = c(5,6) then suggests that the first figure + will be 5 inches wide, the second 6. To include a figure either save it as + a ggplot object or indicate a file path to an existing file + (possible formats: png, jpg, bmp). } \examples{ \donttest{ @@ -88,7 +97,7 @@ datasetsXLSX(file="twoDatasets", Building multiple regression models interactively. Biometrics, 37, 391–411.", "Dobson, A. J. (1983) An Introduction to Statistical Modelling. London: Chapman and Hall."), - metadata1 = c("Bemerkungen zum mtcars-Datensatz: x", + metadata = c("Bemerkungen zum mtcars-Datensatz: x", "Bemerkungen zum PlantGrowth-Datensatz: x"), sheetnames = c("Autos","Blumen"), maintitle = "Autos und Pflanzen", @@ -116,7 +125,7 @@ datasetsXLSX(file="twoDatasetsandFigure", Building multiple regression models interactively. Biometrics, 37, 391–411.", "Source: Dobson, A. J. (1983) An Introduction to Statistical Modelling. London: Chapman and Hall."), - metadata1 = c("Bemerkungen zum mtcars-Datensatz: x", + metadata = c("Bemerkungen zum mtcars-Datensatz: x", "Bemerkungen zum PlantGrowth-Datensatz: x"), sheetnames = c("Autos","Blumen", "Histogramm"), maintitle = "Autos und Pflanzen", diff --git a/man/flush_left.Rd b/man/flush_left.Rd index b479738..3f78010 100644 --- a/man/flush_left.Rd +++ b/man/flush_left.Rd @@ -2,9 +2,7 @@ % Please edit documentation in R/flush_left.r \name{flush_left} \alias{flush_left} -\title{flush_left(): -Function to flush title, subtitle and caption to the lefthand side of the -graphics device} +\title{flush_left()} \usage{ flush_left(g) } @@ -12,15 +10,13 @@ flush_left(g) \item{g}{ggplot object} } \description{ -flush_left(): Function to flush title, subtitle and caption to the lefthand side of the graphics device } \examples{ -library(ggplot2) -plt <- ggplot(mtcars, aes(x = cyl)) + - geom_bar() + - labs(title = "Cylinders", subtitle = "Bar chart", +plt <- ggplot2::ggplot(mtcars, ggplot2::aes(x = cyl)) + + ggplot2::geom_bar() + + ggplot2::labs(title = "Cylinders", subtitle = "Bar chart", caption = "mtcars") flush_left(plt) diff --git a/man/insert_hyperlinks.Rd b/man/insert_hyperlinks.Rd index af2401c..695f83f 100644 --- a/man/insert_hyperlinks.Rd +++ b/man/insert_hyperlinks.Rd @@ -7,7 +7,7 @@ insert_hyperlinks(wb, sheetname, title, sheet_row) } \arguments{ -\item{wb}{Worksheet} +\item{wb}{Workbook object} \item{sheetname}{Name of sheet} @@ -16,9 +16,6 @@ insert_hyperlinks(wb, sheetname, title, sheet_row) \item{sheet_row}{Sheet row} } \description{ -A short description... -} -\details{ Function for inserting hyperlinks within an openxlsx Workbook } \keyword{internal} diff --git a/man/insert_second_header.Rd b/man/insert_second_header.Rd index 148ba28..ef4791a 100644 --- a/man/insert_second_header.Rd +++ b/man/insert_second_header.Rd @@ -27,11 +27,7 @@ insert_second_header( \item{data}{Data} } \description{ -Function to export data from R to a formatted .xlsx-file. -} -\note{ -The data is exported to the first sheet. Metadata information is exported to -the second sheet. +Function to add a second header row } \examples{ \donttest{ diff --git a/man/insert_worksheet.Rd b/man/insert_worksheet.Rd index 05b5d29..9df2e9c 100644 --- a/man/insert_worksheet.Rd +++ b/man/insert_worksheet.Rd @@ -6,7 +6,7 @@ \usage{ insert_worksheet( data, - workbook, + wb, sheetname = "data", title = "Title", source = "statzh", @@ -20,7 +20,7 @@ insert_worksheet( \arguments{ \item{data}{data to be included.} -\item{workbook}{workbook object to add new worksheet to.} +\item{wb}{workbook object to add new worksheet to.} \item{sheetname}{name of the sheet tab.} @@ -30,27 +30,34 @@ insert_worksheet( \item{metadata}{metadata information to be included. Defaults to NA.} -\item{logo}{path of the file to be included as logo (png / jpeg / svg). Defaults to "statzh"} +\item{logo}{path of the file to be included as logo (png / jpeg / svg). +Defaults to "statzh"} -\item{grouplines}{defaults to FALSE. Can be used to separate grouped variables visually.} +\item{grouplines}{defaults to FALSE. Can be used to separate grouped +variables visually.} -\item{contactdetails}{contact details of the data publisher. Defaults to "statzh".} +\item{contactdetails}{contact details of the data publisher. Defaults to +"statzh".} -\item{author}{defaults to the last two letters (initials) or numbers of the internal user name.} +\item{author}{defaults to the last two letters (initials) or numbers of the +internal user name.} } \description{ -Function to add formatted worksheets to an existing .xlsx-workbook. +Function to insert a formatted worksheet into an existing + Workbook object. } \note{ -Marked for deprecation in upcoming version. The function does not write the -result into a .xlsx file. A separate call to openxlsx::saveWorkbook() is -required. +The function does not write the result into a .xlsx file. + A separate call to openxlsx::saveWorkbook() is required. } \examples{ +# Initialize an empty Workbook +wb <- openxlsx::createWorkbook() -# Generation of a spreadsheet -wb <- openxlsx::createWorkbook("hello") +insert_worksheet(data = head(mtcars), + wb = wb, + title = "mtcars", + sheetname = "carb") -insert_worksheet(data = mtcars[c(1:10),], workbook = wb, title = "mtcars", sheetname = "carb") } \keyword{insert_worksheet} diff --git a/man/insert_worksheet_image.Rd b/man/insert_worksheet_image.Rd index a711f49..5690550 100644 --- a/man/insert_worksheet_image.Rd +++ b/man/insert_worksheet_image.Rd @@ -9,8 +9,8 @@ insert_worksheet_image( image, wb, sheetname, - startrow = 1, - startcol = 1, + startrow = 3, + startcol = 3, width, height ) @@ -36,7 +36,9 @@ insert an image into a single worksheet } \note{ The function does not write the result into a .xlsx file. A separate call -to openxlsx::saveWorkbook() is required. +to openxlsx::saveWorkbook() is required. A temporary file is created when +image refers to a gg, ggplot or histogram object. This file is deleted +afterwards. } \examples{ library(ggplot2) diff --git a/man/insert_worksheet_nh.Rd b/man/insert_worksheet_nh.Rd index aba8850..1b0be57 100644 --- a/man/insert_worksheet_nh.Rd +++ b/man/insert_worksheet_nh.Rd @@ -30,17 +30,18 @@ insert_worksheet_nh( \item{grouplines}{defaults to NA. Can be used to separate grouped variables visually.} -\item{group_names}{Name(s) of the second header(s). Format: List e.g list(c("title 1", "title 2", "title 3"))} +\item{group_names}{Name(s) of the second header(s). +Format: List e.g list(c("title 1", "title 2", "title 3"))} } \description{ -Function to add formatted worksheets without headers to an existing workbook +Function to add formatted worksheets without headers to an + existing workbook } \note{ -The function does not write the result into a .xlsx file. A separate call -to openxlsx::saveWorkbook() is required. +The function does not write the result into a .xlsx file. A separate + call to `openxlsx::saveWorkbook()` is required. } \examples{ - ## Create workbook export <- openxlsx::createWorkbook() @@ -52,7 +53,6 @@ insert_worksheet_nh(head(mtcars), export, "data1", insert_worksheet_nh(tail(mtcars), export, "data2", title = "Title", source = "statzh", metadata = "Note: ...") - ## insert a worksheet with group lines and second header insert_worksheet_nh(data = head(mtcars), wb = export, title = "grouplines", source = "statzh", metadata = "Note: ...", diff --git a/man/quickXLSX.Rd b/man/quickXLSX.Rd index 1863ddb..c66b58c 100644 --- a/man/quickXLSX.Rd +++ b/man/quickXLSX.Rd @@ -19,7 +19,8 @@ quickXLSX( \arguments{ \item{data}{data to be exported.} -\item{file}{file name of the xlsx-file. The extension ".xlsx" is added automatically.} +\item{file}{file name of the xlsx-file. The extension ".xlsx" is added +automatically.} \item{title}{title to be put above the data in the worksheet.} @@ -36,16 +37,12 @@ quickXLSX( \item{author}{defaults to last two letters (initials) or numbers of the user name.} } \description{ -A short description... -} -\details{ Function to export data from R to a formatted .xlsx-spreadsheet. } \note{ Will be deprecated in upcoming version. } \examples{ - quickXLSX(data = mtcars, title = "Motor trend car road tests", file = "motor_trend_car_road_tests", @@ -58,6 +55,5 @@ quickXLSX(data = mtcars, grouplines = FALSE, logo = "statzh", author = "user") - } \keyword{quickXLSX} diff --git a/man/quick_sum.Rd b/man/quick_sum.Rd index 6206b15..547207c 100644 --- a/man/quick_sum.Rd +++ b/man/quick_sum.Rd @@ -13,7 +13,8 @@ quick_sum(df, var, ..., stats = "all", protect = FALSE) \item{...}{grouping variables} -\item{stats}{Which descriptive statistics should be computed? Can be "all", "base", or "mean". See details.} +\item{stats}{Which descriptive statistics should be computed? Can be "all", +"base", or "mean". See details.} \item{protect}{Apply data protection, can be TRUE or FALSE. See details.} } @@ -21,15 +22,24 @@ quick_sum(df, var, ..., stats = "all", protect = FALSE) Function for simple (grouped) descriptive analyses. } \details{ -If stats is set to "all" (the default), the following descriptive statistics are computed per category of the grouping variable(s): mean, standard deviation, -10\%-quantile, 25\%-quantile, median, 75\%-quantile, 90\%-quantile. -If stats is set to "base", the mean, 25\%-quantile, median, and 75\%-quantile are returned. -stats = "mean" computes the mean and the standard deviation. +If stats is set to "all" (the default), the following descriptive + statistics are computed per category of the grouping variable(s): mean, + standard deviation, 10\%-quantile, 25\%-quantile, median, 75\%-quantile, + 90\%-quantile. -If protect is set to TRUE, the mean and the median is only computed for variables/variable categories with four or more observations. For <4 observations, the function returns NA for the respective variable/category. The other descriptives are only computed if there are at least 6 observations per variable (category). + If stats is set to "base", the mean, 25\%-quantile, median, and 75\%-quantile + are returned. + + stats = "mean" computes the mean and the standard deviation. + + If protect is set to TRUE, the mean and the median is only computed for + variables/variable categories with four or more observations. For <4 + observations, the function returns NA for the respective variable/category. + The other descriptives are only computed if there are at least 6 observations + per variable (category). } \examples{ - quick_sum(df=mtcars, var=cyl, mpg, vs, stats="all", protect=FALSE) + } \keyword{quick_sum} diff --git a/man/splitXLSX.Rd b/man/splitXLSX.Rd index 79c60b4..ebedf7f 100644 --- a/man/splitXLSX.Rd +++ b/man/splitXLSX.Rd @@ -20,11 +20,14 @@ splitXLSX( \arguments{ \item{data}{data to be exported.} -\item{file}{file name of the output .xlsx-file. The extension is added automatically.} +\item{file}{file name of the output .xlsx-file. The extension is added +automatically.} -\item{sheetvar}{name of the variable used to split the data and spread them over several sheets.} +\item{sheetvar}{name of the variable used to split the data and spread them +over several sheets.} -\item{title}{title to be put above the data in the worksheet. the sheetvar subcategory is added in brackets.} +\item{title}{title to be put above the data in the worksheet. the sheetvar +subcategory is added in brackets.} \item{source}{source of the data. Defaults to "statzh".} @@ -39,15 +42,13 @@ splitXLSX( \item{author}{defaults to last two letters (initials) or numbers of the user name.} } \description{ -A short description... -} -\details{ -Function to export data from R as formatted .xlsx-file and spread them over several worksheets -based on a grouping variable (e.g., year). +Function to export data from R as formatted .xlsx-file and spread + them over several worksheets based on a grouping variable (e.g., year). } \note{ -May be deprecated in upcoming version. User should make sure that the grouping variable is of -binary, categorical or other types with a limited number of levels. +May be deprecated in upcoming version. User should make sure that the + grouping variable is of binary, categorical or other types with a limited + number of levels. } \examples{ splitXLSX(data = mtcars, diff --git a/man/zhpal.Rd b/man/zhpal.Rd index ca81c10..00b6501 100644 --- a/man/zhpal.Rd +++ b/man/zhpal.Rd @@ -3,7 +3,8 @@ \docType{data} \name{zhpal} \alias{zhpal} -\title{Data used by the stat zh palettes} +\title{zhpal +Data used by the stat zh palettes} \format{ A \code{list}. } @@ -11,6 +12,7 @@ A \code{list}. zhpal } \description{ +zhpal Data used by the stat zh palettes } \keyword{datasets} From 1d812fc576585d02af2fc519212df8ff414581a5 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Mon, 22 May 2023 15:52:36 +0000 Subject: [PATCH 33/74] Daily commit; insert_index_sheet is now exported, as well as a function for inserting hyperlinks; added arguments for some string formatting operations. --- NAMESPACE | 2 + R/checks.R | 10 ++++ R/datasetsXLSX.R | 84 ++++++++++++++++---------------- R/helper.R | 12 +++-- R/insert_hyperlinks.R | 37 ++++++++++++-- R/insert_image.R | 8 +-- R/insert_index_sheet.R | 46 +++++++++-------- R/insert_metadata_sheet.R | 30 ++++++++---- R/insert_worksheet.R | 35 ++++++++----- R/insert_worksheet_nh.R | 43 ++++++++-------- R/interpolate.R | 2 +- R/quickXLSX.R | 7 +-- R/styles.R | 40 ++++++++++++++- man/datasetsXLSX.Rd | 23 ++++----- man/insert_hyperlink.Rd | 23 +++++++++ man/insert_hyperlinks.Rd | 18 +++++-- man/insert_index_sheet.Rd | 21 +++++--- man/insert_metadata_sheet.Rd | 14 +++++- man/insert_worksheet.Rd | 8 ++- man/insert_worksheet_image.Rd | 6 +-- man/quickXLSX.Rd | 3 -- motor_trend_car_road_tests.xlsx | Bin 0 -> 40652 bytes 22 files changed, 319 insertions(+), 153 deletions(-) create mode 100644 man/insert_hyperlink.Rd create mode 100644 motor_trend_car_road_tests.xlsx diff --git a/NAMESPACE b/NAMESPACE index 104730d..8ae07a2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -5,6 +5,8 @@ export(datasetsXLSX) export(display) export(display.statcol.all) export(flush_left) +export(insert_hyperlinks) +export(insert_index_sheet) export(insert_metadata_sheet) export(insert_worksheet) export(insert_worksheet_image) diff --git a/R/checks.R b/R/checks.R index 536d86c..c8da8d5 100644 --- a/R/checks.R +++ b/R/checks.R @@ -10,3 +10,13 @@ checkGroupOptionCompatibility <- function(group_names, grouplines){ stop("For a second header, the grouplines must be specified") } } + +#' checkImplementedPlotType() +#' +#' @description Check if image is an implemented plot type +#' @param image Any R object +#' @keywords internal +#' @noRd +checkImplementedPlotType <- function(image){ + length(setdiff(class(image), c("gg", "ggplot", "histogram"))) == 0 +} diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index 8fe4dea..21bd9a6 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -1,41 +1,42 @@ -#' datasetsXLSX() +#'datasetsXLSX() #' -#' @description Function to export several datasets and/or figures from R to an +#'@description Function to export several datasets and/or figures from R to an #' .xlsx-file. The function creates an overview sheet and separate sheets for #' each dataset/figure. -#' @details When including figures, the heights and widths need to be specified +#'@details When including figures, the heights and widths need to be specified #' as a vector. For example, say you have one dataset and two figures that you #' would like to export. widths = c(5,6) then suggests that the first figure -#' will be 5 inches wide, the second 6. To include a figure either save it as -#' a ggplot object or indicate a file path to an existing file -#' (possible formats: png, jpg, bmp). -#' @param file file name of the spreadsheet. The extension ".xlsx" is added +#' will be 5 inches wide, the second 6. To include a figure either save it as a +#' ggplot object or indicate a file path to an existing file (possible formats: +#' png, jpg, bmp). +#'@param file file name of the spreadsheet. The extension ".xlsx" is added #' automatically. -#' @param maintitle Title to be put on the first (overview) sheet. -#' @param datasets datasets or plots to be included. -#' @param plot_widths width of figure in inch (1 inch = 2.54 cm). See details. -#' @param plot_heights height of figure in inch (1 inch = 2.54 cm). See details. -#' @param sheetnames names of the sheet tabs. -#' @param titles titles of the different sheets. -#' @param logo file path to the logo to be included in the index-sheet. Can be +#'@param maintitle Title to be put on the first (overview) sheet. +#'@param datasets datasets or plots to be included. +#'@param plot_widths width of figure in inch (1 inch = 2.54 cm). See details. +#'@param plot_heights height of figure in inch (1 inch = 2.54 cm). See details. +#'@param sheetnames names of the sheet tabs. +#'@param titles titles of the different sheets. +#'@param logo file path to the logo to be included in the index-sheet. Can be #' "statzh" or "zh". Defaults to "statzh". -#' @param titlesource source to be mentioned on the title sheet beneath the title -#' @param sources source of the data. Defaults to "statzh". -#' @param metadata metadata information to be included. Defaults to NA. -#' @param auftrag_id order number. -#' @param contact contact information on the title sheet. Defaults to "statzh" -#' @param homepage web address to be put on the title sheet. Default to "statzh" -#' @param openinghours openinghours written on the title sheet. -#' Defaults to Data Shop -#' @param grouplines Column for second header(s). Format: List e.g list(c(2,4,6)) -#' @param group_names Name(s) of the second header(s). Format: List e.g +#'@param titlesource source to be mentioned on the title sheet beneath the title +#'@param sources source of the data. Defaults to "statzh". +#'@param metadata metadata information to be included. Defaults to NA. +#'@param auftrag_id order number. +#'@param contact contact information on the title sheet. Defaults to "statzh" +#'@param homepage web address to be put on the title sheet. Default to "statzh" +#'@param openinghours openinghours written on the title sheet. Defaults to Data +#' Shop +#'@param grouplines Column for second header(s). Format: List e.g list(c(2,4,6)) +#'@param group_names Name(s) of the second header(s). Format: List e.g #' list(c("title 1", "title 2", "title 3")) -#' @param overwrite overwrites the existing excel files with the same file name. +#'@param overwrite overwrites the existing excel files with the same file name. #' default to FALSE -#' @keywords datasetsXLSX -#' @export -#' @importFrom dplyr "%>%" -#' @importFrom purrr pwalk pmap +#'@param wb existing Workbook. Defaults to NULL +#'@keywords datasetsXLSX +#'@export +#'@importFrom dplyr "%>%" +#'@importFrom purrr pwalk pmap #' @examples #'\donttest{ #' \dontrun{ @@ -73,14 +74,12 @@ #' geom_histogram() #' #'datasetsXLSX(file="twoDatasetsandFigure", -#' datasets = list(dat1, dat2, fig), # fig als ggplot Objekt oder File Path +#' datasets = list(dat1, dat2, fig), #' titles = c("mtcars-Datensatz","PlantGrowth-Datensatz", "Histogramm"), #' plot_widths = c(5), #' plot_heights = c(5), -#' sources = c("Source: Henderson and Velleman (1981). -#' Building multiple regression models interactively. Biometrics, 37, 391–411.", -#' "Source: Dobson, A. J. (1983) An Introduction to -#' Statistical Modelling. London: Chapman and Hall."), +#' sources = c("Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.", +#' "Source: Dobson, A. J. (1983) An Introduction to Statistical Modelling. London: Chapman and Hall."), #' metadata = c("Bemerkungen zum mtcars-Datensatz: x", #' "Bemerkungen zum PlantGrowth-Datensatz: x"), #' sheetnames = c("Autos","Blumen", "Histogramm"), @@ -100,20 +99,26 @@ datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, sheetnames, maintitle, titlesource = "statzh", logo = "statzh", auftrag_id = NULL, contact = "statzh", homepage = "statzh", - openinghours = "statzh", overwrite = F){ + openinghours = "statzh", overwrite = F, wb = NULL){ # Run checks on arguments ------ checkGroupOptionCompatibility(group_names, grouplines) + + # Initialize new Workbook ------ - wb <- openxlsx::createWorkbook() + if (is.null(wb)){ + wb <- openxlsx::createWorkbook() + } # Create indexes of which inputs correspond to data.frames or plots----- dataframes_index <- which(vapply(datasets, is.data.frame, TRUE)) implemented_plot_types <- c("gg", "ggplot", "histogram", "character") - plot_index <- which(vapply(datasets, function(x) class(x) %in% implemented_plot_types, TRUE)) + plot_index <- which(vapply(datasets, function(x){ + length(setdiff(class(x), implemented_plot_types)) == 0 + }, TRUE)) # Index from input lists using index ----------- ### data.frames @@ -162,10 +167,7 @@ datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, # Create a table of hyperlinks in index sheet (assumed to be "Index") ------ - data.frame(sheetnames = sheetnames, - titles = titles, - sheet_row = seq(15, 15 + length(sheetnames) - 1)) %>% - purrr::pwalk(~insert_hyperlinks(wb, sheetname = ..1, title = ..2, sheet_row = ..3)) + insert_hyperlinks(wb, sheetnames, titles, index_sheet_name = "Index", sheet_start_row = 15) # Save workbook at path denoted by argument file --------- diff --git a/R/helper.R b/R/helper.R index 507c161..260b98f 100644 --- a/R/helper.R +++ b/R/helper.R @@ -84,7 +84,7 @@ inputHelperSource <- function(source, prefix = NULL, collapse = NULL){ inputHelperMetadata <- function(metadata, prefix = NULL, collapse = NULL){ if (all(is.na(metadata))){ - return(metadata) + return(NULL) } if (!is.null(collapse)){ @@ -130,7 +130,11 @@ inputHelperLogoPath <- function(logo){ inputHelperContactInfo <- function(contact, compact = FALSE){ if (contact == "statzh"){ - contact <- ifelse(compact, statzh_contact_compact, statzh_contact) + if (compact){ + contact <- statzh_contact_compact + } else { + contact <- statzh_contact + } } return(contact) @@ -167,8 +171,8 @@ inputHelperOfficeHours <- function(openinghours){ #' @noRd #' inputHelperHomepage <- function(homepage){ - sub("statzh", statzh_homepage, homepage) - class(homepage) <- 'hyperlink' + homepage <- sub("statzh", statzh_homepage, homepage) + # class(homepage) <- 'hyperlink' return(homepage) } diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index 612cde7..26fe44e 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -1,15 +1,16 @@ -#' insert_hyperlinks() +#' insert_hyperlink() #' #' @description Function for inserting hyperlinks within an openxlsx Workbook #' @param wb Workbook object #' @param sheetname Name of sheet #' @param title Title #' @param sheet_row Sheet row +#' @param index_sheet_name Name of sheet where hyperlink should be created #' @keywords internal -insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ - openxlsx::writeData(wb, "Inhalt", title, xy = c("C", sheet_row)) - openxlsx::addStyle(wb, "Inhalt", hyperlinkStyle(), sheet_row, cols = 3) - openxlsx::mergeCells(wb, sheet = "Inhalt", rows = sheet_row, cols = 3:8) +insert_hyperlink <- function(wb, sheetname, title, sheet_row, index_sheet_name){ + openxlsx::writeData(wb, index_sheet_name, title, xy = c("C", sheet_row)) + openxlsx::addStyle(wb, index_sheet_name, hyperlinkStyle(), sheet_row, cols = 3) + openxlsx::mergeCells(wb, index_sheet_name, rows = sheet_row, cols = 3:8) # Set up hyperlink ------- worksheet <- wb$sheetOrder[1] @@ -28,3 +29,29 @@ insert_hyperlinks <- function(wb, sheetname, title, sheet_row){ wb$worksheets[[worksheet]]$sheet_data$v <- field_v wb$worksheets[[worksheet]]$sheet_data$f <- field_f } + +#' insert_hyperlinks() +#' +#' @description Function for inserting hyperlinks within an openxlsx Workbook +#' @param wb Workbook object +#' @param sheetnames Names of sheets to create hyperlinks to +#' @param titles Titles of Hyperlinks +#' @param index_sheet_name Name of sheet where hyperlinks should be created +#' @param sheet_start_row Sheet row +#' @export +#' @keywords insert_hyperlinks +insert_hyperlinks <- function(wb, sheetnames, titles, index_sheet_name = "Index", + sheet_start_row = 15){ + + sheet_rows <- sheet_start_row + seq(0, length(sheetnames) - 1) + + data.frame(sheetnames = sheetnames, + titles = titles, + sheet_row = sheet_rows) %>% + purrr::pwalk(~insert_hyperlink(wb, + sheetname = ..1, + title = ..2, + sheet_row = ..3, + index_sheet_name = index_sheet_name)) +} + diff --git a/R/insert_image.R b/R/insert_image.R index 80eece9..138e7cc 100644 --- a/R/insert_image.R +++ b/R/insert_image.R @@ -1,5 +1,6 @@ #' insert_worksheet_image() -#' insert an image into a single worksheet +#' +#' @description Insert an image into a worksheet #' @note #' The function does not write the result into a .xlsx file. A separate call #' to openxlsx::saveWorkbook() is required. A temporary file is created when @@ -56,7 +57,7 @@ insert_worksheet_image <- function(image, wb, sheetname, startrow = 3, if (is(image, "character")){ image_path <- image - } else if (is(image, "gg") | is(image, "ggplot") | is(image, "histogram")){ + } else if (checkImplementedPlotType(image)){ # Allocate temporary file of type png to save the image to image_path <- tempfile(fileext = ".png") @@ -79,8 +80,7 @@ insert_worksheet_image <- function(image, wb, sheetname, startrow = 3, stop("Plot muss als ggplot Objekt oder als Filepath vorliegen.") } - # Add new worksheet with image - #-------------- + # Add new worksheet with image ---------- if (file.exists(image_path)){ openxlsx::addWorksheet(wb, sheetName = sheetname, gridLines = FALSE) diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index 34acd3b..290cba8 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -8,22 +8,35 @@ #' @param openinghours statzh or a character string or vector with opening hours #' @param titlesource Character vector denoting the data source #' @param auftrag_id Order ID -#' @param maintitle Main title +#' @param maintitle Title shown on index sheet +#' @param sheetname Name of Index Sheet +#' @param date_prefix Text prepended to date +#' @param order_id_prefix Text prepended to order ID +#' @export #' @keywords datasetsXLSX -insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, - titlesource, auftrag_id, maintitle){ +insert_index_sheet <- function(wb, logo = "statzh", contact = "statzh", + homepage = "statzh", openinghours = "statzh", + titlesource, auftrag_id, maintitle, + sheetname = "Index", + date_prefix = "Erstellt am: ", + order_id_prefix = "Auftragsnr.:"){ # Hardcoded ---------- - index_sheet_name <- "Inhalt" + index_sheet_name <- "Index" toc_caption <- "Inhalt" - # Initialize new worksheet as index sheet ------ - openxlsx::addWorksheet(wb, index_sheet_name) + # Process input (substitute default values) ----- + logo <- inputHelperLogoPath(logo) + contact <- inputHelperContactInfo(contact) + homepage <- inputHelperHomepage(homepage) + openinghours <- inputHelperOfficeHours(openinghours) + creationdate <- inputHelperDateCreated(prefix = date_prefix) + order_id <- inputHelperOrderNumber(auftrag_id, prefix = order_id_prefix) - # Process input (substitute default values) ----- - contactdetails <- inputHelperContactInfo(contactdetails) + # Initialize new worksheet as index sheet ------ + openxlsx::addWorksheet(wb, index_sheet_name) # Determine start/end rows of content blocks ----- @@ -36,34 +49,28 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, # Insert logo ---------- - logo <- inputHelperLogoPath(logo) - if (!is.null(logo)){ - openxlsx::insertImage(wb, index_sheet_name, logo, 2.145, 0.7865, "in") + openxlsx::insertImage(wb, index_sheet_name, logo, 2.145, 0.7865, units = "in") } # Insert contact info, title, metadata, and sources into worksheet -------- - ### Contact information - contact_info <- c(contact, inputHelperHomepage(homepage)) + contact_info <- c(contact, homepage) openxlsx::writeData(wb, index_sheet_name, contact_info, xy = c("O", contact_start_row)) ### Office hours - openxlsx::writeData(wb, index_sheet_name, inputHelperOfficeHours(openinghours), xy = c("R", contact_start_row)) + openxlsx::writeData(wb, index_sheet_name, openinghours, xy = c("R", contact_start_row)) ### Request information - request_info <- c(inputHelperDateCreated(prefix = "Erstellt am: "), - inputHelperOrderNumber(auftrag_id, prefix = "Auftragsnr.:")) - - openxlsx::writeData(wb, index_sheet_name, request_info, xy = c("O", request_start_row)) + openxlsx::writeData(wb, index_sheet_name, c(creationdate, order_id), xy = c("O", request_start_row)) ### Title openxlsx::writeData(wb, index_sheet_name, maintitle, xy = c("C", title_start_row)) openxlsx::addStyle(wb, index_sheet_name, style_maintitle(), title_start_row, 3) ### Source - openxlsx::writeData(wb, index_sheet_name, source, xy = c("C", source_start_row)) + openxlsx::writeData(wb, index_sheet_name, titlesource, xy = c("C", source_start_row)) ### Table of content caption openxlsx::writeData(wb, index_sheet_name, toc_caption, xy = c("C", index_start_row)) @@ -71,7 +78,6 @@ insert_index_sheet <- function(wb, logo, contact, homepage, openinghours, # Format --------- - ### Set column width of first column to 1 openxlsx::setColWidths(wb, index_sheet_name, 1, 1) diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index d11b0bb..46a8c19 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -9,6 +9,10 @@ #' @param logo path of the file to be included as logo (png / jpeg / svg). Defaults to "statzh" #' @param contactdetails contact details of the data publisher. Defaults to "statzh". #' @param author defaults to the last two letters (initials) or numbers of the internal user name. +#' @param date_prefix Text shown before date +#' @param author_prefix Text shown before author name +#' @param source_prefix Text shown before sources +#' @param metadata_prefix Text shown before metadata #' @importFrom dplyr "%>%" #' @keywords insert_metadata_sheet, openxlsx #' @export @@ -21,11 +25,21 @@ #' openxlsx::saveWorkbook(wb,"insert_metadata_sheet.xlsx") #' } insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", - source = "statzh", metadata = NA, logo = "statzh", contactdetails = "statzh", - author = "user"){ + source = "statzh", metadata = NA, + logo = "statzh", contactdetails = "statzh", + author = "user", date_prefix = "Aktualisiert am: ", + author_prefix = "durch: ", + source_prefix = "Datenquelle:", + metadata_prefix = "Hinweise:"){ # Process input (substitute default values) ----- + logo <- inputHelperLogoPath(logo) contactdetails <- inputHelperContactInfo(contactdetails) + creationdate <- inputHelperDateCreated(prefix = date_prefix) + authorname <- inputHelperAuthorName(author, prefix = author_prefix) + source <- inputHelperSource(source, prefix = source_prefix) + metadata <- inputHelperMetadata(metadata, prefix = metadata_prefix) + # Determine start/end rows of content blocks ----- contact_start_row <- 2 @@ -42,20 +56,17 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", # Insert logo -------- - logo <- inputHelperLogoPath(logo) if(!is.null(logo)){ - openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, "in") + openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, units = "in") } # Insert contact info, title, metadata, and sources into worksheet -------- - ### Contact info openxlsx::writeData(wb, sheetname, contactdetails, 12, contact_start_row) ### Request information - info_string <- paste(inputHelperDateCreated(prefix = "Aktualisiert am: "), - inputHelperAuthorName(author, prefix = "durch: ")) + info_string <- paste(creationdate, authorname) openxlsx::writeData(wb, sheetname, info_string, 12, contact_end_row + 1) ### Title @@ -63,13 +74,12 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", openxlsx::addStyle(wb, sheetname, style_title(), rows = title_start_row, cols = 1) ### Source and metadata - openxlsx::writeData(wb, sheetname, inputHelperSource(source, prefix = "Datenquelle:"), startRow = source_start_row) - openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata, prefix = "Hinweise:"), startRow = metadata_start_row) + openxlsx::writeData(wb, sheetname, source, startRow = source_start_row) + openxlsx::writeData(wb, sheetname, metadata, startRow = metadata_start_row) openxlsx::addStyle(wb, sheetname, style_subtitle2(), c(source_start_row, metadata_start_row), 1) # Format ---------- - ### Headerline openxlsx::addStyle(wb, sheetname, style_headerline(), contact_end_row + 2, 1:26, gridExpand = TRUE, stack = TRUE) diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index a12fed5..59b8556 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -14,10 +14,13 @@ #' Defaults to "statzh" #' @param contactdetails contact details of the data publisher. Defaults to #' "statzh". +#' @param homepage Homepage of data publisher. Defaults to "statzh". #' @param grouplines defaults to FALSE. Can be used to separate grouped #' variables visually. #' @param author defaults to the last two letters (initials) or numbers of the #' internal user name. +#' @param date_prefix Text shown before date +#' @param author_prefix Text shown before author name #' @importFrom dplyr "%>%" #' @keywords insert_worksheet #' @export @@ -33,23 +36,31 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", source = "statzh", metadata = NA, logo = "statzh", grouplines = FALSE, contactdetails = "statzh", - author = "user"){ + homepage = "statzh", author = "user", + date_prefix = "Aktualisiert am: ", + author_prefix = "durch: "){ # Process input (substitute default values) ----- + logo <- inputHelperLogoPath(logo) contactdetails <- inputHelperContactInfo(contactdetails) + homepage <- inputHelperHomepage(homepage) + creationdate <- inputHelperDateCreated(prefix = date_prefix) + authorname <- inputHelperAuthorName(author, prefix = author_prefix) + source <- inputHelperSource(source) + metadata <- inputHelperMetadata(metadata) - # Determine start/end rows, row and column extents of content blocks ----- + # Determine start/end rows, row and column extents of content blocks ----- ### Contact information contact_start_row <- 2 contact_start_col <- max(ncol(data) - 2, 4) contact_end_col <- 26 contact_end_row <- contact_start_row + length(contactdetails) contact_column_extent <- contact_start_col:contact_end_col - contact_rows_extent <- contact_start_row:(contact_end_row + 1) + contact_rows_extent <- contact_start_row:contact_end_row ### Descriptives - title_start_row <- contact_end_row + 2 + title_start_row <- contact_end_row + 3 source_start_row <- title_start_row + 1 metadata_start_row <- source_start_row + length(source) metadata_end_row <- metadata_start_row + length(metadata) @@ -68,20 +79,19 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", # Insert logo ------ - logo <- inputHelperLogoPath(logo) - if (!is.null(logo)){ - openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, "in") + openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, units = "in") } # Insert contact info, date created, and author ----- ### Contact info - openxlsx::writeData(wb, sheetname, contactdetails, contact_start_col, contact_start_row, headerStyle = style_wrap()) + openxlsx::writeData(wb, sheetname, contactdetails, contact_start_col, contact_start_row) + openxlsx::writeData(wb, sheetname, homepage, contact_start_col, contact_end_row) ### Creation date - infostring <- paste(inputHelperDateCreated(prefix = "Aktualisiert am: "), inputHelperAuthorName(author, prefix = "durch: ")) - openxlsx::writeData(wb, sheetname, infostring, contact_start_col, contact_end_row + 1, headerStyle = style_subtitle3()) + infostring <- paste(creationdate, authorname) + openxlsx::writeData(wb, sheetname, infostring, contact_start_col, contact_end_row+1) # Insert descriptives into worksheet -------- @@ -90,14 +100,13 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", openxlsx::addStyle(wb, sheetname, style_title(), title_start_row, 1, gridExpand = TRUE) ### Source - openxlsx::writeData(wb, sheetname, inputHelperSource(source), startRow = source_start_row, headerStyle = style_subtitle3()) + openxlsx::writeData(wb, sheetname, source, startRow = source_start_row) ### Metadata - openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), startRow = metadata_start_row, headerStyle = style_subtitle3()) + openxlsx::writeData(wb, sheetname, metadata, startRow = metadata_start_row) # Insert data -------- - ### Pad colnames using whitespaces for better auto-fitting of column width colnames(data) <- paste0(colnames(data), " ", sep = "") diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index f297541..21d9f9e 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -42,38 +42,43 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", source = "statzh", metadata = NA, grouplines = NA, group_names = NA){ + # Process input (substitute default values) ----- + source <- inputHelperSource(source) + metadata <- inputHelperMetadata(metadata) + + + # Determine start/end rows, row and column extents of content blocks ----- + ### Descriptives + title_start_row <- 1 + source_start_row <- title_start_row + 1 + metadata_start_row <- source_start_row + length(source) + metadata_end_row <- metadata_start_row + length(metadata) + # descriptives_row_extent <- title_start_row:metadata_end_row + + ### Data + data_start_row <- metadata_end_row + 3 + data_end_row <- data_start_row + nrow(data) + # data_row_extent <- data_start_row:data_end_row + + # Initialize new worksheet ------ sheetname <- verifyInputSheetname(sheetname) openxlsx::addWorksheet(wb, sheetname) # Insert title, metadata, and sources into worksheet -------- - ### Title openxlsx::writeData(wb, sheetname, title) openxlsx::addStyle(wb, sheetname, style_title(), 1, 1) ### Source - sources_to_insert <- inputHelperSource(source) - source_end_row <- add_additional_text(wb, sources_to_insert, sheetname, 2) + openxlsx::writeData(wb, sheetname, source, startRow = source_start_row) ### Metadata - if (!is.na(metadata)){ - metadata_to_insert <- inputHelperMetadata(metadata) - metadata_start_row <- source_end_row + 1 - - metadata_end_row <- add_additional_text(wb, metadata_to_insert, sheetname, metadata_start_row) - - data_start_row <- metadata_end_row + 2 - merge_end_row <- metadata_end_row - - } else{ - data_start_row <- source_end_row + 2 - merge_end_row <- source_end_row - } + openxlsx::writeData(wb, sheetname, metadata, startRow = metadata_start_row) ### Merge cells with title, metadata, and sources to ensure that they're displayed properly - purrr::walk(1:merge_end_row, ~openxlsx::mergeCells(wb, sheetname, 1:26, rows = .)) + purrr::walk(1:metadata_end_row, ~openxlsx::mergeCells(wb, sheetname, 1:26, rows = .)) # Insert data -------- @@ -91,9 +96,7 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", openxlsx::addStyle(wb, sheetname, style_header(), data_start_row, 1:ncol(data), gridExpand = TRUE, stack = TRUE) - # Apply styles -------- - - ### Grouplines + # Grouplines --------- if (any(!is.na(grouplines))){ if (!any(is.na(group_names))){ data_start_row <- data_start_row - 1 diff --git a/R/interpolate.R b/R/interpolate.R index c53aafa..1fdea9a 100644 --- a/R/interpolate.R +++ b/R/interpolate.R @@ -20,7 +20,7 @@ interpolate2 <- function(palette, color, degree, number){ } newpalette <- c() - for (i in palette) { + for (i in palette){ intcols <- c(i, color) pal <- grDevices::colorRampPalette(intcols) intcols <- pal(7) diff --git a/R/quickXLSX.R b/R/quickXLSX.R index 7da721d..2e190a9 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -1,7 +1,6 @@ #' quickXLSX() #' #' @description Function to export data from R to a formatted .xlsx-spreadsheet. -#' @note Will be deprecated in upcoming version. #' @param data data to be exported. #' @param file file name of the xlsx-file. The extension ".xlsx" is added #' automatically. @@ -29,10 +28,12 @@ quickXLSX <- function(data = NA, file, title = "Title", source = "statzh", # Create workbook -------- wb <- openxlsx::createWorkbook() + # Insert data -------- insert_worksheet(data, wb, "Inhalt", title = title, source = source, - metadata = metadata, logo = logo, grouplines = grouplines, - contactdetails = contactdetails, author = author) + metadata = metadata, logo = logo, grouplines = grouplines, + contactdetails = contactdetails, author = author) + # Save workbook--------- openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) diff --git a/R/styles.R b/R/styles.R index 20f23b7..00614b2 100644 --- a/R/styles.R +++ b/R/styles.R @@ -4,11 +4,49 @@ #' @keywords internal #' @noRd + +### Metadata +style_metadata_title <- function(){ + openxlsx::createStyle(fontSize = 14, textDecoration = "bold", fontName = "Arial") +} +style_metadata_subtitle <- function(){ + openxlsx::createStyle(fontSize = 12, textDecoration = "bold", fontName = "Arial") +} +style_metadata_headerline <- function(){ + openxlsx::createStyle(border = "Bottom", borderColour = "#009ee0", + borderStyle = getOption("openxlsx.borderStyle", "thick")) +} + +### Index + + +### worksheet +style_worksheet_title <- function(){ + openxlsx::createStyle(fontSize=14, textDecoration="bold",fontName="Arial") +} +style_worksheet_subtitle <- function(){ + openxlsx::createStyle(fontSize=12, textDecoration="italic",fontName="Arial") +} +style_worksheet_header <- function(){ + openxlsx::createStyle(fontSize = 12, fontColour = "#000000", halign = "left", border="Bottom", borderColour = "#009ee0",textDecoration = "bold") +} +style_worksheet_headerline <- function(){ + +} +### Worksheet no header + + + mainTitleStyle <- function(){ openxlsx::createStyle(fontSize = 20, textDecoration = "bold", fontName = "Arial", halign = "left") } +style_maintitle <- function(){ + openxlsx::createStyle(fontSize = 20, textDecoration = "bold", fontName = "Arial", + halign = "left") +} + style_title <- function(){ openxlsx::createStyle(fontSize = 14, textDecoration = "bold", fontName = "Arial") } @@ -56,6 +94,6 @@ style_leftline <- function(){ } # Linewrap text --------- -style_wrap <- function() { +style_wrap <- function(){ openxlsx::createStyle(wrapText = TRUE) } diff --git a/man/datasetsXLSX.Rd b/man/datasetsXLSX.Rd index ee5a289..22d1981 100644 --- a/man/datasetsXLSX.Rd +++ b/man/datasetsXLSX.Rd @@ -22,7 +22,8 @@ datasetsXLSX( contact = "statzh", homepage = "statzh", openinghours = "statzh", - overwrite = F + overwrite = F, + wb = NULL ) } \arguments{ @@ -61,11 +62,13 @@ list(c("title 1", "title 2", "title 3"))} \item{homepage}{web address to be put on the title sheet. Default to "statzh"} -\item{openinghours}{openinghours written on the title sheet. -Defaults to Data Shop} +\item{openinghours}{openinghours written on the title sheet. Defaults to Data +Shop} \item{overwrite}{overwrites the existing excel files with the same file name. default to FALSE} + +\item{wb}{existing Workbook. Defaults to NULL} } \description{ Function to export several datasets and/or figures from R to an @@ -76,9 +79,9 @@ Function to export several datasets and/or figures from R to an When including figures, the heights and widths need to be specified as a vector. For example, say you have one dataset and two figures that you would like to export. widths = c(5,6) then suggests that the first figure - will be 5 inches wide, the second 6. To include a figure either save it as - a ggplot object or indicate a file path to an existing file - (possible formats: png, jpg, bmp). + will be 5 inches wide, the second 6. To include a figure either save it as a + ggplot object or indicate a file path to an existing file (possible formats: + png, jpg, bmp). } \examples{ \donttest{ @@ -117,14 +120,12 @@ fig <- ggplot(mtcars, aes(x=disp))+ geom_histogram() datasetsXLSX(file="twoDatasetsandFigure", - datasets = list(dat1, dat2, fig), # fig als ggplot Objekt oder File Path + datasets = list(dat1, dat2, fig), titles = c("mtcars-Datensatz","PlantGrowth-Datensatz", "Histogramm"), plot_widths = c(5), plot_heights = c(5), - sources = c("Source: Henderson and Velleman (1981). - Building multiple regression models interactively. Biometrics, 37, 391–411.", - "Source: Dobson, A. J. (1983) An Introduction to - Statistical Modelling. London: Chapman and Hall."), + sources = c("Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.", + "Source: Dobson, A. J. (1983) An Introduction to Statistical Modelling. London: Chapman and Hall."), metadata = c("Bemerkungen zum mtcars-Datensatz: x", "Bemerkungen zum PlantGrowth-Datensatz: x"), sheetnames = c("Autos","Blumen", "Histogramm"), diff --git a/man/insert_hyperlink.Rd b/man/insert_hyperlink.Rd new file mode 100644 index 0000000..c4f7299 --- /dev/null +++ b/man/insert_hyperlink.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/insert_hyperlinks.R +\name{insert_hyperlink} +\alias{insert_hyperlink} +\title{insert_hyperlink()} +\usage{ +insert_hyperlink(wb, sheetname, title, sheet_row, index_sheet_name) +} +\arguments{ +\item{wb}{Workbook object} + +\item{sheetname}{Name of sheet} + +\item{title}{Title} + +\item{sheet_row}{Sheet row} + +\item{index_sheet_name}{Name of sheet where hyperlink should be created} +} +\description{ +Function for inserting hyperlinks within an openxlsx Workbook +} +\keyword{internal} diff --git a/man/insert_hyperlinks.Rd b/man/insert_hyperlinks.Rd index 695f83f..fd0ad36 100644 --- a/man/insert_hyperlinks.Rd +++ b/man/insert_hyperlinks.Rd @@ -4,18 +4,26 @@ \alias{insert_hyperlinks} \title{insert_hyperlinks()} \usage{ -insert_hyperlinks(wb, sheetname, title, sheet_row) +insert_hyperlinks( + wb, + sheetnames, + titles, + index_sheet_name = "Index", + sheet_start_row = 15 +) } \arguments{ \item{wb}{Workbook object} -\item{sheetname}{Name of sheet} +\item{sheetnames}{Names of sheets to create hyperlinks to} -\item{title}{Title} +\item{titles}{Titles of Hyperlinks} -\item{sheet_row}{Sheet row} +\item{index_sheet_name}{Name of sheet where hyperlinks should be created} + +\item{sheet_start_row}{Sheet row} } \description{ Function for inserting hyperlinks within an openxlsx Workbook } -\keyword{internal} +\keyword{insert_hyperlinks} diff --git a/man/insert_index_sheet.Rd b/man/insert_index_sheet.Rd index 1436e19..79ec118 100644 --- a/man/insert_index_sheet.Rd +++ b/man/insert_index_sheet.Rd @@ -6,13 +6,16 @@ \usage{ insert_index_sheet( wb, - logo, - contact, - homepage, - openinghours, + logo = "statzh", + contact = "statzh", + homepage = "statzh", + openinghours = "statzh", titlesource, auftrag_id, - maintitle + maintitle, + sheetname = "Index", + date_prefix = "Erstellt am: ", + order_id_prefix = "Auftragsnr.:" ) } \arguments{ @@ -30,7 +33,13 @@ insert_index_sheet( \item{auftrag_id}{Order ID} -\item{maintitle}{Main title} +\item{maintitle}{Title shown on index sheet} + +\item{sheetname}{Name of Index Sheet} + +\item{date_prefix}{Text prepended to date} + +\item{order_id_prefix}{Text prepended to order ID} } \description{ Function which generates an index sheet inside an openxlsx workbook. diff --git a/man/insert_metadata_sheet.Rd b/man/insert_metadata_sheet.Rd index bd22444..52eb929 100644 --- a/man/insert_metadata_sheet.Rd +++ b/man/insert_metadata_sheet.Rd @@ -12,7 +12,11 @@ insert_metadata_sheet( metadata = NA, logo = "statzh", contactdetails = "statzh", - author = "user" + author = "user", + date_prefix = "Aktualisiert am: ", + author_prefix = "durch: ", + source_prefix = "Datenquelle:", + metadata_prefix = "Hinweise:" ) } \arguments{ @@ -31,6 +35,14 @@ insert_metadata_sheet( \item{contactdetails}{contact details of the data publisher. Defaults to "statzh".} \item{author}{defaults to the last two letters (initials) or numbers of the internal user name.} + +\item{date_prefix}{Text shown before date} + +\item{author_prefix}{Text shown before author name} + +\item{source_prefix}{Text shown before sources} + +\item{metadata_prefix}{Text shown before metadata} } \description{ Function to add formatted metadata information to an existing .xlsx-workbook. diff --git a/man/insert_worksheet.Rd b/man/insert_worksheet.Rd index 9df2e9c..2bf9a7b 100644 --- a/man/insert_worksheet.Rd +++ b/man/insert_worksheet.Rd @@ -14,7 +14,9 @@ insert_worksheet( logo = "statzh", grouplines = FALSE, contactdetails = "statzh", - author = "user" + author = "user", + date_prefix = "Aktualisiert am: ", + author_prefix = "durch: " ) } \arguments{ @@ -41,6 +43,10 @@ variables visually.} \item{author}{defaults to the last two letters (initials) or numbers of the internal user name.} + +\item{date_prefix}{Text shown before date} + +\item{author_prefix}{Text shown before author name} } \description{ Function to insert a formatted worksheet into an existing diff --git a/man/insert_worksheet_image.Rd b/man/insert_worksheet_image.Rd index 5690550..51887d9 100644 --- a/man/insert_worksheet_image.Rd +++ b/man/insert_worksheet_image.Rd @@ -2,8 +2,7 @@ % Please edit documentation in R/insert_image.R \name{insert_worksheet_image} \alias{insert_worksheet_image} -\title{insert_worksheet_image() -insert an image into a single worksheet} +\title{insert_worksheet_image()} \usage{ insert_worksheet_image( image, @@ -31,8 +30,7 @@ insert_worksheet_image( \item{height}{height of figure} } \description{ -insert_worksheet_image() -insert an image into a single worksheet +Insert an image into a worksheet } \note{ The function does not write the result into a .xlsx file. A separate call diff --git a/man/quickXLSX.Rd b/man/quickXLSX.Rd index c66b58c..46ac018 100644 --- a/man/quickXLSX.Rd +++ b/man/quickXLSX.Rd @@ -39,9 +39,6 @@ automatically.} \description{ Function to export data from R to a formatted .xlsx-spreadsheet. } -\note{ -Will be deprecated in upcoming version. -} \examples{ quickXLSX(data = mtcars, title = "Motor trend car road tests", diff --git a/motor_trend_car_road_tests.xlsx b/motor_trend_car_road_tests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..74e664a0b63bf6c3f45404d9293feaa8dacc57f3 GIT binary patch literal 40652 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 RqM;F?K9{KLq&De#^ncjQg_r;U literal 0 HcmV?d00001 From f9c41561b3215742996dce1f875614df8865616d Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Fri, 26 May 2023 14:56:11 +0000 Subject: [PATCH 34/74] Daily commit; Positions of content in xlsx are now relative. --- R/helper.R | 98 +++++++++++++++++++++++++++++++++++++++ R/insert_index_sheet.R | 77 ++++++++++++++---------------- R/insert_metadata_sheet.R | 53 +++++++++++---------- R/insert_worksheet.R | 82 +++++++++++++++++++++----------- R/insert_worksheet_nh.R | 67 +++++++++++--------------- man/insert_worksheet.Rd | 3 ++ 6 files changed, 245 insertions(+), 135 deletions(-) diff --git a/R/helper.R b/R/helper.R index 260b98f..8b95e51 100644 --- a/R/helper.R +++ b/R/helper.R @@ -224,3 +224,101 @@ inputHelperAuthorName <- function(author, prefix = NULL){ return(paste0(prefix, author)) } + + +#' excelIndexToRowCol() +#' +#' @description Function extracts initials from global environment if +#' input is 'user', otherwise passes on the input. +#' @param author Name of author +#' @param prefix A character string to prepend to the result +#' @returns A character string with the username +#' @keywords internal +#' @noRd +#' +excelIndexToRowCol <- function(index){ + + splitIndex <- function(x, split = "") unlist(strsplit(x, split)) + + excelColumnLetterToNumeric <- function(x){ + chars <- splitIndex(x, "") + offsets <- 26^(length(chars):1 - 1) + sum(offsets * match(chars, LETTERS)) + } + + # Return extent of occupied region + if (length(index) > 1){ + extents <- lapply(index, excelIndexToRowCol) + extents <- unique(do.call(rbind,lapply(extents, stack))) + rows <- extents[extents$ind == "row", "values"] + cols <- extents[extents$ind == "col", "values"] + return(list(row = seq(min(rows), max(rows)), + col = seq(min(cols), max(cols)))) + } + + # Single index + column_index <- sapply(splitIndex(gsub("([0-9]+)", "", index), ":"), + excelColumnLetterToNumeric) + + rows <- eval(parse(text = gsub("([A-Z]{1,3})", "", index))) + cols <- seq(min(column_index), max(column_index)) + return(list(row = rows, col = cols)) +} + +#' getNamedRegionExtent() +#' +#' @description Function extracts initials from global environment if +#' input is 'user', otherwise passes on the input. +#' @param author Name of author +#' @param prefix A character string to prepend to the result +#' @returns A character string with the username +#' @keywords internal +#' @noRd +#' +getNamedRegionExtent <- function(wb, sheet, name = NULL){ + named_regions <- openxlsx::getNamedRegions(wb) + named_regions_attr <- as.data.frame(attributes(named_regions)) + + if (!is.null(name)){ + match(name, named_regions) + ind <- which(name == named_regions) + } else { + ind <- 1:length(named_regions) + } + + # print(named_regions) + if (length(ind) != 0){ + return(excelIndexToRowCol(named_regions_attr[ind, "position"])) + } +} + +#' getNamedRegionExtent() +#' +#' @description Function extracts initials from global environment if +#' input is 'user', otherwise passes on the input. +#' @param author Name of author +#' @param prefix A character string to prepend to the result +#' @returns A character string with the username +#' @keywords internal +#' @noRd +#' +getNamedRegionFirstRow <- function(wb, sheet, name = NULL){ + region_extent <- getNamedRegionExtent(wb, sheet, name) + return(min(region_extent[["row"]])) +} + +#' getNamedRegionExtent() +#' +#' @description Function extracts initials from global environment if +#' input is 'user', otherwise passes on the input. +#' @param author Name of author +#' @param prefix A character string to prepend to the result +#' @returns A character string with the username +#' @keywords internal +#' @noRd +#' +getNamedRegionLastRow <- function(wb, sheet, name = NULL){ + region_extent <- getNamedRegionExtent(wb, sheet, name) + return(max(region_extent[["row"]])) +} + diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index 290cba8..a334ffa 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -19,72 +19,67 @@ insert_index_sheet <- function(wb, logo = "statzh", contact = "statzh", titlesource, auftrag_id, maintitle, sheetname = "Index", date_prefix = "Erstellt am: ", - order_id_prefix = "Auftragsnr.:"){ - - # Hardcoded ---------- - index_sheet_name <- "Index" - toc_caption <- "Inhalt" - - - # Process input (substitute default values) ----- - logo <- inputHelperLogoPath(logo) - contact <- inputHelperContactInfo(contact) - homepage <- inputHelperHomepage(homepage) - openinghours <- inputHelperOfficeHours(openinghours) - creationdate <- inputHelperDateCreated(prefix = date_prefix) - order_id <- inputHelperOrderNumber(auftrag_id, prefix = order_id_prefix) - + order_id_prefix = "Auftragsnr.:", + toc_caption = "Inhalt"){ # Initialize new worksheet as index sheet ------ - openxlsx::addWorksheet(wb, index_sheet_name) - - - # Determine start/end rows of content blocks ----- - contact_start_row <- 2 - contact_end_row <- contact_start_row + length(c(contact, homepage)) - request_start_row <- contact_end_row + 2 - title_start_row <- request_start_row + 2 - source_start_row <- title_start_row + 1 - index_start_row <- source_start_row + 2 + openxlsx::addWorksheet(wb, sheetname) # Insert logo ---------- + logo <- inputHelperLogoPath(logo) if (!is.null(logo)){ - openxlsx::insertImage(wb, index_sheet_name, logo, 2.145, 0.7865, units = "in") + openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, units = "in") } # Insert contact info, title, metadata, and sources into worksheet -------- ### Contact information - contact_info <- c(contact, homepage) - openxlsx::writeData(wb, index_sheet_name, contact_info, xy = c("O", contact_start_row)) + contact_info <- c(inputHelperContactInfo(contact), + inputHelperHomepage(homepage)) + openxlsx::writeData(wb, sheetname, contact_info, 15, 2, + name = "contact") ### Office hours - openxlsx::writeData(wb, index_sheet_name, openinghours, xy = c("R", contact_start_row)) + openxlsx::writeData(wb, sheetname, inputHelperOfficeHours(openinghours), + 18, getNamedRegionFirstRow(wb, sheetname, "contact"), + name = "officehours") ### Request information - openxlsx::writeData(wb, index_sheet_name, c(creationdate, order_id), xy = c("O", request_start_row)) + info_vec <- c(inputHelperDateCreated(prefix = date_prefix), + inputHelperOrderNumber(auftrag_id, prefix = order_id_prefix)) + openxlsx::writeData(wb, sheetname, info_vec, 15, + getNamedRegionLastRow(wb, sheetname, "contact"), + name = "info") + ### Add Headerline + openxlsx::addStyle(wb, sheetname, style_headerline(), + getNamedRegionLastRow(wb, sheetname, "info"), 1:20, + gridExpand = TRUE, stack = TRUE) ### Title - openxlsx::writeData(wb, index_sheet_name, maintitle, xy = c("C", title_start_row)) - openxlsx::addStyle(wb, index_sheet_name, style_maintitle(), title_start_row, 3) + openxlsx::writeData(wb, sheetname, maintitle, 3, + getNamedRegionLastRow(wb, sheetname, "info") + 3, + name = "title") + openxlsx::addStyle(wb, sheetname, style_maintitle(), + getNamedRegionLastRow(wb, sheetname, "title"), 3) ### Source - openxlsx::writeData(wb, index_sheet_name, titlesource, xy = c("C", source_start_row)) + openxlsx::writeData(wb, sheetname, titlesource, 3, + getNamedRegionLastRow(wb, sheetname, "title") + 1, + name = "source") ### Table of content caption - openxlsx::writeData(wb, index_sheet_name, toc_caption, xy = c("C", index_start_row)) - openxlsx::addStyle(wb, index_sheet_name, subtitleStyle(), index_start_row, 3) + openxlsx::writeData(wb, sheetname, toc_caption, 3, + getNamedRegionLastRow(wb, sheetname, "source"), + name = "toc") + openxlsx::addStyle(wb, sheetname, subtitleStyle(), + getNamedRegionLastRow(wb, sheetname, "toc"), 3) # Format --------- ### Set column width of first column to 1 - openxlsx::setColWidths(wb, index_sheet_name, 1, 1) + openxlsx::setColWidths(wb, sheetname, 1, 1) ### Hide gridlines - openxlsx::showGridLines(wb, index_sheet_name, FALSE) - - ### Add Headerline - openxlsx::addStyle(wb, index_sheet_name, style_headerline(), contact_end_row + 1, 1:20, gridExpand = TRUE, stack = TRUE) - + openxlsx::showGridLines(wb, sheetname, FALSE) } diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index 46a8c19..796ab85 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -32,22 +32,8 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", source_prefix = "Datenquelle:", metadata_prefix = "Hinweise:"){ - # Process input (substitute default values) ----- - logo <- inputHelperLogoPath(logo) - contactdetails <- inputHelperContactInfo(contactdetails) - creationdate <- inputHelperDateCreated(prefix = date_prefix) - authorname <- inputHelperAuthorName(author, prefix = author_prefix) - source <- inputHelperSource(source, prefix = source_prefix) - metadata <- inputHelperMetadata(metadata, prefix = metadata_prefix) - - # Determine start/end rows of content blocks ----- contact_start_row <- 2 - contact_end_row <- contact_start_row + length(contactdetails) - title_start_row <- contact_end_row + 2 - source_start_row <- title_start_row + 1 - source_end_row <- source_start_row + length(source) + 1 - metadata_start_row <- source_end_row + 1 # Add a new worksheet ------ @@ -56,6 +42,7 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", # Insert logo -------- + logo <- inputHelperLogoPath(logo) if(!is.null(logo)){ openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, units = "in") } @@ -63,25 +50,37 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", # Insert contact info, title, metadata, and sources into worksheet -------- ### Contact info - openxlsx::writeData(wb, sheetname, contactdetails, 12, contact_start_row) + openxlsx::writeData(wb, sheetname, inputHelperContactInfo(contactdetails), + 12, 2, name = "contact") ### Request information - info_string <- paste(creationdate, authorname) - openxlsx::writeData(wb, sheetname, info_string, 12, contact_end_row + 1) + info_string <- paste(inputHelperDateCreated(prefix = date_prefix), + inputHelperAuthorName(author, prefix = author_prefix)) + openxlsx::writeData(wb, sheetname, info_string, 12, + startRow = getNamedRegionLastRow(wb, sheetname, "contact") + 1, + name = "info") + ### Headerline + openxlsx::addStyle(wb, sheetname, style_headerline(), + getNamedRegionLastRow(wb, sheetname, "contact") + 1, 1:26, + gridExpand = TRUE, stack = TRUE) ### Title - openxlsx::writeData(wb, sheetname, title, startRow = title_start_row) - openxlsx::addStyle(wb, sheetname, style_title(), rows = title_start_row, cols = 1) + openxlsx::writeData(wb, sheetname, title, + startRow = getNamedRegionLastRow(wb, sheetname, "info") + 3, + name = "title") + openxlsx::addStyle(wb, sheetname, style_title(), + rows = getNamedRegionLastRow(wb, sheetname, "title"), cols = 1) ### Source and metadata - openxlsx::writeData(wb, sheetname, source, startRow = source_start_row) - openxlsx::writeData(wb, sheetname, metadata, startRow = metadata_start_row) - openxlsx::addStyle(wb, sheetname, style_subtitle2(), c(source_start_row, metadata_start_row), 1) - - - # Format ---------- - ### Headerline - openxlsx::addStyle(wb, sheetname, style_headerline(), contact_end_row + 2, 1:26, gridExpand = TRUE, stack = TRUE) + openxlsx::writeData(wb, sheetname, inputHelperSource(source, prefix = source_prefix), + startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, + name = "source") + openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata, prefix = metadata_prefix), + startRow = getNamedRegionLastRow(wb, sheetname, "source"), + name = "metadata") + openxlsx::addStyle(wb, sheetname, style_subtitle2(), + c(getNamedRegionFirstRow(wb, sheetname, "source"), + getNamedRegionFirstRow(wb, sheetname, "metadata")), 1) ### Hide gridlines openxlsx::showGridLines(wb, sheetname, FALSE) diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 59b8556..b322c32 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -40,12 +40,9 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", date_prefix = "Aktualisiert am: ", author_prefix = "durch: "){ + # Process input (substitute default values) ----- - logo <- inputHelperLogoPath(logo) - contactdetails <- inputHelperContactInfo(contactdetails) - homepage <- inputHelperHomepage(homepage) - creationdate <- inputHelperDateCreated(prefix = date_prefix) - authorname <- inputHelperAuthorName(author, prefix = author_prefix) + source <- inputHelperSource(source) metadata <- inputHelperMetadata(metadata) @@ -55,6 +52,8 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", contact_start_row <- 2 contact_start_col <- max(ncol(data) - 2, 4) contact_end_col <- 26 + + contact_end_row <- contact_start_row + length(contactdetails) contact_column_extent <- contact_start_col:contact_end_col contact_rows_extent <- contact_start_row:contact_end_row @@ -79,6 +78,7 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", # Insert logo ------ + logo <- inputHelperLogoPath(logo) if (!is.null(logo)){ openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, units = "in") } @@ -86,24 +86,57 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", # Insert contact info, date created, and author ----- ### Contact info - openxlsx::writeData(wb, sheetname, contactdetails, contact_start_col, contact_start_row) - openxlsx::writeData(wb, sheetname, homepage, contact_start_col, contact_end_row) + openxlsx::writeData(wb, sheetname, inputHelperContactInfo(contactdetails), + contact_start_col, contact_start_row, + name = "contact") + openxlsx::writeData(wb, sheetname, inputHelperHomepage(homepage), + contact_start_col, + startRow = getNamedRegionLastRow(wb, sheetname, "contact") + 1, + name = "homepage") ### Creation date - infostring <- paste(creationdate, authorname) - openxlsx::writeData(wb, sheetname, infostring, contact_start_col, contact_end_row+1) + infostring <- paste(inputHelperDateCreated(prefix = date_prefix), + inputHelperAuthorName(author, prefix = author_prefix)) + openxlsx::writeData(wb, sheetname, infostring, contact_start_col, + startRow = getNamedRegionLastRow(wb, sheetname, "homepage") + 1, + name = "info") + + + ### Horizontally merge cells to ensure that contact entries are displayed properly + info_extent <- getNamedRegionExtent(wb, sheetname, c("contact", "homepage", "info")) + purrr::walk(info_extent$rows, + ~openxlsx::mergeCells(wb, sheetname, min(info_extent$col):contact_end_col, rows = .)) + + + ### Insert headerline after contacts ------ + openxlsx::addStyle(wb, sheetname, style_headerline(), + rows = getNamedRegionLastRow(wb, sheetname, "homepage") + 1, + cols = 1:ncol(data), gridExpand = TRUE, stack = TRUE) # Insert descriptives into worksheet -------- ### Title - openxlsx::writeData(wb, sheetname, title, startRow = title_start_row) - openxlsx::addStyle(wb, sheetname, style_title(), title_start_row, 1, gridExpand = TRUE) + openxlsx::writeData(wb, sheetname, title, + startRow = getNamedRegionLastRow(wb, sheetname) + 3, + name = "title") + openxlsx::addStyle(wb, sheetname, style_title(), + getNamedRegionLastRow(wb, sheetname, "title"), 1, + gridExpand = TRUE) ### Source - openxlsx::writeData(wb, sheetname, source, startRow = source_start_row) + openxlsx::writeData(wb, sheetname, source, + startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, + name = "source") ### Metadata - openxlsx::writeData(wb, sheetname, metadata, startRow = metadata_start_row) + openxlsx::writeData(wb, sheetname, metadata, + startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, + name = "metadata") + + ### Horizontally merge cells containing descriptive info to ensure that they're displayed properly + descriptives_extent <- getNamedRegionExtent(wb, sheetname, c("title","source","metadata")) + purrr::walk(descriptives_extent$row, + ~openxlsx::mergeCells(wb, sheetname, 1:contact_end_col, rows = .)) # Insert data -------- @@ -111,23 +144,16 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", colnames(data) <- paste0(colnames(data), " ", sep = "") ### Write data - openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), startRow = data_start_row, - rowNames = FALSE, withFilter = FALSE) - - openxlsx::addStyle(wb, sheetname, style_header(), data_start_row, 1:ncol(data), + openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), + startRow = getNamedRegionLastRow(wb, sheetname) + 3, + rowNames = FALSE, withFilter = FALSE, + name = "data_region") + + openxlsx::addStyle(wb, sheetname, style_header(), + rows = getNamedRegionFirstRow(wb, sheetname, "data_region"), + cols = 1:ncol(data), gridExpand = TRUE, stack = TRUE) - - # Format --------- - ### Horizontally merge cells to ensure that contact entries are displayed properly - purrr::walk(contact_rows_extent, ~openxlsx::mergeCells(wb, sheetname, contact_column_extent, rows = .)) - - ### Insert headerline after contacts ------ - openxlsx::addStyle(wb, sheetname, style_headerline(), contact_end_row + 1, 1:ncol(data), gridExpand = TRUE, stack = TRUE) - - ### Horizontally merge cells containing descriptive info to ensure that they're displayed properly - purrr::walk(descriptives_row_extent, ~openxlsx::mergeCells(wb, sheetname, descriptives_column_extent, rows = .)) - ### Grouplines if (!is.null(grouplines)){ openxlsx::addStyle(wb, sheetname, style_leftline(), data_row_extent, grouplines, gridExpand = TRUE, stack = TRUE) diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index 21d9f9e..ec5e57b 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -38,50 +38,41 @@ #' ## save workbook #' openxlsx::saveWorkbook(export,"example.xlsx") #' } -insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", - source = "statzh", metadata = NA, grouplines = NA, +insert_worksheet_nh <- function(data, wb, sheetname = "Daten", + title = "Title", + source = "statzh", + metadata = NA, + grouplines = NA, group_names = NA){ - - # Process input (substitute default values) ----- - source <- inputHelperSource(source) - metadata <- inputHelperMetadata(metadata) - - - # Determine start/end rows, row and column extents of content blocks ----- - ### Descriptives - title_start_row <- 1 - source_start_row <- title_start_row + 1 - metadata_start_row <- source_start_row + length(source) - metadata_end_row <- metadata_start_row + length(metadata) - # descriptives_row_extent <- title_start_row:metadata_end_row - - ### Data - data_start_row <- metadata_end_row + 3 - data_end_row <- data_start_row + nrow(data) - # data_row_extent <- data_start_row:data_end_row - - # Initialize new worksheet ------ sheetname <- verifyInputSheetname(sheetname) openxlsx::addWorksheet(wb, sheetname) - # Insert title, metadata, and sources into worksheet -------- ### Title - openxlsx::writeData(wb, sheetname, title) + openxlsx::writeData(wb, sheetname, title, startCol = 1, startRow = 1, + name = "title") openxlsx::addStyle(wb, sheetname, style_title(), 1, 1) ### Source - openxlsx::writeData(wb, sheetname, source, startRow = source_start_row) + openxlsx::writeData(wb, sheetname, inputHelperSource(source), + startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, + name = "source") ### Metadata - openxlsx::writeData(wb, sheetname, metadata, startRow = metadata_start_row) + openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), + startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, + name = "metadata") + ### Merge cells with title, metadata, and sources to ensure that they're displayed properly - purrr::walk(1:metadata_end_row, ~openxlsx::mergeCells(wb, sheetname, 1:26, rows = .)) + descr_extent <- getNamedRegionExtent(wb, sheetname, c("title", "source", "metadata")) + purrr::walk(descr_extent$row, ~openxlsx::mergeCells(wb, sheetname, 1:26, rows = .)) # Insert data -------- + data_start_row <- getNamedRegionLastRow(wb, sheetname, "metadata") + 3 + ### Insert second header if (!any(is.na(group_names))){ insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) @@ -92,20 +83,16 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", colnames(data) <- paste0(colnames(data), " ", sep = "") ### Write data after checking for leftover grouping - openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), startRow = data_start_row, rowNames = FALSE, withFilter = FALSE) - openxlsx::addStyle(wb, sheetname, style_header(), data_start_row, 1:ncol(data), gridExpand = TRUE, stack = TRUE) + openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), + startRow = data_start_row, rowNames = FALSE, + withFilter = FALSE, name = "data_region") + openxlsx::addStyle(wb, sheetname, style_header(), + data_start_row, 1:ncol(data), + gridExpand = TRUE, stack = TRUE) # Grouplines --------- if (any(!is.na(grouplines))){ - if (!any(is.na(group_names))){ - data_start_row <- data_start_row - 1 - data_end_row <- nrow(data) + data_start_row + 1 - - } else { - data_end_row <- nrow(data) + data_start_row - } - if (is.numeric(grouplines)){ groupline_numbers <- grouplines @@ -113,11 +100,13 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", title = "Title", groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) } - openxlsx::addStyle(wb, sheetname, style_leftline(), data_start_row:data_end_row, groupline_numbers, gridExpand = TRUE, stack = TRUE) + data_region_extent <- getNamedRegionExtent(wb, sheetname, "data_region") + openxlsx::addStyle(wb, sheetname, style_leftline(), + data_region_extent$row, groupline_numbers, + gridExpand = TRUE, stack = TRUE) } # Format -------- - ### Define minimum column width options("openxlsx.minWidth" = 5) diff --git a/man/insert_worksheet.Rd b/man/insert_worksheet.Rd index 2bf9a7b..1c33fe4 100644 --- a/man/insert_worksheet.Rd +++ b/man/insert_worksheet.Rd @@ -14,6 +14,7 @@ insert_worksheet( logo = "statzh", grouplines = FALSE, contactdetails = "statzh", + homepage = "statzh", author = "user", date_prefix = "Aktualisiert am: ", author_prefix = "durch: " @@ -41,6 +42,8 @@ variables visually.} \item{contactdetails}{contact details of the data publisher. Defaults to "statzh".} +\item{homepage}{Homepage of data publisher. Defaults to "statzh".} + \item{author}{defaults to the last two letters (initials) or numbers of the internal user name.} From e4f75d5ffab5cb3d7b04d1a2846cbd539765a843 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Tue, 30 May 2023 12:38:02 +0000 Subject: [PATCH 35/74] All output functions working --- R/datasetsXLSX.R | 3 +- R/helper.R | 16 ++++---- R/insert_index_sheet.R | 12 +++--- R/insert_metadata_sheet.R | 12 +++--- R/insert_worksheet.R | 67 ++++++++++---------------------- R/insert_worksheet_nh.R | 49 +++++++++++------------ R/splitXLSX.R | 10 +++-- motor_trend_car_road_tests.xlsx | Bin 40652 -> 0 bytes 8 files changed, 73 insertions(+), 96 deletions(-) delete mode 100644 motor_trend_car_road_tests.xlsx diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index 21bd9a6..f97322f 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -105,7 +105,6 @@ datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, checkGroupOptionCompatibility(group_names, grouplines) - # Initialize new Workbook ------ if (is.null(wb)){ wb <- openxlsx::createWorkbook() @@ -141,7 +140,7 @@ datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, # Insert datasets according to dataframes_index ------- - if(length(dataframes_index) > 0){ + if (length(dataframes_index) > 0){ list(dataframe_datasets, dataframe_sheetnames, dataframe_titles, diff --git a/R/helper.R b/R/helper.R index 8b95e51..eda4a28 100644 --- a/R/helper.R +++ b/R/helper.R @@ -61,7 +61,7 @@ inputHelperSource <- function(source, prefix = NULL, collapse = NULL){ source <- sub("statzh", statzh_name, source) if (all(is.na(source))){ - return(source) + return("") } if (!is.null(collapse)){ @@ -84,7 +84,7 @@ inputHelperSource <- function(source, prefix = NULL, collapse = NULL){ inputHelperMetadata <- function(metadata, prefix = NULL, collapse = NULL){ if (all(is.na(metadata))){ - return(NULL) + return("") } if (!is.null(collapse)){ @@ -279,14 +279,16 @@ getNamedRegionExtent <- function(wb, sheet, name = NULL){ named_regions <- openxlsx::getNamedRegions(wb) named_regions_attr <- as.data.frame(attributes(named_regions)) - if (!is.null(name)){ - match(name, named_regions) - ind <- which(name == named_regions) + sheet_ind <- match(sheet, named_regions_attr$sheet) + + if (any(!is.null(name))){ + name <- paste(sheet, name, sep = "_") + ind <- match(name, named_regions) + } else { - ind <- 1:length(named_regions) + ind <- sheet_ind } - # print(named_regions) if (length(ind) != 0){ return(excelIndexToRowCol(named_regions_attr[ind, "position"])) } diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index a334ffa..5dbb512 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -38,19 +38,19 @@ insert_index_sheet <- function(wb, logo = "statzh", contact = "statzh", contact_info <- c(inputHelperContactInfo(contact), inputHelperHomepage(homepage)) openxlsx::writeData(wb, sheetname, contact_info, 15, 2, - name = "contact") + name = paste(sheetname,"contact", sep = "_")) ### Office hours openxlsx::writeData(wb, sheetname, inputHelperOfficeHours(openinghours), 18, getNamedRegionFirstRow(wb, sheetname, "contact"), - name = "officehours") + name = paste(sheetname,"officehours", sep = "_")) ### Request information info_vec <- c(inputHelperDateCreated(prefix = date_prefix), inputHelperOrderNumber(auftrag_id, prefix = order_id_prefix)) openxlsx::writeData(wb, sheetname, info_vec, 15, getNamedRegionLastRow(wb, sheetname, "contact"), - name = "info") + name = paste(sheetname,"info", sep = "_")) ### Add Headerline openxlsx::addStyle(wb, sheetname, style_headerline(), getNamedRegionLastRow(wb, sheetname, "info"), 1:20, @@ -59,19 +59,19 @@ insert_index_sheet <- function(wb, logo = "statzh", contact = "statzh", ### Title openxlsx::writeData(wb, sheetname, maintitle, 3, getNamedRegionLastRow(wb, sheetname, "info") + 3, - name = "title") + name = paste(sheetname,"title", sep = "_")) openxlsx::addStyle(wb, sheetname, style_maintitle(), getNamedRegionLastRow(wb, sheetname, "title"), 3) ### Source openxlsx::writeData(wb, sheetname, titlesource, 3, getNamedRegionLastRow(wb, sheetname, "title") + 1, - name = "source") + name = paste(sheetname,"source", sep = "_")) ### Table of content caption openxlsx::writeData(wb, sheetname, toc_caption, 3, getNamedRegionLastRow(wb, sheetname, "source"), - name = "toc") + name = paste(sheetname,"toc", sep = "_")) openxlsx::addStyle(wb, sheetname, subtitleStyle(), getNamedRegionLastRow(wb, sheetname, "toc"), 3) diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index 796ab85..c479aa6 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -51,14 +51,14 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", # Insert contact info, title, metadata, and sources into worksheet -------- ### Contact info openxlsx::writeData(wb, sheetname, inputHelperContactInfo(contactdetails), - 12, 2, name = "contact") + 12, 2, name = paste(sheetname,"contact", sep = "_")) ### Request information info_string <- paste(inputHelperDateCreated(prefix = date_prefix), inputHelperAuthorName(author, prefix = author_prefix)) openxlsx::writeData(wb, sheetname, info_string, 12, startRow = getNamedRegionLastRow(wb, sheetname, "contact") + 1, - name = "info") + name = paste(sheetname,"info", sep = "_")) ### Headerline openxlsx::addStyle(wb, sheetname, style_headerline(), getNamedRegionLastRow(wb, sheetname, "contact") + 1, 1:26, @@ -67,17 +67,17 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", ### Title openxlsx::writeData(wb, sheetname, title, startRow = getNamedRegionLastRow(wb, sheetname, "info") + 3, - name = "title") + name = paste(sheetname,"title", sep = "_")) openxlsx::addStyle(wb, sheetname, style_title(), rows = getNamedRegionLastRow(wb, sheetname, "title"), cols = 1) ### Source and metadata openxlsx::writeData(wb, sheetname, inputHelperSource(source, prefix = source_prefix), startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, - name = "source") + name = paste(sheetname,"source", sep = "_")) openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata, prefix = metadata_prefix), - startRow = getNamedRegionLastRow(wb, sheetname, "source"), - name = "metadata") + startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, + name = paste(sheetname,"metadata", sep = "_")) openxlsx::addStyle(wb, sheetname, style_subtitle2(), c(getNamedRegionFirstRow(wb, sheetname, "source"), getNamedRegionFirstRow(wb, sheetname, "metadata")), 1) diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index b322c32..5af72da 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -40,38 +40,6 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", date_prefix = "Aktualisiert am: ", author_prefix = "durch: "){ - - # Process input (substitute default values) ----- - - source <- inputHelperSource(source) - metadata <- inputHelperMetadata(metadata) - - - # Determine start/end rows, row and column extents of content blocks ----- - ### Contact information - contact_start_row <- 2 - contact_start_col <- max(ncol(data) - 2, 4) - contact_end_col <- 26 - - - contact_end_row <- contact_start_row + length(contactdetails) - contact_column_extent <- contact_start_col:contact_end_col - contact_rows_extent <- contact_start_row:contact_end_row - - ### Descriptives - title_start_row <- contact_end_row + 3 - source_start_row <- title_start_row + 1 - metadata_start_row <- source_start_row + length(source) - metadata_end_row <- metadata_start_row + length(metadata) - descriptives_column_extent <- 1:contact_end_col - descriptives_row_extent <- title_start_row:metadata_end_row - - ### Data - data_start_row <- metadata_end_row + 3 - data_end_row <- data_start_row + nrow(data) - data_row_extent <- data_start_row:data_end_row - - # Initialize new worksheet ------ sheetname <- verifyInputSheetname(sheetname) openxlsx::addWorksheet(wb, sheetname) @@ -86,20 +54,23 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", # Insert contact info, date created, and author ----- ### Contact info + contact_start_col <- max(ncol(data) - 2, 4) + contact_end_col <- 26 + openxlsx::writeData(wb, sheetname, inputHelperContactInfo(contactdetails), - contact_start_col, contact_start_row, - name = "contact") + contact_start_col, 2, + name = paste(sheetname,"contact", sep = "_")) openxlsx::writeData(wb, sheetname, inputHelperHomepage(homepage), contact_start_col, startRow = getNamedRegionLastRow(wb, sheetname, "contact") + 1, - name = "homepage") + name = paste(sheetname,"homepage", sep = "_")) ### Creation date infostring <- paste(inputHelperDateCreated(prefix = date_prefix), inputHelperAuthorName(author, prefix = author_prefix)) openxlsx::writeData(wb, sheetname, infostring, contact_start_col, startRow = getNamedRegionLastRow(wb, sheetname, "homepage") + 1, - name = "info") + name = paste(sheetname, "info", sep = "_")) ### Horizontally merge cells to ensure that contact entries are displayed properly @@ -110,28 +81,28 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", ### Insert headerline after contacts ------ openxlsx::addStyle(wb, sheetname, style_headerline(), - rows = getNamedRegionLastRow(wb, sheetname, "homepage") + 1, + rows = getNamedRegionLastRow(wb, sheetname, "info"), cols = 1:ncol(data), gridExpand = TRUE, stack = TRUE) # Insert descriptives into worksheet -------- ### Title openxlsx::writeData(wb, sheetname, title, - startRow = getNamedRegionLastRow(wb, sheetname) + 3, - name = "title") + startRow = getNamedRegionLastRow(wb, sheetname, "info") + 3, + name = paste(sheetname, "title", sep = "_")) openxlsx::addStyle(wb, sheetname, style_title(), getNamedRegionLastRow(wb, sheetname, "title"), 1, gridExpand = TRUE) ### Source - openxlsx::writeData(wb, sheetname, source, + openxlsx::writeData(wb, sheetname, inputHelperSource(source), startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, - name = "source") + name = paste(sheetname,"source", sep = "_")) ### Metadata - openxlsx::writeData(wb, sheetname, metadata, + openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, - name = "metadata") + name = paste(sheetname,"metadata", sep = "_")) ### Horizontally merge cells containing descriptive info to ensure that they're displayed properly descriptives_extent <- getNamedRegionExtent(wb, sheetname, c("title","source","metadata")) @@ -145,18 +116,20 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", ### Write data openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), - startRow = getNamedRegionLastRow(wb, sheetname) + 3, + startRow = getNamedRegionLastRow(wb, sheetname, "metadata") + 3, rowNames = FALSE, withFilter = FALSE, - name = "data_region") + name = paste(sheetname,"data", sep = "_")) openxlsx::addStyle(wb, sheetname, style_header(), - rows = getNamedRegionFirstRow(wb, sheetname, "data_region"), + rows = getNamedRegionFirstRow(wb, sheetname, "data"), cols = 1:ncol(data), gridExpand = TRUE, stack = TRUE) ### Grouplines if (!is.null(grouplines)){ - openxlsx::addStyle(wb, sheetname, style_leftline(), data_row_extent, grouplines, gridExpand = TRUE, stack = TRUE) + openxlsx::addStyle(wb, sheetname, style_leftline(), + getNamedRegionExtent(wb, sheetname, "data")$row, + grouplines, gridExpand = TRUE, stack = TRUE) } ### Define minimum column width diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index ec5e57b..8155dba 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -48,22 +48,22 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", sheetname <- verifyInputSheetname(sheetname) openxlsx::addWorksheet(wb, sheetname) + # Insert title, metadata, and sources into worksheet -------- ### Title openxlsx::writeData(wb, sheetname, title, startCol = 1, startRow = 1, - name = "title") + name = paste(sheetname, "title", sep = "_")) openxlsx::addStyle(wb, sheetname, style_title(), 1, 1) ### Source openxlsx::writeData(wb, sheetname, inputHelperSource(source), startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, - name = "source") + name = paste(sheetname,"source", sep = "_")) ### Metadata openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, - name = "metadata") - + name = paste(sheetname,"metadata", sep = "_")) ### Merge cells with title, metadata, and sources to ensure that they're displayed properly descr_extent <- getNamedRegionExtent(wb, sheetname, c("title", "source", "metadata")) @@ -73,26 +73,10 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", # Insert data -------- data_start_row <- getNamedRegionLastRow(wb, sheetname, "metadata") + 3 - ### Insert second header - if (!any(is.na(group_names))){ - insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) - data_start_row <- data_start_row + 1 - } - - ### Pad colnames using whitespaces for better auto-fitting of column width - colnames(data) <- paste0(colnames(data), " ", sep = "") - - ### Write data after checking for leftover grouping - openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), - startRow = data_start_row, rowNames = FALSE, - withFilter = FALSE, name = "data_region") - openxlsx::addStyle(wb, sheetname, style_header(), - data_start_row, 1:ncol(data), - gridExpand = TRUE, stack = TRUE) - # Grouplines --------- - if (any(!is.na(grouplines))){ + if (!any(is.null(grouplines) || any(is.na(grouplines)))){ + if (is.numeric(grouplines)){ groupline_numbers <- grouplines @@ -100,12 +84,29 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) } - data_region_extent <- getNamedRegionExtent(wb, sheetname, "data_region") + ### Insert second header + if (!any(is.null(group_names) || any(is.na(group_names)))){ + insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) + data_start_row <- data_start_row + 1 + } + + data_row_extent <- data_start_row + 1:nrow(data) - 1 openxlsx::addStyle(wb, sheetname, style_leftline(), - data_region_extent$row, groupline_numbers, + data_row_extent, groupline_numbers, gridExpand = TRUE, stack = TRUE) } + ### Pad colnames using whitespaces for better auto-fitting of column width + colnames(data) <- paste0(colnames(data), " ", sep = "") + + ### Write data after checking for leftover grouping + openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), + startRow = data_start_row, rowNames = FALSE, + withFilter = FALSE, name = paste(sheetname,"data", sep = "_")) + openxlsx::addStyle(wb, sheetname, style_header(), + data_start_row, 1:ncol(data), + gridExpand = TRUE, stack = TRUE) + # Format -------- ### Define minimum column width options("openxlsx.minWidth" = 5) diff --git a/R/splitXLSX.R b/R/splitXLSX.R index 8a1e066..89ab580 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -46,10 +46,12 @@ splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", # loop to split values of the variable used to split the data ----- for (sheetvalue in sheetvalues){ sheettitle <- paste0(title, " (", deparse(substitute(sheetvar)), ": ", sheetvalue, ")") - verifyDataUngrouped(data) %>% - dplyr::filter((!!col_name) == sheetvalue) %>% - insert_worksheet(wb, verifyInputSheetname(sheetvalue), sheettitle, source, - metadata, logo, grouplines, contactdetails, author) + data_subset <- verifyDataUngrouped(data) %>% + dplyr::filter((!!col_name) == sheetvalue) + + sheetname <- paste(deparse(substitute(sheetvar)), sheetvalue, sep = "_") + insert_worksheet(data_subset, wb, verifyInputSheetname(sheetname), sheettitle, + source, metadata, logo, grouplines, contactdetails, author = author) } # Reverse order diff --git a/motor_trend_car_road_tests.xlsx b/motor_trend_car_road_tests.xlsx deleted file mode 100644 index 74e664a0b63bf6c3f45404d9293feaa8dacc57f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40652 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 RqM;F?K9{KLq&De#^ncjQg_r;U From 3b6e4f066ad8aa759e1fae083d1fc2f162f87ab5 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Tue, 30 May 2023 15:47:26 +0000 Subject: [PATCH 36/74] Updated documentation; removed unused code --- R/add_additional_text.R | 30 --------------------- R/datasetsXLSX.R | 3 +++ R/helper.R | 56 ++++++++++++++++++++------------------- R/insert_second_header.R | 7 ----- R/insert_worksheet_nh.R | 4 +-- R/quickXLSX.R | 2 +- man/insert_index_sheet.Rd | 3 ++- 7 files changed, 37 insertions(+), 68 deletions(-) delete mode 100644 R/add_additional_text.R diff --git a/R/add_additional_text.R b/R/add_additional_text.R deleted file mode 100644 index fc1bf04..0000000 --- a/R/add_additional_text.R +++ /dev/null @@ -1,30 +0,0 @@ -#' add_additional_text() -#' -#' @description Insert text into an existing workbook object. Text is inserted -#' at column index 1. -#' -#' @returns Integer corresponding to the final row index -#' -#' @param wb Workbook object where text should be inserted -#' -#' @param text Character vector of text to be inserted -#' -#' @param sheetname Name of the worksheet where text should be inserted. -#' -#' @param start_row Row from which to insert elements -#' -#' @keywords internal -add_additional_text <- function(wb, text, sheetname, start_row){ - - rows <- c(seq(start_row, start_row + length(text) - 1)) - - # Write data - openxlsx::writeData(wb, sheet = sheetname, x = text, colNames = FALSE, - headerStyle = style_subtitle(), startRow = start_row) - - # Apply style - openxlsx::addStyle(wb, sheet = sheetname, style = style_subtitle(), - rows = rows, cols = 1, gridExpand = TRUE) - - return(max(rows)) -} diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index f97322f..66fff6b 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -9,6 +9,9 @@ #' will be 5 inches wide, the second 6. To include a figure either save it as a #' ggplot object or indicate a file path to an existing file (possible formats: #' png, jpg, bmp). +#'@note For some attributes like plot_widths and plot_heights, if a single value +#' is provided, it will be reused (behavior of purrr::pmap). This is not the +#' case for grouplines and group_names. These must be specified for each dataset. #'@param file file name of the spreadsheet. The extension ".xlsx" is added #' automatically. #'@param maintitle Title to be put on the first (overview) sheet. diff --git a/R/helper.R b/R/helper.R index eda4a28..0fb5f5c 100644 --- a/R/helper.R +++ b/R/helper.R @@ -56,7 +56,6 @@ verifyDataUngrouped <- function(data){ #' @returns A character string #' @keywords internal #' @noRd -#' inputHelperSource <- function(source, prefix = NULL, collapse = NULL){ source <- sub("statzh", statzh_name, source) @@ -150,7 +149,6 @@ inputHelperContactInfo <- function(contact, compact = FALSE){ #' @returns A character vector #' @keywords internal #' @noRd -#' inputHelperOfficeHours <- function(openinghours){ if (openinghours == "statzh"){ openinghours <- statzh_openinghours @@ -169,7 +167,6 @@ inputHelperOfficeHours <- function(openinghours){ #' @returns A character string or a 'hyperlink' object #' @keywords internal #' @noRd -#' inputHelperHomepage <- function(homepage){ homepage <- sub("statzh", statzh_homepage, homepage) # class(homepage) <- 'hyperlink' @@ -178,7 +175,7 @@ inputHelperHomepage <- function(homepage){ } -#' înputHelperDateCreated() +#' inputHelperDateCreated() #' #' @description Returns current date as a string with format specified by date_format #' @param prefix A Prefix to prepend to the date. Default to NULL @@ -192,7 +189,7 @@ inputHelperDateCreated <- function(prefix = NULL, date_format = "%d.%m.%Y"){ } -#' înputHelperOrderNumber() +#' inputHelperOrderNumber() #' #' @description Returns current date as a string with format specified by date_format #' @param prefix A Prefix to prepend to the date. Default to NULL @@ -228,9 +225,10 @@ inputHelperAuthorName <- function(author, prefix = NULL){ #' excelIndexToRowCol() #' -#' @description Function extracts initials from global environment if -#' input is 'user', otherwise passes on the input. -#' @param author Name of author +#' @description Converts an Excel style index (e.g. A1) into numeric row and +#' column indices. +#' @details Handles cells (A1) and matrices (A1:B2) +#' @param index A Microsoft Excel style index (see details) #' @param prefix A character string to prepend to the result #' @returns A character string with the username #' @keywords internal @@ -246,7 +244,7 @@ excelIndexToRowCol <- function(index){ sum(offsets * match(chars, LETTERS)) } - # Return extent of occupied region + # Return extent of combined region if (length(index) > 1){ extents <- lapply(index, excelIndexToRowCol) extents <- unique(do.call(rbind,lapply(extents, stack))) @@ -267,11 +265,16 @@ excelIndexToRowCol <- function(index){ #' getNamedRegionExtent() #' -#' @description Function extracts initials from global environment if -#' input is 'user', otherwise passes on the input. -#' @param author Name of author -#' @param prefix A character string to prepend to the result -#' @returns A character string with the username +#' @description Get extent of a named region in a workbook object +#' @details If a single name is provided, returns the extent of the associated +#' named region. If a character vector is provided, the combined extent is +#' returned instead. If left at default (NULL), the combined extent of all +#' regions is returned. +#' @param wb A workbook object +#' @param sheet Name of a worksheet +#' @param name name of region. Also takes a vector of multiple names +#' @returns A list with two numeric vectors row and col, containing a sequence +#' of numeric row and column indices. #' @keywords internal #' @noRd #' @@ -294,13 +297,13 @@ getNamedRegionExtent <- function(wb, sheet, name = NULL){ } } -#' getNamedRegionExtent() +#' getNamedRegionFirstRow() #' -#' @description Function extracts initials from global environment if -#' input is 'user', otherwise passes on the input. -#' @param author Name of author -#' @param prefix A character string to prepend to the result -#' @returns A character string with the username +#' @description Get first row number of named region +#' @param wb A workbook object +#' @param sheet Name of a worksheet +#' @param name name of region. Also takes a vector of multiple names +#' @returns Numeric row number corresponding to first row of named region #' @keywords internal #' @noRd #' @@ -309,16 +312,15 @@ getNamedRegionFirstRow <- function(wb, sheet, name = NULL){ return(min(region_extent[["row"]])) } -#' getNamedRegionExtent() +#' getNamedRegionLastRow() #' -#' @description Function extracts initials from global environment if -#' input is 'user', otherwise passes on the input. -#' @param author Name of author -#' @param prefix A character string to prepend to the result -#' @returns A character string with the username +#' @description Get last row number of named region +#' @param wb A workbook object +#' @param sheet Name of a worksheet +#' @param name name of region. Also takes a vector of multiple names +#' @returns Numeric row number corresponding to last row of named region #' @keywords internal #' @noRd -#' getNamedRegionLastRow <- function(wb, sheet, name = NULL){ region_extent <- getNamedRegionExtent(wb, sheet, name) return(max(region_extent[["row"]])) diff --git a/R/insert_second_header.R b/R/insert_second_header.R index 4120c9e..bafb648 100644 --- a/R/insert_second_header.R +++ b/R/insert_second_header.R @@ -1,19 +1,12 @@ #' insert_second_header() #' #' @description Function to add a second header row -#' #' @param wb Workbook -#' #' @param sheetname Sheet name -#' #' @param data_start_row Row index for first row with data -#' #' @param group_names Group names -#' #' @param grouplines Group lines -#' #' @param data Data -#' #' @keywords internal #' @examples #' \donttest{ diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index 8155dba..2cfe181 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -1,7 +1,7 @@ #' insert_worksheet_nh #' -#' @description Function to add formatted worksheets without headers to an -#' existing workbook +#' @description Function to add formatted worksheets to an existing Workbook. +#' The worksheets do not include contact information or logos. #' @note The function does not write the result into a .xlsx file. A separate #' call to `openxlsx::saveWorkbook()` is required. #' @param data data to be included in the XLSX-table. diff --git a/R/quickXLSX.R b/R/quickXLSX.R index 2e190a9..19c4860 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -2,9 +2,9 @@ #' #' @description Function to export data from R to a formatted .xlsx-spreadsheet. #' @param data data to be exported. +#' @param title title to be put above the data in the worksheet. #' @param file file name of the xlsx-file. The extension ".xlsx" is added #' automatically. -#' @param title title to be put above the data in the worksheet. #' @template shared_parameters #' @keywords quickXLSX #' @export diff --git a/man/insert_index_sheet.Rd b/man/insert_index_sheet.Rd index 79ec118..71ea74d 100644 --- a/man/insert_index_sheet.Rd +++ b/man/insert_index_sheet.Rd @@ -15,7 +15,8 @@ insert_index_sheet( maintitle, sheetname = "Index", date_prefix = "Erstellt am: ", - order_id_prefix = "Auftragsnr.:" + order_id_prefix = "Auftragsnr.:", + toc_caption = "Inhalt" ) } \arguments{ From 23828d87bc6db8b624b66ffc04c2e041d3cafb8a Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Wed, 31 May 2023 15:27:54 +0000 Subject: [PATCH 37/74] Daily commit --- R/datasetsXLSX.R | 30 +++--- R/get_groupline_index_by_pattern.R | 4 +- R/helper.R | 23 +++-- R/insert_image.R | 8 +- R/insert_worksheet.R | 132 +++++++++++++++----------- R/insert_worksheet_nh.R | 32 +++++-- R/styles.R | 8 +- man/add_additional_text.Rd | 25 ----- man/datasetsXLSX.Rd | 10 +- man/get_groupline_index_by_pattern.Rd | 4 +- man/insert_worksheet.Rd | 7 +- man/insert_worksheet_nh.Rd | 4 +- 12 files changed, 157 insertions(+), 130 deletions(-) delete mode 100644 man/add_additional_text.Rd diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index 66fff6b..850091e 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -35,7 +35,6 @@ #' list(c("title 1", "title 2", "title 3")) #'@param overwrite overwrites the existing excel files with the same file name. #' default to FALSE -#'@param wb existing Workbook. Defaults to NULL #'@keywords datasetsXLSX #'@export #'@importFrom dplyr "%>%" @@ -96,22 +95,28 @@ #' overwrite = T) #'} #'} -datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, - plot_heights = NULL, grouplines = NA, - group_names = NA, sources = "statzh", metadata = NA, - sheetnames, maintitle, titlesource = "statzh", - logo = "statzh", auftrag_id = NULL, - contact = "statzh", homepage = "statzh", - openinghours = "statzh", overwrite = F, wb = NULL){ +datasetsXLSX <- function(file, datasets, titles, + plot_widths = NULL, + plot_heights = NULL, + grouplines = NA, + group_names = NA, + sources = "statzh", + metadata = NA, + sheetnames, maintitle, + titlesource = "statzh", + logo = "statzh", + auftrag_id = NULL, + contact = "statzh", + homepage = "statzh", + openinghours = "statzh", + overwrite = F){ # Run checks on arguments ------ checkGroupOptionCompatibility(group_names, grouplines) # Initialize new Workbook ------ - if (is.null(wb)){ - wb <- openxlsx::createWorkbook() - } + wb <- openxlsx::createWorkbook() # Create indexes of which inputs correspond to data.frames or plots----- @@ -169,7 +174,8 @@ datasetsXLSX <- function(file, datasets, titles, plot_widths = NULL, # Create a table of hyperlinks in index sheet (assumed to be "Index") ------ - insert_hyperlinks(wb, sheetnames, titles, index_sheet_name = "Index", sheet_start_row = 15) + insert_hyperlinks(wb, sheetnames, titles, index_sheet_name = "Index", + sheet_start_row = 15) # Save workbook at path denoted by argument file --------- diff --git a/R/get_groupline_index_by_pattern.R b/R/get_groupline_index_by_pattern.R index 8bbfcec..90a057a 100644 --- a/R/get_groupline_index_by_pattern.R +++ b/R/get_groupline_index_by_pattern.R @@ -1,8 +1,8 @@ #' get_groupline_index_by_pattern() #' #' Derive groupline index by matching names -#' @param grouplines ... -#' @param data ... +#' @param grouplines column names at which to insert group line +#' @param data a data.frame #' @keywords internal get_groupline_index_by_pattern <- function(grouplines, data){ diff --git a/R/helper.R b/R/helper.R index 0fb5f5c..d3570bf 100644 --- a/R/helper.R +++ b/R/helper.R @@ -280,21 +280,24 @@ excelIndexToRowCol <- function(index){ #' getNamedRegionExtent <- function(wb, sheet, name = NULL){ named_regions <- openxlsx::getNamedRegions(wb) - named_regions_attr <- as.data.frame(attributes(named_regions)) + sheet_ind <- which(sheet == attr(named_regions, "sheet")) + positions <- attr(named_regions, "position")[sheet_ind] - sheet_ind <- match(sheet, named_regions_attr$sheet) + if (all(is.null(name))){ + return(excelIndexToRowCol(positions)) + } - if (any(!is.null(name))){ - name <- paste(sheet, name, sep = "_") - ind <- match(name, named_regions) + ind <- unlist(sapply(name, function(string){ + which(grepl(paste0(string,"$"), named_regions[sheet_ind])) + })) - } else { - ind <- sheet_ind + if (length(ind) > 0){ + return(excelIndexToRowCol(positions[ind])) } - if (length(ind) != 0){ - return(excelIndexToRowCol(named_regions_attr[ind, "position"])) - } + warning("name not found!") + return(excelIndexToRowCol(positions)) + } #' getNamedRegionFirstRow() diff --git a/R/insert_image.R b/R/insert_image.R index 138e7cc..d5cd0f7 100644 --- a/R/insert_image.R +++ b/R/insert_image.R @@ -60,7 +60,7 @@ insert_worksheet_image <- function(image, wb, sheetname, startrow = 3, } else if (checkImplementedPlotType(image)){ # Allocate temporary file of type png to save the image to - image_path <- tempfile(fileext = ".png") + image_path <- tempfile(tmpdir = "~/tmp", fileext = ".png") # Handle case input object is of class histogram if (is(image, "histogram")){ @@ -88,9 +88,9 @@ insert_worksheet_image <- function(image, wb, sheetname, startrow = 3, width = width, height = height, startRow = startrow, startCol = startcol, units = "in", dpi = 300) - if (!is.character(image)){ - unlink(image_path) - } + # if (!is.character(image)){ + # # unlink(image_path) + # } } else { warning("Image not found.") } diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 5af72da..1f961b7 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -15,10 +15,11 @@ #' @param contactdetails contact details of the data publisher. Defaults to #' "statzh". #' @param homepage Homepage of data publisher. Defaults to "statzh". -#' @param grouplines defaults to FALSE. Can be used to separate grouped +#' @param grouplines defaults to NA. Can be used to separate grouped #' variables visually. #' @param author defaults to the last two letters (initials) or numbers of the #' internal user name. +#' @param group_names Names for groupings in secondary header #' @param date_prefix Text shown before date #' @param author_prefix Text shown before author name #' @importFrom dplyr "%>%" @@ -33,10 +34,18 @@ #' title = "mtcars", #' sheetname = "carb") #' -insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", - source = "statzh", metadata = NA, logo = "statzh", - grouplines = FALSE, contactdetails = "statzh", - homepage = "statzh", author = "user", +insert_worksheet <- function(data, + wb, + sheetname = "data", + title = "Title", + source = "statzh", + metadata = NA, + logo = "statzh", + grouplines = NA, + contactdetails = "statzh", + homepage = "statzh", + author = "user", + group_names = NA, date_prefix = "Aktualisiert am: ", author_prefix = "durch: "){ @@ -85,56 +94,65 @@ insert_worksheet <- function(data, wb, sheetname = "data", title = "Title", cols = 1:ncol(data), gridExpand = TRUE, stack = TRUE) - # Insert descriptives into worksheet -------- - ### Title - openxlsx::writeData(wb, sheetname, title, - startRow = getNamedRegionLastRow(wb, sheetname, "info") + 3, - name = paste(sheetname, "title", sep = "_")) - openxlsx::addStyle(wb, sheetname, style_title(), - getNamedRegionLastRow(wb, sheetname, "title"), 1, - gridExpand = TRUE) - - ### Source - openxlsx::writeData(wb, sheetname, inputHelperSource(source), - startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, - name = paste(sheetname,"source", sep = "_")) - - ### Metadata - openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), - startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, - name = paste(sheetname,"metadata", sep = "_")) - - ### Horizontally merge cells containing descriptive info to ensure that they're displayed properly - descriptives_extent <- getNamedRegionExtent(wb, sheetname, c("title","source","metadata")) - purrr::walk(descriptives_extent$row, - ~openxlsx::mergeCells(wb, sheetname, 1:contact_end_col, rows = .)) - - - # Insert data -------- - ### Pad colnames using whitespaces for better auto-fitting of column width - colnames(data) <- paste0(colnames(data), " ", sep = "") - - ### Write data - openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), - startRow = getNamedRegionLastRow(wb, sheetname, "metadata") + 3, - rowNames = FALSE, withFilter = FALSE, - name = paste(sheetname,"data", sep = "_")) - - openxlsx::addStyle(wb, sheetname, style_header(), - rows = getNamedRegionFirstRow(wb, sheetname, "data"), - cols = 1:ncol(data), - gridExpand = TRUE, stack = TRUE) - - ### Grouplines - if (!is.null(grouplines)){ - openxlsx::addStyle(wb, sheetname, style_leftline(), - getNamedRegionExtent(wb, sheetname, "data")$row, - grouplines, gridExpand = TRUE, stack = TRUE) - } - - ### Define minimum column width - options("openxlsx.minWidth" = 5) - - ### Use automatic columnwidth for columns with data - openxlsx::setColWidths(wb, sheetname, 1:ncol(data), "auto", ignoreMergedCells = TRUE) + insert_worksheet_nh(data, + wb, + sheetname = sheetname, + title = title, + source = source, + metadata = metadata, + grouplines = grouplines, + group_names = group_names) + + # # Insert descriptives into worksheet -------- + # ### Title + # openxlsx::writeData(wb, sheetname, title, + # startRow = getNamedRegionLastRow(wb, sheetname, "info") + 3, + # name = paste(sheetname, "title", sep = "_")) + # openxlsx::addStyle(wb, sheetname, style_title(), + # getNamedRegionLastRow(wb, sheetname, "title"), 1, + # gridExpand = TRUE) + # + # ### Source + # openxlsx::writeData(wb, sheetname, inputHelperSource(source), + # startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, + # name = paste(sheetname,"source", sep = "_")) + # + # ### Metadata + # openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), + # startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, + # name = paste(sheetname,"metadata", sep = "_")) + # + # ### Horizontally merge cells containing descriptive info to ensure that they're displayed properly + # descriptives_extent <- getNamedRegionExtent(wb, sheetname, c("title","source","metadata")) + # purrr::walk(descriptives_extent$row, + # ~openxlsx::mergeCells(wb, sheetname, 1:contact_end_col, rows = .)) + # + # + # # Insert data -------- + # ### Pad colnames using whitespaces for better auto-fitting of column width + # colnames(data) <- paste0(colnames(data), " ", sep = "") + # + # ### Write data + # openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), + # startRow = getNamedRegionLastRow(wb, sheetname, "metadata") + 3, + # rowNames = FALSE, withFilter = FALSE, + # name = paste(sheetname,"data", sep = "_")) + # + # openxlsx::addStyle(wb, sheetname, style_header(), + # rows = getNamedRegionFirstRow(wb, sheetname, "data"), + # cols = 1:ncol(data), + # gridExpand = TRUE, stack = TRUE) + # + # ### Grouplines + # if (!is.null(grouplines)){ + # openxlsx::addStyle(wb, sheetname, style_leftline(), + # getNamedRegionExtent(wb, sheetname, "data")$row, + # grouplines, gridExpand = TRUE, stack = TRUE) + # } + # + # ### Define minimum column width + # options("openxlsx.minWidth" = 5) + # + # ### Use automatic columnwidth for columns with data + # openxlsx::setColWidths(wb, sheetname, 1:ncol(data), "auto", ignoreMergedCells = TRUE) } diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index 2cfe181..0041ca3 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -38,7 +38,9 @@ #' ## save workbook #' openxlsx::saveWorkbook(export,"example.xlsx") #' } -insert_worksheet_nh <- function(data, wb, sheetname = "Daten", +insert_worksheet_nh <- function(data, + wb, + sheetname = "Daten", title = "Title", source = "statzh", metadata = NA, @@ -46,37 +48,53 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", group_names = NA){ # Initialize new worksheet ------ sheetname <- verifyInputSheetname(sheetname) - openxlsx::addWorksheet(wb, sheetname) + + if (!(sheetname %in% names(wb))){ + openxlsx::addWorksheet(wb, sheetname) + start_row <- 1 + + } else { + start_row <- getNamedRegionLastRow(wb, sheetname) + 3 + } # Insert title, metadata, and sources into worksheet -------- ### Title - openxlsx::writeData(wb, sheetname, title, startCol = 1, startRow = 1, + openxlsx::writeData(wb, sheetname, title, startCol = 1, startRow = start_row, name = paste(sheetname, "title", sep = "_")) - openxlsx::addStyle(wb, sheetname, style_title(), 1, 1) + openxlsx::addStyle(wb, sheetname, style_title(), start_row, 1) ### Source openxlsx::writeData(wb, sheetname, inputHelperSource(source), startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, name = paste(sheetname,"source", sep = "_")) + openxlsx::addStyle(wb, sheetname, style_subtitle(), + getNamedRegionLastRow(wb, sheetname, "source"), 1, + stack = TRUE, gridExpand = TRUE) ### Metadata openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, name = paste(sheetname,"metadata", sep = "_")) + openxlsx::addStyle(wb, sheetname, style_subtitle(), + getNamedRegionLastRow(wb, sheetname, "metadata"), 1, + stack = TRUE, gridExpand = TRUE) ### Merge cells with title, metadata, and sources to ensure that they're displayed properly descr_extent <- getNamedRegionExtent(wb, sheetname, c("title", "source", "metadata")) purrr::walk(descr_extent$row, ~openxlsx::mergeCells(wb, sheetname, 1:26, rows = .)) + ### Add Line wrapping + openxlsx::addStyle(wb, sheetname, style_wrap(), descr_extent$row, 1, + stack = TRUE, gridExpand = TRUE) + # Insert data -------- data_start_row <- getNamedRegionLastRow(wb, sheetname, "metadata") + 3 # Grouplines --------- - if (!any(is.null(grouplines) || any(is.na(grouplines)))){ - + if (!any(is.null(grouplines)) & !any(is.na(grouplines))){ if (is.numeric(grouplines)){ groupline_numbers <- grouplines @@ -85,7 +103,7 @@ insert_worksheet_nh <- function(data, wb, sheetname = "Daten", } ### Insert second header - if (!any(is.null(group_names) || any(is.na(group_names)))){ + if (!any(is.null(group_names)) & !any(is.na(group_names))){ insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) data_start_row <- data_start_row + 1 } diff --git a/R/styles.R b/R/styles.R index 00614b2..c94a0f9 100644 --- a/R/styles.R +++ b/R/styles.R @@ -57,6 +57,10 @@ subtitleStyle <- function(){ } style_subtitle <- function(){ + openxlsx::createStyle(fontSize = 12, textDecoration = "italic", fontName = "Arial") +} + +style_subtitle3 <- function(){ openxlsx::createStyle(fontSize = 11, fontName = "Calibri") } @@ -64,9 +68,7 @@ style_subtitle2 <- function(){ openxlsx::createStyle(fontSize = 12, textDecoration = "bold", fontName = "Arial") } -style_subtitle3 <- function(){ - openxlsx::createStyle(fontSize = 12, textDecoration = "italic", fontName = "Arial") -} + hyperlinkStyle <- function(){ openxlsx::createStyle(fontSize = 11, fontName = "Calibri", fontColour = "blue", diff --git a/man/add_additional_text.Rd b/man/add_additional_text.Rd deleted file mode 100644 index aeb531a..0000000 --- a/man/add_additional_text.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_additional_text.R -\name{add_additional_text} -\alias{add_additional_text} -\title{add_additional_text()} -\usage{ -add_additional_text(wb, text, sheetname, start_row) -} -\arguments{ -\item{wb}{Workbook object where text should be inserted} - -\item{text}{Character vector of text to be inserted} - -\item{sheetname}{Name of the worksheet where text should be inserted.} - -\item{start_row}{Row from which to insert elements} -} -\value{ -Integer corresponding to the final row index -} -\description{ -Insert text into an existing workbook object. Text is inserted - at column index 1. -} -\keyword{internal} diff --git a/man/datasetsXLSX.Rd b/man/datasetsXLSX.Rd index 22d1981..8011bab 100644 --- a/man/datasetsXLSX.Rd +++ b/man/datasetsXLSX.Rd @@ -22,8 +22,7 @@ datasetsXLSX( contact = "statzh", homepage = "statzh", openinghours = "statzh", - overwrite = F, - wb = NULL + overwrite = F ) } \arguments{ @@ -67,8 +66,6 @@ Shop} \item{overwrite}{overwrites the existing excel files with the same file name. default to FALSE} - -\item{wb}{existing Workbook. Defaults to NULL} } \description{ Function to export several datasets and/or figures from R to an @@ -83,6 +80,11 @@ When including figures, the heights and widths need to be specified ggplot object or indicate a file path to an existing file (possible formats: png, jpg, bmp). } +\note{ +For some attributes like plot_widths and plot_heights, if a single value + is provided, it will be reused (behavior of purrr::pmap). This is not the + case for grouplines and group_names. These must be specified for each dataset. +} \examples{ \donttest{ \dontrun{ diff --git a/man/get_groupline_index_by_pattern.Rd b/man/get_groupline_index_by_pattern.Rd index 5823704..3e98455 100644 --- a/man/get_groupline_index_by_pattern.Rd +++ b/man/get_groupline_index_by_pattern.Rd @@ -7,9 +7,9 @@ get_groupline_index_by_pattern(grouplines, data) } \arguments{ -\item{grouplines}{...} +\item{grouplines}{column names at which to insert group line} -\item{data}{...} +\item{data}{a data.frame} } \description{ Derive groupline index by matching names diff --git a/man/insert_worksheet.Rd b/man/insert_worksheet.Rd index 1c33fe4..101868b 100644 --- a/man/insert_worksheet.Rd +++ b/man/insert_worksheet.Rd @@ -12,10 +12,11 @@ insert_worksheet( source = "statzh", metadata = NA, logo = "statzh", - grouplines = FALSE, + grouplines = NA, contactdetails = "statzh", homepage = "statzh", author = "user", + group_names = NA, date_prefix = "Aktualisiert am: ", author_prefix = "durch: " ) @@ -36,7 +37,7 @@ insert_worksheet( \item{logo}{path of the file to be included as logo (png / jpeg / svg). Defaults to "statzh"} -\item{grouplines}{defaults to FALSE. Can be used to separate grouped +\item{grouplines}{defaults to NA. Can be used to separate grouped variables visually.} \item{contactdetails}{contact details of the data publisher. Defaults to @@ -47,6 +48,8 @@ variables visually.} \item{author}{defaults to the last two letters (initials) or numbers of the internal user name.} +\item{group_names}{Names for groupings in secondary header} + \item{date_prefix}{Text shown before date} \item{author_prefix}{Text shown before author name} diff --git a/man/insert_worksheet_nh.Rd b/man/insert_worksheet_nh.Rd index 1b0be57..55007bc 100644 --- a/man/insert_worksheet_nh.Rd +++ b/man/insert_worksheet_nh.Rd @@ -34,8 +34,8 @@ insert_worksheet_nh( Format: List e.g list(c("title 1", "title 2", "title 3"))} } \description{ -Function to add formatted worksheets without headers to an - existing workbook +Function to add formatted worksheets to an existing Workbook. + The worksheets do not include contact information or logos. } \note{ The function does not write the result into a .xlsx file. A separate From 76e1b2c4f75dbdba99eff91653d78a1e517ee9df Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Thu, 1 Jun 2023 14:32:09 +0000 Subject: [PATCH 38/74] All examples working, no warnings, one note --- NAMESPACE | 22 ++--- R/aXLSX.R | 63 ++++++------ R/datasetsXLSX.R | 95 +++++++----------- R/display.statcol.all.R | 18 ++-- R/flush_left.r | 12 +-- R/get_groupline_index_by_pattern.R | 18 +--- R/helper.R | 137 +++++++++++++++++--------- R/insert_hyperlinks.R | 18 ++-- R/insert_image.R | 123 ++++++++++------------- R/insert_index_sheet.R | 69 ++++++------- R/insert_metadata_sheet.R | 72 +++++++------- R/insert_second_header.R | 20 +--- R/insert_worksheet.R | 129 +++++++----------------- R/insert_worksheet_nh.R | 60 +++++------ R/interpolate.R | 8 +- R/quickXLSX.R | 43 ++++---- R/quick_sum.r | 57 ++++------- R/splitXLSX.R | 57 ++++++----- man/aXLSX.Rd | 57 +++++------ man/datasetsXLSX.Rd | 70 ++++--------- man/display.statcol.all.Rd | 1 - man/excelIndexToRowCol.Rd | 19 ++++ man/flush_left.Rd | 9 +- man/get_groupline_index_by_pattern.Rd | 5 +- man/insert_hyperlink.Rd | 8 +- man/insert_hyperlinks.Rd | 6 +- man/insert_index_sheet.Rd | 41 ++++---- man/insert_metadata_sheet.Rd | 24 +++-- man/insert_second_header.Rd | 23 ++--- man/insert_worksheet.Rd | 26 ++--- man/insert_worksheet_image.Rd | 57 ++++------- man/insert_worksheet_nh.Rd | 40 ++++---- man/interpolate2.Rd | 1 - man/namedRegionColumnExtent.Rd | 18 ++++ man/namedRegionExtent.Rd | 31 ++++++ man/namedRegionFirstCol.Rd | 22 +++++ man/namedRegionFirstRow.Rd | 22 +++++ man/namedRegionLastCol.Rd | 22 +++++ man/namedRegionLastRow.Rd | 22 +++++ man/namedRegionRowExtent.Rd | 20 ++++ man/quickXLSX.Rd | 45 +++++---- man/quick_sum.Rd | 6 +- man/splitXLSX.Rd | 55 ++++++----- 43 files changed, 838 insertions(+), 833 deletions(-) create mode 100644 man/excelIndexToRowCol.Rd create mode 100644 man/namedRegionColumnExtent.Rd create mode 100644 man/namedRegionExtent.Rd create mode 100644 man/namedRegionFirstCol.Rd create mode 100644 man/namedRegionFirstRow.Rd create mode 100644 man/namedRegionLastCol.Rd create mode 100644 man/namedRegionLastRow.Rd create mode 100644 man/namedRegionRowExtent.Rd diff --git a/NAMESPACE b/NAMESPACE index 8ae07a2..9f16c57 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -17,36 +17,26 @@ export(quick_sum) export(splitXLSX) export(theme_stat) export(zhpal) -import(ggplot2) importFrom(dplyr,"%>%") -importFrom(dplyr,group_by) -importFrom(dplyr,n) -importFrom(dplyr,summarize) -importFrom(dplyr,ungroup) importFrom(ggplot2,aes) importFrom(ggplot2,continuous_scale) importFrom(ggplot2,element_blank) importFrom(ggplot2,element_line) -importFrom(ggplot2,ggplotGrob) -importFrom(ggplot2,ggsave) +importFrom(ggplot2,facet_wrap) +importFrom(ggplot2,geom_point) +importFrom(ggplot2,ggplot) +importFrom(ggplot2,guides) importFrom(ggplot2,labs) importFrom(ggplot2,theme) importFrom(ggplot2,theme_minimal) importFrom(ggplot2,unit) importFrom(grDevices,"colorRampPalette") -importFrom(grDevices,colorRampPalette) -importFrom(grDevices,dev.off) -importFrom(grDevices,png) importFrom(graphics,"rect") -importFrom(gridExtra,grid.arrange) importFrom(methods,is) -importFrom(openxlsx,addWorksheet) -importFrom(openxlsx,insertImage) -importFrom(purrr,pmap) -importFrom(purrr,pwalk) -importFrom(purrr,walk) importFrom(rlang,":=") +importFrom(rlang,.data) importFrom(scales,manual_pal) importFrom(stats,median) importFrom(stats,quantile) importFrom(stats,sd) +importFrom(utils,stack) diff --git a/R/aXLSX.R b/R/aXLSX.R index bf4f688..32882c9 100644 --- a/R/aXLSX.R +++ b/R/aXLSX.R @@ -3,49 +3,46 @@ #' @description Function to export data from R to a formatted .xlsx-file. The #' data is exported to the first sheet. Metadata information is exported to #' the second sheet. -#' @param data data to be exported. -#' @param file file name of the xlsx-file. The extension ".xlsx" is added automatically. -#' @param title title to be put above the data in the worksheet. -#' @template shared_parameters -#' @keywords aXLSX -#' @export +#' @inheritParams insert_worksheet +#' @param file Path of output xlsx-file. #' @examples -#' dataset <- mtcars -#' source_string <- paste("Source: Henderson and Velleman (1981).", -#' "Building multiple regression models interactively.", -#' "Biometrics, 37, 391–411.") -#' -#' metadata_string <- paste("The data was extracted from the 1974", -#' "Motor Trend US magazine and comprises fuel consumption and", -#' "10 aspects of automobile design and performance for 32 automobiles", -#' "(1973–74 models).") -#' \donttest{ -#' \dontrun{ #' aXLSX(data = mtcars, #' title = "Motor trend car road tests", -#' file = "motor_trend_car_road_tests", -#' source = source_string, -#' metadata = metadata_string, -#' contactdetails = "statzh", -#' grouplines = NA, -#' logo = "statzh", -#' author = "user") -#' } -#' } -aXLSX <- function(data, file, title = "Title", source = "statzh", metadata = NA, - logo = "statzh", grouplines = NA, contactdetails = "statzh", - author = "user"){ +#' file = tempfile(fileext = ".xlsx"), +#' source = paste("Source: Henderson and Velleman (1981). Building", +#' "multiple regression models interactively.", +#' "Biometrics, 37, 391–411."), +#' metadata = paste("The data was extracted from the 1974", +#' "Motor Trend US magazine and comprises fuel", +#' "consumption and 10 aspects of automobile design", +#' "and performance for 32 automobiles", +#' "(1973–74 models).")) +#' @keywords aXLSX +#' @export +aXLSX <- function(data, + file, + title = "Title", + source = "statzh", + metadata = NA, + logo = "statzh", + contactdetails = "statzh", + author = "user", + grouplines = NA, + group_names = NA){ # Initialize Workbook object ------- wb <- openxlsx::createWorkbook() # Insert data ----- - insert_worksheet_nh(data, wb, title = title, source = source, metadata = NA, - grouplines = grouplines) + insert_worksheet_nh(wb, data = data, title = title, + source = source, metadata = NA, + grouplines = grouplines, + group_names = group_names) # Insert metadata ------- - insert_metadata_sheet(wb, title = title, source = source, metadata = metadata, - logo = logo, contactdetails = contactdetails, + insert_metadata_sheet(wb, title = title, source = source, + metadata = metadata, logo = logo, + contactdetails = contactdetails, author = author) # Write workbook to disk -------- diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index 850091e..fdb9fab 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -26,7 +26,7 @@ #'@param sources source of the data. Defaults to "statzh". #'@param metadata metadata information to be included. Defaults to NA. #'@param auftrag_id order number. -#'@param contact contact information on the title sheet. Defaults to "statzh" +#'@param contactdetails contact information on the title sheet. Defaults to "statzh" #'@param homepage web address to be put on the title sheet. Default to "statzh" #'@param openinghours openinghours written on the title sheet. Defaults to Data #' Shop @@ -35,81 +35,51 @@ #' list(c("title 1", "title 2", "title 3")) #'@param overwrite overwrites the existing excel files with the same file name. #' default to FALSE -#'@keywords datasetsXLSX -#'@export -#'@importFrom dplyr "%>%" -#'@importFrom purrr pwalk pmap -#' @examples -#'\donttest{ -#' \dontrun{ -#'# Example with two datasets and no figure -#'dat1 <- mtcars -#'dat2 <- PlantGrowth -#' -#'datasetsXLSX(file="twoDatasets", -#' datasets = list(dat1, dat2), -#' titles = c("mtcars-Datensatz","PlantGrowth-Datensatz"), -#' grouplines = list(c(1)), -#' # adds a second header in the first sheet -#' group_names = list(c("name_of_second_header")), -#' sources = c("Source: Henderson and Velleman (1981). -#' Building multiple regression models interactively. Biometrics, 37, 391–411.", -#' "Dobson, A. J. (1983) An Introduction to Statistical -#' Modelling. London: Chapman and Hall."), -#' metadata = c("Bemerkungen zum mtcars-Datensatz: x", -#' "Bemerkungen zum PlantGrowth-Datensatz: x"), -#' sheetnames = c("Autos","Blumen"), -#' maintitle = "Autos und Pflanzen", -#' titlesource = "statzh", -#' logo = "statzh", -#' auftrag_id="A2021_0000", -#' contact = "statzh", -#' homepage = "statzh", -#' openinghours = "statzh", -#' overwrite = T) -#' +#'@examples #'# Example with two datasets and one figure +#'fig <- ggplot2::ggplot(mtcars, ggplot2::aes(x = disp))+ +#' ggplot2::geom_histogram() #' -#'dat1 <- mtcars -#'dat2 <- PlantGrowth -#'fig <- ggplot(mtcars, aes(x=disp))+ -#' geom_histogram() -#' -#'datasetsXLSX(file="twoDatasetsandFigure", -#' datasets = list(dat1, dat2, fig), -#' titles = c("mtcars-Datensatz","PlantGrowth-Datensatz", "Histogramm"), +#'datasetsXLSX(file = tempfile(fileext = ".xlsx"), +#' datasets = list(mtcars, PlantGrowth, fig), +#' titles = c("mtcars-Datensatz", +#' "PlantGrowth-Datensatz", +#' "Histogramm"), #' plot_widths = c(5), #' plot_heights = c(5), -#' sources = c("Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.", -#' "Source: Dobson, A. J. (1983) An Introduction to Statistical Modelling. London: Chapman and Hall."), +#' sources = c(paste("Source: Henderson and Velleman (1981).", +#' "Building multiple regression models", +#' "interactively. Biometrics, 37, 391–411."), +#' paste("Source: Dobson, A. J. (1983) An Introduction", +#' "to Statistical Modelling.", +#' "London: Chapman and Hall.")), #' metadata = c("Bemerkungen zum mtcars-Datensatz: x", #' "Bemerkungen zum PlantGrowth-Datensatz: x"), #' sheetnames = c("Autos","Blumen", "Histogramm"), #' maintitle = "Autos und Pflanzen", -#' titlesource = "statzh", -#' logo="statzh", -#' auftrag_id="A2021_0000", -#' contact = "statzh", -#' homepage = "statzh", -#' openinghours = "statzh", -#' overwrite = T) -#'} -#'} -datasetsXLSX <- function(file, datasets, titles, +#' auftrag_id = "A2021_0000", +#' overwrite = TRUE) +#' @keywords datasetsXLSX +#' @importFrom dplyr %>% +#' @export +datasetsXLSX <- function(file, + datasets, + titles, plot_widths = NULL, plot_heights = NULL, grouplines = NA, group_names = NA, sources = "statzh", metadata = NA, - sheetnames, maintitle, + sheetnames, + maintitle, titlesource = "statzh", logo = "statzh", auftrag_id = NULL, - contact = "statzh", + contactdetails = "statzh", homepage = "statzh", openinghours = "statzh", - overwrite = F){ + overwrite = FALSE){ # Run checks on arguments ------ checkGroupOptionCompatibility(group_names, grouplines) @@ -143,9 +113,10 @@ datasetsXLSX <- function(file, datasets, titles, # Insert the initial index sheet ---------- - insert_index_sheet(wb, logo, contact, homepage, openinghours, titlesource, - auftrag_id, maintitle) - + insert_index_sheet(wb = wb, title = maintitle, auftrag_id = auftrag_id, + logo = logo, contactdetails = contactdetails, + homepage = homepage, openinghours = openinghours, + source = titlesource) # Insert datasets according to dataframes_index ------- if (length(dataframes_index) > 0){ @@ -156,7 +127,7 @@ datasetsXLSX <- function(file, datasets, titles, dataframe_metadata, dataframe_grouplines, dataframe_group_names) %>% - purrr::pwalk(~insert_worksheet_nh(data = ..1, wb = wb, sheetname = ..2, + purrr::pwalk(~insert_worksheet_nh(wb = wb, data = ..1, sheetname = ..2, title = ..3, source = ..4, metadata = ..5, grouplines = ..6, group_names = ..7)) } @@ -168,7 +139,7 @@ datasetsXLSX <- function(file, datasets, titles, plot_sheetnames, plot_widths, plot_heights) %>% - purrr::pmap(~insert_worksheet_image(image = ..1, wb = wb, sheetname = ..2, + purrr::pmap(~insert_worksheet_image(wb = wb, image = ..1, sheetname = ..2, width = ..3, height = ..4)) } diff --git a/R/display.statcol.all.R b/R/display.statcol.all.R index 5e42477..3983eda 100644 --- a/R/display.statcol.all.R +++ b/R/display.statcol.all.R @@ -1,26 +1,24 @@ #' display.statcol.all() #' -#' Preview all Stat ZH palettes stored in the 'zhpal'-object -#' @keywords display.statcol.all -#' @export -#' @import ggplot2 +#' @description Preview all Stat ZH palettes stored in the 'zhpal'-object #' @examples #' display.statcol.all() -#' - +#' @keywords display.statcol.all +#' @importFrom ggplot2 ggplot aes geom_point facet_wrap guides theme_minimal +#' theme element_blank labs +#' @importFrom rlang .data +#' @export display.statcol.all <- function(){ df <- data.frame(unlist(x$stattheme_data)) - - df$pal_col <- row.names(df) - + df[,"pal_col"] <- row.names(df) colnames(df) <- c("col", "pal_col") df$palette <- gsub('(.mid|.low|.high|.high|\\d$)', '', df$pal_col) df$palette <- gsub('\\d$','', df$palette) - gg1 <- ggplot2::ggplot(df, ggplot2::aes(x = pal_col, y = 0, color = I(col))) + + gg1 <- ggplot2::ggplot(df, ggplot2::aes(x = .data$pal_col, y = 0, color = I(col))) + ggplot2::geom_point(size = 20, shape = 15) + ggplot2::facet_wrap(~palette, ncol = 3, scales = "free") + ggplot2::guides(color = "none") + diff --git a/R/flush_left.r b/R/flush_left.r index b751910..f45cc04 100644 --- a/R/flush_left.r +++ b/R/flush_left.r @@ -1,19 +1,17 @@ #' flush_left() #' -#' Function to flush title, subtitle and caption to the lefthand side of the -#' graphics device +#' @description Function to flush title, subtitle and caption to the +#' lefthand side of the ggplot2 graphics device #' @param g ggplot object -#' @keywords flush_left, ggplot -#' @importFrom ggplot2 ggplotGrob labs aes -#' @importFrom gridExtra grid.arrange -#' @export #' @examples #' plt <- ggplot2::ggplot(mtcars, ggplot2::aes(x = cyl)) + #' ggplot2::geom_bar() + #' ggplot2::labs(title = "Cylinders", subtitle = "Bar chart", -#' caption = "mtcars") +#' caption = "mtcars") #' #' flush_left(plt) +#' @keywords flush_left +#' @export flush_left <- function(g){ xout <- ggplot2::ggplotGrob(g) diff --git a/R/get_groupline_index_by_pattern.R b/R/get_groupline_index_by_pattern.R index 90a057a..fc6876c 100644 --- a/R/get_groupline_index_by_pattern.R +++ b/R/get_groupline_index_by_pattern.R @@ -1,23 +1,13 @@ #' get_groupline_index_by_pattern() #' -#' Derive groupline index by matching names -#' @param grouplines column names at which to insert group line -#' @param data a data.frame +#' @description Derive groupline index by matching names +#' @inheritParams insert_worksheet #' @keywords internal - get_groupline_index_by_pattern <- function(grouplines, data){ get_lowest_col <- function(groupline, data){ - groupline_numbers_single <- which(grepl(groupline, names(data))) - - out <- min(groupline_numbers_single) - - return(out) + min(which(grepl(groupline, names(data)))) } - groupline_numbers <- unlist(lapply(grouplines, function(x){ - get_lowest_col(x, data) - })) - - return(groupline_numbers) + unlist(lapply(grouplines, function(x) get_lowest_col(x, data))) } diff --git a/R/helper.R b/R/helper.R index d3570bf..e1624c3 100644 --- a/R/helper.R +++ b/R/helper.R @@ -74,10 +74,9 @@ inputHelperSource <- function(source, prefix = NULL, collapse = NULL){ #' inputHelperMetadata() #' #' @description Concatenate metadata into a formatted string. +#' @inheritParams inputHelperSource #' @param metadata A character vector with metadata information -#' @param extension A character string with the prefix. Default: "Metadaten: ". -#' @param collapse A character string with the separator for metadata. Default: ";" -#' @returns A character vector if +#' @returns A character vector #' @keywords internal #' @noRd inputHelperMetadata <- function(metadata, prefix = NULL, collapse = NULL){ @@ -226,14 +225,11 @@ inputHelperAuthorName <- function(author, prefix = NULL){ #' excelIndexToRowCol() #' #' @description Converts an Excel style index (e.g. A1) into numeric row and -#' column indices. -#' @details Handles cells (A1) and matrices (A1:B2) +#' column indices. Handles cells (A1) as well as matrices (A1:B2) #' @param index A Microsoft Excel style index (see details) -#' @param prefix A character string to prepend to the result -#' @returns A character string with the username +#' @returns A list containing row indices and column indices #' @keywords internal -#' @noRd -#' +#' @importFrom utils stack excelIndexToRowCol <- function(index){ splitIndex <- function(x, split = "") unlist(strsplit(x, split)) @@ -263,7 +259,8 @@ excelIndexToRowCol <- function(index){ return(list(row = rows, col = cols)) } -#' getNamedRegionExtent() + +#' namedRegionExtent() #' #' @description Get extent of a named region in a workbook object #' @details If a single name is provided, returns the extent of the associated @@ -272,60 +269,112 @@ excelIndexToRowCol <- function(index){ #' regions is returned. #' @param wb A workbook object #' @param sheet Name of a worksheet -#' @param name name of region. Also takes a vector of multiple names -#' @returns A list with two numeric vectors row and col, containing a sequence -#' of numeric row and column indices. +#' @param region_name names of regions in Workbook. +#' @param which either "row", "col", or "both" (default). +#' @returns A list with two numeric vectors row and col, containing +#' row and column indices. #' @keywords internal -#' @noRd -#' -getNamedRegionExtent <- function(wb, sheet, name = NULL){ +namedRegionExtent <- function(wb, sheetname, region_name = NULL, which = "both"){ named_regions <- openxlsx::getNamedRegions(wb) - sheet_ind <- which(sheet == attr(named_regions, "sheet")) + + if (!(sheetname %in% names(wb))){ + stop("Sheetname does not exist in Workbook") + } + + sheet_ind <- which(sheetname == attr(named_regions, "sheet")) + region_names <- named_regions[sheet_ind] + + positions <- attr(named_regions, "position")[sheet_ind] - if (all(is.null(name))){ - return(excelIndexToRowCol(positions)) + if (which == "both"){ + dimensions <- c("row", "col") + } else { + dimensions <- which + } + + # If name is null, return full extent for sheet + if (all(is.null(region_name))){ + return(excelIndexToRowCol(positions)[dimensions]) } - ind <- unlist(sapply(name, function(string){ - which(grepl(paste0(string,"$"), named_regions[sheet_ind])) + region_ind <- unlist(sapply(region_name, function(region){ + which(grepl(paste0(region,"$"), region_names)) })) - if (length(ind) > 0){ - return(excelIndexToRowCol(positions[ind])) + # Return extent for combined region + if (length(region_ind) > 0){ + return(excelIndexToRowCol(positions[region_ind])[dimensions]) } - warning("name not found!") - return(excelIndexToRowCol(positions)) + # Default to A1 + return(excelIndexToRowCol("A1")[dimensions]) +} + +#' namedRegionRowExtent() +#' +#' @description Get row extent of a named region in a workbook object +#' @inheritParams namedRegionExtent +#' @returns A numeric vector of row indices +#' @keywords internal +#' +namedRegionRowExtent <- function(wb, sheetname, region_name = NULL){ + unlist(namedRegionExtent(wb, sheetname, region_name, "row")) } -#' getNamedRegionFirstRow() + +#' namedRegionColumnExtent() #' -#' @description Get first row number of named region -#' @param wb A workbook object -#' @param sheet Name of a worksheet -#' @param name name of region. Also takes a vector of multiple names -#' @returns Numeric row number corresponding to first row of named region +#' @description Get column extent of a named region in a Workbook object +#' @inheritParams namedRegionExtent +#' @returns A numeric vector of column indices #' @keywords internal -#' @noRd #' -getNamedRegionFirstRow <- function(wb, sheet, name = NULL){ - region_extent <- getNamedRegionExtent(wb, sheet, name) - return(min(region_extent[["row"]])) +namedRegionColumnExtent <- function(wb, sheetname, name = NULL){ + unlist(namedRegionExtent(wb, sheetname, name, "col")) } -#' getNamedRegionLastRow() + +#' namedRegionFirstRow() +#' +#' @description Get first row number of named region +#' @inheritParams namedRegionExtent +#' @returns Numeric value corresponding to first row of named region +#' @keywords internal +namedRegionFirstRow <- function(wb, sheet, region_name = NULL){ + min(namedRegionRowExtent(wb, sheet, region_name)) +} + + +#' namedRegionLastRow() #' #' @description Get last row number of named region -#' @param wb A workbook object -#' @param sheet Name of a worksheet -#' @param name name of region. Also takes a vector of multiple names -#' @returns Numeric row number corresponding to last row of named region +#' @inheritParams namedRegionExtent +#' @returns Numeric value corresponding to last row of named region #' @keywords internal -#' @noRd -getNamedRegionLastRow <- function(wb, sheet, name = NULL){ - region_extent <- getNamedRegionExtent(wb, sheet, name) - return(max(region_extent[["row"]])) +namedRegionLastRow <- function(wb, sheet, region_name = NULL){ + max(namedRegionRowExtent(wb, sheet, region_name)) } + +#' namedRegionFirstCol() +#' +#' @description Get first col number of named region +#' @inheritParams namedRegionExtent +#' @returns Numeric value corresponding to first column of named region +#' @keywords internal +namedRegionFirstCol <- function(wb, sheet, region_name = NULL){ + min(namedRegionColumnExtent(wb, sheet, region_name)) +} + + +#' namedRegionLastCol() +#' +#' @description Get last col number of named region +#' @inheritParams namedRegionExtent +#' @returns Numeric value corresponding to last column of named region +#' @keywords internal +namedRegionLastCol <- function(wb, sheet, region_name = NULL){ + max(namedRegionColumnExtent(wb, sheet, region_name)) +} diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index 26fe44e..15e4d3e 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -1,14 +1,13 @@ #' insert_hyperlink() #' #' @description Function for inserting hyperlinks within an openxlsx Workbook -#' @param wb Workbook object -#' @param sheetname Name of sheet -#' @param title Title -#' @param sheet_row Sheet row +#' @inheritParams insert_worksheet +#' @param sheet_row Row where hyperlink should be inserted #' @param index_sheet_name Name of sheet where hyperlink should be created #' @keywords internal insert_hyperlink <- function(wb, sheetname, title, sheet_row, index_sheet_name){ - openxlsx::writeData(wb, index_sheet_name, title, xy = c("C", sheet_row)) + openxlsx::writeData(wb, index_sheet_name, title, + startCol = 3, startRow = sheet_row) openxlsx::addStyle(wb, index_sheet_name, hyperlinkStyle(), sheet_row, cols = 3) openxlsx::mergeCells(wb, index_sheet_name, rows = sheet_row, cols = 3:8) @@ -30,16 +29,17 @@ insert_hyperlink <- function(wb, sheetname, title, sheet_row, index_sheet_name){ wb$worksheets[[worksheet]]$sheet_data$f <- field_f } + #' insert_hyperlinks() #' #' @description Function for inserting hyperlinks within an openxlsx Workbook -#' @param wb Workbook object +#' @inheritParams insert_worksheet +#' @inheritParams insert_hyperlink #' @param sheetnames Names of sheets to create hyperlinks to #' @param titles Titles of Hyperlinks -#' @param index_sheet_name Name of sheet where hyperlinks should be created -#' @param sheet_start_row Sheet row -#' @export +#' @param sheet_start_row Initial row after which hyperlinks should be created #' @keywords insert_hyperlinks +#' @export insert_hyperlinks <- function(wb, sheetnames, titles, index_sheet_name = "Index", sheet_start_row = 15){ diff --git a/R/insert_image.R b/R/insert_image.R index d5cd0f7..9ac8f94 100644 --- a/R/insert_image.R +++ b/R/insert_image.R @@ -1,11 +1,10 @@ #' insert_worksheet_image() #' #' @description Insert an image into a worksheet -#' @note -#' The function does not write the result into a .xlsx file. A separate call -#' to openxlsx::saveWorkbook() is required. A temporary file is created when -#' image refers to a gg, ggplot or histogram object. This file is deleted -#' afterwards. +#' @note The function does not write the result into a .xlsx file. A separate +#' call to openxlsx::saveWorkbook() is required. A temporary file is created +#' for inputs of type gg, ggplot or histogram object at path given by +#' `tempfile()`. #' @param image image or plot #' @param wb workbook object to write new worksheet in #' @param sheetname name of the sheet tab @@ -13,85 +12,65 @@ #' @param startcol column coordinate of upper left corner of figure #' @param width width of figure #' @param height height of figure -#' @export -#' @importFrom grDevices png dev.off -#' @importFrom methods is -#' @importFrom openxlsx addWorksheet insertImage -#' @importFrom ggplot2 ggsave -#' @keywords insert_worksheet_image +#' @param units unit of measurement (default: in) +#' @param dpi image resolution (default: 300) #' @examples -#' library(ggplot2) -#' wb <- openxlsx::createWorkbook() -#' -#' # Add a geom_histogram() -#' #-------------- -#' figure1 <- ggplot(mtcars, aes(x = disp)) + -#' geom_histogram() -#' -#' insert_worksheet_image(image = figure1, wb, sheetname = "ggplot image", -#' width = 3.5, height = 5.5) -#' -#' # Add a base histogram -#' #-------------- -#' base_hist <- hist(mtcars$disp) +#' figure <- ggplot2::ggplot(mtcars, ggplot2::aes(x = disp)) + +#' ggplot2::geom_histogram() #' -#' insert_worksheet_image(image = base_hist, wb, sheetname = "Base histogram", -#' width = 3.5, height = 5.5) -#' -#' # Insert an existing image file -#' #-------------- -#' image_path <- paste0(path.package("statR"), "/extdata/Stempel_Kanton_ZH.png") -#' -#' insert_worksheet_image(image = image_path, wb, sheetname = "Existing image", -#' width = 3.5, height = 5.5) -#' -#' # Export workbook -#' #-------------- -#' \dontrun{ -#' openxlsx::saveWorkbook(wb,"insert_worksheet_image.xlsx") -#' } -#' -insert_worksheet_image <- function(image, wb, sheetname, startrow = 3, - startcol = 3, width, height){ - - if (is(image, "character")){ - image_path <- image +#' wb <- openxlsx::createWorkbook() +#' insert_worksheet_image(wb, sheetname = "ggplot image", +#' image = figure, width = 3.5, height = 5.5) +#' @keywords insert_worksheet_image +#' @importFrom methods is +#' @export +insert_worksheet_image <- function(wb, sheetname, image, startrow = 3, + startcol = 3, width, height, + units = "in", dpi = 300){ - } else if (checkImplementedPlotType(image)){ + # If image is.null, pass + if (is.null(image)) return() - # Allocate temporary file of type png to save the image to - image_path <- tempfile(tmpdir = "~/tmp", fileext = ".png") + else if (is.character(image)) image_path <- image - # Handle case input object is of class histogram - if (is(image, "histogram")){ - grDevices::png(image_path, width = width, height = height, units = "in", - res = 300) - plot(image) - grDevices::dev.off() + else if (checkImplementedPlotType(image)){ + image_path <- tempfile(fileext = ".png") + } - } else { + else { + stop("Plot muss als ggplot Objekt oder als Filepath vorliegen.") + } - # Handle case input object is of class gg or ggplot - ggplot2::ggsave(image_path, plot = image, width = width, height = height, - dpi = 300, device = "png") - } - } else { - stop("Plot muss als ggplot Objekt oder als Filepath vorliegen.") + # Create png of plot ---------- + if (is(image, "histogram")){ + grDevices::png(image_path, width = width, height = height, units = units, + res = dpi) + plot(image) + grDevices::dev.off() } - # Add new worksheet with image ---------- - if (file.exists(image_path)){ - openxlsx::addWorksheet(wb, sheetName = sheetname, gridLines = FALSE) + else if (is(image, "gg") | is(image, "ggplot2")){ + ggplot2::ggsave(image_path, plot = image, device = "png", + width = width, height = height, units = units, dpi = dpi) + } - openxlsx::insertImage(wb, sheet = sheetname, file = image_path, - width = width, height = height, startRow = startrow, - startCol = startcol, units = "in", dpi = 300) - # if (!is.character(image)){ - # # unlink(image_path) - # } - } else { + # If file not found at image_path, warn and pass + if (!file.exists(image_path)){ warning("Image not found.") + return() } + + + # Add worksheet if not already defined --------- + if (!(sheetname %in% names(wb))){ + openxlsx::addWorksheet(wb, sheetName = sheetname, gridLines = FALSE) + } + + # Insert image --------- + openxlsx::insertImage(wb, sheet = sheetname, file = image_path, + width = width, height = height, startRow = startrow, + startCol = startcol, units = units, dpi = dpi) + } diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index 5dbb512..1892ac1 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -1,23 +1,23 @@ #' insert_index_sheet() #' -#' @description Function which generates an index sheet inside an openxlsx workbook. -#' @param wb A workbook object as generated by openxlsx::createWorkbook() -#' @param logo Either statzh or zh, or path to logo file -#' @param contact Either "statzh" or a character string -#' @param homepage statzh or a character string with the URL +#' @description Function which generates an index sheet inside an openxlsx +#' workbook. +#' @inheritParams insert_worksheet #' @param openinghours statzh or a character string or vector with opening hours -#' @param titlesource Character vector denoting the data source #' @param auftrag_id Order ID -#' @param maintitle Title shown on index sheet -#' @param sheetname Name of Index Sheet -#' @param date_prefix Text prepended to date -#' @param order_id_prefix Text prepended to order ID +#' @param order_id_prefix Text inserted before order ID +#' @param toc_caption Text for table of content +#' @keywords insert_index_sheet #' @export -#' @keywords datasetsXLSX -insert_index_sheet <- function(wb, logo = "statzh", contact = "statzh", - homepage = "statzh", openinghours = "statzh", - titlesource, auftrag_id, maintitle, +insert_index_sheet <- function(wb, sheetname = "Index", + title, + auftrag_id, + logo = "statzh", + contactdetails = "statzh", + homepage = "statzh", + openinghours = "statzh", + source = "statzh", date_prefix = "Erstellt am: ", order_id_prefix = "Auftragsnr.:", toc_caption = "Inhalt"){ @@ -27,53 +27,54 @@ insert_index_sheet <- function(wb, logo = "statzh", contact = "statzh", # Insert logo ---------- - logo <- inputHelperLogoPath(logo) - if (!is.null(logo)){ - openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, units = "in") - } + insert_worksheet_image(wb = wb, sheetname = sheetname, + image = inputHelperLogoPath(logo), + startrow = 1, startcol = 1, + width = 2.145, height = 0.7865) # Insert contact info, title, metadata, and sources into worksheet -------- ### Contact information - contact_info <- c(inputHelperContactInfo(contact), - inputHelperHomepage(homepage)) - openxlsx::writeData(wb, sheetname, contact_info, 15, 2, + openxlsx::writeData(wb, sheetname, + x = c(inputHelperContactInfo(contactdetails), + inputHelperHomepage(homepage)), + startCol = 15, startRow = 2, name = paste(sheetname,"contact", sep = "_")) ### Office hours openxlsx::writeData(wb, sheetname, inputHelperOfficeHours(openinghours), - 18, getNamedRegionFirstRow(wb, sheetname, "contact"), + 18, namedRegionFirstRow(wb, sheetname, "contact"), name = paste(sheetname,"officehours", sep = "_")) ### Request information - info_vec <- c(inputHelperDateCreated(prefix = date_prefix), - inputHelperOrderNumber(auftrag_id, prefix = order_id_prefix)) - openxlsx::writeData(wb, sheetname, info_vec, 15, - getNamedRegionLastRow(wb, sheetname, "contact"), + openxlsx::writeData(wb, sheetname, + c(inputHelperDateCreated(prefix = date_prefix), + inputHelperOrderNumber(auftrag_id, prefix = order_id_prefix)), + startCol = 15, startRow = namedRegionLastRow(wb, sheetname, "contact"), name = paste(sheetname,"info", sep = "_")) ### Add Headerline openxlsx::addStyle(wb, sheetname, style_headerline(), - getNamedRegionLastRow(wb, sheetname, "info"), 1:20, + namedRegionLastRow(wb, sheetname, "info"), 1:20, gridExpand = TRUE, stack = TRUE) ### Title - openxlsx::writeData(wb, sheetname, maintitle, 3, - getNamedRegionLastRow(wb, sheetname, "info") + 3, + openxlsx::writeData(wb, sheetname, title, 3, + namedRegionLastRow(wb, sheetname, "info") + 3, name = paste(sheetname,"title", sep = "_")) openxlsx::addStyle(wb, sheetname, style_maintitle(), - getNamedRegionLastRow(wb, sheetname, "title"), 3) + namedRegionLastRow(wb, sheetname, "title"), 3) ### Source - openxlsx::writeData(wb, sheetname, titlesource, 3, - getNamedRegionLastRow(wb, sheetname, "title") + 1, + openxlsx::writeData(wb, sheetname, inputHelperSource(source), 3, + namedRegionLastRow(wb, sheetname, "title") + 1, name = paste(sheetname,"source", sep = "_")) ### Table of content caption openxlsx::writeData(wb, sheetname, toc_caption, 3, - getNamedRegionLastRow(wb, sheetname, "source"), + namedRegionLastRow(wb, sheetname, "source"), name = paste(sheetname,"toc", sep = "_")) openxlsx::addStyle(wb, sheetname, subtitleStyle(), - getNamedRegionLastRow(wb, sheetname, "toc"), 3) + namedRegionLastRow(wb, sheetname, "toc"), 3) # Format --------- diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index c479aa6..94e79fe 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -1,33 +1,30 @@ #' insert_metadata_sheet() #' -#' Function to add formatted metadata information to an existing .xlsx-workbook. -#' @param wb workbook object to add new worksheet to. -#' @param title title to be put above the data. -#' @param sheetname name of the sheet tab. -#' @param source source of the data. Defaults to "statzh". -#' @param metadata metadata information to be included. Defaults to NA. -#' @param logo path of the file to be included as logo (png / jpeg / svg). Defaults to "statzh" -#' @param contactdetails contact details of the data publisher. Defaults to "statzh". -#' @param author defaults to the last two letters (initials) or numbers of the internal user name. -#' @param date_prefix Text shown before date -#' @param author_prefix Text shown before author name +#' @description Function to add a formatted worksheet with metadata to an +#' existing Workbook object. +#' @inheritParams insert_worksheet #' @param source_prefix Text shown before sources #' @param metadata_prefix Text shown before metadata -#' @importFrom dplyr "%>%" -#' @keywords insert_metadata_sheet, openxlsx -#' @export #' @examples -#' # Generation of a spreadsheet +#' # Create Workbook #' wb <- openxlsx::createWorkbook() +#' +#' # Insert a simple metadata sheet #' insert_metadata_sheet(wb, title = "Title of mtcars", #' metadata = c("Meta data information.")) -#' \dontrun{ -#' openxlsx::saveWorkbook(wb,"insert_metadata_sheet.xlsx") -#' } -insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", - source = "statzh", metadata = NA, - logo = "statzh", contactdetails = "statzh", - author = "user", date_prefix = "Aktualisiert am: ", +#' +#' @keywords insert_metadata_sheet +#' @seealso createWorkbook, addWorksheet, writeData +#' @export +insert_metadata_sheet <- function(wb, + sheetname = "Metadaten", + title = "Title", + source = "statzh", + metadata = NA, + logo = "statzh", + contactdetails = "statzh", + author = "user", + date_prefix = "Aktualisiert am: ", author_prefix = "durch: ", source_prefix = "Datenquelle:", metadata_prefix = "Hinweise:"){ @@ -42,10 +39,10 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", # Insert logo -------- - logo <- inputHelperLogoPath(logo) - if(!is.null(logo)){ - openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, units = "in") - } + insert_worksheet_image(wb = wb, sheetname = sheetname, + image = inputHelperLogoPath(logo), + startrow = 1, startcol = 1, + width = 2.145, height = 0.7865) # Insert contact info, title, metadata, and sources into worksheet -------- @@ -54,33 +51,34 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", 12, 2, name = paste(sheetname,"contact", sep = "_")) ### Request information - info_string <- paste(inputHelperDateCreated(prefix = date_prefix), - inputHelperAuthorName(author, prefix = author_prefix)) - openxlsx::writeData(wb, sheetname, info_string, 12, - startRow = getNamedRegionLastRow(wb, sheetname, "contact") + 1, + openxlsx::writeData(wb, sheetname, + x = paste(inputHelperDateCreated(prefix = date_prefix), + inputHelperAuthorName(author, prefix = author_prefix)), + 12, startRow = namedRegionLastRow(wb, sheetname, "contact") + 1, name = paste(sheetname,"info", sep = "_")) + ### Headerline openxlsx::addStyle(wb, sheetname, style_headerline(), - getNamedRegionLastRow(wb, sheetname, "contact") + 1, 1:26, + namedRegionLastRow(wb, sheetname, "contact") + 1, 1:26, gridExpand = TRUE, stack = TRUE) ### Title openxlsx::writeData(wb, sheetname, title, - startRow = getNamedRegionLastRow(wb, sheetname, "info") + 3, + startRow = namedRegionLastRow(wb, sheetname, "info") + 3, name = paste(sheetname,"title", sep = "_")) openxlsx::addStyle(wb, sheetname, style_title(), - rows = getNamedRegionLastRow(wb, sheetname, "title"), cols = 1) + rows = namedRegionLastRow(wb, sheetname, "title"), cols = 1) ### Source and metadata openxlsx::writeData(wb, sheetname, inputHelperSource(source, prefix = source_prefix), - startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, + startRow = namedRegionLastRow(wb, sheetname, "title") + 1, name = paste(sheetname,"source", sep = "_")) openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata, prefix = metadata_prefix), - startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, + startRow = namedRegionLastRow(wb, sheetname, "source") + 1, name = paste(sheetname,"metadata", sep = "_")) openxlsx::addStyle(wb, sheetname, style_subtitle2(), - c(getNamedRegionFirstRow(wb, sheetname, "source"), - getNamedRegionFirstRow(wb, sheetname, "metadata")), 1) + c(namedRegionFirstRow(wb, sheetname, "source"), + namedRegionFirstRow(wb, sheetname, "metadata")), 1) ### Hide gridlines openxlsx::showGridLines(wb, sheetname, FALSE) diff --git a/R/insert_second_header.R b/R/insert_second_header.R index bafb648..7690757 100644 --- a/R/insert_second_header.R +++ b/R/insert_second_header.R @@ -1,23 +1,9 @@ #' insert_second_header() #' #' @description Function to add a second header row -#' @param wb Workbook -#' @param sheetname Sheet name +#' @inheritParams insert_worksheet #' @param data_start_row Row index for first row with data -#' @param group_names Group names -#' @param grouplines Group lines -#' @param data Data #' @keywords internal -#' @examples -#' \donttest{ -#' \dontrun{ -#' # Beispiel anhand des Datensatzes 'mtcars' -#'dat <- mtcars -#' -#'insert_second_header(wb, sheetname, data_start_row, group_names, -#' grouplines, data) -#' } -#' } insert_second_header <- function(wb, sheetname, data_start_row, group_names, grouplines, data){ @@ -30,8 +16,8 @@ insert_second_header <- function(wb, sheetname, data_start_row, group_names, # Write data ------- purrr::walk2(groupline_numbers, group_names, - ~openxlsx::writeData(wb, sheet = sheetname, x = .y, startCol = .x, - colNames = FALSE, startRow = data_start_row)) + ~openxlsx::writeData(wb, sheet = sheetname, x = .y, + startCol = .x, startRow = data_start_row)) # Apply style --------- openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 1f961b7..477635b 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -19,32 +19,33 @@ #' variables visually. #' @param author defaults to the last two letters (initials) or numbers of the #' internal user name. -#' @param group_names Names for groupings in secondary header +#' @param group_names Names for groupings in secondary header. Format: +#' List e.g list(c("title 1", "title 2", "title 3")) #' @param date_prefix Text shown before date #' @param author_prefix Text shown before author name -#' @importFrom dplyr "%>%" -#' @keywords insert_worksheet -#' @export #' @examples -#' # Initialize an empty Workbook +#' # Initialize Workbook #' wb <- openxlsx::createWorkbook() #' -#' insert_worksheet(data = head(mtcars), +#'# Insert mtcars dataset with STATZH design +#' insert_worksheet(data = mtcars, #' wb = wb, -#' title = "mtcars", +#' title = "mtcars dataset", #' sheetname = "carb") #' -insert_worksheet <- function(data, - wb, - sheetname = "data", +#' @keywords insert_worksheet +#' @export +insert_worksheet <- function(wb, + sheetname = "Daten", + data, title = "Title", source = "statzh", metadata = NA, logo = "statzh", - grouplines = NA, contactdetails = "statzh", homepage = "statzh", author = "user", + grouplines = NA, group_names = NA, date_prefix = "Aktualisiert am: ", author_prefix = "durch: "){ @@ -55,104 +56,44 @@ insert_worksheet <- function(data, # Insert logo ------ - logo <- inputHelperLogoPath(logo) - if (!is.null(logo)){ - openxlsx::insertImage(wb, sheetname, logo, 2.145, 0.7865, units = "in") - } + insert_worksheet_image(wb = wb, sheetname = sheetname, + image = inputHelperLogoPath(logo), + startrow = 1, startcol = 1, + width = 2.145, height = 0.7865) # Insert contact info, date created, and author ----- ### Contact info - contact_start_col <- max(ncol(data) - 2, 4) - contact_end_col <- 26 + contact_start_col <- min(ncol(data) - 2, 4) - openxlsx::writeData(wb, sheetname, inputHelperContactInfo(contactdetails), + openxlsx::writeData(wb, sheetname, + x = c(inputHelperContactInfo(contactdetails), + inputHelperHomepage(homepage)), contact_start_col, 2, - name = paste(sheetname,"contact", sep = "_")) - openxlsx::writeData(wb, sheetname, inputHelperHomepage(homepage), - contact_start_col, - startRow = getNamedRegionLastRow(wb, sheetname, "contact") + 1, - name = paste(sheetname,"homepage", sep = "_")) + name = paste(sheetname, "contact", sep = "_")) - ### Creation date - infostring <- paste(inputHelperDateCreated(prefix = date_prefix), - inputHelperAuthorName(author, prefix = author_prefix)) - openxlsx::writeData(wb, sheetname, infostring, contact_start_col, - startRow = getNamedRegionLastRow(wb, sheetname, "homepage") + 1, + ### Information string about time of generation and responsible user + openxlsx::writeData(wb, sheetname, + x = paste(inputHelperDateCreated(prefix=date_prefix), + inputHelperAuthorName(author, prefix=author_prefix)), + contact_start_col, + startRow = namedRegionLastRow(wb, sheetname, "contact") + 1, name = paste(sheetname, "info", sep = "_")) ### Horizontally merge cells to ensure that contact entries are displayed properly - info_extent <- getNamedRegionExtent(wb, sheetname, c("contact", "homepage", "info")) - purrr::walk(info_extent$rows, - ~openxlsx::mergeCells(wb, sheetname, min(info_extent$col):contact_end_col, rows = .)) + purrr::walk(namedRegionRowExtent(wb, sheetname, c("contact", "info")), + ~openxlsx::mergeCells(wb, sheetname, + cols = contact_start_col:26, + rows = .)) ### Insert headerline after contacts ------ openxlsx::addStyle(wb, sheetname, style_headerline(), - rows = getNamedRegionLastRow(wb, sheetname, "info"), + rows = namedRegionLastRow(wb, sheetname, "info"), cols = 1:ncol(data), gridExpand = TRUE, stack = TRUE) - - insert_worksheet_nh(data, - wb, - sheetname = sheetname, - title = title, - source = source, - metadata = metadata, - grouplines = grouplines, - group_names = group_names) - - # # Insert descriptives into worksheet -------- - # ### Title - # openxlsx::writeData(wb, sheetname, title, - # startRow = getNamedRegionLastRow(wb, sheetname, "info") + 3, - # name = paste(sheetname, "title", sep = "_")) - # openxlsx::addStyle(wb, sheetname, style_title(), - # getNamedRegionLastRow(wb, sheetname, "title"), 1, - # gridExpand = TRUE) - # - # ### Source - # openxlsx::writeData(wb, sheetname, inputHelperSource(source), - # startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, - # name = paste(sheetname,"source", sep = "_")) - # - # ### Metadata - # openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), - # startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, - # name = paste(sheetname,"metadata", sep = "_")) - # - # ### Horizontally merge cells containing descriptive info to ensure that they're displayed properly - # descriptives_extent <- getNamedRegionExtent(wb, sheetname, c("title","source","metadata")) - # purrr::walk(descriptives_extent$row, - # ~openxlsx::mergeCells(wb, sheetname, 1:contact_end_col, rows = .)) - # - # - # # Insert data -------- - # ### Pad colnames using whitespaces for better auto-fitting of column width - # colnames(data) <- paste0(colnames(data), " ", sep = "") - # - # ### Write data - # openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), - # startRow = getNamedRegionLastRow(wb, sheetname, "metadata") + 3, - # rowNames = FALSE, withFilter = FALSE, - # name = paste(sheetname,"data", sep = "_")) - # - # openxlsx::addStyle(wb, sheetname, style_header(), - # rows = getNamedRegionFirstRow(wb, sheetname, "data"), - # cols = 1:ncol(data), - # gridExpand = TRUE, stack = TRUE) - # - # ### Grouplines - # if (!is.null(grouplines)){ - # openxlsx::addStyle(wb, sheetname, style_leftline(), - # getNamedRegionExtent(wb, sheetname, "data")$row, - # grouplines, gridExpand = TRUE, stack = TRUE) - # } - # - # ### Define minimum column width - # options("openxlsx.minWidth" = 5) - # - # ### Use automatic columnwidth for columns with data - # openxlsx::setColWidths(wb, sheetname, 1:ncol(data), "auto", ignoreMergedCells = TRUE) + insert_worksheet_nh(wb, sheetname = sheetname, data = data, title = title, + source = source, metadata = metadata, + grouplines = grouplines, group_names = group_names) } diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index 0041ca3..f9ce31c 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -4,49 +4,36 @@ #' The worksheets do not include contact information or logos. #' @note The function does not write the result into a .xlsx file. A separate #' call to `openxlsx::saveWorkbook()` is required. -#' @param data data to be included in the XLSX-table. -#' @param wb workbook object to write new worksheet in. -#' @param title title of the table and the sheet -#' @param sheetname name of the sheet-tab. -#' @param source source of the data. Defaults to "statzh". -#' @param metadata metadata-information to be included. Defaults to NA. -#' @param grouplines defaults to NA. Can be used to separate grouped variables visually. -#' @param group_names Name(s) of the second header(s). -#' Format: List e.g list(c("title 1", "title 2", "title 3")) -#' @keywords insert_worksheet, openxlsx -#' @importFrom dplyr "%>%" -#' @importFrom purrr walk -#' @export +#' @inheritParams insert_worksheet #' @examples #' ## Create workbook -#' export <- openxlsx::createWorkbook() +#' wb <- openxlsx::createWorkbook() #' #' ## insert a new worksheet -#' insert_worksheet_nh(head(mtcars), export, "data1", +#' insert_worksheet_nh(wb, sheetname = "data1", data = head(mtcars), #' title = "Title", source = "statzh", metadata = "Note: ...") #' #' ## insert a further worksheet -#' insert_worksheet_nh(tail(mtcars), export, "data2", +#' insert_worksheet_nh(wb, sheetname = "data2", data = tail(mtcars), #' title = "Title", source = "statzh", metadata = "Note: ...") #' #' ## insert a worksheet with group lines and second header -#' insert_worksheet_nh(data = head(mtcars), wb = export, -#' title = "grouplines", source = "statzh", metadata = "Note: ...", -#' grouplines = c(1,5,6), group_names = "carb") -#' -#' \dontrun{ -#' ## save workbook -#' openxlsx::saveWorkbook(export,"example.xlsx") -#' } -insert_worksheet_nh <- function(data, - wb, +#' insert_worksheet_nh(wb, sheetname = "data3", data = head(mtcars), +#' title = "grouplines", source = "statzh", +#' metadata = "Note: ...", +#' grouplines = c(1,5,6), group_names = "carb") +#' @keywords insert_worksheet_nh +#' @export +insert_worksheet_nh <- function(wb, sheetname = "Daten", + data, title = "Title", source = "statzh", metadata = NA, grouplines = NA, group_names = NA){ # Initialize new worksheet ------ + sheetname <- verifyInputSheetname(sheetname) if (!(sheetname %in% names(wb))){ @@ -54,10 +41,9 @@ insert_worksheet_nh <- function(data, start_row <- 1 } else { - start_row <- getNamedRegionLastRow(wb, sheetname) + 3 + start_row <- namedRegionLastRow(wb, sheetname) + 3 } - # Insert title, metadata, and sources into worksheet -------- ### Title openxlsx::writeData(wb, sheetname, title, startCol = 1, startRow = start_row, @@ -66,31 +52,33 @@ insert_worksheet_nh <- function(data, ### Source openxlsx::writeData(wb, sheetname, inputHelperSource(source), - startRow = getNamedRegionLastRow(wb, sheetname, "title") + 1, + startRow = namedRegionLastRow(wb, sheetname, "title") + 1, name = paste(sheetname,"source", sep = "_")) openxlsx::addStyle(wb, sheetname, style_subtitle(), - getNamedRegionLastRow(wb, sheetname, "source"), 1, + namedRegionLastRow(wb, sheetname, "source"), 1, stack = TRUE, gridExpand = TRUE) ### Metadata openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), - startRow = getNamedRegionLastRow(wb, sheetname, "source") + 1, + startRow = namedRegionLastRow(wb, sheetname, "source") + 1, name = paste(sheetname,"metadata", sep = "_")) openxlsx::addStyle(wb, sheetname, style_subtitle(), - getNamedRegionLastRow(wb, sheetname, "metadata"), 1, + namedRegionLastRow(wb, sheetname, "metadata"), 1, stack = TRUE, gridExpand = TRUE) + ### Merge cells with title, metadata, and sources to ensure that they're displayed properly - descr_extent <- getNamedRegionExtent(wb, sheetname, c("title", "source", "metadata")) - purrr::walk(descr_extent$row, ~openxlsx::mergeCells(wb, sheetname, 1:26, rows = .)) + purrr::walk(namedRegionRowExtent(wb, sheetname, c("title", "source", "metadata")), + ~openxlsx::mergeCells(wb, sheetname, cols = 1:26, rows = .)) ### Add Line wrapping - openxlsx::addStyle(wb, sheetname, style_wrap(), descr_extent$row, 1, + openxlsx::addStyle(wb, sheetname, style_wrap(), + namedRegionRowExtent(wb, sheetname, c("title", "source", "metadata")), 1, stack = TRUE, gridExpand = TRUE) # Insert data -------- - data_start_row <- getNamedRegionLastRow(wb, sheetname, "metadata") + 3 + data_start_row <- namedRegionLastRow(wb, sheetname, "metadata") + 3 # Grouplines --------- diff --git a/R/interpolate.R b/R/interpolate.R index 1fdea9a..afece64 100644 --- a/R/interpolate.R +++ b/R/interpolate.R @@ -1,18 +1,16 @@ #'interpolate2() #' -#' Function to generate new color palettes by interpolation. +#' @description Function to generate new color palettes by interpolation. #' @param palette a vector of colors to be interpolated #' @param color color (hex-code) to be mixed with the colors in the 'palette'. #' @param degree degree of interpolation, range: 1 (slight interpolation) - 7 (strong interpolation). #' @param number number of colors to be generated. -#' @keywords interpolate2 -#' @export -#' @importFrom grDevices colorRampPalette #' @examples #' #interpolate the 'zhblue'-palette with black and generate 7 new ones #' interpolate2(palette = zhpal$zhblue, color = c("#000000"), degree = 3, #' number = 7) -#' +#' @keywords interpolate2 +#' @export interpolate2 <- function(palette, color, degree, number){ if (degree < 1 | degree > 7){ diff --git a/R/quickXLSX.R b/R/quickXLSX.R index 19c4860..8da0471 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -1,38 +1,43 @@ #' quickXLSX() #' #' @description Function to export data from R to a formatted .xlsx-spreadsheet. +#' @inheritParams insert_worksheet #' @param data data to be exported. -#' @param title title to be put above the data in the worksheet. #' @param file file name of the xlsx-file. The extension ".xlsx" is added -#' automatically. -#' @template shared_parameters #' @keywords quickXLSX #' @export #' @examples #'quickXLSX(data = mtcars, #' title = "Motor trend car road tests", -#' file = "motor_trend_car_road_tests", -#' source = "Source: Henderson and Velleman (1981). Building multiple -#' regression models interactively. Biometrics, 37, 391–411.", -#' metadata = c("The data was extracted from the 1974 Motor Trend US -#' magazine and comprises fuel consumption and 10 aspects of automobile -#' design and performance for 32 automobiles (1973–74 models)."), -#' contactdetails = "statzh", -#' grouplines = FALSE, -#' logo = "statzh", -#' author = "user") -quickXLSX <- function(data = NA, file, title = "Title", source = "statzh", - metadata = NA, logo = "statzh", grouplines = FALSE, - contactdetails = "statzh", author = "user"){ +#' file = tempfile(fileext = ".xlsx"), +#' source = paste("Source: Henderson and Velleman (1981). Building", +#' "multiple regression models interactively.", +#' "Biometrics, 37, 391–411."), +#' metadata = paste("The data was extracted from the 1974 Motor", +#' "Trend US magazine and comprises fuel consumption", +#' "and 10 aspects of automobile design and", +#' "performance for 32 automobiles (1973–74 models).")) +quickXLSX <- function(data = NA, + file, + title = "Title", + source = "statzh", + metadata = NA, + logo = "statzh", + contactdetails = "statzh", + author = "user", + grouplines = NA, + group_names = NA){ # Create workbook -------- wb <- openxlsx::createWorkbook() # Insert data -------- - insert_worksheet(data, wb, "Inhalt", title = title, source = source, - metadata = metadata, logo = logo, grouplines = grouplines, - contactdetails = contactdetails, author = author) + insert_worksheet(wb, sheetname = "Inhalt", data = data, title = title, + source = source, + metadata = metadata, logo = logo, + contactdetails = contactdetails, author = author, + grouplines = grouplines, group_names = group_names) # Save workbook--------- diff --git a/R/quick_sum.r b/R/quick_sum.r index f90e575..ff6151f 100644 --- a/R/quick_sum.r +++ b/R/quick_sum.r @@ -1,45 +1,31 @@ #' quick_sum() #' #' @description Function for simple (grouped) descriptive analyses. -#' #' @details If stats is set to "all" (the default), the following descriptive #' statistics are computed per category of the grouping variable(s): mean, #' standard deviation, 10\%-quantile, 25\%-quantile, median, 75\%-quantile, #' 90\%-quantile. -#' #' If stats is set to "base", the mean, 25\%-quantile, median, and 75\%-quantile #' are returned. -#' #' stats = "mean" computes the mean and the standard deviation. -#' #' If protect is set to TRUE, the mean and the median is only computed for #' variables/variable categories with four or more observations. For <4 #' observations, the function returns NA for the respective variable/category. #' The other descriptives are only computed if there are at least 6 observations #' per variable (category). -#' #' @param df dataframe -#' #' @param var variables to be aggregated -#' #' @param ... grouping variables -#' #' @param stats Which descriptive statistics should be computed? Can be "all", #' "base", or "mean". See details. -#' #' @param protect Apply data protection, can be TRUE or FALSE. See details. -#' +#' @examples +#' quick_sum(df = mtcars, var = cyl, mpg, vs, stats = "all", protect = FALSE) #' @keywords quick_sum -#' -#' @importFrom dplyr ungroup summarize group_by n #' @importFrom stats median quantile sd -#' @importFrom rlang := -#' +#' @importFrom rlang := .data +#' @importFrom dplyr %>% #' @export -#' -#' @examples -#' quick_sum(df=mtcars, var=cyl, mpg, vs, stats="all", protect=FALSE) -#' quick_sum <- function(df, var, ..., stats = "all", protect = FALSE){ if (!stats %in% c("mean", "base", "all")){ stop("Please choose one of the following stats arguments: all, base, mean") @@ -64,11 +50,11 @@ quick_sum <- function(df, var, ..., stats = "all", protect = FALSE){ df %>% dplyr::group_by(!!!grps) %>% dplyr::summarise( - Anzahl=dplyr::n(), + Anzahl = dplyr::n(), !!mean_name := ifelse(Anzahl <= n1, NA, mean(!!var, na.rm = T)), - !!q25_name := ifelse(Anzahl <=n2, NA, quantile(!!var, probs = 0.25, na.rm = T)), - !!med_name := ifelse(Anzahl<=n1,NA,median(!!var, probs=0.5, na.rm = T)), - !!q75_name := ifelse(Anzahl<=n2,NA,quantile(!!var, probs=0.75, na.rm = T)) + !!q25_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs = 0.25, na.rm = T)), + !!med_name := ifelse(Anzahl <= n1, NA, median(!!var, probs = 0.5, na.rm = T)), + !!q75_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs = 0.75, na.rm = T)) )%>% dplyr::ungroup() @@ -76,26 +62,25 @@ quick_sum <- function(df, var, ..., stats = "all", protect = FALSE){ df %>% dplyr::group_by(!!!grps) %>% dplyr::summarise( - Anzahl=dplyr::n(), - !!mean_name := ifelse(Anzahl<=n1,NA,mean(!!var, na.rm = T)), - !!sd_name := ifelse(Anzahl<=n2,NA,sd(!!var, na.rm = T)), - !!q10_name := ifelse(Anzahl<=n2,NA,quantile(!!var, probs=0.1, na.rm = T)), - !!q25_name := ifelse(Anzahl<=n2,NA,quantile(!!var, probs=0.25, na.rm = T)), - !!med_name := ifelse(Anzahl<=n1,NA,median(!!var, probs=0.5, na.rm = T)), - !!q75_name := ifelse(Anzahl<=n2,NA,quantile(!!var, probs=0.75, na.rm = T)), - !!q90_name := ifelse(Anzahl<=n2,NA,quantile(!!var, probs=0.9, na.rm = T)) - )%>% + Anzahl = dplyr::n(), + !!mean_name := ifelse(Anzahl <=n1, NA, mean(!!var, na.rm = T)), + !!sd_name := ifelse(Anzahl <= n2, NA, sd(!!var, na.rm = T)), + !!q10_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs=0.1, na.rm = T)), + !!q25_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs=0.25, na.rm = T)), + !!med_name := ifelse(Anzahl <= n1, NA, median(!!var, probs=0.5, na.rm = T)), + !!q75_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs=0.75, na.rm = T)), + !!q90_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs=0.9, na.rm = T)) + ) %>% dplyr::ungroup() } else if (stats %in% c("mean")){ df %>% dplyr::group_by(!!!grps) %>% dplyr::summarise( - Anzahl=dplyr::n(), - !!mean_name := ifelse(Anzahl<=n1,NA,mean(!!var, na.rm = T)), - !!sd_name := ifelse(Anzahl<=n2,NA,sd(!!var, na.rm = T)) - )%>% + Anzahl = dplyr::n(), + !!mean_name := ifelse(Anzahl <= n1, NA, mean(!!var, na.rm = T)), + !!sd_name := ifelse(Anzahl <= n2, NA, sd(!!var, na.rm = T)) + ) %>% dplyr::ungroup() - } } diff --git a/R/splitXLSX.R b/R/splitXLSX.R index 89ab580..8f14cc7 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -2,38 +2,39 @@ #' #' @description Function to export data from R as formatted .xlsx-file and spread #' them over several worksheets based on a grouping variable (e.g., year). -#' @note May be deprecated in upcoming version. User should make sure that the -#' grouping variable is of binary, categorical or other types with a limited -#' number of levels. -#' @param data data to be exported. +#' @note User should make sure that the grouping variable is of binary, +#' categorical or other types with a limited number of levels. +#' @inheritParams insert_worksheet #' @param file file name of the output .xlsx-file. The extension is added #' automatically. #' @param sheetvar name of the variable used to split the data and spread them #' over several sheets. -#' @param title title to be put above the data in the worksheet. the sheetvar -#' subcategory is added in brackets. -#' @template shared_parameters -#' @keywords splitXLSX -#' @export #' @examples #'splitXLSX(data = mtcars, #' title = "Motor trend car road tests", -#' file = "motor_trend_car_road_tests", +#' file = tempfile(fileext = ".xlsx"), #' sheetvar = cyl, -#' source = "Source: Henderson and Velleman (1981), -#' Building multiple regression models interactively. -#' Biometrics, 37, 391–411.", -#' metadata = c("The data was extracted from the 1974 -#' Motor Trend US magazine and comprises fuel consumption and -#' 10 aspects of automobile design and performance for -#' 32 automobiles (1973–74 models)."), -#' contactdetails = "statzh", -#' grouplines = FALSE, -#' logo = "statzh", -#' author = "user") -splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", - metadata = NA, logo = "statzh", grouplines = FALSE, - contactdetails = "statzh", author = "user"){ +#' source = paste("Source: Henderson and Velleman (1981),", +#' "Building multiple regression models interactively.", +#' "Biometrics, 37, 391–411."), +#' metadata = paste("The data was extracted from the 1974 Motor Trend", +#' "US magazine and comprises fuel consumption and", +#' "10 aspects of automobile design and performance", +#' "for 32 automobiles (1973–74 models).")) +#' @keywords splitXLSX +#' @export +splitXLSX <- function(data, + file, + sheetvar, + title = "Titel", + source = "statzh", + metadata = NA, + logo = "statzh", + contactdetails = "statzh", + homepage = "statzh", + author = "user", + grouplines = NA, + group_names = NA){ # create workbook ------ wb <- openxlsx::createWorkbook() @@ -50,8 +51,12 @@ splitXLSX <- function(data, file, sheetvar, title = "Titel", source = "statzh", dplyr::filter((!!col_name) == sheetvalue) sheetname <- paste(deparse(substitute(sheetvar)), sheetvalue, sep = "_") - insert_worksheet(data_subset, wb, verifyInputSheetname(sheetname), sheettitle, - source, metadata, logo, grouplines, contactdetails, author = author) + insert_worksheet(wb, sheetname = sheetname, + data = data_subset, title = sheettitle, source = source, + metadata = metadata, logo = logo, + contactdetails = contactdetails, homepage = homepage, + author = author, grouplines = grouplines, + group_names = group_names) } # Reverse order diff --git a/man/aXLSX.Rd b/man/aXLSX.Rd index 4d2490b..7ba5eba 100644 --- a/man/aXLSX.Rd +++ b/man/aXLSX.Rd @@ -11,29 +11,37 @@ aXLSX( source = "statzh", metadata = NA, logo = "statzh", - grouplines = NA, contactdetails = "statzh", - author = "user" + author = "user", + grouplines = NA, + group_names = NA ) } \arguments{ -\item{data}{data to be exported.} +\item{data}{data to be included.} -\item{file}{file name of the xlsx-file. The extension ".xlsx" is added automatically.} +\item{file}{Path of output xlsx-file.} -\item{title}{title to be put above the data in the worksheet.} +\item{title}{title to be put above the data.} \item{source}{source of the data. Defaults to "statzh".} -\item{metadata}{metadata-information to be included. Defaults to NA.} +\item{metadata}{metadata information to be included. Defaults to NA.} + +\item{logo}{path of the file to be included as logo (png / jpeg / svg). +Defaults to "statzh"} -\item{logo}{path of the file to be included as logo (png / jpeg / svg). Defaults to "statzh"} +\item{contactdetails}{contact details of the data publisher. Defaults to +"statzh".} -\item{grouplines}{columns to be separated visually by vertical lines.} +\item{author}{defaults to the last two letters (initials) or numbers of the +internal user name.} -\item{contactdetails}{contactdetails of the data publisher. Defaults to "statzh".} +\item{grouplines}{defaults to NA. Can be used to separate grouped +variables visually.} -\item{author}{defaults to last two letters (initials) or numbers of the user name.} +\item{group_names}{Names for groupings in secondary header. Format: +List e.g list(c("title 1", "title 2", "title 3"))} } \description{ Function to export data from R to a formatted .xlsx-file. The @@ -41,27 +49,16 @@ Function to export data from R to a formatted .xlsx-file. The the second sheet. } \examples{ -dataset <- mtcars -source_string <- paste("Source: Henderson and Velleman (1981).", - "Building multiple regression models interactively.", - "Biometrics, 37, 391–411.") - -metadata_string <- paste("The data was extracted from the 1974", - "Motor Trend US magazine and comprises fuel consumption and", - "10 aspects of automobile design and performance for 32 automobiles", - "(1973–74 models).") -\donttest{ -\dontrun{ aXLSX(data = mtcars, title = "Motor trend car road tests", - file = "motor_trend_car_road_tests", - source = source_string, - metadata = metadata_string, - contactdetails = "statzh", - grouplines = NA, - logo = "statzh", - author = "user") -} -} + file = tempfile(fileext = ".xlsx"), + source = paste("Source: Henderson and Velleman (1981). Building", + "multiple regression models interactively.", + "Biometrics, 37, 391–411."), + metadata = paste("The data was extracted from the 1974", + "Motor Trend US magazine and comprises fuel", + "consumption and 10 aspects of automobile design", + "and performance for 32 automobiles", + "(1973–74 models).")) } \keyword{aXLSX} diff --git a/man/datasetsXLSX.Rd b/man/datasetsXLSX.Rd index 8011bab..62ad9fd 100644 --- a/man/datasetsXLSX.Rd +++ b/man/datasetsXLSX.Rd @@ -19,10 +19,10 @@ datasetsXLSX( titlesource = "statzh", logo = "statzh", auftrag_id = NULL, - contact = "statzh", + contactdetails = "statzh", homepage = "statzh", openinghours = "statzh", - overwrite = F + overwrite = FALSE ) } \arguments{ @@ -57,7 +57,7 @@ list(c("title 1", "title 2", "title 3"))} \item{auftrag_id}{order number.} -\item{contact}{contact information on the title sheet. Defaults to "statzh"} +\item{contactdetails}{contact information on the title sheet. Defaults to "statzh"} \item{homepage}{web address to be put on the title sheet. Default to "statzh"} @@ -86,60 +86,28 @@ For some attributes like plot_widths and plot_heights, if a single value case for grouplines and group_names. These must be specified for each dataset. } \examples{ -\donttest{ -\dontrun{ -# Example with two datasets and no figure -dat1 <- mtcars -dat2 <- PlantGrowth - -datasetsXLSX(file="twoDatasets", - datasets = list(dat1, dat2), - titles = c("mtcars-Datensatz","PlantGrowth-Datensatz"), - grouplines = list(c(1)), - # adds a second header in the first sheet - group_names = list(c("name_of_second_header")), - sources = c("Source: Henderson and Velleman (1981). - Building multiple regression models interactively. Biometrics, 37, 391–411.", - "Dobson, A. J. (1983) An Introduction to Statistical - Modelling. London: Chapman and Hall."), - metadata = c("Bemerkungen zum mtcars-Datensatz: x", - "Bemerkungen zum PlantGrowth-Datensatz: x"), - sheetnames = c("Autos","Blumen"), - maintitle = "Autos und Pflanzen", - titlesource = "statzh", - logo = "statzh", - auftrag_id="A2021_0000", - contact = "statzh", - homepage = "statzh", - openinghours = "statzh", - overwrite = T) - # Example with two datasets and one figure - -dat1 <- mtcars -dat2 <- PlantGrowth -fig <- ggplot(mtcars, aes(x=disp))+ - geom_histogram() - -datasetsXLSX(file="twoDatasetsandFigure", - datasets = list(dat1, dat2, fig), - titles = c("mtcars-Datensatz","PlantGrowth-Datensatz", "Histogramm"), +fig <- ggplot2::ggplot(mtcars, ggplot2::aes(x = disp))+ + ggplot2::geom_histogram() + +datasetsXLSX(file = tempfile(fileext = ".xlsx"), + datasets = list(mtcars, PlantGrowth, fig), + titles = c("mtcars-Datensatz", + "PlantGrowth-Datensatz", + "Histogramm"), plot_widths = c(5), plot_heights = c(5), - sources = c("Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.", - "Source: Dobson, A. J. (1983) An Introduction to Statistical Modelling. London: Chapman and Hall."), + sources = c(paste("Source: Henderson and Velleman (1981).", + "Building multiple regression models", + "interactively. Biometrics, 37, 391–411."), + paste("Source: Dobson, A. J. (1983) An Introduction", + "to Statistical Modelling.", + "London: Chapman and Hall.")), metadata = c("Bemerkungen zum mtcars-Datensatz: x", "Bemerkungen zum PlantGrowth-Datensatz: x"), sheetnames = c("Autos","Blumen", "Histogramm"), maintitle = "Autos und Pflanzen", - titlesource = "statzh", - logo="statzh", - auftrag_id="A2021_0000", - contact = "statzh", - homepage = "statzh", - openinghours = "statzh", - overwrite = T) -} -} + auftrag_id = "A2021_0000", + overwrite = TRUE) } \keyword{datasetsXLSX} diff --git a/man/display.statcol.all.Rd b/man/display.statcol.all.Rd index 611e86f..ba4721c 100644 --- a/man/display.statcol.all.Rd +++ b/man/display.statcol.all.Rd @@ -11,6 +11,5 @@ Preview all Stat ZH palettes stored in the 'zhpal'-object } \examples{ display.statcol.all() - } \keyword{display.statcol.all} diff --git a/man/excelIndexToRowCol.Rd b/man/excelIndexToRowCol.Rd new file mode 100644 index 0000000..6ba992c --- /dev/null +++ b/man/excelIndexToRowCol.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helper.R +\name{excelIndexToRowCol} +\alias{excelIndexToRowCol} +\title{excelIndexToRowCol()} +\usage{ +excelIndexToRowCol(index) +} +\arguments{ +\item{index}{A Microsoft Excel style index (see details)} +} +\value{ +A list containing row indices and column indices +} +\description{ +Converts an Excel style index (e.g. A1) into numeric row and + column indices. Handles cells (A1) as well as matrices (A1:B2) +} +\keyword{internal} diff --git a/man/flush_left.Rd b/man/flush_left.Rd index 3f78010..9a6a518 100644 --- a/man/flush_left.Rd +++ b/man/flush_left.Rd @@ -10,16 +10,15 @@ flush_left(g) \item{g}{ggplot object} } \description{ -Function to flush title, subtitle and caption to the lefthand side of the -graphics device +Function to flush title, subtitle and caption to the + lefthand side of the ggplot2 graphics device } \examples{ plt <- ggplot2::ggplot(mtcars, ggplot2::aes(x = cyl)) + ggplot2::geom_bar() + ggplot2::labs(title = "Cylinders", subtitle = "Bar chart", - caption = "mtcars") + caption = "mtcars") flush_left(plt) } -\keyword{flush_left,} -\keyword{ggplot} +\keyword{flush_left} diff --git a/man/get_groupline_index_by_pattern.Rd b/man/get_groupline_index_by_pattern.Rd index 3e98455..399684e 100644 --- a/man/get_groupline_index_by_pattern.Rd +++ b/man/get_groupline_index_by_pattern.Rd @@ -7,9 +7,10 @@ get_groupline_index_by_pattern(grouplines, data) } \arguments{ -\item{grouplines}{column names at which to insert group line} +\item{grouplines}{defaults to NA. Can be used to separate grouped +variables visually.} -\item{data}{a data.frame} +\item{data}{data to be included.} } \description{ Derive groupline index by matching names diff --git a/man/insert_hyperlink.Rd b/man/insert_hyperlink.Rd index c4f7299..b4978c5 100644 --- a/man/insert_hyperlink.Rd +++ b/man/insert_hyperlink.Rd @@ -7,13 +7,13 @@ insert_hyperlink(wb, sheetname, title, sheet_row, index_sheet_name) } \arguments{ -\item{wb}{Workbook object} +\item{wb}{workbook object to add new worksheet to.} -\item{sheetname}{Name of sheet} +\item{sheetname}{name of the sheet tab.} -\item{title}{Title} +\item{title}{title to be put above the data.} -\item{sheet_row}{Sheet row} +\item{sheet_row}{Row where hyperlink should be inserted} \item{index_sheet_name}{Name of sheet where hyperlink should be created} } diff --git a/man/insert_hyperlinks.Rd b/man/insert_hyperlinks.Rd index fd0ad36..bea7362 100644 --- a/man/insert_hyperlinks.Rd +++ b/man/insert_hyperlinks.Rd @@ -13,15 +13,15 @@ insert_hyperlinks( ) } \arguments{ -\item{wb}{Workbook object} +\item{wb}{workbook object to add new worksheet to.} \item{sheetnames}{Names of sheets to create hyperlinks to} \item{titles}{Titles of Hyperlinks} -\item{index_sheet_name}{Name of sheet where hyperlinks should be created} +\item{index_sheet_name}{Name of sheet where hyperlink should be created} -\item{sheet_start_row}{Sheet row} +\item{sheet_start_row}{Initial row after which hyperlinks should be created} } \description{ Function for inserting hyperlinks within an openxlsx Workbook diff --git a/man/insert_index_sheet.Rd b/man/insert_index_sheet.Rd index 71ea74d..ad0b877 100644 --- a/man/insert_index_sheet.Rd +++ b/man/insert_index_sheet.Rd @@ -6,43 +6,48 @@ \usage{ insert_index_sheet( wb, + sheetname = "Index", + title, + auftrag_id, logo = "statzh", - contact = "statzh", + contactdetails = "statzh", homepage = "statzh", openinghours = "statzh", - titlesource, - auftrag_id, - maintitle, - sheetname = "Index", + source = "statzh", date_prefix = "Erstellt am: ", order_id_prefix = "Auftragsnr.:", toc_caption = "Inhalt" ) } \arguments{ -\item{wb}{A workbook object as generated by openxlsx::createWorkbook()} +\item{wb}{workbook object to add new worksheet to.} -\item{logo}{Either statzh or zh, or path to logo file} +\item{sheetname}{name of the sheet tab.} -\item{contact}{Either "statzh" or a character string} +\item{title}{title to be put above the data.} -\item{homepage}{statzh or a character string with the URL} +\item{auftrag_id}{Order ID} -\item{openinghours}{statzh or a character string or vector with opening hours} +\item{logo}{path of the file to be included as logo (png / jpeg / svg). +Defaults to "statzh"} -\item{titlesource}{Character vector denoting the data source} +\item{contactdetails}{contact details of the data publisher. Defaults to +"statzh".} -\item{auftrag_id}{Order ID} +\item{homepage}{Homepage of data publisher. Defaults to "statzh".} + +\item{openinghours}{statzh or a character string or vector with opening hours} -\item{maintitle}{Title shown on index sheet} +\item{source}{source of the data. Defaults to "statzh".} -\item{sheetname}{Name of Index Sheet} +\item{date_prefix}{Text shown before date} -\item{date_prefix}{Text prepended to date} +\item{order_id_prefix}{Text inserted before order ID} -\item{order_id_prefix}{Text prepended to order ID} +\item{toc_caption}{Text for table of content} } \description{ -Function which generates an index sheet inside an openxlsx workbook. +Function which generates an index sheet inside an openxlsx + workbook. } -\keyword{datasetsXLSX} +\keyword{insert_index_sheet} diff --git a/man/insert_metadata_sheet.Rd b/man/insert_metadata_sheet.Rd index 52eb929..485782c 100644 --- a/man/insert_metadata_sheet.Rd +++ b/man/insert_metadata_sheet.Rd @@ -30,11 +30,14 @@ insert_metadata_sheet( \item{metadata}{metadata information to be included. Defaults to NA.} -\item{logo}{path of the file to be included as logo (png / jpeg / svg). Defaults to "statzh"} +\item{logo}{path of the file to be included as logo (png / jpeg / svg). +Defaults to "statzh"} -\item{contactdetails}{contact details of the data publisher. Defaults to "statzh".} +\item{contactdetails}{contact details of the data publisher. Defaults to +"statzh".} -\item{author}{defaults to the last two letters (initials) or numbers of the internal user name.} +\item{author}{defaults to the last two letters (initials) or numbers of the +internal user name.} \item{date_prefix}{Text shown before date} @@ -45,16 +48,19 @@ insert_metadata_sheet( \item{metadata_prefix}{Text shown before metadata} } \description{ -Function to add formatted metadata information to an existing .xlsx-workbook. +Function to add a formatted worksheet with metadata to an + existing Workbook object. } \examples{ -# Generation of a spreadsheet +# Create Workbook wb <- openxlsx::createWorkbook() + +# Insert a simple metadata sheet insert_metadata_sheet(wb, title = "Title of mtcars", metadata = c("Meta data information.")) -\dontrun{ -openxlsx::saveWorkbook(wb,"insert_metadata_sheet.xlsx") + } +\seealso{ +createWorkbook, addWorksheet, writeData } -\keyword{insert_metadata_sheet,} -\keyword{openxlsx} +\keyword{insert_metadata_sheet} diff --git a/man/insert_second_header.Rd b/man/insert_second_header.Rd index ef4791a..0a6b8df 100644 --- a/man/insert_second_header.Rd +++ b/man/insert_second_header.Rd @@ -14,30 +14,21 @@ insert_second_header( ) } \arguments{ -\item{wb}{Workbook} +\item{wb}{workbook object to add new worksheet to.} -\item{sheetname}{Sheet name} +\item{sheetname}{name of the sheet tab.} \item{data_start_row}{Row index for first row with data} -\item{group_names}{Group names} +\item{group_names}{Names for groupings in secondary header. Format: +List e.g list(c("title 1", "title 2", "title 3"))} -\item{grouplines}{Group lines} +\item{grouplines}{defaults to NA. Can be used to separate grouped +variables visually.} -\item{data}{Data} +\item{data}{data to be included.} } \description{ Function to add a second header row } -\examples{ -\donttest{ -\dontrun{ -# Beispiel anhand des Datensatzes 'mtcars' -dat <- mtcars - -insert_second_header(wb, sheetname, data_start_row, group_names, - grouplines, data) -} -} -} \keyword{internal} diff --git a/man/insert_worksheet.Rd b/man/insert_worksheet.Rd index 101868b..829bf1c 100644 --- a/man/insert_worksheet.Rd +++ b/man/insert_worksheet.Rd @@ -5,29 +5,29 @@ \title{insert_worksheet()} \usage{ insert_worksheet( - data, wb, - sheetname = "data", + sheetname = "Daten", + data, title = "Title", source = "statzh", metadata = NA, logo = "statzh", - grouplines = NA, contactdetails = "statzh", homepage = "statzh", author = "user", + grouplines = NA, group_names = NA, date_prefix = "Aktualisiert am: ", author_prefix = "durch: " ) } \arguments{ -\item{data}{data to be included.} - \item{wb}{workbook object to add new worksheet to.} \item{sheetname}{name of the sheet tab.} +\item{data}{data to be included.} + \item{title}{title to be put above the data.} \item{source}{source of the data. Defaults to "statzh".} @@ -37,9 +37,6 @@ insert_worksheet( \item{logo}{path of the file to be included as logo (png / jpeg / svg). Defaults to "statzh"} -\item{grouplines}{defaults to NA. Can be used to separate grouped -variables visually.} - \item{contactdetails}{contact details of the data publisher. Defaults to "statzh".} @@ -48,7 +45,11 @@ variables visually.} \item{author}{defaults to the last two letters (initials) or numbers of the internal user name.} -\item{group_names}{Names for groupings in secondary header} +\item{grouplines}{defaults to NA. Can be used to separate grouped +variables visually.} + +\item{group_names}{Names for groupings in secondary header. Format: +List e.g list(c("title 1", "title 2", "title 3"))} \item{date_prefix}{Text shown before date} @@ -63,12 +64,13 @@ The function does not write the result into a .xlsx file. A separate call to openxlsx::saveWorkbook() is required. } \examples{ -# Initialize an empty Workbook +# Initialize Workbook wb <- openxlsx::createWorkbook() -insert_worksheet(data = head(mtcars), +# Insert mtcars dataset with STATZH design +insert_worksheet(data = mtcars, wb = wb, - title = "mtcars", + title = "mtcars dataset", sheetname = "carb") } diff --git a/man/insert_worksheet_image.Rd b/man/insert_worksheet_image.Rd index 51887d9..1107480 100644 --- a/man/insert_worksheet_image.Rd +++ b/man/insert_worksheet_image.Rd @@ -5,22 +5,24 @@ \title{insert_worksheet_image()} \usage{ insert_worksheet_image( - image, wb, sheetname, + image, startrow = 3, startcol = 3, width, - height + height, + units = "in", + dpi = 300 ) } \arguments{ -\item{image}{image or plot} - \item{wb}{workbook object to write new worksheet in} \item{sheetname}{name of the sheet tab} +\item{image}{image or plot} + \item{startrow}{row coordinate of upper left corner of figure} \item{startcol}{column coordinate of upper left corner of figure} @@ -28,47 +30,26 @@ insert_worksheet_image( \item{width}{width of figure} \item{height}{height of figure} + +\item{units}{unit of measurement (default: in)} + +\item{dpi}{image resolution (default: 300)} } \description{ Insert an image into a worksheet } \note{ -The function does not write the result into a .xlsx file. A separate call -to openxlsx::saveWorkbook() is required. A temporary file is created when -image refers to a gg, ggplot or histogram object. This file is deleted -afterwards. +The function does not write the result into a .xlsx file. A separate + call to openxlsx::saveWorkbook() is required. A temporary file is created + for inputs of type gg, ggplot or histogram object at path given by + `tempfile()`. } \examples{ -library(ggplot2) -wb <- openxlsx::createWorkbook() - -# Add a geom_histogram() -#-------------- -figure1 <- ggplot(mtcars, aes(x = disp)) + - geom_histogram() - -insert_worksheet_image(image = figure1, wb, sheetname = "ggplot image", - width = 3.5, height = 5.5) - -# Add a base histogram -#-------------- -base_hist <- hist(mtcars$disp) - -insert_worksheet_image(image = base_hist, wb, sheetname = "Base histogram", - width = 3.5, height = 5.5) - -# Insert an existing image file -#-------------- -image_path <- paste0(path.package("statR"), "/extdata/Stempel_Kanton_ZH.png") - -insert_worksheet_image(image = image_path, wb, sheetname = "Existing image", - width = 3.5, height = 5.5) - -# Export workbook -#-------------- -\dontrun{ -openxlsx::saveWorkbook(wb,"insert_worksheet_image.xlsx") -} +figure <- ggplot2::ggplot(mtcars, ggplot2::aes(x = disp)) + + ggplot2::geom_histogram() +wb <- openxlsx::createWorkbook() +insert_worksheet_image(wb, sheetname = "ggplot image", + image = figure, width = 3.5, height = 5.5) } \keyword{insert_worksheet_image} diff --git a/man/insert_worksheet_nh.Rd b/man/insert_worksheet_nh.Rd index 55007bc..6f90b66 100644 --- a/man/insert_worksheet_nh.Rd +++ b/man/insert_worksheet_nh.Rd @@ -5,9 +5,9 @@ \title{insert_worksheet_nh} \usage{ insert_worksheet_nh( - data, wb, sheetname = "Daten", + data, title = "Title", source = "statzh", metadata = NA, @@ -16,22 +16,23 @@ insert_worksheet_nh( ) } \arguments{ -\item{data}{data to be included in the XLSX-table.} +\item{wb}{workbook object to add new worksheet to.} -\item{wb}{workbook object to write new worksheet in.} +\item{sheetname}{name of the sheet tab.} -\item{sheetname}{name of the sheet-tab.} +\item{data}{data to be included.} -\item{title}{title of the table and the sheet} +\item{title}{title to be put above the data.} \item{source}{source of the data. Defaults to "statzh".} -\item{metadata}{metadata-information to be included. Defaults to NA.} +\item{metadata}{metadata information to be included. Defaults to NA.} -\item{grouplines}{defaults to NA. Can be used to separate grouped variables visually.} +\item{grouplines}{defaults to NA. Can be used to separate grouped +variables visually.} -\item{group_names}{Name(s) of the second header(s). -Format: List e.g list(c("title 1", "title 2", "title 3"))} +\item{group_names}{Names for groupings in secondary header. Format: +List e.g list(c("title 1", "title 2", "title 3"))} } \description{ Function to add formatted worksheets to an existing Workbook. @@ -43,25 +44,20 @@ The function does not write the result into a .xlsx file. A separate } \examples{ ## Create workbook -export <- openxlsx::createWorkbook() +wb <- openxlsx::createWorkbook() ## insert a new worksheet -insert_worksheet_nh(head(mtcars), export, "data1", +insert_worksheet_nh(wb, sheetname = "data1", data = head(mtcars), title = "Title", source = "statzh", metadata = "Note: ...") ## insert a further worksheet -insert_worksheet_nh(tail(mtcars), export, "data2", +insert_worksheet_nh(wb, sheetname = "data2", data = tail(mtcars), title = "Title", source = "statzh", metadata = "Note: ...") ## insert a worksheet with group lines and second header -insert_worksheet_nh(data = head(mtcars), wb = export, - title = "grouplines", source = "statzh", metadata = "Note: ...", - grouplines = c(1,5,6), group_names = "carb") - -\dontrun{ -## save workbook - openxlsx::saveWorkbook(export,"example.xlsx") -} +insert_worksheet_nh(wb, sheetname = "data3", data = head(mtcars), + title = "grouplines", source = "statzh", + metadata = "Note: ...", + grouplines = c(1,5,6), group_names = "carb") } -\keyword{insert_worksheet,} -\keyword{openxlsx} +\keyword{insert_worksheet_nh} diff --git a/man/interpolate2.Rd b/man/interpolate2.Rd index a896462..09004f6 100644 --- a/man/interpolate2.Rd +++ b/man/interpolate2.Rd @@ -22,6 +22,5 @@ Function to generate new color palettes by interpolation. #interpolate the 'zhblue'-palette with black and generate 7 new ones interpolate2(palette = zhpal$zhblue, color = c("#000000"), degree = 3, number = 7) - } \keyword{interpolate2} diff --git a/man/namedRegionColumnExtent.Rd b/man/namedRegionColumnExtent.Rd new file mode 100644 index 0000000..cfc0755 --- /dev/null +++ b/man/namedRegionColumnExtent.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helper.R +\name{namedRegionColumnExtent} +\alias{namedRegionColumnExtent} +\title{namedRegionColumnExtent()} +\usage{ +namedRegionColumnExtent(wb, sheetname, name = NULL) +} +\arguments{ +\item{wb}{A workbook object} +} +\value{ +A numeric vector of column indices +} +\description{ +Get column extent of a named region in a Workbook object +} +\keyword{internal} diff --git a/man/namedRegionExtent.Rd b/man/namedRegionExtent.Rd new file mode 100644 index 0000000..38eb037 --- /dev/null +++ b/man/namedRegionExtent.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helper.R +\name{namedRegionExtent} +\alias{namedRegionExtent} +\title{namedRegionExtent()} +\usage{ +namedRegionExtent(wb, sheetname, region_name = NULL, which = "both") +} +\arguments{ +\item{wb}{A workbook object} + +\item{region_name}{names of regions in Workbook.} + +\item{which}{either "row", "col", or "both" (default).} + +\item{sheet}{Name of a worksheet} +} +\value{ +A list with two numeric vectors row and col, containing + row and column indices. +} +\description{ +Get extent of a named region in a workbook object +} +\details{ +If a single name is provided, returns the extent of the associated + named region. If a character vector is provided, the combined extent is + returned instead. If left at default (NULL), the combined extent of all + regions is returned. +} +\keyword{internal} diff --git a/man/namedRegionFirstCol.Rd b/man/namedRegionFirstCol.Rd new file mode 100644 index 0000000..5325f87 --- /dev/null +++ b/man/namedRegionFirstCol.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helper.R +\name{namedRegionFirstCol} +\alias{namedRegionFirstCol} +\title{namedRegionFirstCol()} +\usage{ +namedRegionFirstCol(wb, sheet, region_name = NULL) +} +\arguments{ +\item{wb}{A workbook object} + +\item{sheet}{Name of a worksheet} + +\item{region_name}{names of regions in Workbook.} +} +\value{ +Numeric value corresponding to first column of named region +} +\description{ +Get first col number of named region +} +\keyword{internal} diff --git a/man/namedRegionFirstRow.Rd b/man/namedRegionFirstRow.Rd new file mode 100644 index 0000000..ada0238 --- /dev/null +++ b/man/namedRegionFirstRow.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helper.R +\name{namedRegionFirstRow} +\alias{namedRegionFirstRow} +\title{namedRegionFirstRow()} +\usage{ +namedRegionFirstRow(wb, sheet, region_name = NULL) +} +\arguments{ +\item{wb}{A workbook object} + +\item{sheet}{Name of a worksheet} + +\item{region_name}{names of regions in Workbook.} +} +\value{ +Numeric value corresponding to first row of named region +} +\description{ +Get first row number of named region +} +\keyword{internal} diff --git a/man/namedRegionLastCol.Rd b/man/namedRegionLastCol.Rd new file mode 100644 index 0000000..aabe81d --- /dev/null +++ b/man/namedRegionLastCol.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helper.R +\name{namedRegionLastCol} +\alias{namedRegionLastCol} +\title{namedRegionLastCol()} +\usage{ +namedRegionLastCol(wb, sheet, region_name = NULL) +} +\arguments{ +\item{wb}{A workbook object} + +\item{sheet}{Name of a worksheet} + +\item{region_name}{names of regions in Workbook.} +} +\value{ +Numeric value corresponding to last column of named region +} +\description{ +Get last col number of named region +} +\keyword{internal} diff --git a/man/namedRegionLastRow.Rd b/man/namedRegionLastRow.Rd new file mode 100644 index 0000000..2a79668 --- /dev/null +++ b/man/namedRegionLastRow.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helper.R +\name{namedRegionLastRow} +\alias{namedRegionLastRow} +\title{namedRegionLastRow()} +\usage{ +namedRegionLastRow(wb, sheet, region_name = NULL) +} +\arguments{ +\item{wb}{A workbook object} + +\item{sheet}{Name of a worksheet} + +\item{region_name}{names of regions in Workbook.} +} +\value{ +Numeric value corresponding to last row of named region +} +\description{ +Get last row number of named region +} +\keyword{internal} diff --git a/man/namedRegionRowExtent.Rd b/man/namedRegionRowExtent.Rd new file mode 100644 index 0000000..10c85ac --- /dev/null +++ b/man/namedRegionRowExtent.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helper.R +\name{namedRegionRowExtent} +\alias{namedRegionRowExtent} +\title{namedRegionRowExtent()} +\usage{ +namedRegionRowExtent(wb, sheetname, region_name = NULL) +} +\arguments{ +\item{wb}{A workbook object} + +\item{region_name}{names of regions in Workbook.} +} +\value{ +A numeric vector of row indices +} +\description{ +Get row extent of a named region in a workbook object +} +\keyword{internal} diff --git a/man/quickXLSX.Rd b/man/quickXLSX.Rd index 46ac018..270d350 100644 --- a/man/quickXLSX.Rd +++ b/man/quickXLSX.Rd @@ -11,30 +11,37 @@ quickXLSX( source = "statzh", metadata = NA, logo = "statzh", - grouplines = FALSE, contactdetails = "statzh", - author = "user" + author = "user", + grouplines = NA, + group_names = NA ) } \arguments{ \item{data}{data to be exported.} -\item{file}{file name of the xlsx-file. The extension ".xlsx" is added -automatically.} +\item{file}{file name of the xlsx-file. The extension ".xlsx" is added} -\item{title}{title to be put above the data in the worksheet.} +\item{title}{title to be put above the data.} \item{source}{source of the data. Defaults to "statzh".} -\item{metadata}{metadata-information to be included. Defaults to NA.} +\item{metadata}{metadata information to be included. Defaults to NA.} -\item{logo}{path of the file to be included as logo (png / jpeg / svg). Defaults to "statzh"} +\item{logo}{path of the file to be included as logo (png / jpeg / svg). +Defaults to "statzh"} -\item{grouplines}{columns to be separated visually by vertical lines.} +\item{contactdetails}{contact details of the data publisher. Defaults to +"statzh".} -\item{contactdetails}{contactdetails of the data publisher. Defaults to "statzh".} +\item{author}{defaults to the last two letters (initials) or numbers of the +internal user name.} -\item{author}{defaults to last two letters (initials) or numbers of the user name.} +\item{grouplines}{defaults to NA. Can be used to separate grouped +variables visually.} + +\item{group_names}{Names for groupings in secondary header. Format: +List e.g list(c("title 1", "title 2", "title 3"))} } \description{ Function to export data from R to a formatted .xlsx-spreadsheet. @@ -42,15 +49,13 @@ Function to export data from R to a formatted .xlsx-spreadsheet. \examples{ quickXLSX(data = mtcars, title = "Motor trend car road tests", - file = "motor_trend_car_road_tests", - source = "Source: Henderson and Velleman (1981). Building multiple - regression models interactively. Biometrics, 37, 391–411.", - metadata = c("The data was extracted from the 1974 Motor Trend US - magazine and comprises fuel consumption and 10 aspects of automobile - design and performance for 32 automobiles (1973–74 models)."), - contactdetails = "statzh", - grouplines = FALSE, - logo = "statzh", - author = "user") + file = tempfile(fileext = ".xlsx"), + source = paste("Source: Henderson and Velleman (1981). Building", + "multiple regression models interactively.", + "Biometrics, 37, 391–411."), + metadata = paste("The data was extracted from the 1974 Motor", + "Trend US magazine and comprises fuel consumption", + "and 10 aspects of automobile design and", + "performance for 32 automobiles (1973–74 models).")) } \keyword{quickXLSX} diff --git a/man/quick_sum.Rd b/man/quick_sum.Rd index 547207c..e424fe5 100644 --- a/man/quick_sum.Rd +++ b/man/quick_sum.Rd @@ -26,12 +26,9 @@ If stats is set to "all" (the default), the following descriptive statistics are computed per category of the grouping variable(s): mean, standard deviation, 10\%-quantile, 25\%-quantile, median, 75\%-quantile, 90\%-quantile. - If stats is set to "base", the mean, 25\%-quantile, median, and 75\%-quantile are returned. - stats = "mean" computes the mean and the standard deviation. - If protect is set to TRUE, the mean and the median is only computed for variables/variable categories with four or more observations. For <4 observations, the function returns NA for the respective variable/category. @@ -39,7 +36,6 @@ If stats is set to "all" (the default), the following descriptive per variable (category). } \examples{ -quick_sum(df=mtcars, var=cyl, mpg, vs, stats="all", protect=FALSE) - +quick_sum(df = mtcars, var = cyl, mpg, vs, stats = "all", protect = FALSE) } \keyword{quick_sum} diff --git a/man/splitXLSX.Rd b/man/splitXLSX.Rd index ebedf7f..cf39213 100644 --- a/man/splitXLSX.Rd +++ b/man/splitXLSX.Rd @@ -12,13 +12,15 @@ splitXLSX( source = "statzh", metadata = NA, logo = "statzh", - grouplines = FALSE, contactdetails = "statzh", - author = "user" + homepage = "statzh", + author = "user", + grouplines = NA, + group_names = NA ) } \arguments{ -\item{data}{data to be exported.} +\item{data}{data to be included.} \item{file}{file name of the output .xlsx-file. The extension is added automatically.} @@ -26,45 +28,48 @@ automatically.} \item{sheetvar}{name of the variable used to split the data and spread them over several sheets.} -\item{title}{title to be put above the data in the worksheet. the sheetvar -subcategory is added in brackets.} +\item{title}{title to be put above the data.} \item{source}{source of the data. Defaults to "statzh".} -\item{metadata}{metadata-information to be included. Defaults to NA.} +\item{metadata}{metadata information to be included. Defaults to NA.} -\item{logo}{path of the file to be included as logo (png / jpeg / svg). Defaults to "statzh"} +\item{logo}{path of the file to be included as logo (png / jpeg / svg). +Defaults to "statzh"} -\item{grouplines}{columns to be separated visually by vertical lines.} +\item{contactdetails}{contact details of the data publisher. Defaults to +"statzh".} -\item{contactdetails}{contactdetails of the data publisher. Defaults to "statzh".} +\item{homepage}{Homepage of data publisher. Defaults to "statzh".} -\item{author}{defaults to last two letters (initials) or numbers of the user name.} +\item{author}{defaults to the last two letters (initials) or numbers of the +internal user name.} + +\item{grouplines}{defaults to NA. Can be used to separate grouped +variables visually.} + +\item{group_names}{Names for groupings in secondary header. Format: +List e.g list(c("title 1", "title 2", "title 3"))} } \description{ Function to export data from R as formatted .xlsx-file and spread them over several worksheets based on a grouping variable (e.g., year). } \note{ -May be deprecated in upcoming version. User should make sure that the - grouping variable is of binary, categorical or other types with a limited - number of levels. +User should make sure that the grouping variable is of binary, + categorical or other types with a limited number of levels. } \examples{ splitXLSX(data = mtcars, title = "Motor trend car road tests", - file = "motor_trend_car_road_tests", + file = tempfile(fileext = ".xlsx"), sheetvar = cyl, - source = "Source: Henderson and Velleman (1981), - Building multiple regression models interactively. - Biometrics, 37, 391–411.", - metadata = c("The data was extracted from the 1974 - Motor Trend US magazine and comprises fuel consumption and - 10 aspects of automobile design and performance for - 32 automobiles (1973–74 models)."), - contactdetails = "statzh", - grouplines = FALSE, - logo = "statzh", - author = "user") + source = paste("Source: Henderson and Velleman (1981),", + "Building multiple regression models interactively.", + "Biometrics, 37, 391–411."), + metadata = paste("The data was extracted from the 1974 Motor Trend", + "US magazine and comprises fuel consumption and", + "10 aspects of automobile design and performance", + "for 32 automobiles (1973–74 models).")) } \keyword{splitXLSX} From 67d5779e73d9bcb91506849ca049fa467699f40d Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Mon, 5 Jun 2023 13:36:15 +0000 Subject: [PATCH 39/74] Exported some common arguments into global options (mainly prefixes). --- R/aXLSX.R | 14 ++++++--- R/datasetsXLSX.R | 49 ++++++++++++++++++++------------ R/helper.R | 27 ++++++++++-------- R/insert_hyperlinks.R | 6 ++-- R/insert_index_sheet.R | 53 +++++++++++++++++++++-------------- R/insert_metadata_sheet.R | 25 ++++++----------- R/insert_worksheet.R | 36 +++++++++++++++--------- R/insert_worksheet_nh.R | 15 ++++++---- R/namespace.R | 17 +++++++++++ R/quickXLSX.R | 14 ++++++--- man/datasetsXLSX.Rd | 34 +++++++++++----------- man/dot-onLoad.Rd | 12 ++++++++ man/insert_index_sheet.Rd | 11 +------- man/insert_metadata_sheet.Rd | 14 +-------- man/insert_worksheet.Rd | 8 +----- test_out.xlsx | Bin 0 -> 44878 bytes 16 files changed, 191 insertions(+), 144 deletions(-) create mode 100644 R/namespace.R create mode 100644 man/dot-onLoad.Rd create mode 100644 test_out.xlsx diff --git a/R/aXLSX.R b/R/aXLSX.R index 32882c9..bdc931b 100644 --- a/R/aXLSX.R +++ b/R/aXLSX.R @@ -34,14 +34,20 @@ aXLSX <- function(data, wb <- openxlsx::createWorkbook() # Insert data ----- - insert_worksheet_nh(wb, data = data, title = title, - source = source, metadata = NA, + insert_worksheet_nh(wb, + data = data, + title = title, + source = source, + metadata = NA, grouplines = grouplines, group_names = group_names) # Insert metadata ------- - insert_metadata_sheet(wb, title = title, source = source, - metadata = metadata, logo = logo, + insert_metadata_sheet(wb, + title = title, + source = source, + metadata = metadata, + logo = logo, contactdetails = contactdetails, author = author) diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index fdb9fab..ac1e730 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -14,7 +14,7 @@ #' case for grouplines and group_names. These must be specified for each dataset. #'@param file file name of the spreadsheet. The extension ".xlsx" is added #' automatically. -#'@param maintitle Title to be put on the first (overview) sheet. +#'@param index_title Title to be put on the first (overview) sheet. #'@param datasets datasets or plots to be included. #'@param plot_widths width of figure in inch (1 inch = 2.54 cm). See details. #'@param plot_heights height of figure in inch (1 inch = 2.54 cm). See details. @@ -22,7 +22,7 @@ #'@param titles titles of the different sheets. #'@param logo file path to the logo to be included in the index-sheet. Can be #' "statzh" or "zh". Defaults to "statzh". -#'@param titlesource source to be mentioned on the title sheet beneath the title +#'@param index_source source to be mentioned on the title sheet beneath the title #'@param sources source of the data. Defaults to "statzh". #'@param metadata metadata information to be included. Defaults to NA. #'@param auftrag_id order number. @@ -56,7 +56,7 @@ #' metadata = c("Bemerkungen zum mtcars-Datensatz: x", #' "Bemerkungen zum PlantGrowth-Datensatz: x"), #' sheetnames = c("Autos","Blumen", "Histogramm"), -#' maintitle = "Autos und Pflanzen", +#' index_title = "Autos und Pflanzen", #' auftrag_id = "A2021_0000", #' overwrite = TRUE) #' @keywords datasetsXLSX @@ -64,21 +64,21 @@ #' @export datasetsXLSX <- function(file, datasets, + sheetnames, titles, plot_widths = NULL, plot_heights = NULL, - grouplines = NA, - group_names = NA, sources = "statzh", metadata = NA, - sheetnames, - maintitle, - titlesource = "statzh", + grouplines = NA, + group_names = NA, + index_title = "Inhalt", + index_source = "statzh", logo = "statzh", - auftrag_id = NULL, contactdetails = "statzh", homepage = "statzh", openinghours = "statzh", + auftrag_id = NULL, overwrite = FALSE){ # Run checks on arguments ------ @@ -113,10 +113,15 @@ datasetsXLSX <- function(file, # Insert the initial index sheet ---------- - insert_index_sheet(wb = wb, title = maintitle, auftrag_id = auftrag_id, - logo = logo, contactdetails = contactdetails, - homepage = homepage, openinghours = openinghours, - source = titlesource) + insert_index_sheet(wb = wb, + title = index_title, + auftrag_id = auftrag_id, + logo = logo, + contactdetails = contactdetails, + homepage = homepage, + openinghours = openinghours, + source = index_source) + # Insert datasets according to dataframes_index ------- if (length(dataframes_index) > 0){ @@ -127,9 +132,14 @@ datasetsXLSX <- function(file, dataframe_metadata, dataframe_grouplines, dataframe_group_names) %>% - purrr::pwalk(~insert_worksheet_nh(wb = wb, data = ..1, sheetname = ..2, - title = ..3, source = ..4, metadata = ..5, - grouplines = ..6, group_names = ..7)) + purrr::pwalk(~insert_worksheet_nh(wb = wb, + data = ..1, + sheetname = ..2, + title = ..3, + source = ..4, + metadata = ..5, + grouplines = ..6, + group_names = ..7)) } @@ -139,8 +149,11 @@ datasetsXLSX <- function(file, plot_sheetnames, plot_widths, plot_heights) %>% - purrr::pmap(~insert_worksheet_image(wb = wb, image = ..1, sheetname = ..2, - width = ..3, height = ..4)) + purrr::pmap(~insert_worksheet_image(wb = wb, + image = ..1, + sheetname = ..2, + width = ..3, + height = ..4)) } diff --git a/R/helper.R b/R/helper.R index e1624c3..ae2aa4b 100644 --- a/R/helper.R +++ b/R/helper.R @@ -56,7 +56,8 @@ verifyDataUngrouped <- function(data){ #' @returns A character string #' @keywords internal #' @noRd -inputHelperSource <- function(source, prefix = NULL, collapse = NULL){ +inputHelperSource <- function(source, prefix = getOption("prefix_source"), + collapse = NULL){ source <- sub("statzh", statzh_name, source) if (all(is.na(source))){ @@ -64,7 +65,7 @@ inputHelperSource <- function(source, prefix = NULL, collapse = NULL){ } if (!is.null(collapse)){ - return(paste0(prefix, paste0(source, collapse = collapse))) + return(paste(prefix, paste0(source, collapse = collapse))) } return(c(prefix, source)) @@ -79,14 +80,15 @@ inputHelperSource <- function(source, prefix = NULL, collapse = NULL){ #' @returns A character vector #' @keywords internal #' @noRd -inputHelperMetadata <- function(metadata, prefix = NULL, collapse = NULL){ +inputHelperMetadata <- function(metadata, prefix = getOption("prefix_metadata"), + collapse = NULL){ if (all(is.na(metadata))){ return("") } if (!is.null(collapse)){ - return(paste0(prefix, paste0(metadata, collapse = collapse))) + return(paste(prefix, paste0(metadata, collapse = collapse))) } return(c(prefix, metadata)) @@ -168,7 +170,7 @@ inputHelperOfficeHours <- function(openinghours){ #' @noRd inputHelperHomepage <- function(homepage){ homepage <- sub("statzh", statzh_homepage, homepage) - # class(homepage) <- 'hyperlink' + class(homepage) <- 'hyperlink' return(homepage) } @@ -183,8 +185,9 @@ inputHelperHomepage <- function(homepage){ #' @keywords internal #' @seealso format #' @noRd -inputHelperDateCreated <- function(prefix = NULL, date_format = "%d.%m.%Y"){ - paste0(prefix, format(Sys.Date(), format = date_format)) +inputHelperDateCreated <- function(prefix = getOption("prefix_date"), + date_format = getOption("date_format")){ + paste(prefix, format(Sys.Date(), format = date_format)) } @@ -196,8 +199,9 @@ inputHelperDateCreated <- function(prefix = NULL, date_format = "%d.%m.%Y"){ #' @keywords internal #' @seealso format #' @noRd -inputHelperOrderNumber <- function(order_num, prefix = NULL){ - paste0(prefix, order_num) +inputHelperOrderNumber <- function(order_num, + prefix = getOption("prefix_order_id")){ + paste(prefix, order_num) } #' inputHelperAuthorName() @@ -210,14 +214,15 @@ inputHelperOrderNumber <- function(order_num, prefix = NULL){ #' @keywords internal #' @noRd #' -inputHelperAuthorName <- function(author, prefix = NULL){ +inputHelperAuthorName <- function(author, + prefix = getOption("prefix_author")){ if (author == "user"){ sys_vals <- c(Sys.getenv("USERNAME"), Sys.getenv("USER")) author_name <- sys_vals[which(sys_vals != "")[1]] author <- stringr::str_sub(author_name, start = 6, end = 7) } - return(paste0(prefix, author)) + return(paste(prefix, author)) } diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index 15e4d3e..923232f 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -6,6 +6,7 @@ #' @param index_sheet_name Name of sheet where hyperlink should be created #' @keywords internal insert_hyperlink <- function(wb, sheetname, title, sheet_row, index_sheet_name){ + openxlsx::writeData(wb, index_sheet_name, title, startCol = 3, startRow = sheet_row) openxlsx::addStyle(wb, index_sheet_name, hyperlinkStyle(), sheet_row, cols = 3) @@ -45,9 +46,8 @@ insert_hyperlinks <- function(wb, sheetnames, titles, index_sheet_name = "Index" sheet_rows <- sheet_start_row + seq(0, length(sheetnames) - 1) - data.frame(sheetnames = sheetnames, - titles = titles, - sheet_row = sheet_rows) %>% + + list(sheetnames, titles, sheet_rows) %>% purrr::pwalk(~insert_hyperlink(wb, sheetname = ..1, title = ..2, diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index 1892ac1..a4b83c7 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -5,8 +5,6 @@ #' @inheritParams insert_worksheet #' @param openinghours statzh or a character string or vector with opening hours #' @param auftrag_id Order ID -#' @param order_id_prefix Text inserted before order ID -#' @param toc_caption Text for table of content #' @keywords insert_index_sheet #' @export insert_index_sheet <- function(wb, @@ -17,10 +15,7 @@ insert_index_sheet <- function(wb, contactdetails = "statzh", homepage = "statzh", openinghours = "statzh", - source = "statzh", - date_prefix = "Erstellt am: ", - order_id_prefix = "Auftragsnr.:", - toc_caption = "Inhalt"){ + source = "statzh"){ # Initialize new worksheet as index sheet ------ openxlsx::addWorksheet(wb, sheetname) @@ -36,42 +31,58 @@ insert_index_sheet <- function(wb, # Insert contact info, title, metadata, and sources into worksheet -------- ### Contact information openxlsx::writeData(wb, sheetname, - x = c(inputHelperContactInfo(contactdetails), - inputHelperHomepage(homepage)), + x = inputHelperContactInfo(contactdetails), startCol = 15, startRow = 2, name = paste(sheetname,"contact", sep = "_")) ### Office hours - openxlsx::writeData(wb, sheetname, inputHelperOfficeHours(openinghours), - 18, namedRegionFirstRow(wb, sheetname, "contact"), + openxlsx::writeData(wb, sheetname, + inputHelperOfficeHours(openinghours), + startCol = 18, + startRow = namedRegionFirstRow(wb, sheetname, "contact"), name = paste(sheetname,"officehours", sep = "_")) - ### Request information + ### Homepage openxlsx::writeData(wb, sheetname, - c(inputHelperDateCreated(prefix = date_prefix), - inputHelperOrderNumber(auftrag_id, prefix = order_id_prefix)), - startCol = 15, startRow = namedRegionLastRow(wb, sheetname, "contact"), - name = paste(sheetname,"info", sep = "_")) + x = inputHelperHomepage(homepage), + startCol = 15, + startRow = namedRegionLastRow(wb, sheetname, "contact") + 1, + name = paste(sheetname,"homepage", sep = "_")) + + + ### Add Headerline openxlsx::addStyle(wb, sheetname, style_headerline(), - namedRegionLastRow(wb, sheetname, "info"), 1:20, + namedRegionLastRow(wb, sheetname, "homepage") + 1, 1:20, gridExpand = TRUE, stack = TRUE) + ### Request information + openxlsx::writeData(wb, sheetname, + c( + inputHelperDateCreated(), + inputHelperOrderNumber(auftrag_id) + ), + startCol = 15, + startRow = namedRegionLastRow(wb, sheetname, "homepage") + 3, + name = paste(sheetname,"info", sep = "_")) + ### Title openxlsx::writeData(wb, sheetname, title, 3, - namedRegionLastRow(wb, sheetname, "info") + 3, + namedRegionLastRow(wb, sheetname, "info") + 1, name = paste(sheetname,"title", sep = "_")) openxlsx::addStyle(wb, sheetname, style_maintitle(), namedRegionLastRow(wb, sheetname, "title"), 3) ### Source - openxlsx::writeData(wb, sheetname, inputHelperSource(source), 3, - namedRegionLastRow(wb, sheetname, "title") + 1, + openxlsx::writeData(wb, sheetname, + inputHelperSource(source, collapse = "; "), + startCol = 3, + startRow = namedRegionLastRow(wb, sheetname, "title") + 1, name = paste(sheetname,"source", sep = "_")) ### Table of content caption - openxlsx::writeData(wb, sheetname, toc_caption, 3, - namedRegionLastRow(wb, sheetname, "source"), + openxlsx::writeData(wb, sheetname, getOption("toc_title"), 3, + namedRegionLastRow(wb, sheetname, "source") + 3, name = paste(sheetname,"toc", sep = "_")) openxlsx::addStyle(wb, sheetname, subtitleStyle(), namedRegionLastRow(wb, sheetname, "toc"), 3) diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index 94e79fe..0395d2e 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -3,8 +3,6 @@ #' @description Function to add a formatted worksheet with metadata to an #' existing Workbook object. #' @inheritParams insert_worksheet -#' @param source_prefix Text shown before sources -#' @param metadata_prefix Text shown before metadata #' @examples #' # Create Workbook #' wb <- openxlsx::createWorkbook() @@ -23,15 +21,7 @@ insert_metadata_sheet <- function(wb, metadata = NA, logo = "statzh", contactdetails = "statzh", - author = "user", - date_prefix = "Aktualisiert am: ", - author_prefix = "durch: ", - source_prefix = "Datenquelle:", - metadata_prefix = "Hinweise:"){ - - # Determine start/end rows of content blocks ----- - contact_start_row <- 2 - + author = "user"){ # Add a new worksheet ------ sheetname <- verifyInputSheetname(sheetname) @@ -52,9 +42,10 @@ insert_metadata_sheet <- function(wb, ### Request information openxlsx::writeData(wb, sheetname, - x = paste(inputHelperDateCreated(prefix = date_prefix), - inputHelperAuthorName(author, prefix = author_prefix)), - 12, startRow = namedRegionLastRow(wb, sheetname, "contact") + 1, + x = paste(inputHelperDateCreated(), + inputHelperAuthorName(author)), + startCol = 12, + startRow = namedRegionLastRow(wb, sheetname, "contact") + 1, name = paste(sheetname,"info", sep = "_")) ### Headerline @@ -70,10 +61,12 @@ insert_metadata_sheet <- function(wb, rows = namedRegionLastRow(wb, sheetname, "title"), cols = 1) ### Source and metadata - openxlsx::writeData(wb, sheetname, inputHelperSource(source, prefix = source_prefix), + openxlsx::writeData(wb, sheetname, + inputHelperSource(source), startRow = namedRegionLastRow(wb, sheetname, "title") + 1, name = paste(sheetname,"source", sep = "_")) - openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata, prefix = metadata_prefix), + openxlsx::writeData(wb, sheetname, + inputHelperMetadata(metadata), startRow = namedRegionLastRow(wb, sheetname, "source") + 1, name = paste(sheetname,"metadata", sep = "_")) openxlsx::addStyle(wb, sheetname, style_subtitle2(), diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 477635b..e61f263 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -21,8 +21,6 @@ #' internal user name. #' @param group_names Names for groupings in secondary header. Format: #' List e.g list(c("title 1", "title 2", "title 3")) -#' @param date_prefix Text shown before date -#' @param author_prefix Text shown before author name #' @examples #' # Initialize Workbook #' wb <- openxlsx::createWorkbook() @@ -46,9 +44,7 @@ insert_worksheet <- function(wb, homepage = "statzh", author = "user", grouplines = NA, - group_names = NA, - date_prefix = "Aktualisiert am: ", - author_prefix = "durch: "){ + group_names = NA){ # Initialize new worksheet ------ sheetname <- verifyInputSheetname(sheetname) @@ -67,22 +63,29 @@ insert_worksheet <- function(wb, contact_start_col <- min(ncol(data) - 2, 4) openxlsx::writeData(wb, sheetname, - x = c(inputHelperContactInfo(contactdetails), - inputHelperHomepage(homepage)), + x = inputHelperContactInfo(contactdetails), contact_start_col, 2, name = paste(sheetname, "contact", sep = "_")) + openxlsx::writeData(wb, sheetname, + x = inputHelperHomepage(homepage), + contact_start_col, + namedRegionLastRow(wb, sheetname, "contact") + 1, + name = paste(sheetname, "homepage", sep = "_")) + ### Information string about time of generation and responsible user openxlsx::writeData(wb, sheetname, - x = paste(inputHelperDateCreated(prefix=date_prefix), - inputHelperAuthorName(author, prefix=author_prefix)), + paste( + inputHelperDateCreated(), + inputHelperAuthorName(author) + ), contact_start_col, - startRow = namedRegionLastRow(wb, sheetname, "contact") + 1, + startRow = namedRegionLastRow(wb, sheetname, "homepage") + 1, name = paste(sheetname, "info", sep = "_")) ### Horizontally merge cells to ensure that contact entries are displayed properly - purrr::walk(namedRegionRowExtent(wb, sheetname, c("contact", "info")), + purrr::walk(namedRegionRowExtent(wb, sheetname, c("contact", "homepage", "info")), ~openxlsx::mergeCells(wb, sheetname, cols = contact_start_col:26, rows = .)) @@ -93,7 +96,12 @@ insert_worksheet <- function(wb, rows = namedRegionLastRow(wb, sheetname, "info"), cols = 1:ncol(data), gridExpand = TRUE, stack = TRUE) - insert_worksheet_nh(wb, sheetname = sheetname, data = data, title = title, - source = source, metadata = metadata, - grouplines = grouplines, group_names = group_names) + insert_worksheet_nh(wb, + sheetname = sheetname, + data = data, + title = title, + source = source, + metadata = metadata, + grouplines = grouplines, + group_names = group_names) } diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index f9ce31c..db50d9f 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -51,19 +51,21 @@ insert_worksheet_nh <- function(wb, openxlsx::addStyle(wb, sheetname, style_title(), start_row, 1) ### Source - openxlsx::writeData(wb, sheetname, inputHelperSource(source), + openxlsx::writeData(wb, sheetname, + inputHelperSource(source), startRow = namedRegionLastRow(wb, sheetname, "title") + 1, name = paste(sheetname,"source", sep = "_")) openxlsx::addStyle(wb, sheetname, style_subtitle(), - namedRegionLastRow(wb, sheetname, "source"), 1, + namedRegionFirstRow(wb, sheetname, "source"), 1, stack = TRUE, gridExpand = TRUE) ### Metadata - openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), + openxlsx::writeData(wb, sheetname, + inputHelperMetadata(metadata), startRow = namedRegionLastRow(wb, sheetname, "source") + 1, name = paste(sheetname,"metadata", sep = "_")) openxlsx::addStyle(wb, sheetname, style_subtitle(), - namedRegionLastRow(wb, sheetname, "metadata"), 1, + namedRegionFirstRow(wb, sheetname, "metadata"), 1, stack = TRUE, gridExpand = TRUE) @@ -78,7 +80,7 @@ insert_worksheet_nh <- function(wb, # Insert data -------- - data_start_row <- namedRegionLastRow(wb, sheetname, "metadata") + 3 + data_start_row <- namedRegionLastRow(wb, sheetname, "metadata") + 2 # Grouplines --------- @@ -108,7 +110,8 @@ insert_worksheet_nh <- function(wb, ### Write data after checking for leftover grouping openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), startRow = data_start_row, rowNames = FALSE, - withFilter = FALSE, name = paste(sheetname,"data", sep = "_")) + withFilter = FALSE, + name = paste(sheetname, "data", sep = "_")) openxlsx::addStyle(wb, sheetname, style_header(), data_start_row, 1:ncol(data), gridExpand = TRUE, stack = TRUE) diff --git a/R/namespace.R b/R/namespace.R new file mode 100644 index 0000000..1b4be4d --- /dev/null +++ b/R/namespace.R @@ -0,0 +1,17 @@ +#' .onLoad() +#' +#' @keywords internal +.onLoad <- function(libname, pkgname) { + defaults <- list( + date_format = "%d.%m.%Y", + prefix_date = "Aktualisiert am:", + prefix_author = "durch:", + prefix_source = "Quelle:", + prefix_metadata = "Hinweise:", + prefix_order_id = "Auftragsnr.:", + collapse_source = ";", + toc_title = "Inhalt" + ) + + options(defaults) +} diff --git a/R/quickXLSX.R b/R/quickXLSX.R index 8da0471..7130db2 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -33,11 +33,17 @@ quickXLSX <- function(data = NA, # Insert data -------- - insert_worksheet(wb, sheetname = "Inhalt", data = data, title = title, + insert_worksheet(wb, + sheetname = "Inhalt", + data = data, + title = title, source = source, - metadata = metadata, logo = logo, - contactdetails = contactdetails, author = author, - grouplines = grouplines, group_names = group_names) + metadata = metadata, + logo = logo, + contactdetails = contactdetails, + author = author, + grouplines = grouplines, + group_names = group_names) # Save workbook--------- diff --git a/man/datasetsXLSX.Rd b/man/datasetsXLSX.Rd index 62ad9fd..4cd7fca 100644 --- a/man/datasetsXLSX.Rd +++ b/man/datasetsXLSX.Rd @@ -7,21 +7,21 @@ datasetsXLSX( file, datasets, + sheetnames, titles, plot_widths = NULL, plot_heights = NULL, - grouplines = NA, - group_names = NA, sources = "statzh", metadata = NA, - sheetnames, - maintitle, - titlesource = "statzh", + grouplines = NA, + group_names = NA, + index_title = "Inhalt", + index_source = "statzh", logo = "statzh", - auftrag_id = NULL, contactdetails = "statzh", homepage = "statzh", openinghours = "statzh", + auftrag_id = NULL, overwrite = FALSE ) } @@ -31,32 +31,30 @@ automatically.} \item{datasets}{datasets or plots to be included.} +\item{sheetnames}{names of the sheet tabs.} + \item{titles}{titles of the different sheets.} \item{plot_widths}{width of figure in inch (1 inch = 2.54 cm). See details.} \item{plot_heights}{height of figure in inch (1 inch = 2.54 cm). See details.} -\item{grouplines}{Column for second header(s). Format: List e.g list(c(2,4,6))} - -\item{group_names}{Name(s) of the second header(s). Format: List e.g -list(c("title 1", "title 2", "title 3"))} - \item{sources}{source of the data. Defaults to "statzh".} \item{metadata}{metadata information to be included. Defaults to NA.} -\item{sheetnames}{names of the sheet tabs.} +\item{grouplines}{Column for second header(s). Format: List e.g list(c(2,4,6))} + +\item{group_names}{Name(s) of the second header(s). Format: List e.g +list(c("title 1", "title 2", "title 3"))} -\item{maintitle}{Title to be put on the first (overview) sheet.} +\item{index_title}{Title to be put on the first (overview) sheet.} -\item{titlesource}{source to be mentioned on the title sheet beneath the title} +\item{index_source}{source to be mentioned on the title sheet beneath the title} \item{logo}{file path to the logo to be included in the index-sheet. Can be "statzh" or "zh". Defaults to "statzh".} -\item{auftrag_id}{order number.} - \item{contactdetails}{contact information on the title sheet. Defaults to "statzh"} \item{homepage}{web address to be put on the title sheet. Default to "statzh"} @@ -64,6 +62,8 @@ list(c("title 1", "title 2", "title 3"))} \item{openinghours}{openinghours written on the title sheet. Defaults to Data Shop} +\item{auftrag_id}{order number.} + \item{overwrite}{overwrites the existing excel files with the same file name. default to FALSE} } @@ -106,7 +106,7 @@ datasetsXLSX(file = tempfile(fileext = ".xlsx"), metadata = c("Bemerkungen zum mtcars-Datensatz: x", "Bemerkungen zum PlantGrowth-Datensatz: x"), sheetnames = c("Autos","Blumen", "Histogramm"), - maintitle = "Autos und Pflanzen", + index_title = "Autos und Pflanzen", auftrag_id = "A2021_0000", overwrite = TRUE) } diff --git a/man/dot-onLoad.Rd b/man/dot-onLoad.Rd new file mode 100644 index 0000000..253b036 --- /dev/null +++ b/man/dot-onLoad.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/namespace.R +\name{.onLoad} +\alias{.onLoad} +\title{.onLoad()} +\usage{ +.onLoad(libname, pkgname) +} +\description{ +.onLoad() +} +\keyword{internal} diff --git a/man/insert_index_sheet.Rd b/man/insert_index_sheet.Rd index ad0b877..202ed3d 100644 --- a/man/insert_index_sheet.Rd +++ b/man/insert_index_sheet.Rd @@ -13,10 +13,7 @@ insert_index_sheet( contactdetails = "statzh", homepage = "statzh", openinghours = "statzh", - source = "statzh", - date_prefix = "Erstellt am: ", - order_id_prefix = "Auftragsnr.:", - toc_caption = "Inhalt" + source = "statzh" ) } \arguments{ @@ -39,12 +36,6 @@ Defaults to "statzh"} \item{openinghours}{statzh or a character string or vector with opening hours} \item{source}{source of the data. Defaults to "statzh".} - -\item{date_prefix}{Text shown before date} - -\item{order_id_prefix}{Text inserted before order ID} - -\item{toc_caption}{Text for table of content} } \description{ Function which generates an index sheet inside an openxlsx diff --git a/man/insert_metadata_sheet.Rd b/man/insert_metadata_sheet.Rd index 485782c..5101a73 100644 --- a/man/insert_metadata_sheet.Rd +++ b/man/insert_metadata_sheet.Rd @@ -12,11 +12,7 @@ insert_metadata_sheet( metadata = NA, logo = "statzh", contactdetails = "statzh", - author = "user", - date_prefix = "Aktualisiert am: ", - author_prefix = "durch: ", - source_prefix = "Datenquelle:", - metadata_prefix = "Hinweise:" + author = "user" ) } \arguments{ @@ -38,14 +34,6 @@ Defaults to "statzh"} \item{author}{defaults to the last two letters (initials) or numbers of the internal user name.} - -\item{date_prefix}{Text shown before date} - -\item{author_prefix}{Text shown before author name} - -\item{source_prefix}{Text shown before sources} - -\item{metadata_prefix}{Text shown before metadata} } \description{ Function to add a formatted worksheet with metadata to an diff --git a/man/insert_worksheet.Rd b/man/insert_worksheet.Rd index 829bf1c..4a19b33 100644 --- a/man/insert_worksheet.Rd +++ b/man/insert_worksheet.Rd @@ -16,9 +16,7 @@ insert_worksheet( homepage = "statzh", author = "user", grouplines = NA, - group_names = NA, - date_prefix = "Aktualisiert am: ", - author_prefix = "durch: " + group_names = NA ) } \arguments{ @@ -50,10 +48,6 @@ variables visually.} \item{group_names}{Names for groupings in secondary header. Format: List e.g list(c("title 1", "title 2", "title 3"))} - -\item{date_prefix}{Text shown before date} - -\item{author_prefix}{Text shown before author name} } \description{ Function to insert a formatted worksheet into an existing diff --git a/test_out.xlsx b/test_out.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dedad19d51c4cf269431ee6f8815fefdc8d5b7a8 GIT binary patch literal 44878 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 S4GauE^luVsz${80&i)T@O=vIx literal 0 HcmV?d00001 From 44345ad6328126a2c22bca57d0bfe752a429e8a0 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Mon, 3 Jul 2023 09:56:51 +0000 Subject: [PATCH 40/74] Bugfix: dynamic column for contact info. Added author to DESCRIPTION --- DESCRIPTION | 3 ++- R/insert_worksheet.R | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3f12c21..b463d97 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -7,7 +7,8 @@ Authors@R: as.person(c( "Lara Theiler [aut]", "Thomas Knecht [aut]", "Alexandra Würmli [aut]", - "Thomas Lo Russo [aut,cre]")) + "Thomas Lo Russo [aut,cre]", + "Thomas Fischer [aut]")) Description: statR beinhaltet eine Reihe von Funktionen mit denen unter anderem publikationsfertige Visualisierungen (mittels ggplot2-themes und Farbpaletten) und formatierte Excel-Tabellen erstellt werden können. Die generierten Visualisierungen und Tabellen sind an das Corporate Design des Kantons Zürich angepasst. Depends: R (>= 3.3.0) License: GPL-3 diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index e61f263..150ce21 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -60,7 +60,7 @@ insert_worksheet <- function(wb, # Insert contact info, date created, and author ----- ### Contact info - contact_start_col <- min(ncol(data) - 2, 4) + contact_start_col <- max(ncol(data) - 2, 4) openxlsx::writeData(wb, sheetname, x = inputHelperContactInfo(contactdetails), From 939a33b95f41d690a97ddad35761b5c978baf1aa Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Mon, 3 Jul 2023 09:59:16 +0000 Subject: [PATCH 41/74] Increment version number to 2.3.0 --- DESCRIPTION | 2 +- NEWS.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index b463d97..ab17642 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: statR Title: statR -Version: 2.2.0 +Version: 2.3.0 Authors@R: as.person(c( "Andrea Schnell [aut]", "Michelle Donzallaz [aut]", diff --git a/NEWS.md b/NEWS.md index 4408fbb..60a6644 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,5 @@ +# statR 2.3.0 + # statR 2.2.0 * implemented new color palettes according to the ZH.CH Design System From 448789aee0cfeb1b7b90205cfee13bdc1d5235ba Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Wed, 12 Jul 2023 13:45:59 +0000 Subject: [PATCH 42/74] Implemented user configuration based on yaml package (new dependency); linting, some bug-fixes --- DESCRIPTION | 3 +- NAMESPACE | 5 + R/aXLSX.R | 24 ++-- R/checks.R | 6 +- R/col_stat.R | 202 +++++++++++++++-------------- R/datasetsXLSX.R | 24 ++-- R/display.R | 4 +- R/display.statcol.all.R | 11 +- R/flush_left.r | 3 +- R/get_groupline_index_by_pattern.R | 4 +- R/helper.R | 132 +++++++++++-------- R/insert_hyperlinks.R | 23 ++-- R/insert_image.R | 15 +-- R/insert_index_sheet.R | 31 ++--- R/insert_metadata_sheet.R | 25 ++-- R/insert_second_header.R | 6 +- R/insert_worksheet.R | 16 +-- R/insert_worksheet_nh.R | 18 +-- R/interpolate.R | 7 +- R/namespace.R | 24 +++- R/quickXLSX.R | 24 ++-- R/quick_sum.r | 45 ++++--- R/splitXLSX.R | 21 ++- R/styles.R | 87 +++++++------ R/theme_stat.r | 105 +++++++++------ R/user_config.R | 66 ++++++++++ inst/extdata/config/default | 13 ++ inst/extdata/config/statzh | 13 ++ man/aXLSX.Rd | 6 +- man/datasetsXLSX.Rd | 18 +-- man/getActiveConfigName.Rd | 11 ++ man/getUserConfigs.Rd | 11 ++ man/insert_index_sheet.Rd | 10 +- man/insert_metadata_sheet.Rd | 6 +- man/insert_worksheet.Rd | 8 +- man/insert_worksheet_nh.Rd | 2 +- man/quickXLSX.Rd | 6 +- man/readUserConfig.Rd | 14 ++ man/setActiveConfig.Rd | 18 +++ man/splitXLSX.Rd | 8 +- man/writeUserConfig.Rd | 16 +++ test_out.xlsx | Bin 44878 -> 0 bytes 42 files changed, 657 insertions(+), 434 deletions(-) create mode 100644 R/user_config.R create mode 100644 inst/extdata/config/default create mode 100644 inst/extdata/config/statzh create mode 100644 man/getActiveConfigName.Rd create mode 100644 man/getUserConfigs.Rd create mode 100644 man/readUserConfig.Rd create mode 100644 man/setActiveConfig.Rd create mode 100644 man/writeUserConfig.Rd delete mode 100644 test_out.xlsx diff --git a/DESCRIPTION b/DESCRIPTION index ab17642..6dad7db 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -27,7 +27,8 @@ Imports: scales, stringr, purrr, - methods + methods, + yaml URL: https://statistikzh.github.io/statR/ BugReports: https://github.com/statistikZH/statR/issues Suggests: diff --git a/NAMESPACE b/NAMESPACE index 9f16c57..3d5c8d3 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -5,6 +5,8 @@ export(datasetsXLSX) export(display) export(display.statcol.all) export(flush_left) +export(getActiveConfigName) +export(getUserConfigs) export(insert_hyperlinks) export(insert_index_sheet) export(insert_metadata_sheet) @@ -14,8 +16,11 @@ export(insert_worksheet_nh) export(interpolate2) export(quickXLSX) export(quick_sum) +export(readUserConfig) +export(setActiveConfig) export(splitXLSX) export(theme_stat) +export(writeUserConfig) export(zhpal) importFrom(dplyr,"%>%") importFrom(ggplot2,aes) diff --git a/R/aXLSX.R b/R/aXLSX.R index bdc931b..116c22f 100644 --- a/R/aXLSX.R +++ b/R/aXLSX.R @@ -22,33 +22,25 @@ aXLSX <- function(data, file, title = "Title", - source = "statzh", + source = getOption("statR_source"), metadata = NA, - logo = "statzh", - contactdetails = "statzh", + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), author = "user", grouplines = NA, - group_names = NA){ + group_names = NA) { # Initialize Workbook object ------- wb <- openxlsx::createWorkbook() # Insert data ----- - insert_worksheet_nh(wb, - data = data, - title = title, - source = source, - metadata = NA, - grouplines = grouplines, + insert_worksheet_nh(wb, data = data, title = title, source = source, + metadata = NA, grouplines = grouplines, group_names = group_names) # Insert metadata ------- - insert_metadata_sheet(wb, - title = title, - source = source, - metadata = metadata, - logo = logo, - contactdetails = contactdetails, + insert_metadata_sheet(wb, title = title, source = source, metadata = metadata, + logo = logo, contactdetails = contactdetails, author = author) # Write workbook to disk -------- diff --git a/R/checks.R b/R/checks.R index c8da8d5..19deb1f 100644 --- a/R/checks.R +++ b/R/checks.R @@ -5,8 +5,8 @@ #' @param grouplines A character or integer vector of columns to put grouplines at #' @keywords internal #' @noRd -checkGroupOptionCompatibility <- function(group_names, grouplines){ - if (any(!is.na(group_names)) & all(is.na(grouplines))){ +checkGroupOptionCompatibility <- function (group_names, grouplines){ + if (any(!is.na(group_names)) & all(is.na(grouplines))) { stop("For a second header, the grouplines must be specified") } } @@ -17,6 +17,6 @@ checkGroupOptionCompatibility <- function(group_names, grouplines){ #' @param image Any R object #' @keywords internal #' @noRd -checkImplementedPlotType <- function(image){ +checkImplementedPlotType <- function(image) { length(setdiff(class(image), c("gg", "ggplot", "histogram"))) == 0 } diff --git a/R/col_stat.R b/R/col_stat.R index df7f763..0d63f5f 100644 --- a/R/col_stat.R +++ b/R/col_stat.R @@ -12,102 +12,116 @@ stattheme_data <- { x <- list() - #standard - x$stattheme_data$zhcd<- c("#009ee0", "#0076bd", "#885ea0", "#e30059", "#e2001a","#ffcc00", "#00a1a3","#3ea743") + # standard + x$stattheme_data$zhcd <- c("#009ee0", "#0076bd", "#885ea0", "#e30059", + "#e2001a", "#ffcc00", "#00a1a3", "#3ea743") # Akzentfarben ZH Web - x$stattheme_data$zhwebaccent<- c("#009ee0", "#0070B4", "#7F3DA7", "#D40053", "#B01657", "#DC7700","#00797B", "#1A7F1F") + x$stattheme_data$zhwebaccent <- c("#009ee0", "#0070B4", "#7F3DA7", "#D40053", + "#B01657", "#DC7700", "#00797B", "#1A7F1F") - ### 1. Ordinale / kategoriale Paletten - - #Farbmatrixpaletten (horizontal) - - x$stattheme_data$zhwebdataviz<- c("#0070B4", "#00407C", "#00797B", "#8A8C00", "#00544C", "#DC7700", "#D93C1A", "#96170F", "#D40053", "#B01657", "#7A0049", "#9572D5", "#54268E", "#CCCCCC", "#949494", "#666666", "#333333" ) - - x$stattheme_data$zhdarker<- c("#407B9F", "#409292", "#5F9463", "#B2A558", "#B77346", "#B24A4C", "#857091") - - x$stattheme_data$zhdark<- c("#3F8AB4", "#3FA5A5", "#65A96A", "#CEBE5B", "#D27F46", "#CD4B4E", "#9479A4") - - x$stattheme_data$zh<- c("#3F98CC", "#3FB8B9", "#6DBD72", "#EBD760", "#F08D47", "#ea4d51", "#A585B7") - - x$stattheme_data$zhlight<- c("#5FA9D3", "#5FC3C3","#84C788", "#EDDD79", "#F29F64", "#EC686C", "#B399C3") - - x$stattheme_data$zhpastel <- c( "#7FB9DD", "#7FCECE", "#9DD2A0", "#F1E494", "#F4B283", "#F1868B", "#C3ACCE") - x$stattheme_data$zhextralight <- c("#9FCBE5", "#9FDADA" ,"#B4DEB8", "#F3EBAE", "#F7C5A1", "#F3A5A7", "#D2C1DA") - - x$stattheme_data$zhultralight <- c("#BFDCED" ,"#BFE6E6", "#CDE9D0" ,"#F8F1CA" ,"#F9D8C0", "#F8C3C4", "#E0D6E6") - - #x$stattheme_data$zhpaired16<-c("#4684AA","#8CBFDD", "#469A9A","#8CD0D1", "#669F6A","#A5D3A9", "#CCAA1A","#F8DD6A", "#C37D4C" ,"#F1B892","#BE4654","#EC8C99", "#8D7899","#C6B4CE","#1B252B","#767C7F") - - x$stattheme_data$zhpaired<-c("#3f8ab4","#9FCBE5", "#3fa5a5","#9FDADA", "#65A96A","#B4DEB8", "#CEBE5B","#F3EBAE", "#D27F46" ,"#F7C5A1","#CD4B4E","#F3A5A7", "#9479A4","#D2C1DA","#1B252B","#767C7F") + ### 1. Ordinale / kategoriale Paletten - #Farbmatrixpaletten (vertikal) + # Farbmatrixpaletten (horizontal) - x$stattheme_data$zhblue <- c("#407B9F","#3F8AB4","#3F98CC","#5FA9D3","#7FB9DD","#9FCBE5","#BFDCED") + x$stattheme_data$zhwebdataviz <- c("#0070B4", "#00407C", "#00797B", "#8A8C00", + "#00544C", "#DC7700", "#D93C1A", "#96170F", + "#D40053", "#B01657", "#7A0049", "#9572D5", + "#54268E", "#CCCCCC", "#949494", "#666666", + "#333333") - # x$stattheme_data$zhbluemh<- c('#386a87','#528489','#699b8f','#7fb19d','#96c3b0','#add3cb','#c5dfed') + x$stattheme_data$zhdarker <- c("#407B9F", "#409292", "#5F9463", "#B2A558", + "#B77346", "#B24A4C", "#857091") - # x$stattheme_data$zhblue <- c('#407b9f','#4c97c1','#71b2d8','#a0cbe5','#d0e5f2') + x$stattheme_data$zhdark <- c("#3F8AB4", "#3FA5A5", "#65A96A", "#CEBE5B", + "#D27F46", "#CD4B4E", "#9479A4") - #x$stattheme_data$zhblue <- c('#407b9f','#71b2d8','#d0e5f2') + x$stattheme_data$zh <- c("#3F98CC", "#3FB8B9", "#6DBD72", "#EBD760", + "#F08D47", "#ea4d51", "#A585B7") - x$stattheme_data$zhgreen <-c("#527F54", "#669F6A", "#7ABF7F","#90C993","#A5D3A9","#BBDFBF","#D2E9D3") + x$stattheme_data$zhlight <- c("#5FA9D3", "#5FC3C3", "#84C788", "#EDDD79", + "#F29F64", "#EC686C", "#B399C3") - # x$stattheme_data$zhturqoise <-c("#409292", "#3FA5A5", "#3FB8B8","#5FC3C3","#7FCECE","#9FDADA","#BFE6E6") + x$stattheme_data$zhpastel <- c("#7FB9DD", "#7FCECE", "#9DD2A0", "#F1E494", + "#F4B283", "#F1868B", "#C3ACCE") - # x$stattheme_data$zhyellow<-c("#B2A558", "#CEBE5B", "#EBD760","#EDDD79","#F1E494","#F3EBAE","#F8F1CA") + x$stattheme_data$zhextralight <- c("#9FCBE5", "#9FDADA", "#B4DEB8", "#F3EBAE", + "#F7C5A1", "#F3A5A7", "#D2C1DA") - x$stattheme_data$zhorange <-c("#B77346", "#D27F46", "#F08D47","#F29f64","#f4b283","#f7c5a1","#f9d8c0") + x$stattheme_data$zhultralight <- c("#BFDCED", "#BFE6E6", "#CDE9D0", "#F8F1CA", + "#F9D8C0", "#F8C3C4", "#E0D6E6") - x$stattheme_data$zhred <- c('#983844','#b74451','#d84f60','#e76c7b','#ec8c99','#f1a8b2','#f6c5cb') - # x$stattheme_data$zhviolet <-c('#715f7a','#857190','#9a83a7','#af96bc','#c0acc9','#d0c2d8','#e3d9e6') + x$stattheme_data$zhpaired <- c("#3f8ab4", "#9FCBE5", "#3fa5a5", "#9FDADA", + "#65A96A", "#B4DEB8", "#CEBE5B", "#F3EBAE", + "#D27F46", "#F7C5A1", "#CD4B4E", "#F3A5A7", + "#9479A4", "#D2C1DA", "#1B252B", "#767C7F") - # x$stattheme_data$zhvioletmh<-c('#715f7a','#877375','#9a8874','#ae9e77','#c1b284','#d4c6a1','#e3d9e6') - #diagonal palette + # Farbmatrixpaletten (vertikal) + #---------------------------- + x$stattheme_data$zhblue <- c("#407B9F", "#3F8AB4", "#3F98CC", "#5FA9D3", + "#7FB9DD", "#9FCBE5", "#BFDCED") - #x$stattheme_data$zhdiagonal <- c("#407B9F", "#3FA5A5" ,"#6CBD72", "#EDDD79", "#F4B283", "#F3A5A7" ,"#E0D6E6") + x$stattheme_data$zhgreen <- c("#527F54", "#669F6A", "#7ABF7F", "#90C993", + "#A5D3A9", "#BBDFBF", "#D2E9D3") - x$stattheme_data$zhdiagonal <- c("#407B9F", "#3FA5A5" ,"#6CBD72", "#EDDD79", "#F4B283", "#F3A5A7" ,"#E0D6E6","#857091") + x$stattheme_data$zhorange <- c("#B77346", "#D27F46", "#F08D47", "#F29f64", + "#f4b283", "#f7c5a1", "#f9d8c0") - #zhBlueYellowGrey + x$stattheme_data$zhred <- c("#983844", "#b74451", "#d84f60", "#e76c7b", + "#ec8c99", "#f1a8b2", "#f6c5cb") - x$stattheme_data$zhbyg<- c( "#003B5E", "#006EB1" ,"#5FA9D5","#FFE16F","#C2D37B", "#86CEB8", "#56BFB9", "#9DB99E", "#656564") - x$stattheme_data$zhbyglight<- c("#2A5A78", "#2A85BE", "#79B7DC" ,"#FFE586" ,"#CCD991", "#99D6C3" ,"#72C9C4", "#ACC4AD" ,"#7E7E7D") + # Diagonal palette + #----------------- + x$stattheme_data$zhdiagonal <- c("#407B9F", "#3FA5A5", "#6CBD72", "#EDDD79", + "#F4B283", "#F3A5A7", "#E0D6E6", "#857091") - #zhlake - x$stattheme_data$zhlake<-c("#002338","#004671","#0076BD","#3F94BA" ,"#7FB2B7", "#BFD0B4","#DAEBCC", "#FFEFB2") + # zhBlueYellowGrey + #----------------- + x$stattheme_data$zhbyg <- c( "#003B5E", "#006EB1", "#5FA9D5", "#FFE16F", + "#C2D37B", "#86CEB8", "#56BFB9", "#9DB99E", + "#656564") - # x$stattheme_data$zhlakelight<-c("#2A4659", "#2A6487", "#2A8CC7", "#5FA5C5", "#93BEC3", "#C9D7BF" ,"#DFEDD3", "#FFF1BE") + x$stattheme_data$zhbyglight <- c("#2A5A78", "#2A85BE", "#79B7DC", "#FFE586", + "#CCD991", "#99D6C3", "#72C9C4", "#ACC4AD", + "#7E7E7D") - #likert-paletten - #zhlikert Benchmarking mit Kantonsrot / Kantonsgr?n - '#e2001a', "#3ea743" + # zhlake + #------- + x$stattheme_data$zhlake <- c("#002338", "#004671", "#0076BD", "#3F94BA", + "#7FB2B7", "#BFD0B4", "#DAEBCC", "#FFEFB2") - x$stattheme_data$zhlikert5gr <- c( "#F09B7A", "#E93F53","#6EBD72", "#B3DA8A", "#F8F7A2") - x$stattheme_data$zhlikert5br <- c("#F09B7A","#E93F53","#3F98CD", "#9BC7B7", "#F8F7A2") + # zhlikert Benchmarking mit Kantonsrot / Kantonsgr?n - '#e2001a', "#3ea743" + #-------------------------------------------------------------------------- + x$stattheme_data$zhlikert5gr <- c( "#F09B7A", "#E93F53", "#6EBD72", "#B3DA8A", + "#F8F7A2") - x$stattheme_data$zhlikert6gr <- c("#6EBD72", "#A5D485" ,"#DCEB98" ,"#f2a975", "#EF8872" ,"#E93F53") + x$stattheme_data$zhlikert5br <- c("#F09B7A", "#E93F53", "#3F98CD", "#9BC7B7", + "#F8F7A2") - x$stattheme_data$zhlikert6br <- c("#3F98CD" ,"#7FB9DD", "#9FDADA", "#F7C5A1", "#EF8872", "#E93F53") + x$stattheme_data$zhlikert6gr <- c("#6EBD72", "#A5D485", "#DCEB98", "#f2a975", + "#EF8872", "#E93F53") + x$stattheme_data$zhlikert6br <- c("#3F98CD", "#7FB9DD", "#9FDADA", "#F7C5A1", + "#EF8872", "#E93F53") - #BENCHMARKING-PALETTEN - x$stattheme_data$bmlikert <- c("#e2001a","#f27644","#fab872","#ffe16f","#9ec359","#3ea743") + # BENCHMARKING-PALETTEN + #---------------------- + x$stattheme_data$bmlikert <- c("#e2001a", "#f27644", "#fab872", "#ffe16f", + "#9ec359", "#3ea743") - x$stattheme_data$bmtabelle <- c("#ff9faa","#f9bda5","#d6e6b8","#ffe16f","#b9e5bb") + x$stattheme_data$bmtabelle <- c("#ff9faa", "#f9bda5", "#d6e6b8", "#ffe16f", + "#b9e5bb") x$stattheme_data$bmmittelwert <- c("#6DB0D9") - #zh180 - # x$stattheme_data$zh180 <- c("#2A5A78","#2A5C7B","#2A5E7E","#2A6081","#2A6284","#2B6487","#2B668A","#2B688D","#2B6A90","#2B6B93","#2B6D96","#2B6F99","#2B719C","#2B739F","#2B75A3","#2B77A6","#2B79A9","#2B7BAC","#2B7DAF","#2A7FB3","#2A81B6","#2A83B9","#2A85BC","#2D87BE","#3289C0","#368BC1","#3A8DC2","#3F8FC4","#4292C5","#4694C6","#4A96C8","#4D98C9","#519ACA","#549CCC","#589FCD","#5BA1CE","#5EA3D0","#61A5D1","#64A7D2","#67AAD4","#6AACD5","#6DAED6","#70B0D8","#73B3D9","#76B5DA","#7BB7DA","#85B8D5","#8EBAD0","#96BCCB","#9EBDC6","#A5BFC1","#ACC1BC","#B2C2B6","#B9C4B1","#BFC6AC","#C4C8A7","#CAC9A1","#CFCB9C","#D4CD96","#D9CF91","#DED08B","#E3D285","#E8D47F","#EDD679","#F1D873","#F5DA6D","#FADB66","#FEDD5F","#FDDD61","#FBDD63","#F8DD66","#F6DD68","#F4DD6A","#F2DD6D","#F0DC6F","#EEDC71","#EBDC74","#E9DC76","#E7DC78","#E5DB7A","#E2DB7C","#E0DB7F","#DEDB81","#DBDB83","#D9DB85","#D7DA87","#D4DA89","#D2DA8B","#CFDA8D","#CDDA8F","#CBD992","#C9D994","#C7D996","#C5D999","#C3D99B","#C1D89D","#BFD89F","#BDD8A2","#BBD8A4","#B9D8A6","#B7D8A8","#B4D7AB","#B2D7AD","#B0D7AF","#AED7B1","#ABD7B3","#A9D7B6","#A6D6B8","#A4D6BA","#A1D6BC","#9FD6BE","#9CD6C1","#99D5C3","#98D5C3","#96D4C3","#94D4C3","#93D3C3","#91D3C3","#8FD2C3","#8ED1C3","#8CD1C3","#8AD0C3","#88D0C3","#87CFC3","#85CEC3","#83CEC3","#81CDC3","#7FCDC3","#7ECCC3","#7CCCC3","#7ACBC3","#78CAC3","#76CAC3","#74C9C3","#72C9C3","#74C8C3","#77C8C2","#7BC8C1","#7EC8C0","#81C8BF","#84C7BE","#86C7BD","#89C7BC","#8CC7BB","#8FC6BA","#91C6B9","#94C6B8","#96C6B7","#99C6B6","#9BC5B5","#9EC5B4","#A0C5B3","#A2C5B2","#A5C4B1","#A7C4B0","#A9C4AF","#ABC4AE","#ACC2AD","#AABFAA","#A7BCA8","#A5B9A6","#A3B5A4","#A1B2A1","#9FAF9F","#9DAC9D","#9BA99B","#99A699","#97A296","#949F94","#929C92","#909990","#8E968E","#8C938C","#8A9089","#888D87","#868A85","#848783","#828481","#80817F","#7E7E7D") - # 2. Definiere Liste mit sequentiellen Paletten bzw. low / high Farben @@ -117,91 +131,89 @@ stattheme_data <- { x$stattheme_data$zhbygseq <- x$stattheme_data$zhbyg[c(4,7,1)] - x$stattheme_data$zhseq <- c(x$stattheme_data$zhultralight[3],x$stattheme_data$zh[2], x$stattheme_data$zhdarker[1],"#2A526A") - - x$stattheme_data$zhlakeseq <-c(x$stattheme_data$zhlake[8],x$stattheme_data$zhlake[3],x$stattheme_data$zhlakelight[1]) - + x$stattheme_data$zhseq <- c(x$stattheme_data$zhultralight[3], + x$stattheme_data$zh[2], + x$stattheme_data$zhdarker[1], + "#2A526A") - # x$stattheme_data$sequential$zhblueseq$low <- "#C5DFED" + x$stattheme_data$zhlakeseq <- c(x$stattheme_data$zhlake[8], + x$stattheme_data$zhlake[3], + x$stattheme_data$zhlakelight[1]) - # x$stattheme_data$sequential$zhblueseq$high <- "#386A87" x$stattheme_data$sequential$zhblueseq$low <- "#BFDCED" - x$stattheme_data$sequential$zhblueseq$high <- "#19242D" + x$stattheme_data$sequential$zhblueseq$high <- "#19242D" - x$stattheme_data$sequential$zhredseq$low<- "#F6C5CB" + x$stattheme_data$sequential$zhredseq$low <- "#F6C5CB" x$stattheme_data$sequential$zhredseq$high <-"#983844" - x$stattheme_data$sequential$zhvioletseq$high<- "#715F7A" + + x$stattheme_data$sequential$zhvioletseq$high <- "#715F7A" x$stattheme_data$sequential$zhvioletseq$low <- "#E3D9E6" - x$stattheme_data$sequential$zhbgseq$high<- "#0076BD" - x$stattheme_data$sequential$zhbgseq$low <- "#B1DBB3" + x$stattheme_data$sequential$zhbgseq$high <- "#0076BD" - x$stattheme_data$sequential$zhgreenseq$high<- "#527F54" + x$stattheme_data$sequential$zhbgseq$low <- "#B1DBB3" - x$stattheme_data$sequential$zhgreenseq$low <- "#D2E9D3" + x$stattheme_data$sequential$zhgreenseq$high <- "#527F54" - #x$stattheme_data$sequential$zhseq$low <- "#E9F3F9" + x$stattheme_data$sequential$zhgreenseq$low <- "#D2E9D3" - #x$stattheme_data$sequential$zhseq$high <- "#005A90" #3. Definiere Liste mit divergierenden Paletten #zhmh - multihue - x$stattheme_data$diverging$zhmhblue$low <- "#F3EBAE" - - x$stattheme_data$diverging$zhmhblue$mid <- "#0076BD" + x$stattheme_data$diverging$zhmhblue$low <- "#F3EBAE" - x$stattheme_data$diverging$zhmhblue$high <- "#19242D" + x$stattheme_data$diverging$zhmhblue$mid <- "#0076BD" + x$stattheme_data$diverging$zhmhblue$high <- "#19242D" - x$stattheme_data$diverging$zhmhgreen$low <- "#F3EBAE" - x$stattheme_data$diverging$zhmhgreen$mid <- "#00a1a3" + x$stattheme_data$diverging$zhmhgreen$low <- "#F3EBAE" - x$stattheme_data$diverging$zhmhgreen$high <- "#19242D" + x$stattheme_data$diverging$zhmhgreen$mid <- "#00a1a3" + x$stattheme_data$diverging$zhmhgreen$high <- "#19242D" - x$stattheme_data$diverging$zhbluered$low <- "#e2001a" + x$stattheme_data$diverging$zhbluered$low <- "#e2001a" - x$stattheme_data$diverging$zhbluered$mid <- "#f0f0f0" + x$stattheme_data$diverging$zhbluered$mid <- "#f0f0f0" - x$stattheme_data$diverging$zhbluered$high <- "#0076BD" + x$stattheme_data$diverging$zhbluered$high <- "#0076BD" - x$stattheme_data$diverging$zhvioletgreen$high <-"#3ea743" + x$stattheme_data$diverging$zhvioletgreen$high <- "#3ea743" - x$stattheme_data$diverging$zhvioletgreen$mid <- "#f0f0f0" + x$stattheme_data$diverging$zhvioletgreen$mid <- "#f0f0f0" - x$stattheme_data$diverging$zhvioletgreen$low<- "#885ea0" + x$stattheme_data$diverging$zhvioletgreen$low <- "#885ea0" - x$stattheme_data$diverging$zhspectral$low <- "#EA5251" + x$stattheme_data$diverging$zhspectral$low <- "#EA5251" - x$stattheme_data$diverging$zhspectral$mid <- "#FFE57F" - - x$stattheme_data$diverging$zhspectral$high <- "#3F98CC" + x$stattheme_data$diverging$zhspectral$mid <- "#FFE57F" + x$stattheme_data$diverging$zhspectral$high <- "#3F98CC" } #' stattheme_pal() -#' -#' Stat ZH scales +#' @description Stat ZH scales + #' @importFrom scales manual_pal + #' @keywords stattheme_pal -#' @noRd -#' +#' @noRd stattheme_pal <- function(palette = "default"){ if (palette %in% names(x$stattheme_data)){ @@ -218,6 +230,4 @@ stattheme_pal <- function(palette = "default"){ #' #' @format A \code{list}. #' @export -#' - zhpal <- x$stattheme_data diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R index ac1e730..792b96d 100644 --- a/R/datasetsXLSX.R +++ b/R/datasetsXLSX.R @@ -66,34 +66,32 @@ datasetsXLSX <- function(file, datasets, sheetnames, titles, + sources, plot_widths = NULL, plot_heights = NULL, - sources = "statzh", metadata = NA, grouplines = NA, group_names = NA, - index_title = "Inhalt", - index_source = "statzh", - logo = "statzh", - contactdetails = "statzh", - homepage = "statzh", - openinghours = "statzh", + index_title = getOption("statR_toc_title"), + index_source = getOption("statR_source"), + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), + homepage = getOption("statR_homepage"), + openinghours = getOption("statR_openinghours"), auftrag_id = NULL, - overwrite = FALSE){ + overwrite = FALSE) { # Run checks on arguments ------ checkGroupOptionCompatibility(group_names, grouplines) - # Initialize new Workbook ------ wb <- openxlsx::createWorkbook() - # Create indexes of which inputs correspond to data.frames or plots----- dataframes_index <- which(vapply(datasets, is.data.frame, TRUE)) implemented_plot_types <- c("gg", "ggplot", "histogram", "character") - plot_index <- which(vapply(datasets, function(x){ + plot_index <- which(vapply(datasets, function(x) { length(setdiff(class(x), implemented_plot_types)) == 0 }, TRUE)) @@ -124,7 +122,7 @@ datasetsXLSX <- function(file, # Insert datasets according to dataframes_index ------- - if (length(dataframes_index) > 0){ + if (length(dataframes_index) > 0) { list(dataframe_datasets, dataframe_sheetnames, dataframe_titles, @@ -144,7 +142,7 @@ datasetsXLSX <- function(file, # Insert images according to plot_index -------- - if (length(plot_index) > 0){ + if (length(plot_index) > 0) { list(plot_datasets, plot_sheetnames, plot_widths, diff --git a/R/display.R b/R/display.R index 22bd23d..7dd50d2 100644 --- a/R/display.R +++ b/R/display.R @@ -13,9 +13,9 @@ #' display(zhpal$zhdiagonal) #' #example with a single hex-code #' display("#000000") -display <- function(col, border = "light gray", ...){ +display <- function(col, border = "light gray", ...) { n <- length(col) plot(0, type = "n", xlim = c(0, 1), ylim = c(0, 1), axes = FALSE, xlab = "", ylab = "", ...) - rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border) + rect(0:(n - 1) / n, 0, 1:n / n, 1, col = col, border = border) } diff --git a/R/display.statcol.all.R b/R/display.statcol.all.R index 3983eda..38313f7 100644 --- a/R/display.statcol.all.R +++ b/R/display.statcol.all.R @@ -8,17 +8,18 @@ #' theme element_blank labs #' @importFrom rlang .data #' @export -display.statcol.all <- function(){ +display.statcol.all <- function() { df <- data.frame(unlist(x$stattheme_data)) - df[,"pal_col"] <- row.names(df) + df[, "pal_col"] <- row.names(df) colnames(df) <- c("col", "pal_col") - df$palette <- gsub('(.mid|.low|.high|.high|\\d$)', '', df$pal_col) + df$palette <- gsub("(.mid|.low|.high|.high|\\d$)", "", df$pal_col) - df$palette <- gsub('\\d$','', df$palette) + df$palette <- gsub("\\d$", "", df$palette) - gg1 <- ggplot2::ggplot(df, ggplot2::aes(x = .data$pal_col, y = 0, color = I(col))) + + gg1 <- ggplot2::ggplot(df, ggplot2::aes(x = .data$pal_col, y = 0, + color = I(col))) + ggplot2::geom_point(size = 20, shape = 15) + ggplot2::facet_wrap(~palette, ncol = 3, scales = "free") + ggplot2::guides(color = "none") + diff --git a/R/flush_left.r b/R/flush_left.r index f45cc04..2d2f978 100644 --- a/R/flush_left.r +++ b/R/flush_left.r @@ -12,7 +12,7 @@ #' flush_left(plt) #' @keywords flush_left #' @export -flush_left <- function(g){ +flush_left <- function(g) { xout <- ggplot2::ggplotGrob(g) xout$layout$l[xout$layout$name == "title"] <- 1 @@ -20,4 +20,3 @@ flush_left <- function(g){ xout$layout$l[xout$layout$name == "caption"] <- 1 gridExtra::grid.arrange(xout) } - diff --git a/R/get_groupline_index_by_pattern.R b/R/get_groupline_index_by_pattern.R index fc6876c..05ce6b9 100644 --- a/R/get_groupline_index_by_pattern.R +++ b/R/get_groupline_index_by_pattern.R @@ -3,9 +3,9 @@ #' @description Derive groupline index by matching names #' @inheritParams insert_worksheet #' @keywords internal -get_groupline_index_by_pattern <- function(grouplines, data){ +get_groupline_index_by_pattern <- function(grouplines, data) { - get_lowest_col <- function(groupline, data){ + get_lowest_col <- function(groupline, data) { min(which(grepl(groupline, names(data)))) } diff --git a/R/helper.R b/R/helper.R index ae2aa4b..83aba32 100644 --- a/R/helper.R +++ b/R/helper.R @@ -8,8 +8,8 @@ #' @returns A character string #' @keywords internal #' @noRd -verifyInputSheetname <- function(sheetname){ - if (nchar(sheetname) > 31){ +verifyInputSheetname <- function(sheetname) { + if (nchar(sheetname) > 31) { message("sheetname truncated at 31 characters to satisfy MS-Excel limit.") } @@ -25,8 +25,8 @@ verifyInputSheetname <- function(sheetname){ #' @returns A character string #' @keywords internal #' @noRd -verifyInputFilename <- function(filename, extension = ".xlsx"){ - regex_pattern <- paste0(extension,"$") +verifyInputFilename <- function(filename, extension = ".xlsx") { + regex_pattern <- paste0(extension, "$") paste0(gsub(regex_pattern, "", filename), extension) } @@ -39,8 +39,8 @@ verifyInputFilename <- function(filename, extension = ".xlsx"){ #' @returns A data.frame #' @keywords internal #' @noRd -verifyDataUngrouped <- function(data){ - if (!dplyr::is_grouped_df(data)){ +verifyDataUngrouped <- function(data) { + if (!dplyr::is_grouped_df(data)) { return(data) } @@ -57,14 +57,13 @@ verifyDataUngrouped <- function(data){ #' @keywords internal #' @noRd inputHelperSource <- function(source, prefix = getOption("prefix_source"), - collapse = NULL){ - source <- sub("statzh", statzh_name, source) + collapse = getOption("statR_collapse")) { - if (all(is.na(source))){ + if (all(is.na(source))) { return("") } - if (!is.null(collapse)){ + if (!is.null(collapse)) { return(paste(prefix, paste0(source, collapse = collapse))) } @@ -81,13 +80,13 @@ inputHelperSource <- function(source, prefix = getOption("prefix_source"), #' @keywords internal #' @noRd inputHelperMetadata <- function(metadata, prefix = getOption("prefix_metadata"), - collapse = NULL){ + collapse = getOption("statR_collapse")) { - if (all(is.na(metadata))){ + if (all(is.na(metadata))) { return("") } - if (!is.null(collapse)){ + if (!is.null(collapse)) { return(paste(prefix, paste0(metadata, collapse = collapse))) } @@ -103,14 +102,14 @@ inputHelperMetadata <- function(metadata, prefix = getOption("prefix_metadata"), #' @returns A character string #' @keywords internal #' @noRd -inputHelperLogoPath <- function(logo){ - if (is.null(logo)){ +inputHelperLogoPath <- function(logo) { + if (is.null(logo)) { message("No logo added.") - } else if (logo == "statzh"){ + } else if (logo == "statzh") { logo <- paste0(find.package("statR"), "/extdata/", statzh_logo) - } else if (logo == "zh"){ + } else if (logo == "zh") { logo <- paste0(find.package("statR"), "/extdata/", zh_logo) } @@ -122,22 +121,21 @@ inputHelperLogoPath <- function(logo){ #' #' @description Replaces default value "statzh" with the contact information of #' the Statistics Office of Canton Zurich, otherwise returns the input value. -#' @param contact A character vector with contact information #' @param compact A boolean which controls the format of the contact information. Default: FALSE #' @returns A character vector #' @keywords internal #' @noRd -inputHelperContactInfo <- function(contact, compact = FALSE){ - - if (contact == "statzh"){ - if (compact){ - contact <- statzh_contact_compact - } else { - contact <- statzh_contact - } +inputHelperContactInfo <- function(compact = FALSE) { + + phone <- inputHelperPhone(getOption("statR_phone")) + + if (compact) { + return(c(paste(getOption("statR_name"), phone, sep = ", "), + getOption("statR_email"))) } - return(contact) + return(c(getOption("statR_organization"), getOption("statR_name"), + phone, getOption("statR_email"))) } @@ -150,8 +148,8 @@ inputHelperContactInfo <- function(contact, compact = FALSE){ #' @returns A character vector #' @keywords internal #' @noRd -inputHelperOfficeHours <- function(openinghours){ - if (openinghours == "statzh"){ +inputHelperOfficeHours <- function(openinghours) { + if (openinghours == "statzh") { openinghours <- statzh_openinghours } @@ -161,20 +159,34 @@ inputHelperOfficeHours <- function(openinghours){ #' inputHelperHomepage() #' -#' @description Replace default values "zh" and "statzh" with the homepage of -#' the Statistics Office of Canton Zurich, otherwise returns the input value. -#' @note Converts input to 'hyperlink' object. +#' @description Formats homepage as a hyperlink object. #' @param homepage A character string #' @returns A character string or a 'hyperlink' object #' @keywords internal #' @noRd -inputHelperHomepage <- function(homepage){ - homepage <- sub("statzh", statzh_homepage, homepage) - class(homepage) <- 'hyperlink' +inputHelperHomepage <- function(homepage) { + if (!is.null(homepage)) { + class(homepage) <- "hyperlink" + } return(homepage) } +#' inputHelperPhone() +#' +#' @description Formats phone number +#' @param homepage A character string +#' @returns A character string or a 'hyperlink' object +#' @keywords internal +#' @noRd +inputHelperPhone <- function(phone, prefix = getOption("statR_prefix_phone")) { + if (!is.null(phone)) { + phone <- paste(prefix, phone) + } + + return(phone) +} + #' inputHelperDateCreated() #' @@ -186,7 +198,7 @@ inputHelperHomepage <- function(homepage){ #' @seealso format #' @noRd inputHelperDateCreated <- function(prefix = getOption("prefix_date"), - date_format = getOption("date_format")){ + date_format = getOption("date_format")) { paste(prefix, format(Sys.Date(), format = date_format)) } @@ -200,10 +212,15 @@ inputHelperDateCreated <- function(prefix = getOption("prefix_date"), #' @seealso format #' @noRd inputHelperOrderNumber <- function(order_num, - prefix = getOption("prefix_order_id")){ - paste(prefix, order_num) + prefix = getOption("prefix_order_id")) { + if (!is.null(order_num)) { + order_num <- paste(prefix, order_num) + } + + return(order_num) } + #' inputHelperAuthorName() #' #' @description Function extracts initials from global environment if @@ -215,8 +232,8 @@ inputHelperOrderNumber <- function(order_num, #' @noRd #' inputHelperAuthorName <- function(author, - prefix = getOption("prefix_author")){ - if (author == "user"){ + prefix = getOption("prefix_author")) { + if (author == "user") { sys_vals <- c(Sys.getenv("USERNAME"), Sys.getenv("USER")) author_name <- sys_vals[which(sys_vals != "")[1]] author <- stringr::str_sub(author_name, start = 6, end = 7) @@ -235,20 +252,20 @@ inputHelperAuthorName <- function(author, #' @returns A list containing row indices and column indices #' @keywords internal #' @importFrom utils stack -excelIndexToRowCol <- function(index){ +excelIndexToRowCol <- function(index) { splitIndex <- function(x, split = "") unlist(strsplit(x, split)) - excelColumnLetterToNumeric <- function(x){ + excelColumnLetterToNumeric <- function(x) { chars <- splitIndex(x, "") offsets <- 26^(length(chars):1 - 1) sum(offsets * match(chars, LETTERS)) } # Return extent of combined region - if (length(index) > 1){ + if (length(index) > 1) { extents <- lapply(index, excelIndexToRowCol) - extents <- unique(do.call(rbind,lapply(extents, stack))) + extents <- unique(do.call(rbind, lapply(extents, stack))) rows <- extents[extents$ind == "row", "values"] cols <- extents[extents$ind == "col", "values"] return(list(row = seq(min(rows), max(rows)), @@ -279,10 +296,11 @@ excelIndexToRowCol <- function(index){ #' @returns A list with two numeric vectors row and col, containing #' row and column indices. #' @keywords internal -namedRegionExtent <- function(wb, sheetname, region_name = NULL, which = "both"){ +namedRegionExtent <- function(wb, sheetname, region_name = NULL, + which = "both") { named_regions <- openxlsx::getNamedRegions(wb) - if (!(sheetname %in% names(wb))){ + if (!(sheetname %in% names(wb))) { stop("Sheetname does not exist in Workbook") } @@ -292,23 +310,23 @@ namedRegionExtent <- function(wb, sheetname, region_name = NULL, which = "both") positions <- attr(named_regions, "position")[sheet_ind] - if (which == "both"){ + if (which == "both") { dimensions <- c("row", "col") } else { dimensions <- which } # If name is null, return full extent for sheet - if (all(is.null(region_name))){ + if (all(is.null(region_name))) { return(excelIndexToRowCol(positions)[dimensions]) } - region_ind <- unlist(sapply(region_name, function(region){ - which(grepl(paste0(region,"$"), region_names)) + region_ind <- unlist(sapply(region_name, function(region) { + which(grepl(paste0(region, "$"), region_names)) })) # Return extent for combined region - if (length(region_ind) > 0){ + if (length(region_ind) > 0) { return(excelIndexToRowCol(positions[region_ind])[dimensions]) } @@ -324,7 +342,7 @@ namedRegionExtent <- function(wb, sheetname, region_name = NULL, which = "both") #' @returns A numeric vector of row indices #' @keywords internal #' -namedRegionRowExtent <- function(wb, sheetname, region_name = NULL){ +namedRegionRowExtent <- function(wb, sheetname, region_name = NULL) { unlist(namedRegionExtent(wb, sheetname, region_name, "row")) } @@ -336,7 +354,7 @@ namedRegionRowExtent <- function(wb, sheetname, region_name = NULL){ #' @returns A numeric vector of column indices #' @keywords internal #' -namedRegionColumnExtent <- function(wb, sheetname, name = NULL){ +namedRegionColumnExtent <- function(wb, sheetname, name = NULL) { unlist(namedRegionExtent(wb, sheetname, name, "col")) } @@ -347,7 +365,7 @@ namedRegionColumnExtent <- function(wb, sheetname, name = NULL){ #' @inheritParams namedRegionExtent #' @returns Numeric value corresponding to first row of named region #' @keywords internal -namedRegionFirstRow <- function(wb, sheet, region_name = NULL){ +namedRegionFirstRow <- function(wb, sheet, region_name = NULL) { min(namedRegionRowExtent(wb, sheet, region_name)) } @@ -358,7 +376,7 @@ namedRegionFirstRow <- function(wb, sheet, region_name = NULL){ #' @inheritParams namedRegionExtent #' @returns Numeric value corresponding to last row of named region #' @keywords internal -namedRegionLastRow <- function(wb, sheet, region_name = NULL){ +namedRegionLastRow <- function(wb, sheet, region_name = NULL) { max(namedRegionRowExtent(wb, sheet, region_name)) } @@ -369,7 +387,7 @@ namedRegionLastRow <- function(wb, sheet, region_name = NULL){ #' @inheritParams namedRegionExtent #' @returns Numeric value corresponding to first column of named region #' @keywords internal -namedRegionFirstCol <- function(wb, sheet, region_name = NULL){ +namedRegionFirstCol <- function(wb, sheet, region_name = NULL) { min(namedRegionColumnExtent(wb, sheet, region_name)) } @@ -380,6 +398,6 @@ namedRegionFirstCol <- function(wb, sheet, region_name = NULL){ #' @inheritParams namedRegionExtent #' @returns Numeric value corresponding to last column of named region #' @keywords internal -namedRegionLastCol <- function(wb, sheet, region_name = NULL){ +namedRegionLastCol <- function(wb, sheet, region_name = NULL) { max(namedRegionColumnExtent(wb, sheet, region_name)) } diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index 923232f..141d8b2 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -5,11 +5,13 @@ #' @param sheet_row Row where hyperlink should be inserted #' @param index_sheet_name Name of sheet where hyperlink should be created #' @keywords internal -insert_hyperlink <- function(wb, sheetname, title, sheet_row, index_sheet_name){ +insert_hyperlink <- function(wb, sheetname, title, sheet_row, + index_sheet_name) { - openxlsx::writeData(wb, index_sheet_name, title, - startCol = 3, startRow = sheet_row) - openxlsx::addStyle(wb, index_sheet_name, hyperlinkStyle(), sheet_row, cols = 3) + openxlsx::writeData(wb, index_sheet_name, title, startCol = 3, + startRow = sheet_row) + openxlsx::addStyle(wb, index_sheet_name, hyperlinkStyle(), sheet_row, + cols = 3) openxlsx::mergeCells(wb, index_sheet_name, rows = sheet_row, cols = 3:8) # Set up hyperlink ------- @@ -23,7 +25,8 @@ insert_hyperlink <- function(wb, sheetname, title, sheet_row, index_sheet_name){ field_f <- wb$worksheets[[worksheet]]$sheet_data$f field_f[length(field_f)] <- paste0("=HYPERLINK("#'", sheetname, - "'!A1", "", title, "")") + "'!A1", "", title, + "")") wb$worksheets[[worksheet]]$sheet_data$t <- as.integer(field_t) wb$worksheets[[worksheet]]$sheet_data$v <- field_v @@ -41,16 +44,14 @@ insert_hyperlink <- function(wb, sheetname, title, sheet_row, index_sheet_name){ #' @param sheet_start_row Initial row after which hyperlinks should be created #' @keywords insert_hyperlinks #' @export -insert_hyperlinks <- function(wb, sheetnames, titles, index_sheet_name = "Index", - sheet_start_row = 15){ +insert_hyperlinks <- function(wb, sheetnames, titles, + index_sheet_name = "Index", + sheet_start_row = 15) { sheet_rows <- sheet_start_row + seq(0, length(sheetnames) - 1) - list(sheetnames, titles, sheet_rows) %>% - purrr::pwalk(~insert_hyperlink(wb, - sheetname = ..1, - title = ..2, + purrr::pwalk(~insert_hyperlink(wb, sheetname = ..1, title = ..2, sheet_row = ..3, index_sheet_name = index_sheet_name)) } diff --git a/R/insert_image.R b/R/insert_image.R index 9ac8f94..ebc26c8 100644 --- a/R/insert_image.R +++ b/R/insert_image.R @@ -26,45 +26,44 @@ #' @export insert_worksheet_image <- function(wb, sheetname, image, startrow = 3, startcol = 3, width, height, - units = "in", dpi = 300){ + units = "in", dpi = 300) { # If image is.null, pass if (is.null(image)) return() else if (is.character(image)) image_path <- image - else if (checkImplementedPlotType(image)){ + else if (checkImplementedPlotType(image)) { image_path <- tempfile(fileext = ".png") - } - else { + } else { stop("Plot muss als ggplot Objekt oder als Filepath vorliegen.") } # Create png of plot ---------- - if (is(image, "histogram")){ + if (is(image, "histogram")) { grDevices::png(image_path, width = width, height = height, units = units, res = dpi) plot(image) grDevices::dev.off() } - else if (is(image, "gg") | is(image, "ggplot2")){ + else if (is(image, "gg") | is(image, "ggplot2")) { ggplot2::ggsave(image_path, plot = image, device = "png", width = width, height = height, units = units, dpi = dpi) } # If file not found at image_path, warn and pass - if (!file.exists(image_path)){ + if (!file.exists(image_path)) { warning("Image not found.") return() } # Add worksheet if not already defined --------- - if (!(sheetname %in% names(wb))){ + if (!(sheetname %in% names(wb))) { openxlsx::addWorksheet(wb, sheetName = sheetname, gridLines = FALSE) } diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index a4b83c7..313729b 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -11,11 +11,11 @@ insert_index_sheet <- function(wb, sheetname = "Index", title, auftrag_id, - logo = "statzh", - contactdetails = "statzh", - homepage = "statzh", - openinghours = "statzh", - source = "statzh"){ + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), + homepage = getOption("statR_homepage"), + openinghours = getOption("statR_openinghours"), + source = getOption("statR_source")) { # Initialize new worksheet as index sheet ------ openxlsx::addWorksheet(wb, sheetname) @@ -30,24 +30,21 @@ insert_index_sheet <- function(wb, # Insert contact info, title, metadata, and sources into worksheet -------- ### Contact information - openxlsx::writeData(wb, sheetname, - x = inputHelperContactInfo(contactdetails), + openxlsx::writeData(wb, sheetname, contactdetails, startCol = 15, startRow = 2, name = paste(sheetname,"contact", sep = "_")) ### Office hours - openxlsx::writeData(wb, sheetname, - inputHelperOfficeHours(openinghours), + openxlsx::writeData(wb, sheetname, openinghours, startCol = 18, startRow = namedRegionFirstRow(wb, sheetname, "contact"), - name = paste(sheetname,"officehours", sep = "_")) + name = paste(sheetname, "officehours", sep = "_")) ### Homepage - openxlsx::writeData(wb, sheetname, - x = inputHelperHomepage(homepage), + openxlsx::writeData(wb, sheetname, inputHelperHomepage(homepage), startCol = 15, startRow = namedRegionLastRow(wb, sheetname, "contact") + 1, - name = paste(sheetname,"homepage", sep = "_")) + name = paste(sheetname, "homepage", sep = "_")) @@ -64,12 +61,12 @@ insert_index_sheet <- function(wb, ), startCol = 15, startRow = namedRegionLastRow(wb, sheetname, "homepage") + 3, - name = paste(sheetname,"info", sep = "_")) + name = paste(sheetname, "info", sep = "_")) ### Title openxlsx::writeData(wb, sheetname, title, 3, namedRegionLastRow(wb, sheetname, "info") + 1, - name = paste(sheetname,"title", sep = "_")) + name = paste(sheetname, "title", sep = "_")) openxlsx::addStyle(wb, sheetname, style_maintitle(), namedRegionLastRow(wb, sheetname, "title"), 3) @@ -78,12 +75,12 @@ insert_index_sheet <- function(wb, inputHelperSource(source, collapse = "; "), startCol = 3, startRow = namedRegionLastRow(wb, sheetname, "title") + 1, - name = paste(sheetname,"source", sep = "_")) + name = paste(sheetname, "source", sep = "_")) ### Table of content caption openxlsx::writeData(wb, sheetname, getOption("toc_title"), 3, namedRegionLastRow(wb, sheetname, "source") + 3, - name = paste(sheetname,"toc", sep = "_")) + name = paste(sheetname, "toc", sep = "_")) openxlsx::addStyle(wb, sheetname, subtitleStyle(), namedRegionLastRow(wb, sheetname, "toc"), 3) diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index 0395d2e..25916f2 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -17,11 +17,11 @@ insert_metadata_sheet <- function(wb, sheetname = "Metadaten", title = "Title", - source = "statzh", + source = getOption("statR_source"), metadata = NA, - logo = "statzh", - contactdetails = "statzh", - author = "user"){ + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(compact = TRUE), + author = "user") { # Add a new worksheet ------ sheetname <- verifyInputSheetname(sheetname) @@ -37,8 +37,8 @@ insert_metadata_sheet <- function(wb, # Insert contact info, title, metadata, and sources into worksheet -------- ### Contact info - openxlsx::writeData(wb, sheetname, inputHelperContactInfo(contactdetails), - 12, 2, name = paste(sheetname,"contact", sep = "_")) + openxlsx::writeData(wb, sheetname, contactdetails, + 12, 2, name = paste(sheetname, "contact", sep = "_")) ### Request information openxlsx::writeData(wb, sheetname, @@ -46,7 +46,7 @@ insert_metadata_sheet <- function(wb, inputHelperAuthorName(author)), startCol = 12, startRow = namedRegionLastRow(wb, sheetname, "contact") + 1, - name = paste(sheetname,"info", sep = "_")) + name = paste(sheetname, "info", sep = "_")) ### Headerline openxlsx::addStyle(wb, sheetname, style_headerline(), @@ -56,19 +56,18 @@ insert_metadata_sheet <- function(wb, ### Title openxlsx::writeData(wb, sheetname, title, startRow = namedRegionLastRow(wb, sheetname, "info") + 3, - name = paste(sheetname,"title", sep = "_")) + name = paste(sheetname, "title", sep = "_")) openxlsx::addStyle(wb, sheetname, style_title(), rows = namedRegionLastRow(wb, sheetname, "title"), cols = 1) ### Source and metadata - openxlsx::writeData(wb, sheetname, - inputHelperSource(source), + openxlsx::writeData(wb, sheetname, inputHelperSource(source, collapse = NULL), startRow = namedRegionLastRow(wb, sheetname, "title") + 1, - name = paste(sheetname,"source", sep = "_")) + name = paste(sheetname, "source", sep = "_")) openxlsx::writeData(wb, sheetname, - inputHelperMetadata(metadata), + inputHelperMetadata(metadata, collapse = NULL), startRow = namedRegionLastRow(wb, sheetname, "source") + 1, - name = paste(sheetname,"metadata", sep = "_")) + name = paste(sheetname, "metadata", sep = "_")) openxlsx::addStyle(wb, sheetname, style_subtitle2(), c(namedRegionFirstRow(wb, sheetname, "source"), namedRegionFirstRow(wb, sheetname, "metadata")), 1) diff --git a/R/insert_second_header.R b/R/insert_second_header.R index 7690757..c74f346 100644 --- a/R/insert_second_header.R +++ b/R/insert_second_header.R @@ -5,12 +5,12 @@ #' @param data_start_row Row index for first row with data #' @keywords internal insert_second_header <- function(wb, sheetname, data_start_row, group_names, - grouplines, data){ + grouplines, data) { - if (is.character(grouplines)){ + if (is.character(grouplines)) { groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) - } else if (is.numeric(grouplines)){ + } else if (is.numeric(grouplines)) { groupline_numbers <- grouplines } diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 150ce21..59d1909 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -37,14 +37,14 @@ insert_worksheet <- function(wb, sheetname = "Daten", data, title = "Title", - source = "statzh", + source = getOption("statR_source"), metadata = NA, - logo = "statzh", - contactdetails = "statzh", - homepage = "statzh", + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), + homepage = getOption("statR_homepage"), author = "user", grouplines = NA, - group_names = NA){ + group_names = NA) { # Initialize new worksheet ------ sheetname <- verifyInputSheetname(sheetname) @@ -62,13 +62,11 @@ insert_worksheet <- function(wb, ### Contact info contact_start_col <- max(ncol(data) - 2, 4) - openxlsx::writeData(wb, sheetname, - x = inputHelperContactInfo(contactdetails), + openxlsx::writeData(wb, sheetname, contactdetails, contact_start_col, 2, name = paste(sheetname, "contact", sep = "_")) - openxlsx::writeData(wb, sheetname, - x = inputHelperHomepage(homepage), + openxlsx::writeData(wb, sheetname, inputHelperHomepage(homepage), contact_start_col, namedRegionLastRow(wb, sheetname, "contact") + 1, name = paste(sheetname, "homepage", sep = "_")) diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R index db50d9f..9aa5e84 100644 --- a/R/insert_worksheet_nh.R +++ b/R/insert_worksheet_nh.R @@ -28,15 +28,15 @@ insert_worksheet_nh <- function(wb, sheetname = "Daten", data, title = "Title", - source = "statzh", + source = getOption("statR_source"), metadata = NA, grouplines = NA, - group_names = NA){ + group_names = NA) { # Initialize new worksheet ------ sheetname <- verifyInputSheetname(sheetname) - if (!(sheetname %in% names(wb))){ + if (!(sheetname %in% names(wb))) { openxlsx::addWorksheet(wb, sheetname) start_row <- 1 @@ -54,7 +54,7 @@ insert_worksheet_nh <- function(wb, openxlsx::writeData(wb, sheetname, inputHelperSource(source), startRow = namedRegionLastRow(wb, sheetname, "title") + 1, - name = paste(sheetname,"source", sep = "_")) + name = paste(sheetname, "source", sep = "_")) openxlsx::addStyle(wb, sheetname, style_subtitle(), namedRegionFirstRow(wb, sheetname, "source"), 1, stack = TRUE, gridExpand = TRUE) @@ -63,7 +63,7 @@ insert_worksheet_nh <- function(wb, openxlsx::writeData(wb, sheetname, inputHelperMetadata(metadata), startRow = namedRegionLastRow(wb, sheetname, "source") + 1, - name = paste(sheetname,"metadata", sep = "_")) + name = paste(sheetname, "metadata", sep = "_")) openxlsx::addStyle(wb, sheetname, style_subtitle(), namedRegionFirstRow(wb, sheetname, "metadata"), 1, stack = TRUE, gridExpand = TRUE) @@ -84,16 +84,16 @@ insert_worksheet_nh <- function(wb, # Grouplines --------- - if (!any(is.null(grouplines)) & !any(is.na(grouplines))){ - if (is.numeric(grouplines)){ + if (!any(is.null(grouplines)) & !any(is.na(grouplines))) { + if (is.numeric(grouplines)) { groupline_numbers <- grouplines - } else if (is.character(grouplines)){ + } else if (is.character(grouplines)) { groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) } ### Insert second header - if (!any(is.null(group_names)) & !any(is.na(group_names))){ + if (!any(is.null(group_names)) & !any(is.na(group_names))) { insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) data_start_row <- data_start_row + 1 } diff --git a/R/interpolate.R b/R/interpolate.R index afece64..b4a43ca 100644 --- a/R/interpolate.R +++ b/R/interpolate.R @@ -11,14 +11,14 @@ #' number = 7) #' @keywords interpolate2 #' @export -interpolate2 <- function(palette, color, degree, number){ +interpolate2 <- function(palette, color, degree, number) { - if (degree < 1 | degree > 7){ + if (degree < 1 | degree > 7) { stop("degree out of range. Provide integer between 1-7.") } newpalette <- c() - for (i in palette){ + for (i in palette) { intcols <- c(i, color) pal <- grDevices::colorRampPalette(intcols) intcols <- pal(7) @@ -28,4 +28,3 @@ interpolate2 <- function(palette, color, degree, number){ pal <- grDevices::colorRampPalette(newpalette, space = "Lab") return(pal(number)) } - diff --git a/R/namespace.R b/R/namespace.R index 1b4be4d..1ffa469 100644 --- a/R/namespace.R +++ b/R/namespace.R @@ -2,16 +2,26 @@ #' #' @keywords internal .onLoad <- function(libname, pkgname) { + + # Set default values for some format options defaults <- list( date_format = "%d.%m.%Y", - prefix_date = "Aktualisiert am:", - prefix_author = "durch:", - prefix_source = "Quelle:", - prefix_metadata = "Hinweise:", - prefix_order_id = "Auftragsnr.:", - collapse_source = ";", - toc_title = "Inhalt" + statR_prefix_date = "Aktualisiert am:", + statR_prefix_author = "durch:", + statR_prefix_phone = "Tel.", + statR_prefix_source = "Quelle:", + statR_prefix_metadata = "Hinweise:", + statR_prefix_order_id = "Auftragsnr.:", + statR_collapse = ";", + statR_toc_title = "Inhalt" ) options(defaults) + + if ("persistent" %in% getUserConfigs()) { + readUserConfig("persistent") + + } else { + readUserConfig("default") + } } diff --git a/R/quickXLSX.R b/R/quickXLSX.R index 7130db2..f88fa3e 100644 --- a/R/quickXLSX.R +++ b/R/quickXLSX.R @@ -20,33 +20,25 @@ quickXLSX <- function(data = NA, file, title = "Title", - source = "statzh", + source = getOption("statR_source"), metadata = NA, - logo = "statzh", - contactdetails = "statzh", + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(compact = TRUE), author = "user", grouplines = NA, - group_names = NA){ + group_names = NA) { # Create workbook -------- wb <- openxlsx::createWorkbook() # Insert data -------- - insert_worksheet(wb, - sheetname = "Inhalt", - data = data, - title = title, - source = source, - metadata = metadata, - logo = logo, - contactdetails = contactdetails, - author = author, - grouplines = grouplines, - group_names = group_names) + insert_worksheet(wb, sheetname = "Inhalt", data = data, title = title, + source = source, metadata = metadata, logo = logo, + contactdetails = contactdetails, author = author, + grouplines = grouplines, group_names = group_names) # Save workbook--------- openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) } - diff --git a/R/quick_sum.r b/R/quick_sum.r index ff6151f..517e5bd 100644 --- a/R/quick_sum.r +++ b/R/quick_sum.r @@ -26,8 +26,8 @@ #' @importFrom rlang := .data #' @importFrom dplyr %>% #' @export -quick_sum <- function(df, var, ..., stats = "all", protect = FALSE){ - if (!stats %in% c("mean", "base", "all")){ +quick_sum <- function(df, var, ..., stats = "all", protect = FALSE) { + if (!stats %in% c("mean", "base", "all")) { stop("Please choose one of the following stats arguments: all, base, mean") } @@ -46,40 +46,49 @@ quick_sum <- function(df, var, ..., stats = "all", protect = FALSE){ n1 <- ifelse(protect, 3, 0) n2 <- ifelse(protect, 5, 0) - if(stats %in% c("base")){ + if (stats %in% c("base")) { df %>% dplyr::group_by(!!!grps) %>% dplyr::summarise( Anzahl = dplyr::n(), - !!mean_name := ifelse(Anzahl <= n1, NA, mean(!!var, na.rm = T)), - !!q25_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs = 0.25, na.rm = T)), - !!med_name := ifelse(Anzahl <= n1, NA, median(!!var, probs = 0.5, na.rm = T)), - !!q75_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs = 0.75, na.rm = T)) + !!mean_name := ifelse(Anzahl <= n1, NA, + mean(!!var, na.rm = TRUE)), + !!q25_name := ifelse(Anzahl <= n2, NA, + quantile(!!var, probs = 0.25, na.rm = TRUE)), + !!med_name := ifelse(Anzahl <= n1, NA, + median(!!var, probs = 0.5, na.rm = TRUE)), + !!q75_name := ifelse(Anzahl <= n2, NA, + quantile(!!var, probs = 0.75, na.rm = TRUE)) )%>% dplyr::ungroup() - } else if (stats %in% c("all")){ + } else if (stats %in% c("all")) { df %>% dplyr::group_by(!!!grps) %>% dplyr::summarise( Anzahl = dplyr::n(), - !!mean_name := ifelse(Anzahl <=n1, NA, mean(!!var, na.rm = T)), - !!sd_name := ifelse(Anzahl <= n2, NA, sd(!!var, na.rm = T)), - !!q10_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs=0.1, na.rm = T)), - !!q25_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs=0.25, na.rm = T)), - !!med_name := ifelse(Anzahl <= n1, NA, median(!!var, probs=0.5, na.rm = T)), - !!q75_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs=0.75, na.rm = T)), - !!q90_name := ifelse(Anzahl <= n2, NA, quantile(!!var, probs=0.9, na.rm = T)) + !!mean_name := ifelse(Anzahl <= n1, NA, mean(!!var, na.rm = TRUE)), + !!sd_name := ifelse(Anzahl <= n2, NA, sd(!!var, na.rm = TRUE)), + !!q10_name := ifelse(Anzahl <= n2, NA, + quantile(!!var, probs = 0.1, na.rm = TRUE)), + !!q25_name := ifelse(Anzahl <= n2, NA, + quantile(!!var, probs = 0.25, na.rm = TRUE)), + !!med_name := ifelse(Anzahl <= n1, NA, + median(!!var, probs = 0.5, na.rm = TRUE)), + !!q75_name := ifelse(Anzahl <= n2, NA, + quantile(!!var, probs = 0.75, na.rm = TRUE)), + !!q90_name := ifelse(Anzahl <= n2, NA, + quantile(!!var, probs = 0.9, na.rm = TRUE)) ) %>% dplyr::ungroup() - } else if (stats %in% c("mean")){ + } else if (stats %in% c("mean")) { df %>% dplyr::group_by(!!!grps) %>% dplyr::summarise( Anzahl = dplyr::n(), - !!mean_name := ifelse(Anzahl <= n1, NA, mean(!!var, na.rm = T)), - !!sd_name := ifelse(Anzahl <= n2, NA, sd(!!var, na.rm = T)) + !!mean_name := ifelse(Anzahl <= n1, NA, mean(!!var, na.rm = TRUE)), + !!sd_name := ifelse(Anzahl <= n2, NA, sd(!!var, na.rm = TRUE)) ) %>% dplyr::ungroup() } diff --git a/R/splitXLSX.R b/R/splitXLSX.R index 8f14cc7..0973d92 100644 --- a/R/splitXLSX.R +++ b/R/splitXLSX.R @@ -27,14 +27,14 @@ splitXLSX <- function(data, file, sheetvar, title = "Titel", - source = "statzh", + source = getOption("statR_source"), metadata = NA, - logo = "statzh", - contactdetails = "statzh", - homepage = "statzh", + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(compact = TRUE), + homepage = getOption("statR_homepage"), author = "user", grouplines = NA, - group_names = NA){ + group_names = NA) { # create workbook ------ wb <- openxlsx::createWorkbook() @@ -51,12 +51,11 @@ splitXLSX <- function(data, dplyr::filter((!!col_name) == sheetvalue) sheetname <- paste(deparse(substitute(sheetvar)), sheetvalue, sep = "_") - insert_worksheet(wb, sheetname = sheetname, - data = data_subset, title = sheettitle, source = source, - metadata = metadata, logo = logo, - contactdetails = contactdetails, homepage = homepage, - author = author, grouplines = grouplines, - group_names = group_names) + insert_worksheet(wb, sheetname = sheetname, data = data_subset, + title = sheettitle, source = source, metadata = metadata, + logo = logo, contactdetails = contactdetails, + homepage = homepage, author = author, + grouplines = grouplines, group_names = group_names) } # Reverse order diff --git a/R/styles.R b/R/styles.R index c94a0f9..bc1ea73 100644 --- a/R/styles.R +++ b/R/styles.R @@ -6,13 +6,13 @@ ### Metadata -style_metadata_title <- function(){ +style_metadata_title <- function() { openxlsx::createStyle(fontSize = 14, textDecoration = "bold", fontName = "Arial") } -style_metadata_subtitle <- function(){ +style_metadata_subtitle <- function() { openxlsx::createStyle(fontSize = 12, textDecoration = "bold", fontName = "Arial") } -style_metadata_headerline <- function(){ +style_metadata_headerline <- function() { openxlsx::createStyle(border = "Bottom", borderColour = "#009ee0", borderStyle = getOption("openxlsx.borderStyle", "thick")) } @@ -21,81 +21,90 @@ style_metadata_headerline <- function(){ ### worksheet -style_worksheet_title <- function(){ - openxlsx::createStyle(fontSize=14, textDecoration="bold",fontName="Arial") +style_worksheet_title <- function() { + openxlsx::createStyle(fontSize = 14, textDecoration = "bold", + fontName = "Arial") } -style_worksheet_subtitle <- function(){ - openxlsx::createStyle(fontSize=12, textDecoration="italic",fontName="Arial") -} -style_worksheet_header <- function(){ - openxlsx::createStyle(fontSize = 12, fontColour = "#000000", halign = "left", border="Bottom", borderColour = "#009ee0",textDecoration = "bold") + +style_worksheet_subtitle <- function() { + openxlsx::createStyle(fontSize = 12, textDecoration = "italic", + fontName = "Arial") } -style_worksheet_headerline <- function(){ +style_worksheet_header <- function() { + openxlsx::createStyle(fontSize = 12, fontColour = "#000000", halign = "left", + border = "Bottom", borderColour = "#009ee0", + textDecoration = "bold") } -### Worksheet no header +style_worksheet_headerline <- function() { +} -mainTitleStyle <- function(){ - openxlsx::createStyle(fontSize = 20, textDecoration = "bold", fontName = "Arial", - halign = "left") +### Worksheet no header + +mainTitleStyle <- function() { + openxlsx::createStyle(fontSize = 20, textDecoration = "bold", halign = "left", + fontName = "Arial") } -style_maintitle <- function(){ - openxlsx::createStyle(fontSize = 20, textDecoration = "bold", fontName = "Arial", - halign = "left") +style_maintitle <- function() { + openxlsx::createStyle(fontSize = 20, textDecoration = "bold", halign = "left", + fontName = "Arial") } -style_title <- function(){ - openxlsx::createStyle(fontSize = 14, textDecoration = "bold", fontName = "Arial") +style_title <- function() { + openxlsx::createStyle(fontSize = 14, textDecoration = "bold", + fontName = "Arial") } -subtitleStyle <- function(){ - openxlsx::createStyle(fontSize = 11, textDecoration = "bold", fontName = "Arial", - halign = "left") +subtitleStyle <- function() { + openxlsx::createStyle(fontSize = 11, textDecoration = "bold", halign = "left", + fontName = "Arial") } -style_subtitle <- function(){ - openxlsx::createStyle(fontSize = 12, textDecoration = "italic", fontName = "Arial") +style_subtitle <- function() { + openxlsx::createStyle(fontSize = 12, textDecoration = "italic", + fontName = "Arial") } -style_subtitle3 <- function(){ +style_subtitle3 <- function() { openxlsx::createStyle(fontSize = 11, fontName = "Calibri") } -style_subtitle2 <- function(){ - openxlsx::createStyle(fontSize = 12, textDecoration = "bold", fontName = "Arial") +style_subtitle2 <- function() { + openxlsx::createStyle(fontSize = 12, textDecoration = "bold", + fontName = "Arial") } - -hyperlinkStyle <- function(){ - openxlsx::createStyle(fontSize = 11, fontName = "Calibri", fontColour = "blue", - textDecoration = "underline") +hyperlinkStyle <- function() { + openxlsx::createStyle(fontSize = 11, fontName = "Calibri", + fontColour = "blue", textDecoration = "underline") } -style_header <- function(){ - openxlsx::createStyle(fontSize = 12, fontName = "Calibri", fontColour = "#000000", - halign = "left", border="Bottom", borderColour = "#009ee0", textDecoration = "bold") +style_header <- function() { + openxlsx::createStyle(fontSize = 12, fontName = "Calibri", halign = "left", + fontColour = "#000000", border="Bottom", + borderColour = "#009ee0", textDecoration = "bold") } # Linien -------------- -style_headerline <- function(){ +style_headerline <- function() { openxlsx::createStyle(border = "Bottom", borderColour = "#009ee0", borderStyle = getOption("openxlsx.borderStyle", "thick")) } -style_bottomline <- function(){ +style_bottomline <- function() { openxlsx::createStyle(border="Bottom", borderColour = "#009ee0") } -style_leftline <- function(){ +style_leftline <- function() { openxlsx::createStyle(border = "Left", borderColour = "#009ee0") } # Linewrap text --------- -style_wrap <- function(){ +style_wrap <- function() { openxlsx::createStyle(wrapText = TRUE) } diff --git a/R/theme_stat.r b/R/theme_stat.r index 2128a01..1c37983 100644 --- a/R/theme_stat.r +++ b/R/theme_stat.r @@ -27,10 +27,10 @@ #' }} theme_stat <- function(base_size = 11, axis.label.pos = "top", axis.lines = "x", - ticks = "x", major.grid.lines = "y", minor.grid.lines = "none", - map = FALSE){ + ticks = "x", major.grid.lines = "y", + minor.grid.lines = "none", map = FALSE) { - palette <- RColorBrewer::brewer.pal("Greys", n=9) + palette <- RColorBrewer::brewer.pal("Greys", n = 9) color.grid = palette[5] color.title = palette[9] color.axis = palette[7] @@ -38,19 +38,31 @@ theme_stat <- function(base_size = 11, axis.label.pos = "top", axis.lines = "x", theme_var <- ggplot2::theme_minimal(base_family = "Arial") + # TEXTE ggplot2::theme( - text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial"), - - plot.title = ggplot2::element_text(size = base_size*4/3, colour = color.title, face = "bold", family="Arial Black"), - plot.subtitle = ggplot2::element_text(size = base_size, color = color.title, face = "plain", family = "Arial"), - plot.caption = ggplot2::element_text(size = base_size, color = color.title, face = "plain", family = "Arial", hjust = 0), - - strip.text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial"), - - axis.title = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial"), - axis.text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial"), - - legend.title = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial"), - legend.text = ggplot2::element_text(size = base_size, color = color.axis, face = "plain", family = "Arial") + text = ggplot2::element_text(size = base_size, color = color.axis, + face = "plain", family = "Arial"), + + plot.title = ggplot2::element_text(size = base_size * 4 / 3, + colour = color.title, face = "bold", + family = "Arial Black"), + plot.subtitle = ggplot2::element_text(size = base_size, + color = color.title, face = "plain", + family = "Arial"), + plot.caption = ggplot2::element_text(size = base_size, + color = color.title, face = "plain", + family = "Arial", hjust = 0), + + strip.text = ggplot2::element_text(size = base_size, color = color.axis, + face = "plain", family = "Arial"), + + axis.title = ggplot2::element_text(size = base_size, color = color.axis, + face = "plain", family = "Arial"), + axis.text = ggplot2::element_text(size = base_size, color = color.axis, + face = "plain", family = "Arial"), + + legend.title = ggplot2::element_text(size = base_size, color = color.axis, + face = "plain", family = "Arial"), + legend.text = ggplot2::element_text(size = base_size, color = color.axis, + face = "plain", family = "Arial") ) # ACHSEN @@ -66,7 +78,7 @@ theme_stat <- function(base_size = 11, axis.label.pos = "top", axis.lines = "x", hjust.x <- 0.5 vjust.y <- 1 hjust.y <- 0.5 - } else if(axis.label.pos == "bottom"){ + } else if(axis.label.pos == "bottom") { vjust.x <- 0 hjust.x <- 0 vjust.y <- 1 @@ -74,14 +86,18 @@ theme_stat <- function(base_size = 11, axis.label.pos = "top", axis.lines = "x", } theme_var <- theme_var + - ggplot2::theme(axis.title.x = ggplot2::element_text(color=color.axis, vjust= vjust.x, hjust = hjust.x), - axis.title.y = ggplot2::element_text(color=color.axis, vjust= vjust.y, hjust = hjust.y)) + ggplot2::theme(axis.title.x = ggplot2::element_text(color = color.axis, + vjust = vjust.x, + hjust = hjust.x), + axis.title.y = ggplot2::element_text(color = color.axis, + vjust = vjust.y, + hjust = hjust.y)) ## Achsenlinien - if(axis.lines != "none"){ + if (axis.lines != "none") { - if(axis.lines == "both") { + if (axis.lines == "both") { theme_var <- theme_var + ggplot2::theme( axis.line = ggplot2::element_line(colour = color.axis, size = 0.2), @@ -112,21 +128,21 @@ theme_stat <- function(base_size = 11, axis.label.pos = "top", axis.lines = "x", ## Achsenticks - if(ticks != "none"){ - if(ticks == "x") { + if (ticks != "none") { + if (ticks == "x") { theme_var <- theme_var + ggplot2::theme( - #axis.ticks = ggplot2::element_line(colour = color.axis, size = 0.25), - axis.ticks.x = ggplot2::element_line(colour = color.axis, size = 0.25), + axis.ticks.x = ggplot2::element_line(colour = color.axis, + size = 0.25), axis.ticks.length = unit(0.1, "cm") ) } - if(ticks == "y") { + if (ticks == "y") { theme_var <- theme_var + ggplot2::theme( - #axis.ticks = ggplot2::element_line(colour = color.axis, size = 0.25), - axis.ticks.y = ggplot2::element_line(colour = color.axis, size = 0.25), + axis.ticks.y = ggplot2::element_line(colour = color.axis, + size = 0.25), axis.ticks.length = unit(0.1, "cm") ) } @@ -134,9 +150,10 @@ theme_stat <- function(base_size = 11, axis.label.pos = "top", axis.lines = "x", if(ticks == "both") { theme_var <- theme_var + ggplot2::theme( - #axis.ticks = ggplot2::element_line(colour = color.axis, size = 0.25), - axis.ticks.x = ggplot2::element_line(colour = color.axis, size = 0.25), - axis.ticks.y = ggplot2::element_line(colour = color.axis, size = 0.25), + axis.ticks.x = ggplot2::element_line(colour = color.axis, + size = 0.25), + axis.ticks.y = ggplot2::element_line(colour = color.axis, + size = 0.25), axis.ticks.length = unit(0.1, "cm") ) } @@ -157,22 +174,26 @@ theme_stat <- function(base_size = 11, axis.label.pos = "top", axis.lines = "x", if(minor.grid.lines == "x") { theme_var <- theme_var + ggplot2::theme( - panel.grid.minor.x = ggplot2::element_line(colour = color.grid, size = 0.1) + panel.grid.minor.x = ggplot2::element_line(colour = color.grid, + size = 0.1) ) } if(minor.grid.lines == "y") { theme_var <- theme_var + ggplot2::theme( - panel.grid.minor.y = ggplot2::element_line(colour = color.grid, size = 0.1) + panel.grid.minor.y = ggplot2::element_line(colour = color.grid, + size = 0.1) ) } if(minor.grid.lines == "both") { theme_var <- theme_var + ggplot2::theme( - panel.grid.minor.y = ggplot2::element_line(colour = color.grid, size = 0.1), - panel.grid.minor.x = ggplot2::element_line(colour = color.grid, size = 0.1) + panel.grid.minor.y = ggplot2::element_line(colour = color.grid, + size = 0.1), + panel.grid.minor.x = ggplot2::element_line(colour = color.grid, + size = 0.1) ) } } @@ -183,22 +204,26 @@ theme_stat <- function(base_size = 11, axis.label.pos = "top", axis.lines = "x", if(major.grid.lines == "x") { theme_var <- theme_var + ggplot2::theme( - panel.grid.major.x = ggplot2::element_line(colour = color.grid, size = 0.2) + panel.grid.major.x = ggplot2::element_line(colour = color.grid, + size = 0.2) ) } if(major.grid.lines == "y") { theme_var <- theme_var + ggplot2::theme( - panel.grid.major.y = ggplot2::element_line(colour = color.grid, size = 0.2) + panel.grid.major.y = ggplot2::element_line(colour = color.grid, + size = 0.2) ) } if(major.grid.lines == "both") { theme_var <- theme_var + ggplot2::theme( - panel.grid.major.y = ggplot2::element_line(colour = color.grid, size = 0.2), - panel.grid.major.x = ggplot2::element_line(colour = color.grid, size = 0.2) + panel.grid.major.y = ggplot2::element_line(colour = color.grid, + size = 0.2), + panel.grid.major.x = ggplot2::element_line(colour = color.grid, + size = 0.2) ) } } @@ -210,7 +235,7 @@ theme_stat <- function(base_size = 11, axis.label.pos = "top", axis.lines = "x", panel.spacing.y = unit(15, "pt"), strip.background = ggplot2::element_blank() - )+ + ) + # LEGEND ggplot2::theme( legend.box.spacing = unit(0, "cm"), diff --git a/R/user_config.R b/R/user_config.R new file mode 100644 index 0000000..353df96 --- /dev/null +++ b/R/user_config.R @@ -0,0 +1,66 @@ +#' getUserConfigs() +#' @description Returns a character vector of all user configurations +#' @export +getUserConfigs <- function() { + config_path <- system.file("extdata/config/", package = "statR") + list.files(config_path) +} + + +#' readUserConfig() +#' @description Reads a user config. By default loads the default config +#' @param name The name of the configuration +#' @export +readUserConfig <- function(name = "default") { + config_path <- system.file("extdata/config/", package = "statR") + config_file <- paste0(config_path, name) + + if (file.exists(config_file)) { + config <- yaml::read_yaml(config_file) + config[["statR_config_name"]] <- name + options(config) + } +} + + +#' writeUserConfig() +#' @description Writes a user config into a YAML file +#' @param name Name of the configuration +#' @param config_list List of options set by user +#' @export +writeUserConfig <- function(name, config_list) { + config_path <- system.file("extdata/config/", package = "statR") + config_list[["statR_config_name"]] <- name + yaml::write_yaml(config_list, paste0(config_path, name)) +} + + +#' getActiveConfigName() +#' @description Returns the name of the active config +#' @export +getActiveConfigName <- function() { + getOption("statR_config_name") +} + + +#' setActiveConfig() +#' @description Sets a configuration to active and optionally makes it +#' persistent +#' @param name Name of the configuration +#' @param persistent Whether to load the configuration by default on next +#' startup +#' @export +setActiveConfig <- function(name, persistent = FALSE) { + config_path <- system.file("extdata/config/", package = "statR") + config_file <- paste0(config_path, name) + + if (getActiveConfigName() != name & file.exists(config_file)) { + config <- yaml::read_yaml(config_file) + + if (persistent) { + writeUserConfig("persistent", config) + } + + options(config) + } +} diff --git a/inst/extdata/config/default b/inst/extdata/config/default new file mode 100644 index 0000000..c039f10 --- /dev/null +++ b/inst/extdata/config/default @@ -0,0 +1,13 @@ +statR_config_name: default +statR_organization: Statistisches Amt des Kantons Zürich +statR_name: Datashop +statR_phone: +41 43 259 75 00 +statR_email: datashop@statistik.zh.ch +statR_homepage: http://www.statistik.zh.ch +statR_openinghours: +- Bürozeiten +- Montag bis Freitag +- 09:00 bis 12:00 +- 13:00 bis 16:00 +statR_logo: statzh +statR_source: Statistisches Amt des Kantons Zürich diff --git a/inst/extdata/config/statzh b/inst/extdata/config/statzh new file mode 100644 index 0000000..70752a8 --- /dev/null +++ b/inst/extdata/config/statzh @@ -0,0 +1,13 @@ +statR_config_name: statzh +statR_organization: Statistisches Amt des Kantons Zürich +statR_name: Datashop +statR_phone: +41 43 259 75 00 +statR_email: datashop@statistik.zh.ch +statR_homepage: http://www.statistik.zh.ch +statR_openinghours: +- Bürozeiten +- Montag bis Freitag +- 09:00 bis 12:00 +- 13:00 bis 16:00 +statR_logo: statzh +statR_source: Statistisches Amt des Kantons Zürich diff --git a/man/aXLSX.Rd b/man/aXLSX.Rd index 7ba5eba..fe92dc7 100644 --- a/man/aXLSX.Rd +++ b/man/aXLSX.Rd @@ -8,10 +8,10 @@ aXLSX( data, file, title = "Title", - source = "statzh", + source = getOption("statR_source"), metadata = NA, - logo = "statzh", - contactdetails = "statzh", + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), author = "user", grouplines = NA, group_names = NA diff --git a/man/datasetsXLSX.Rd b/man/datasetsXLSX.Rd index 4cd7fca..2dd930e 100644 --- a/man/datasetsXLSX.Rd +++ b/man/datasetsXLSX.Rd @@ -9,18 +9,18 @@ datasetsXLSX( datasets, sheetnames, titles, + sources, plot_widths = NULL, plot_heights = NULL, - sources = "statzh", metadata = NA, grouplines = NA, group_names = NA, - index_title = "Inhalt", - index_source = "statzh", - logo = "statzh", - contactdetails = "statzh", - homepage = "statzh", - openinghours = "statzh", + index_title = getOption("statR_toc_title"), + index_source = getOption("statR_source"), + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), + homepage = getOption("statR_homepage"), + openinghours = getOption("statR_openinghours"), auftrag_id = NULL, overwrite = FALSE ) @@ -35,12 +35,12 @@ automatically.} \item{titles}{titles of the different sheets.} +\item{sources}{source of the data. Defaults to "statzh".} + \item{plot_widths}{width of figure in inch (1 inch = 2.54 cm). See details.} \item{plot_heights}{height of figure in inch (1 inch = 2.54 cm). See details.} -\item{sources}{source of the data. Defaults to "statzh".} - \item{metadata}{metadata information to be included. Defaults to NA.} \item{grouplines}{Column for second header(s). Format: List e.g list(c(2,4,6))} diff --git a/man/getActiveConfigName.Rd b/man/getActiveConfigName.Rd new file mode 100644 index 0000000..68b6cb3 --- /dev/null +++ b/man/getActiveConfigName.Rd @@ -0,0 +1,11 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user_config.R +\name{getActiveConfigName} +\alias{getActiveConfigName} +\title{getActiveConfigName()} +\usage{ +getActiveConfigName() +} +\description{ +Returns the name of the active config +} diff --git a/man/getUserConfigs.Rd b/man/getUserConfigs.Rd new file mode 100644 index 0000000..86947dd --- /dev/null +++ b/man/getUserConfigs.Rd @@ -0,0 +1,11 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user_config.R +\name{getUserConfigs} +\alias{getUserConfigs} +\title{getUserConfigs()} +\usage{ +getUserConfigs() +} +\description{ +Returns a character vector of all user configurations +} diff --git a/man/insert_index_sheet.Rd b/man/insert_index_sheet.Rd index 202ed3d..aba8683 100644 --- a/man/insert_index_sheet.Rd +++ b/man/insert_index_sheet.Rd @@ -9,11 +9,11 @@ insert_index_sheet( sheetname = "Index", title, auftrag_id, - logo = "statzh", - contactdetails = "statzh", - homepage = "statzh", - openinghours = "statzh", - source = "statzh" + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), + homepage = getOption("statR_homepage"), + openinghours = getOption("statR_openinghours"), + source = getOption("statR_source") ) } \arguments{ diff --git a/man/insert_metadata_sheet.Rd b/man/insert_metadata_sheet.Rd index 5101a73..b5c0471 100644 --- a/man/insert_metadata_sheet.Rd +++ b/man/insert_metadata_sheet.Rd @@ -8,10 +8,10 @@ insert_metadata_sheet( wb, sheetname = "Metadaten", title = "Title", - source = "statzh", + source = getOption("statR_source"), metadata = NA, - logo = "statzh", - contactdetails = "statzh", + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(compact = TRUE), author = "user" ) } diff --git a/man/insert_worksheet.Rd b/man/insert_worksheet.Rd index 4a19b33..0362345 100644 --- a/man/insert_worksheet.Rd +++ b/man/insert_worksheet.Rd @@ -9,11 +9,11 @@ insert_worksheet( sheetname = "Daten", data, title = "Title", - source = "statzh", + source = getOption("statR_source"), metadata = NA, - logo = "statzh", - contactdetails = "statzh", - homepage = "statzh", + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), + homepage = getOption("statR_homepage"), author = "user", grouplines = NA, group_names = NA diff --git a/man/insert_worksheet_nh.Rd b/man/insert_worksheet_nh.Rd index 6f90b66..c22f502 100644 --- a/man/insert_worksheet_nh.Rd +++ b/man/insert_worksheet_nh.Rd @@ -9,7 +9,7 @@ insert_worksheet_nh( sheetname = "Daten", data, title = "Title", - source = "statzh", + source = getOption("statR_source"), metadata = NA, grouplines = NA, group_names = NA diff --git a/man/quickXLSX.Rd b/man/quickXLSX.Rd index 270d350..7d98076 100644 --- a/man/quickXLSX.Rd +++ b/man/quickXLSX.Rd @@ -8,10 +8,10 @@ quickXLSX( data = NA, file, title = "Title", - source = "statzh", + source = getOption("statR_source"), metadata = NA, - logo = "statzh", - contactdetails = "statzh", + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(compact = TRUE), author = "user", grouplines = NA, group_names = NA diff --git a/man/readUserConfig.Rd b/man/readUserConfig.Rd new file mode 100644 index 0000000..064604f --- /dev/null +++ b/man/readUserConfig.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user_config.R +\name{readUserConfig} +\alias{readUserConfig} +\title{readUserConfig()} +\usage{ +readUserConfig(name = "default") +} +\arguments{ +\item{name}{The name of the configuration} +} +\description{ +Reads a user config. By default loads the default config +} diff --git a/man/setActiveConfig.Rd b/man/setActiveConfig.Rd new file mode 100644 index 0000000..feaf1aa --- /dev/null +++ b/man/setActiveConfig.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user_config.R +\name{setActiveConfig} +\alias{setActiveConfig} +\title{setActiveConfig()} +\usage{ +setActiveConfig(name, persistent = FALSE) +} +\arguments{ +\item{name}{Name of the configuration} + +\item{persistent}{Whether to load the configuration by default on next +startup} +} +\description{ +Sets a configuration to active and optionally makes it + persistent +} diff --git a/man/splitXLSX.Rd b/man/splitXLSX.Rd index cf39213..a189f28 100644 --- a/man/splitXLSX.Rd +++ b/man/splitXLSX.Rd @@ -9,11 +9,11 @@ splitXLSX( file, sheetvar, title = "Titel", - source = "statzh", + source = getOption("statR_source"), metadata = NA, - logo = "statzh", - contactdetails = "statzh", - homepage = "statzh", + logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(compact = TRUE), + homepage = getOption("statR_homepage"), author = "user", grouplines = NA, group_names = NA diff --git a/man/writeUserConfig.Rd b/man/writeUserConfig.Rd new file mode 100644 index 0000000..464d075 --- /dev/null +++ b/man/writeUserConfig.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user_config.R +\name{writeUserConfig} +\alias{writeUserConfig} +\title{writeUserConfig()} +\usage{ +writeUserConfig(name, config_list) +} +\arguments{ +\item{name}{Name of the configuration} + +\item{config_list}{List of options set by user} +} +\description{ +Writes a user config into a YAML file +} diff --git a/test_out.xlsx b/test_out.xlsx deleted file mode 100644 index dedad19d51c4cf269431ee6f8815fefdc8d5b7a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44878 zcmaHxQ>)^dMu%QbXH!}`-7%NZLf0Y}>u4qAucFp=nlX1SQEY26V{%2E2iuegi;fH1*1w1!wm^?bYhqhNhRMgG@pz?Eil+j z-u?E|0GGFcDqd8D);2xmpZgzK?EYr#+%=}nhU;+71G~#!QEw*0weuG7!WCLT(vZQZ zPFeoMi0`0bz^G?4Z)n>(`Dkac#}^Bm6W^KS?nX%oUTW2tr{CK$#lF!PyuoAqXxrKU zS%#CB0t45-+HAh~2S5r406_k~MTGQkg_e-5jgyIulb*7>or$9kt(&#gw92^606qM7 z^4Mxbnn*=OL|^`7y-0wMUwG&cVLgrK+E346op_!gzc6Jgd;O`kk=PB~stE#3zq^Uk z0H=MXNS+c=@(kh&)4Nr7-B{tABC@E^0PEhm-CV8}^;=lo1{t+jQ*G8KbEx9mn)+N5 zBU25scrNXsYLR0+;BCw1EH?|LfDsfh7}nFS0VyhoD4u1;&PN@m(fno$tvHEvG9cc` zdu~|y0vWi0b-tp1(^RTv&YDH~x^ywVOb0mxqUR;QcrLKM#?T6dp@R{Bk?0#!1}vm+ z=2;CK13@KbF4bjj*M z>5iKl=Ak0FPGRiR>)^|J`=*eHqsZPw_UZE6U-ozZ-jPrzLloJOpJN|9t^%w_S3F|h z*W8C!Tw>qa^RKQBYp~w`)UbGLyD1P50H6x&f2tw;zZx3b8p%7@+Bwo0*xCK3fZ4MQ zQ2z=Tvfqo?U|A6uR)iw3{Rhk$Zd?WUT4yYK;m4CGfRhWCj(f{&RcN;y%s3{fIY)-7 z8h|G_Y*jN??sHs`3N^IfIY|BzLA@5sb1Dg6>W?Z2f6cQDadnh|Z{W^-lQDI1@fH__ zSr4Yg=9z)i&kk@zy4vzUAHE;p0I@g!H>w)kI~vT9-tYY}bIAdVOQIrLcVa_5hj4Cq zIZ87Yx6{g(sAbP!2HAh4*72acSN{`&{ZHD%Hr=!Q?+$tK$`<2I-N5ej^F+|d-5g8CEwst0H{bqQexlfYdmXkD2swH0! zh-HUo?CUWirLb;=s$>}#^6TQvkp6V6seKbc7$Zt8*wxt&+8)=p^=Qy3un;5?k~Ahs zueuA2XQ86adWR=^4d0!gE&p%8rUj ze{J!&>3V=g)VxDM-hln5V9#0)y4wPb6R3V6jbNhIj~{su{i1wx@`(ss}SEt2GEf0PZ!DNs+4xdyxZB1z-JM1n-|(&#>I{3p@O3oitY`W2Kr!{Qb? zsT)fGhc;cWezD=t5*h~6f zH~bU$9}E5W-zWP2hv2`8pH`igeWZu)@|81q|JesE0#X4MRK_R%1KtmeZnmiYM)r`= z(#3<7RZyf2FGK9%SU7bxbydT}x2ry=3NP=O`go;3fWdwYb)CZD>(lY!JAfg24*9n$ zFsm2%;j!_(1iX=j7N~F)XXY&Jk#fX?^iKt3)ex{=U}0%7oT?~iNHKYUHc}nSfgNKy zWEJoj5S3q>xSU%gnXkWTvCHPGuW~eEn(NH1<=WZtJR(S_t0j1DK;cH9RL ztNk5>5?03J;$Igh!NTetN1v>0(@`Z_M3d@e_Utvyb5%G^o}ha6mT0$D%$&gUfU3hO z38~CDGmsF39z02c8!iUylz!sN|LJR`rd3U87tW?_jIKE;57*`0*v!p)JT zN!UvTutZH({jQMO&YRbD7Jg%v@NE`>8XJb2$lk-fmaCrNXsv4;f{p2P)iTD64r7AC zqHM|@Z^5QtmRvbAy#Ki3wXZdH?w=$4ApR#;{HMwI7b?~!#(xdy{#qNDnK01W*_d5- zo5*YHps}D6{0ZGd#ODX<-==Bn{5OQa;RWmVZf>Pe|o+8im#!krITl%qkFPLr`>hA z?Qc^OQ0HCo`p!|Bed|_Vx7ALF+)_=|;;B~m)2HtSe;%sqZNXZG&Bjjlduc=V63C4F z`i-T?Nt7Uv*rF5{I^io;gIC+gcf)E!vx%WK5DZUB+g4c^@QaQHuf7r75P$Exp25}z z4XM>W2IAbd^Wu^@qu?ZyWRC_xE5{fwW|SPv7kpQ4MjkFD8?pSHf{`7d`T8oRzcC{G zel{xZ_3ri>=>5Ec0Z#e$R?q+Nc@F;amHwL9zWLt9q_dW5gk|*NG@`3(XlSt8O|xoh zX<=Qd9w;ctgUaCELU*IOZFu7{-ZRkC-)vQ7XJ=Q#xu}sMbBF)v>UwD=?7t=zS;~Se zv=mFHL5@uj`pZc)r^W_(Yq@aWoq2exe57od+@Fu9%A;mZ9&_i8g&*xsRZ(<~jkWmb zu82@54M(S8_A7p|kp%G1w+9D%8r`NWj@E^R-FmNHZmVngx7sTB>VHAZqv?g^*HIAV z2lMnenNed>J&+2EAbm}NG#|A_N|l@(6%5v79>tjf8l{|=pAvzdA%jG=Tk z$AG^%pN9Ti-a;#`BT}3;H^=9H*&O2W27~amHw?^9Toh!zTjM?6{xRkA z18yJgW1|$gs1J!FJt#66>*Gg4hDphy#*WP`#;4(+k&)v`yqw;3ZS0pxN=Z4D(d>`FmFaV!MkO_#k)0KH51T&Wb zEpY+|op!!8z#um6H&e(YU}$YD^Bn5rhxcpoDj_ZHoG8bX)EAJ^n-G%T1aUNDe>t{f ztPuYE@8oSFlL*C?yffw7?^IE&Bcr|N4WAQx*A8T4*wN&WnJ4a(Q#}Gi{~st@%~Y~1 zXQ!mUEZR<{CMG-$o6ZFZ)I*#krNP0We3Tg`SfrYy<{8EMdo?=9cDkmV(-oH}=)X+o zRmrVf?j`4-=+LajTIOCL2QG~mqtfacn)98!SV2*!@w3;H=$<+Rm8 zA|d%9w3|~0M310r`-5=$vXe8?aND$ym!Q$Qy)x5z->InWB ztiB>VHZ;Lx6?3Pd5s-O|wgcOib5ncrT1f``Erw574FSBXghUY$5uvvT#EhR;)r!gc z8GH%mfO=H}9K zeWFQtG}uJF&1w35f5ZcCZftx6PjIvoLN_S8b72QAdHtfNngk&^9n#wRkcFqy;^K|D zQes(Vvw^1tpwdk9sm4+eQ_NWKv6CHvWANqvxEkh6oNW)A-n7w8y?_kEf$L6qkKgKR z(~Ms)`&U~!ZS=zhPYdYfc9R7rrZO|9-+t&yXG~;~NfxE)I`k~p;!GY1<{{G>BwT8|P-s?!Ux$MNn z!M+jeb8LD8mdX;tOqJ)G&DJ>NSFz%mB}Mw7Lsdm(c?3u>FE3~>ai|+kEu(oV7KesL zFClarEVgKRhl^IDt=A^t8`!<$@}h#5cw1Y()Pi=rB;O z$8i33eR(DnOoWpSZFIZ=yUo`g9h;{Kg^nsx8;vSGRM8_)$V*H0K}KBs?CXnLNENe$ zJ$-n423Fi5nTBSiR zR`Ra8bz@W12&vC|y$}DHP--h1e;BrXr)Lrl!$>GLvtLI?hu8iPw)z?^@%9lqkiw{k|c9|lomRl+?r z5p$0{=&6FhCEg?s@E8f%`&v&h2oh<890X&ak#2`=^O_*@JiWaBKzm{#8=n)~A_5Hc zzy!CeY2Gd;S4P!xs$>;Mom}>+g?hzj?*-5m8)jwuj@?*~$PqRoWAMOP*0V4bj-f-9 zAYkcQu_~pkGOTe^Xy3>f^!E0mMT*B^gQE#j*zCele%+z1GW&uj`viR_{aF&4^JCV!&^4d+K&k>it7C!DT!QCWinw)TkxJA8oQ z=GZsJYV*;Z_~|aL6~8V#!+(pyx6Q3%u@rk9arr4bX1Oge>d7ADchEwy#$?Jce|Tcw z{|-TA3ZN$PNzSSjzp|D>o!gyRUm4#8nD6DQn<#X8IJzkSaS5wTfV7G$C6^ZTkJxe*24}oClW}*^Xpuo&s0@XQX)3BAxhc{RLn{!^V{&=GM**sq=Mv@E z>VqYYhp9%mbyNh1&C^1==&m_pyJRGoi=)(5&3-;~>_b^VuTSLkw#uN2HR+M(63$bmh~aYzzeCn!p$# z+g--^6fdOb{b=%*{XwD}11LmUKTA&hj*zoVHD~nLsxt7pNX-n;TQzlE(9GzWpN+^3 zJgo9XjgL<1$3dfNo>`e?Go1dRM+_g?)X!N+Cng#6>Vc=3RSv1$>R4;M6;HuZ%k1qf zQ@7w6*Qc);&@WuVT)A*0L{Un=F0IuJA5Xk-weGt*vQxA5N(M6JOgU&;FBj)rXUUE- z^|UXMszvl#q2Jb|@e^cp&>~Oa&>5Vp)MWc?kZYfZsfFh0xVBwcsazdc2zF(i{Bt`n zI_9-^oYJmFX!?T=kTnQE|CW%Epup@X?M5V$$LIKnlmJk!xcIMuiAYu)j!YG~j79Kt zG36YY#i}XFf`~3xvEBNei^qqbXkX899YLTJj_$w+?qPq(G#5)&7Z==;#(z;+iGwfr zpkF|;RixS6Ub#U60je?+m1%J#N$k)OtbEuXQx!z|eWiXH{IVl5GI5A)q8^}`f9bMW z;WP(mwDI#5%gV_6#Ys*9M2%qt1vnm=Tv2O$RV76wIYm2T7Us<{s+tT8=@v17diJrciI{M}GG*@(5_*c_Z zvJTIe&=;{jT34@TUvCocI9wxENV7*@CaRWM!bUVAKJ=9gA#uOQxJ5?FjS2%9B)tcA zai0Y*kzjlNkP81bVY!1U&yTp+H-abP>FRi*K{9ndYB+mZDl}tmIMBrP3VekF&F;hH zxMt`FVI-|v)kys-dr)x1uZ}3=DT3NmYsNG- zEhALwfZHl3%pE!{+N{l(&{Qqv7t662$LiU zc80(A(P}a#d{HyuQN_$C32jST2QGrE*9dPEhUEw?3OSN3*QoKT*1;|4e6Kxl_ILql z+6_NVl7;0x^xO>1i9bK^0prT?D_xpWVUh7Fg$1jZSY>M+)_X}!b6~8I+xP}Wk7lC> zeo7W20Omm`rF)hL3!rxD?nYt!YdPCl{YpOW)}A1AHvr30QC~`N(z5K?Dx52SbmZS$jE3qhoFDC7v6G zY01vaPRz`EV7xNbhqon<9DC?bF4#Yc)Iel>^ggbLX|3Wr`j>6w^q!P82UHWxO4Lsa z?sgCFr*{p_INM#@VuzGrHn1P*Re6*p-TYKv50K09H-Pgp5eA5!DOQgcX$qo&+M{`vDHh8l@4u|Md_-zy-E{Uk%6v4I zq01#&y#Bba@Z0w25t@@%7f?4JmCkzeVIoIgNm5Tqud1rCx$5KLU|HrM#ib|kT3>^a zL4o|?zQ)vCUj*A}jZ#b-ksZOTb1R3l!KovnG}uo26)Kj6<&Y&-C?_~P>9|$9y3ER| z{(Cg+)MBB{=duPi9^0L40$3(xtEacqdSP+(@09Y!sfx#i_Dv#BtKfD{sFjx`#~o50 z4F6#9vk^JyH`G}U=+b>@6X8g8<P}1kzANK=!Fik=|qm6~k4@#M3jr z5W{Fhx;y&Oxq=bFmH$`=;g#yOOKi-kLJ)vH?uA4%v*AzMuQU^l zN8vj3oMJ#(TJTLWqpAzX=YFA3cH2}tYM~#^D96$2Bkw1$`$mhbtP6WDKf-DrDFS%5zKSOm!W>|JNMw?NmCOYGIg~nphVNL zKa$FrZFmhXW$#dvI6ma_K{V{rqg7r$h59d>e!%s8>@Vobj zAB1KY7!Yy*+pcQ7pFPIFz80?Wk&*grs8>Bfzh{q5w4OHW*AT=nP(qnPPldl;- zX4Ta6^oR!3+^$TVBS;BSqVQqW;D;3%FKIx0Zc9fLj_6?Rze%uR8l_>t&%IJa{w+dV zR);H}M_Z}K!8E~9aJj{@3{)`&gmY}kJl9`eez^OamBIb}0uj+L5F7JQL=Rlk@-(Mz zj;xOWm|khWUJsaOah$_J4GJSitaRos=>Ye+hE>P|eFFxx>v0dft858>nfZWCiQxU{ zY4b^T2asB>jtR~9zFJ+RfJ~N0?wdWSHk`QL2%VXe;w%#1aTrUBNYCEzhb+EbZ0r>< zHj=!Xg=Z;by=`8{C}7_qJ%rxCaoc)g7nANZa;wGKd+Avpr7V`@P%T5MwLuFP+vHJkKmSCeIwkayE`JqchEWcCgbqeP< z?C2N*a13?$5xE6R$@tLu%M4)I6eh^Zc$W=t35?#-Wj>duBymeyTX#qpd?$uD`s34u zs|{p0cU~?u2s9K70Ev>Bu%7lvG89EW8G{=1U5lEGr8cnpkUH`zb+?CwKp|x>B6UJ@ zfpT<;hGr7dWqjz;06ufn$^&i7?AKVV{E8my+3A?4dPjD zsc?HVM3r1_B}uiW@feZ0h7`hFLB96mJ{83~16_$g?r);b>}8+W)Wv#7L_nf?rXcd; z(rq-4egv8o$Mj7F3j_@R9QyS(sOm= z@+35#8lBSOZO`v;LRfoKHUis^elBx(;vQJ%u_6)0i$oQsNZb_zf3oH^AnFW$ttM;N z)7*QtCoZ(xjni6 z&#WDU6X&}xXH>ebr?teomHG$+aLk*eF!>|qB@HRp`NSG>Ssel7yB_f7e(Vbf@zo4UtE)i~)2tyBQ)^DHi+pa$ z(Z*`J!Vh=68Qayu?UW+sA)U)71r^bVtFq?>7~W`rjjbGR^A+}m=)x4s_Rc-B2tu9! z!XQef;Mo_W@iwcbOcAjGd_xB3A@w?6i5LDXC4~fO>vNykg{OK}JFkzffH&FO=}T|{ z1W_8}RtFxHJF2u$~$|A)&4}QNZd%iU(A^8={22G?T6Z&+bjr zI|&~=AIlq$@e?l(&aSfLca!DgU7J~>2e6wy>5R?KRfSQ?k0n*!JH+357JGkW)13}z z;=l4H1a-aA=ZYP*^2>zJIZWWfIWayr$IA(e`<^X!jXfCvcu6@K)=Ri1)FoV_+Kpd! z(OC4LAAmNL4_!%5yw=XNITK_MlWencr`NcyKB02`v)lc?`6Z4J4W+E-j}^VS9oZML z#P{la%A;pUkyd#~=alNkqB+AfN}sgRLI!>Yag^vU*96=QJLZ*W#*0%!M~M_#n%zD? zTY1BAR%QhxEKL3YY`A$W#ACx+0Vvu!I$Tt5e||%J1>O`0i;r1zO!Xx1E3QL%opE5? z-lp!t!1+O;NpA#d(Dyr<+syAbP*hCUOcl^Q+{__b2`rA!UsJ<75=HLCKc23q0-L)V zj`8)d6BHyDcssc#PB4Mve#ct*xtMOuV#(j1RhT!FnED-=O=Jb!{%v=vtukPEN+O1( z`UAo+s~NGDY~EBdg4}-FZ2)JN+Y!1ucV;KVWtt^oMpY#5dHA-lG^Na1FzR1Q0Yk0k00Ub>tm$H5P6pEy;Jv6~FR-+n* zg%8u>I)k#XTD>_MMD@N4CZEab$-#XmyduHsYS|c^{`=s4YMWVj9KRhv(}IO}*xKE? z)7dMpu~4?QcU10-o}})!?#c}!uptM43Op1Z&Hyld#W8#8m3alx>*Ox|b$?0GCEB>8 ztHtx_mM9_+V=aih^_S>CmkXVp!RqKFv+xum%=oE$%W4sr9qADT3Zo!I%BhKo^5$U+ zEt8pYwFia;9seB4><=Qze3e5&bk$Bo$AR?xZVNa4fVVdb;mibD0vg{cIn{ zPT7D}@k7_HyRFe3Qqh3G`;eC$*^U1^$jO1q(oB_j7~Bx~loMU($w%G#wA!r|tD_Sv z=!!{`bgT{!Xp^gfH$(XS1_#-DHMOi<=Ul-F8!OHEUaKFBs|4RiCk~96H`J@9^|NGw zYT@B?2c*`|=ENYV@?*2y<|_h-q#qh=w{C?r*+pUg4ux39Sn+~A%NH(fbbV9Zk)mp9 zR(WO$rl+W-rc%!zMrOjrQ^rL}Hglpb6@WKLx>9{Lm8iVTt+SYBd*^+iF1g$VHjYe> zE&isXo9rkC@oH8~)$GPw=D#&-3BG81iO*3>}{i`iE9@Sk^9APC|arUJ#pDmdep z`@-sbY~X{`VR3zWRsQC-G({#^ce?`%CO%ZYlc(9_FBivn0(j7PR&Oseio)}Ii^?!c z$8_%B6Gn%0E6m?@xqn0^xt7UO#G>5!BSwT+A@RubV>Hrb?+bY(1mzWOAT`$AE0Ca5 zan-|MIjq|xLk(Tvp0f8=StZt9jQ=V;Wo|<-9^WShwqs5|676AFA}P4)wa=p{LTB#j zKP~ii8+HEs<i?qeA2G1IX%#GE+*7$5C>=(sM**;X8+ELXB-+p zCQ=gZfav8yOF4wI{isuo7SynsL~io+hbJZpW^YxJK`N$Wv?6Jw2Jqg#;$yg;ho@&WPFv8z6mFRvGE3TK zGFE6#JU|`HQ|q7F7U#|pg?jb~<#OD>w9LemETeIO-?Rqs|CxOpZz?t&CN8;yG^?`wmP-&NC*f#6Fh^WPf_Kp z9l55S)Bz^jwXg|ooK7~7KrgO0wE00=we1~Clul9~ZdLSvts;Vg8!*s>6*|c_6PJa5 zF|}R;P2+8Ib~h-Y>NwZ2RcS7*XT?e8ii2c*Ht{tjV>)lyU&mTZ>Y3Cfi@y8dwR ztPQ9i+*gL zANDtN^n9DHJheGln~N^^f-l_5v2$#eo)eV^Ssf&_FH9XuvO1&2dUXLAd5m;S;BJ{) z9C_kKJeD}A$znb?;WwCaCBw)F?)%G5T?u3ds{eN3ILJcID0UKYXa+E>zrWtVy#$ckKgKL^A{^LPVI4kpOyf z2%Cwg_B0J=wve0N`iFJKTs)EuxwJpqge@1^oFKd=vCeE+u=hicRDZmchDDgtX7V>p z#8BKTz>Mfjj4z)n+k^JfhrjR?QrcQ`}12WC}=7viIo7Vq@I}v*x}(+GEEtx zeHxHPsZbKl)E-wK^#|cQz_xd=2Q?5)-b9^T@vbulQ6;+#-ChTkl(Zn*YX&2X+KQhi zs5ZnrFHJ{C4Q|xKf&UxY6R7v`PXBgwoJmuEdmZqy6sd;(+F3g`PoxnlSm-W z5B2#@vHFw|zM^Oc_G8~bCV+8b4aOfMyq>XoDBEj;Ox6Y1aV9W|K23p;w3MMHwlbMq zr8aF)@1(|2SY0=9GCHX|+ToE;xSH*X_erdhIY8HrD-AYXF4thOd()Aq>=rT8JWUEJ zJx%~TT>OcRP~Hh@HZl!CScjlAtl-+6UrIQDd&&kStFv z;RuqLfxJH zXkrpd3CejRAfdm~KVp3YzmN>sF6_XTe1?^I6G$N=bq^e-0-#pioS9|q_+&)mh_?kE@HlNAl396geQ8;uD$(NDgy&m!>IylTn1YWfnn()luVEC63@Kd>q}b5t z{BV3ZX7G{FUYoJkSG)?}$^==(Fg)lEX$Ffa;8e-u>jJm-=qz%fi1-OH0Y+ZMS862d^gU@>nhRArI=Z~i zF(;Fb_48cvHM~l@fTWmQV~w%2_#kl+R*sOu(05HU<&CakgF&Ug1f3OQRx1ll^)&=( zSI&NhEE|*HQJ07}j1-Mj+7&vsf}f^v8@W^RbYNf;)0K$mZd~PBoIE{Tgn+H!FcG0a zFRyZ~Mkupv-c{&S4a1g?KD)H_x*j1E28irX?;M2V!a&tI5kkm=#8BC%*Qy%_ zn3GbIrP~XYT%z!_CTn#2+G-?L%Rb_xJJqLzgNht=#nd!3^mJ%GrE2xKWGk={p=9o4 z=C}5Part_;;e*@-==2fa_cjyR#fUq|!*4rpJq<>WXg^5&a^tAJS5o-YJ@bxG)E4Xhlb}@x zLVyC=b6PV%)wM`aB*-8+Zwm$G(@_!oxYCF8k60bHH&PSMIh?w5Y}ken37{KXGbIv> z?Nq_*npZr4%j35Q7rk@(DVf@=c9l|4O!ZN}8wQ=yr68;Op2{yunR(m69dIaMom&0P z4cxMpjB~-iue?_sy&oVrm#@j*qilSH3R6JO>E-*&{B#;{1p~h2C_9 zpM|7!#wZ7}|cBC=51>7X-kMY4a`Jju7o$Ri9rr^w^P)}%{oC>Btbl7>^CFiC6(;;&&5b3(GM7OGK9@QJ*eo>s98KiK*@3dQGJ~#~?wQZ_bCq@oQ$6Io4KaZSV~h zl7SydMMcGe_@bbh!H%D=b^R=4qw!AB#vE>6`zm@LF8R8ME*GM~+fg(+^jBOnCI~w? z_(+P_NulN`5KkM9si{Nan!1D&j{%~{f1N$GL1yy_?Du)AjQ0{mkO-QC&UyJ)=OKJj zU6H#;ZStjY35u09bxSV^TtP7t7ZY2BCW%^kfGi5Tg{?}9&R#ajWajH=wAGC^lMt|P zKgJk}S;=~v_GW@@u6c)|TX6A7rL;GdZQ@rwAhV(0R>b1Z(1+&dWM(vL=!hJEueTdh z$`^^E%$JOYm+umHN9-Z`V3|`d)9QXAnWuEpHP+^)LrE&UkMS5YHJr9)1xTJzYvaR4 z7bF20?E}%;UAAdY6zIQuskLQ$r`)FjDsm;|KOFtIl z`tuit73rlKd;@4FskBU27D|O_QYO;-N-hIug@hiXxG!9h;}C6G+~Y{&zz5{HU&Afv zCeB8i#KV_#<&dR5$DfS%$)kOi%<4m<`FRB?S5|X)k81$$4um=y{9& zHL`6o2)-fhm|slJP>_(}o)RH$m!`@k6mW53zB#YkCL;5V&5CE`+=Drb^m&j=ulb&6%e5ReJM2iLlUYAFDhl z|Ixa+xy{4YnA@?QiPduI2-j=~Y0QL9Qfeb|f5g1bhPeS1f1)_b>V|(d=Qfx_&oYt* z7;eza;xqk)b2LXfI^mjlgV3}{*+CAK1Pl!&lk!RKj#@c5G_(O+Na*~IQ_aDW0h(6Y zxiArq^oNv2c*>r5lYOm%HlR?M@freLmJsbsH2lbdao3FsHIoDS6ote2%~^T$ zoYLw1hn}H@3<-N!dd@KNm_~7Le>v=?o=q}tiYXDY zgo#1lDEa{FjrRTHCpFv80j%b|Rfp5d%bn3=KG`4g=2XrbupQ&lgrxXuDMe1!rA`4Bx*!d{1*w|s*uVzgP zuq~qd3~D&tTS{MQh(44en|0Pb+6Uc>h%oH%_m;^y9XaJU7D?;7u8r&0*#`epOacB& z>reP=FRaHKk(IquI@L}hTEL^S_SiV+qVian=9a_D?6YN*2$3{4WClF-5us2nchdku zA45BxnxI0G)%CUlRFnXYm{TP3nPEBUY4y^=m0a4uaKQ0oZ;ujU*%*;W(}S0<@+S5O z9=}RY4CmZA#hiK@LW zY&pBHC~~Fg5c{cy0)3>ViDqY(OiIK&Dt<8jiTd$rq2W;HV6b>l!%^`U`(I+fN%{g@ zFfzc^5S^BM{b|GJh_g}01YTBYTQ0NIjm}lNHM_y)7rr$kG*&2c4Z>@)jRP`=s!>9v zZ2Bt~KFLYAXt(`vj!yeTDJ$Tq>%yqR)9$v{x2YN0Rdxms%vN{l0R!r+&t6%zoSG{` z>2ek;H+pGfgsNgCTWeomnS7qZtUvTRAz*lA`GD z^@0nrZfstT@}m{SQm`jILh2O6w2o{&dxnzg%O_Wu<#ip2w)ZS;E!$mZ%J8u&h$@M^ z>i-3PK!LxAhe^G{04X-SE|CXUT~RWag}v((jFvrqn zcEV-AOnW&L)H@5lrFWvIOQ#NuWJpVajswlH0I8CG{?}bLfV*_-^Fm*ibzD1B&5R>q(#c=Za>Tr`}XggKLrKZ79>$-LbNqK_x3&+#lgmW>@`M% znBLnhCqCv*?Nx0Mq7w+i$r03jf6KdP9EK(-zK-->=I3pJTzhrZxBg6lD)oa}B4(lI z8w4D>+WCd4f-%dq^a8cLPo5+~hvZp9Sp=+SWmyYfaIzg7_P>M;LD(I@En=S4S}&Tu z={-K2kF|o+fu7d1jbf4V06P;d5nff3x>64ayCjp6<21Au30XqqRYMCG=U&J`k-{9V z)w?C3z=L*b23DkS0s=Yaq5#Wckt|*s9E9{y<+1m13A2kVhDGhgU6d*V1a z`GH^jYyoqiO2E8Zn$GK$Kgu!yyA)2ZjXQpedw7u=r;CO6cn&9*nh?mc60^o^3Vo&E z)qc01G!K=iwo5L>7`NCJ>t4*F>jGecUc0Z3O@?W3{;tOZ6vD|nedEC<@gR7oR8U)A zpYONStm#&*>2o;mA~zb>PY!dXlFF{{eQ0;$sMgF3@lMMH;XPRR*L6AVjH-I2u%G#x zE{nPN*`K<=>j&t_-LC4pyU#xDZ$C54PP7>K`L&0K!U~;$B~ZbdUBPC)MYtB&@28dX z9&^rj4qr*_$!Iy2xW3Bg$vKsP&jp$BT%wj;g7nz+0}7Pjnuq>wT@u_aO3FTBSW@P^ z){1WyFe}#2u-i8kkHAnu=};EtDDIP&3e|ob+H$m8P;;+rO?3RGXsa~WDNVWgc6MVU#2Xpc=7aDLGF4ox ze#3+N#XCG!n$Or7SsfiB1u#K(JD3P-p@)aRSeWgoXZu{sGCg`_sowhU9$NPwBj5-JYqdp zYy(eEM|by|{Y~RBv0mxXtdNip@WFvX_4J^l0PBiwj*a9PS>S)0d=?xwd^@IuYpruf&dNjIp9#sJ7X^R#fLE_P~fG}%)TxPfqlOeTiH_Tk;`QK#FY-7n8 zj;=fBR;Tvg5X_6;u6{@u0*&P=7O85M3_BV5EMe`%#l?LgNzKTZF%`q0O#4aLN>0^x zYb4s&JIwsVMV$Lf0Pf}A4N;@j0?&myU7qae%o9;;iLwPtpoGb?hk&=Vd~ZW8&dX@E z1Uldh$Tw)q%bb{fb|=(OJ=cQGM*At69n!K|4N8ACrt1;(YzQ{U^Mly`9UV}z%*jcTCRgi7Z|9D| z{@)GL4!E+~e{0&O&+3a6twIJQBENemf@(v-2c;#v3$hI3HPQ0@nQA zDK4-!x?TN3aZsFDHSGv`pXdp8QUEXi+RH>2w8^(Y$WoF^IrImFrjl^-HKer9Nh{wm334;Hk>&1~`t?ZBcpqlEY{echjB2=H}Monw3 zlp)wD>OEM3IziT-BF$G>70)y5Y&>+g;Hi>NGMh1YYi>6~WQe?SO^l3?b#2?@hxlE_ z*`}{v{L3PxFB@8fXNoc}x|BDe>Qm{7iQ^Ix;Su{Em-^K+r}5(*K_LiNNh)IaGQG0w zzV4U|&Madv1a%l*!i3Z@12;Gr``yF-d@kgry#m3FDFg0;-{vE0Th80%zrg+5RmbEQ zNA-p%$)l|fG7y8RR8!+GAhnmuPu0l4Z$~{*lE?Pq^W_=KB6F7W`9O>wN`j$E@qjHUOvn6TC`~>w9me4z} zg6f;Px0mYrhKe&tGS~a+hgwqBqeLDB*U zQI|CT{(RpI+55D?axWk$H5h#1)Ux$juyHR^2iH}qyq7jqu}DcG=Td&h!3*FVyOq`& z`q~)rJR7#u!kM;NzHH6tNynhJahiOtq#o<|b$>XL|2BmW^*394OCU^0zC0;e1%qQt z^P$R>^Xt6qZz7V)Eeze#Rf6hcvsq@t=``mEoH2DC$(S!NiH7;zSNCffoVck~8(W** zggJXj71MG@yJP!SA0yGeaqz5rjl~fAd7lEBj5EsLfmjbzDG85c>AkC3(`+&jnqHQd z<9%!QNg3LT53qc3SCbWSYwGC9w6!}Ee(7S9L--x$sCw?eno31ociH<)IHG`BeI#Qk zjMbE@&^Ex$Ze?Fjja=qnB4!yDt#fLCeWeBS?)v`tHP84);QD0VkfFYQCLU?AUrN=E zYLoLYIgfWD>dKe2((nyVI zdM@hf;pS8`Ap+gfMlcuo>e7U31=i)ckOYSg>ESfeDvH4B;{DwI6sPUe*-+n_WmW?L z+pNNF*ZEwH86&&sw%4{35y1hnjO4&dav)VtP9bI!vad zug|iP5fMP4hoNidQ9G@wlH~mjNMK!MT7JCyF@?5S+uR=lLy$}^^i1Flmb^Ib3?H__ zV2eMJ*2_`}65D3BbQn&2-zGDTfZ3kF_Z;Etv9mO0#;q4!VW zA#iOXUvqVv5vm6H5&u8?#?l|fM{4lxt28!lZV8qp9U-q1#aD+~a ze08thV9htx>`zWk2>c(bI%Ew18DSE3M-H|$9x=!<&LR&vo40vKpQ_kRO3v2SHsblJ zK?!mzzS};?YN7S;yuSi+q8Rl%KK;UjmRT|(X8uq&9S--A2yRyY zu@O30oQHLIe5~hOdSK49Q>F!}9tDpqFQ+$;%Ti3!;t88ns!>qb$;gReTc~Sj;1Ls# zZ8?Tq6TJ{jy!qOu?hVdOvvS7-odcx_XcV|z-ekT_mS0JLbN}##Ot(O;-_#qUFZiQ= zKu2SYh|o{$;jyu137LrD!{t^OIicWqdC=3Xw^fN2k32u5v-su4af4lg;~xn=U$*hh z7dQgqslK^`jY#^@ktL89drk&)rlOCY85hJPyphG#rgU8CFFV7Y)pq>O{r&~+e)>76 zzTOr8ZU^v)E8Ny!BHL3jQg2O6>YLI+DZO{L-59Yxyps9=X2V4;?r*4STkb_a=lTRH z$8T(JCr*5ra?i}AlYjMT76`Xdz3?;ezzN41fPA?aD!X24(gc2tbm4hWKBZK_l^2XoBmMSUNuV>`Eo61++W;;gxJJL$CLQe#2_{ zQ<&^-$522vg~#ZJ$C~HKA#+Phk3vPtZg{WvekqSLcPNTk*g=|0VqyTPFn`mNkjPw4 z_lahX8WUl^_IFX1Wh0E%0{`$1<(rpq20Lgw_Xi*lw?AFM4&bA1$IDCoyuZYG1qcp! z>2#VFZ?Q06cJi<9`*G{q2?Q9Jk5|#o-oSS`ZCw2`rXZ6? z@-SUG{I8+7lLTRh{cV{&`5#w5_-$;D-sF|+1)?RfKw$X&iVlxbJ%-)&KlH-y?Cc1w z2YUJfbb>rWa3KhgS@gE7_WEtwo}W%8^NRf*4{8=1wv+3tO5^8m?k=efh+x>}y7OUS z=>Q#QT*`sUr5WFLQW++>-J&%132>-hJ;eF7hT3_nqk-Q;Hk!qLB8u0>Td-a_8h9?d z8t?N`ELVRZ;?VnQi`|ZJl{e0ppI3n-q>U={+SB_dY@{B2Qf^wov~G5rNQh~=?!~wR zxm-0KGUKBoI%}>uqmumlttW2&9_+2YkMqm31Ir5IA`kmJ8Gc9M@ko(jv$$zsljo6? z6B94$k`j_C8oV@JKGj>bg@dERy_Hrfc&U3T6}sv)1vU9_CbrL?7S#2QxlxQ%wVu?d z;w*V>Ttt3gBnwG_788cAxJ!h<$Q6{TaV~y3;@+vh@ zC8WG(83(x@irySdle4bPv=f6Fzwu0``9@VDl?%ujU+~7Hw>6%EJbkAGMpV2wLSt>=E@ixPO?x^ z1w;olC92R(sp_Usk@oRE@p^LjT?2G?c6+H+W*ty8)(VQp0?A8dA) zv6}3gsKFT|3s9!L-6!h2Awpg6&u0;q9XmX=(agM4=mY9pX|67xTE;Ul%?%9&>EV$Q z@J>TxOqG@!D=Wu2FSkrU+x{V!Nf&G+7#xt-Z?~!`)-1c_?>S_5$I^^u7Z=|zFUO;y ze+;bu5;%?|w}CWjyVz(8Gms&p+}?{<)Q|`(Mlwcajv7hCyWe!&&T3gfAKv`k=lW;~ zGIW0H?N+Br8arUT->+VnP*?%p1Tw~SuEc&xUfzA3>I?&Qw=kI@cB9tR&;H&&+lIeC zp%QIc?PYi6<@IQq398=h6o#_IR!G!0A036$Fc;SAH92d{aJ8V$Oi!;b=u6ki=`{C` zmU>%VfgcCu=qKtB-TIr3Kkw@D?Iy+d_boDAtRWcV;=gC1-rE0#O=xA{`_!C9_~;yg zaHL|GI6e1=|DIvN#MPWdQJjLBkM2Yv3Lx>)mm_QSDdGpreYFRS8&RKg{obkG(1 zn+_7OMYk+pXgwg7rRcGXk_BOpFlZj<2-7ts6So@|e!n@5Ea3w=Y-o~&t~F4!H=^ZelOlW+{#3rW54GMtVHr zTFi}n9s$kDp2dtQ&M|H>fJbuq^PA|GN9`Ul$1OC;wjhxdsow0EguDGsh=OM(IX%&} z`Vs`k1e|B6;DvbbGv~uvzxadXcc5%4g5RZ$e^GtDosky`;2Fs3eTmPMY#>arE5B|e z5MJ0M67H;kE-|}-g3SGX$txtW9W?IXDaY=e+DXM2JmHDKS{>|myboF%LE7h_4X?mh z%fNMzt(H1o?iUG|DJRrf=a{QUe^?*zHc+!_Pa4u$Ar!e(u&x{u9~o_uCB>?mA}3?y zRQt#_*^=S=;Na)C5{Nt!*)1VAn6nv8+|98n*&&d+C8l8nUfrfe8TwsNxMR#>mXXv_L z8nKi4?3&E<5B|BBu-J@2H)4r=ztUm5VV1MAJKLLnEiT6@jcUCq=e;F@g5k{5-~Rso z{c`iUo~w`&wadeOpxE7gtT>Kn@@q%r`}mT8=N5oMwE_Hm*fBtx2tL?W;>WsO>1c~G z)h$#s78S)-Ms5KSfsmFeDu)$K&Cx0X&=)dI zc0wX|_rKVSG+0t@7S2c0xFL&0e@xF5a3l!rM`AbCuprf0x|<>Ao5HH>$S2!zDC>pE zmyHZ`*DPM)nVn=^WBuv_6daN+Rq5WppOo9|zclm%dT#=N~({oRo-VH$_Rnp*bKRMZ(GIQlA>$7Y&E)rO> zq+g4Hb_&DV4W+(B#;Nu zrycz=h(gUO$;{8R#{c9%>zFw$KKKh8&DWEBsogL2Zg(QbazU>=Q?1Tz->&gRa7N0J zxq3-YW}xAMY;R{L z*RDF`JQ-7%_eqbdbYx`YVlnj)n^UVuS#tU{Z7*{{e!jEt*w1cfuGWU;l(Cq4-1!fI z1(gSZy{`C^pSVA=h6b_NU!ZPNU0n`2QYzsxc&p)?cuIb}e;kRBk;(FSmSv%lfpG0)%VlMXXMjW?mRox5kLyQ%8RTQfsmwdu!@q?~5*#{OHVzpk*PLkgk8yP8t@g^`^@;~K=Ns;|V>WoAINS_6&E~(NKK!jQ36{jj0~mlxu{X zl8FvG+9E%H;(7P0uzX=0nNSdXg@Z#U97$G3eEmLoB9Po*9}kAEvDhWLa$&&Ir4hMU zZ9$#$ZZr+_d+XZ_HMq8fL*WCmR*8yEiTjXZ-ChE|Ye`OR_|eRrckg*ns3uOqvgvAF z409l201Vkf`h;E=Me?+!I(jK1#%e{jq%o;9o%k5-j6ON6z`CgcSDP_ zvq&287Y?a)NndN{?}EO&;n3@{Y|x(Pd0j`elBSdrsAC&w7Kh8=o-BfDwjE^pesaQd zdM8rzPC2-|+IMmyF%%`wfgNvnJp15QOy6M_R{NQqRD`qzEiP#ts{75h#VeGtt>DV< zEK!QsSBEOyW7a+Od?F{iz=+z()=rEnX>?qrV`G8)`D|-QwAk|%+pLM;tQpm+jh$J| zT(6QjetkoO%rI@PyaCh!YbfWNO%h|t@{_Y+rxPvM#k04)@!bm&YjkETmd{bxmT1#A zaG8qP_GKP1uvQ{Dj4|XaQPVE37L_}XAOVf#=eIbWobvfgznV! z+xP3poiBb$(f)tbdqzwI`M^P%|<}Nxe+~~!AelRx$ zi-Df}k(7K)j3D8mM;IZYKi0HPjUOEzx#LkGisL?V7;CQO+O&ElvD<@;;%xa~znR^U z&*n#-*k~^6PihkDP3rHWwn#B?Z&z97GdngLS_qWGd}{>tOp14QcXwxZ3n{_nef~$r z7ji`I@^sGw5)qTRo2i!$m%wo>v#0t zgaUB%aHUI?=kE*3xXc|%0LEqv{yIXmlGr)tBK<3rnGcGf=683YVaynC<7&Lm=RW zZLr%i0Ge(ye14=LkY+DKb#vN><8p={z~>1ji$MXC&MBn++;RA|@8&CFQKzhS(h(3G zB0Up}COU2Ub;|o1TZ>6xK)P);9%#~%DR2J4@ifC@s4mN%?J#@C$In7V;3Q5>XDptM z-#MKZZAC2riY>z>@ZMWp*@l$t{*nrwUH!A!9tkbUQWM{8kQ5u|*iC_SB+)hZ^djT= z;qG)J=i4@Nyj=uM5n)LQ)PkF>;DD~tvG+YKrDztd;4FcX zs1e;-XpQ%$?eb)<>9CkHFy`p=7-f>*R=n@@=lW=cOO>sTlAD;*Ch9K+Ohic)6ey^u z)Hc3(UPATQerOe=6H?YQJ-5|g7R2(0S?9u}e@2Yboa63(j^;-|N-3>SirI?~2;3rpY(3cR}I7z}f?aJhe z;)X-V5l2vJdJ4d`cj{pRD{blY+TL5pTUkXOFOLL9ij$hf;1_@5l?$w^tLwJ`JiUai zIuhg6p=AU{*XXR2tF{9pS5!`k=+dQ6aOJ+DQj~-oe4xKS;u^gI&@rWn5_e}J*!!8v z?WW2-;{k}>s>glx!9`^J7@C!L4Kc^diJ`DD_v&7Yw?#exkcK4cCpV)oxI=X4W;oe) zRb7s)^x|%tg6zHR#>%}|G<3OFj9!u)sF&+B6H!1q(zu=0La-C!vB}&FEfv`-Xrqvm zl0bxxuK*Ns1X)lK+POYn@tCK3WRUm@tUg8Dw>+m`B<}kuDcmQXZ&+`aTcu?v&B&m( zDf6%-O8G8)Ph>=H_w)_rx^0cKrUc3bLG5vylVuk%5lvnjv3SxCKW0DZ2aIc<-Fi0^ zW;y`v^GmtjzC-3c5a=-kemnG)pgQqP#mW!ByFY4rUliivl7N46jXKj1mP9E*NIKhB zBg3u&1KC;EtpzxL_LH-4n5&|;cwH}tg~^;Dxydd8Zpk&iGs09h#-CvooehOaW}%!#m%Pk|Oz^W|6b&p+{vKhza$jSt1iLpHr4{<@2yg!cAr_ z$GR6;CiqWV-ua(R`Vn2|Z{KEm76{*&tvICX)_ka}h|hLPVG^c+ z%7kTAycBFYkq@Ft$NzfR3j{%L7w$>mXZ2I?cr=m) z@u#k$1L6T?xh7wM!XnVp*}3+dLYHrN=g)_F^_)Q3Me3WfuLCPlSoYIWny0{2uN*AD zh?(xey@xgnxmt+k7Fn`X#3#SZmJp88ufFL`8UKOb!`YPlyp<5idQ(5K1c(dRNx@{s zwAzFch6FSNhs(;$%nf9;f&{xis^P4%wh6*d+7PU(U9*=%J)Y{yjhPj$>F%T%M9YY$ zs!o;ai}TWtY-X0Us2!?9RBeZnlFPj|3*sqxX5njoG~fMM9k!_f1L_9TfFWTM#$}*B z6FFxR@0aH1=Ue+K)RCr)pc4Ukh>t4kYr@D-H(I)XZD+{fo<>Vh4rj^r>2}b_9w!3``yIFlN{*PG>e3^**y*Y}9BlJxKcKL;} zisf~&Lpo`xe~vi7rLoXE~ z?-J(1V?tXS3=72*O*eDL`Uw~sZl*#nBMFptvxTU)VK$vuR|4U>TVGdPXSeD1$~u$v zh&|vI@tX1*<+35tXXe8Y)SQoRZXh>|$7^vds}Ct+T;Yo|zcSFfo?1qg07UK(3JbH_ z)yy=b=_coLZMurm(#7QTc)b0UI0&TPYHfT~pDM1p-ImXzGYuBbfb2E2K(1YqEhK31 z08oAspKsfp_Z-V~*Pe^pqN18gSw$~TW=3oU$#~p<$=QqB(CHcbO;^p+cBn$5KjEq{ z>*)rH#as|coTNn`ETcb5!xfDsxl1iLUiVULXLo2OP!`7+UD=01-?N3(`-uavUDd@Q z9%bIqLuYV%+mtJfZKCrk*~Zd!`Vc}S{_8cI!NOZV{6z|;z)9b9J|ER7dBxYK$taIU zOJ2`EY9dH7VI#OyJVZ8WD*9h)Y{-~v!(m8>W;=Kc4*`~g)Seq_l_6gD;J^!4v51G? zZi#G_#K2e{C0&cBg7FVKTe9%=JPUZu`J-rU9+wDW5=~&CL+Th)5kFg_-)9{XM}I}G z4;L_#(DE|-NuDQdx6-Bqh&)6@ZCsplbjT@*iT11ubYw7J;GkWY$9H#7JD_^Zu*XMh zSfKhnokO`wC%Y*&{G8r577he{FoeY$o}2eK+H4UEhhwF)cE!MVL(&nDiwd}5|Jo!= zKhwzbH006%jy-2MRkgyjwVl7qM}TfQ#_>N@)pI27nLTPj1#BqXL{uDNUKOtoG(g+Z z)>nwi+PyZ=YKB+qtS)1f!#TayPfqT)X%B5brJaz#yPW^`RRD!4+H_`8n<2-puJbDA zk6p|Z=&xu2jb#Xb%iYvqt)oLghH+S#D$egD^K!tHDQVa-OMmOnhf3JBy#J_+K#n0ZxBi?$GyGX>NAc$nYna5gf4<|UQOLi z_^o2VJMY>@(>+2tvuQP4_o7jp*Rmrtd~S3pQLdEPL9Xi&6vOZ-@KR5l{`m;5H$Rvo zm{}%alsvh$4UMj9WHY1LFUQL!k1Qfa`&f!QVhPC4vwBBlY5g&LY-JaeA?HZbWX-Mg zt`LqCs%gEBMMKf-`78^UjqTN|8rm!(_ijz@xt7cQW)h48m9e+q_OzZ4jp=J`p}j*C z^=C)n4|XQ0BM4{pqah@X&@b8}3@DNWVxuH96VR#L3y#wkYIe`%5D7)1%+i_4PBWPxJ@k zhpFfDish$czw5QJC9A*ZOv6%1vji6W&U~Lw%cc&EmBsj7OQFZd!2l9{y<UV&ULm z;Z8|TgZQ##@M!4jUO~482M3Rij?T-<;^DJmA?e?_u=z{lp3jbbpXm7>LVW)n!KER+ z)MBC5IFSF5p-hi!x2mJ5Mt{J zF#p|kPkoM@Glb!K12KLkh4%t#h{vDC7AE46(Xu?;gpm-X0r^s2gB=Y%| zAXjv@$a>ZzYhcNq3W4a`)cyMi<}b~5zX{JSENE$HRJGTCVEY{67&$vLEO@vT5TMmy z3(BLx-rgZ7ef;(3lqYc`J(IEz82=psrU~?4U}l$>UC#|rkdf;?yq3(8xA%hxq{Iq} z&a?6H9TjJ4CXDS6oX!HJz2w{D6iVp>SqYzC1GU!|%;4d^8 zwH>Ch+gchraR{FKc#>~SY{OGQ6vKstw$|42CPe?dL0g*h?d`AtsHM4~K<_c`qhgVA z%@EHIY4QysPjmCn9lw+D)zx+55$?3ilq-)QAt@;-dmv7?27u~^2jczvZWd|9+pz5< zgfpy5>OPOG_mn9kbSxyII|d;66J^hF2aEw?ve()g8mC|e>A^)F#5XRTd4^SQw*UL8 z2>-vzYd+2$)l0^`pJtwf&4!=91#!XaiZ^9lAC4+)LK;|Uz-sRIvfNpxobQ^PcyRu+p>9J zX$H4=qC|(r$HyNY9>8E_via={!luL#MTNgfE%T5;sWzLMBFDxjZZ+#fh(#Mw(T|wXr^cd=I`6BG+3O8{^RNCs|NJw|=HZcpQn##i#*<%1St@5!Omkur zO?_#(9Ae4rDoV&N?CqF(vc2AC2h7S3+BO4AR>k9c_ED{zw6KLpwJU!ABfrm`^2!|E zN*l-J*ESZ(w%J*y2$GX*r-){Jg%fNH))z12omZ>^fLhV>nPUUC1=MWJzClwnPr(1A z9`?;??Dqz;k!^lE%8M8FF4wJWH#Y+@+U;C?e7fmvO1HZaJVfO@} zeQn$@RQ{(klU~$=>w6%iekNpognRK~<>$RRf%G|+Bc}J1_3{@?X?O-uE|Plkb#8FB zYDrwo!VwQb06!LArSW$l!Fekkso5})&iOXnALZvu3ZHQAUvC`yw)=U!qCxhu6Mgky z;N&F0tJZXXf9c7~8}ZxqVM{8)CS26$`VvY>>fmEmFuT8fU7;re1oVyS;_1BpPrtnm zpncQda;ZEt$lqI1b8RjGX~%r^eDxS7`DxwU#f$q%*F1tsw1Yvh1M2g@vE&KnI5fl$ z8%x@#L;&(u){(mn!}?qf1QNnnI%kcYBh}qgR#v7_KiTSjTRj8SVSGu>UMa|W^rZyi z+0c-XQ3SEdhif`>ZhJL)GzJt|@I3^7;A`oXB5RIP4Fz%!rQ$O{0kUytHw!ypkt>`;MZKiA| zh1hvDRlS=tjpq$q;lGipjgYTxtB*%twK>f9df1d$uD}hceY~;>Tnjl)@)Ug#_ps-& z0g~&`UNg5}P@P%@DO_G3f1Tz#l)jZI=;htx)7`^-L+&=qp)2>~3@w`~B^!#*&B>ZO zq`a*LL&4tZ`!uVAOV6kLCEIIbhLdN&G`Ssl@};T}=p_!l9`?dOYI?fpXUTU*5jyUh zwcZL21Cbd#lqgC4gaRwt^7O5q+ru8sEZXV&&sZ;B(6rw(85rgknOe-AZ3eI5kNTk^ z2GqzI`88EV32h6$RnwNjFXxz)W>tAL6%&QKaOipp(XC)_%e-(rrH-mPk90V6MSb<+ zD@$XGe`Vp+-Y^FtiJ)3KRTYm#rL*os>g=ZJx<_x2uyBj*2by|ih&CqRz$RfmpI$ zB8PljT)qA{hd$upfryGiAe!i9Yp9x_V zK(+G#=}ql~lA^GtjGX30?>#<0o{v#R)TP>pgr4!-ogxl9ZJMQi;9ugoYdi!No$8); z=DL(Kn)rN@XC>*3S>Evn`9uxE6 zN)$Wz!FGA$nx#)ir5~2GtZr*72(RyGX>p>dmOw(hFr{`LP1hS|G?kL;J@E~JQdrY? zPc1?=yE%(SxqfoKh8$oGK_oMlebT!>C6STtRuY>RgT!i_EW?x1#-P; z$K);g;``_I81{5t=+QCGvGm6sj=QPwaNCBI9Q_AL;l7)1iZvNOrcNn{oVn80TV;eW zLx}-9YtOVMvg6K?b#`@UD#lW45~HA$bKB5+)ix#9jNIs7YbB`t>?KT8kGMZPu{S2$ z8qk-om?==dijPHc{;)PN(j*c-Y!)D?;4a1GOn$u#P z2)d}C{D^OPYsLK!H#1u$$lJN>jJYaQaZ#Vu@v+r5TxBNOKJo3_(`ZGkl*<;J-_KN} zT^~PR)fc=euhXRES6Z2ys0X|_--+HbAn&{`sHa*nH`Y(Nq^LU9%Oai}tFJt71`4Dk zre}_OqLy2#D{#m`LvwR;TfHmzm>oZS@=cnZqKQj9m39f_=LU9xXRf#I(lSxTVb#iE z@9k#Tb=UT`J6|Mss+dWOMfxc}-k$)sg6VWflP$Q~hlITyEMZJwDB1j;0b~f&q<(4( zigX*xaOV5uVGi@f2SB6LEjvEg3}Yu1G}?ceg1#|5t;(oH7U9M!b@=OQ{{Vl3ic$DD2q`)+71pLe`_ir!=QAUu|e{^YQU% zeVspyFXx#A08Hbt1%p{9&&S8?TEOy2w&NZTh6q%7CWJ!#j?_Rj<@cq@Qedt8v`bWj zIAiyqdzS zd^L7jp;+|Z?^Y413Wz+p=cJb}RyEt28`RQ+rImrWP@p&zO)2M<@YZ)g6P)*SD-*sb zT7~`oSv%bwhw#nDt0{&%AiCUv8h}SnBz!_J=K|t9p!dYCmy^{jiyvit@q!`rUW>rH ztuF4>S~p>U1)&Ac%_DSXkMCJ?tAj%u!MEM_j-?7}k*8Q>Yj@n{+nT8#-+&VTJxxRp zV(F0i!+0+#NOjq>RoBOiBB=Fpjg|}l`&z93Mkn|2N}m)NtpOQAubLCH84y5|t7*{z z-Q9JW7THT-hZ34)szgS(3JfSLe7f|kH6Ziq&PEQ1Y(dQr=|tD9$Hl!(ux5+MmZS-T zwj_Q6L!U~8!&^2sHq!9msFbOt6+0GuN{rr5*O3v+hlf30gIkV+f$uiXHT5je{`h2x zClHs>y-)*`0gN#va*0#xUf0Z1e}b{}tw;BF*^}O(KfXlS&{4h4ciT1x(}x+#t>?iB zI@v+d&Faoh3>c%gv{-ySd&W6Jo!`>k6`sC}It}lRvAEV}B!QB?{_`*@TXESqNm9L^ z%YU~BcV`i^vCmA;%*;&p<|rgzoE$AR8`3rTS0NOA;X2KO3wLm`&199OBFdLfrsu?= zwL4G+IM|YtUvoduhZ$Nqsc`kW$`Q_OF%C1R(>!$M>g(&X81_7bl!V;wmr{(BsGX*x zzI_XFojG*X+8L6^`6zpwoj{uYSfktSf5ql-cniCIS#?X7N4g(bQO^5Ad@0PMO>F_4!Q)TCfy(ekoX zjwI~zvD|n__~D{d3i%!Ad4f9ZI=+h-k0LK$e8F$|-tSxFVd_hM92@%CUBblr-RShU zqr>ou;jmN;vq@{Va}VqWGSM$w4-Xy=8lOk0&eR1n`%21#h zFl|Pk1pvVETX578Hf%MkxwD&E4~c32tipLziWvYjR!~qkyOAZ3mpA?R_w~_}?_PyVW$6r51WhIfqVyC(gGoun4E>_OjR4|`jUv4*#6{l2-Rocz|(rhYmd|X-W$+JL8*fMRx=kK<4NETh;$eF zc_>O2FyfQhDRTGd`<`8-LzynLFH%)as>>#@!p%(ye>ksmL6Ih7R88AuF|bAZ3g8%V zFfU)|(;X1BSdtH1{;sKy@A|fk{9`joGvxcF0b)|W;GXnPyrPz`YsWK_9?yJ}d!&w< znE+{AfSgA#VK9_m>ik_C16tX64fPk-s1o?4U zX(>yvB3WvV?{nmN^)luRQM;~n4!%W=9MGyiVb94r1kID?{C^vhI3 z(Gt_;gl5H(otD>@oZ}opbJn6L51^@cZ~mqg8Bl?gg+bS@RF_Z4UJTh=*X8yxDMh*O zO509qaqJ`8z)xC6V3eZg%P5?%T>7CjU@Q6~}Zu`cFsuj68XWK9(Fr^&Q?+akF z$&F|SL?Fi^fnh5sSS1Jev3FjMN?EFF^2nEe>GgNyo`TEH{_qEUFQ?9zsPzz~Q=*Mp z4VZ7Xvh+S)9@(OJiR};*i4FJ&Th%2W{|E2E!2tn=I&^~b09?Eq9X&{57*lpvf%Bpy z#_pLoesC4|!vu#3Qbhx+o*&MJ`tc`@XU1rXUlmu4<0AOWF|M#pDf^}3e&mV7rA81ZiiEyM!kjop*o6Y2o&4UEbc#FaB#oU|I}sS3rM0em(i&|Io|VKi^96 zf8^!w{Qu9ri2o4*{%^d{ggj&EzrYUBov%8)`THde5+bs~<%0U({x48V2MAO|?gox` z001z3002-+0|XQR2nYxO5oyI%000000000000000CjbBdcx*3la%paKWpYzxbaZKM zXLB!ba%paKWpYzxbaZKMXLB(wVrg#eS8Z;?APoJ#Q*Z=6%twyX&~g7G44z4$+uD*f zQYRJZ>B(`76Wb4w*eIkF7EB7Zg>9OLI7WgsJPAx-*X?~}R9xG#E)s&fG!Wd~-Q6`n zaM#9zh5&&M9-QDBps^qcu7TiA0*$+S2u|?V@qXN*2V<=stG=GA zX3bi2R@Iud5Y4)1RxTNZ8A8hCYvo#UDfpB+NQ{4OQO`4^C3!b8i@jDaH%dV<*l!9o zqSlSEB{SIQ=$WLzESHs>4e9g#qo$Ko0!3qE7ZhGI@i39$)Qk^&o|4FACw?E3<Aei1KqhhwkUVk;8d@0K~mxhPsZk`wi-AEa;h;2ZoGht(m z>kGL~_dBae9W?%QY~AYY6Sqc{97yyfD?%8#I{fj)5_ndl9UnK4Q$AwN%<_g*nX$rh0<=0 zi@CD|_s%JLAc!YeO`8T#OqM5O5RJ!tHpej^+xGnEWUqc9PeDH-OR-vJC(W89SI+y1 zO3>qHlATNb%q!Vb-z#9v;wOSE5^7ILah)2?zCGd`r3JK{=y8sQ*uIwHZhsuI=4I00 zK=%@RSouSi@zZM=%-i$sh)*$v)1f{nE)aQPw0bk=Cns;YwvAw4sn7rNhMT7cGzmtO~on-R2; z+O$C}HzE?M2I{3N91P40q`$M|=>ODM4onf*B+=y%-A^nD$U2n5fgWH?wRYMlxJt6irEV?2?<(F zgtt0y_afG|Q&>EY2jSdlfpEgJpXYd-ReE>U-aLh8k>Eo%BGOu-7>~opZxGbwO*&UB zsrlT)<{6T1pk>4}qUef;(2kFjs<@5J|9S|7RF*S!Mx>e76S@(_4LM^$derDs3?38M z;v3~NGJ~5vRFZ!;AsuJp50K}`)5%wIcWzWjqNP6dZ&I$2N!?dS_9J9$k&!&L`Ccv- zS0j<$%Hi$95xrqx)xi^3T+4%uRu;@>K%AmI4p{74gbJ>4X4Oo#`?^HqL9_d$tfF@0Vj*4zVk%BJp z3 zoafzYYp++76o*LN4yU6>kWLr)KsMcd++$v3LGjlbe7Mc>Qi1^N3*Ed_b;=Y|kH|#n^vtkv62dZ&G0ha) z7M2d|YfUoL4>jd^3fH}daL=&i)WDusqn_|8}f}ioqm&$hSXj+_G z=E@Mo1yg(lT`7-z!-iysfIFi$(Dg?nsJDqR=8s%Ca&W zU3<<^PF0&i|GoT3NN@;5Vpv}V|5A;-KRTQe2)L309M4FdAf-}1!hSthsYOaO{r$-@ z!FDR0IqsF#s!z3<_=oRk%`Vi9lVzmWyl>F=ld$|)z{AZSh=7o0PaK2txIMbl$II;& zU5{`kg4L!N3(=|>vSr3OF4Lv+D8a}RG={hriFL|%7DM3|_^4nFi-LZ3xt`CClIhhU z&MDU&7V}l;dhYGvlN0J(1oKjEisULBW_FFToEvhE;++Q4j@4uqi;n`}N%hfM7y3R= zBNcGsOAR2Tv6Va}s3do@OufVZNHKl9`o_fqmxZ^vKClghrFvMN{jhF(oxuhP~N1(9<9rM=}tW6SZp#2o2C9tfkkit4dDRk_qui=J!LW$#cC>wi`;I zS7Nf&(=u%Xo0#Qp_TrDhf4%p)Yzg*sQ{_ZnD&6uu^ZSr3uk!_dV!7PDP?LJWCc|JS z60^3Px#zNc(e+AI$NE|B+#u1&*039!LH!^wIK{fYr5oQZH`q@B{PmuTbU`kT%CtTY zWg?kcn+6}H*|S$Efz|BORClJSXbUCrX_6iRPQLIZ2Po4jB!oUD(s}`r;(oB{Gvi5o=epbV7{UKT5ZKTGtW6`LTuTb z%MFe-D<8Gp8E@9TVGbBA1-x-4QY;utd6y@}XIj1(PqS4^ExI)L`ouoFCZ#5*j%RI_ z+$)xAOSX>0GJLLT!=pA2RHshNZ5XWQz~qv@L9KsS+XCy+$^7(rKi=ZomlH5cQI{rZ z1vV?&6v)aFn*dWxEJ#7dtWu@uz1ESTU#G`#?-BRWBe6yU`roJXf^s=L3^U? z*rTXGVX&tuIlmdnc3A3u%;31tKYhx_{7Lo3aW;g{$9gwDOL%mq-$tYwe!Et9@g!#k z7W_j)u8O_Il7q-K9oO3XM`J^KCWR-r3Wv@;Nit%6w$Zzd&d`*!_wM;XfmFDngZsl% zvD-AzcSE>)nl(kxh2iSK_fY?OS$En z2heN8Hsg!lV?J2qs8mb@O#~R2{3m~Bkum>ak-c5q94uU193HH3L861pEC*iby^@XW zZc&1O(X3qX`vo3!)!D)dLvb~_=i#!B@^y{3*QAJU@a4nBkLY?g{YSdDtX{UQHCE>; zaWhf{BZ|2dhg)}aaY?mhi<>S{$v>gONl=!gt|=m3_)=(C@(h(x7o#sEM#Dx0`(<_v z_do<$-)j^B#e&tYz>?%_Hayyh5e8n73%I467nvL&j9`s3^FAJH&Rd!_-l7f?iZ`2G z5{E*TAr*Ea2SIBx<&)i>EIzQ|2!m-eDH`jC0-5X~+E($>W5Oa{UMOO?KPNz{fs}Lrm))AoGN|}NmAr`@}$ns&pe{v3@ucE zP}kR#!O(_I3U|NLWFV1G+)1S%sw>oKn_FKGb^ax5oAvs{2Wq4+we-l~1GBvSNfB7} z4G$uL$_UA7O8F2pjB$~6f@uQrvgmQv=Z9|u1n|W-z3dEjSD1Ir)0C4Wq_pVlj?o2- zOS8sv^ibe8B&titTCbL0c?V%7kB&P4@6ZK|eCei?>M7I-j@M&+rMUWmlF2o=J=3A1 zDW7GSgm(=~TlY%%hSr_7$c^{IHfC|(QQrRu4pfGF^;UyVfm8|zyWEZ-$|Abq2@@^$ z@yc9Xv?%nmL;{An74lkkF!!12_AAdY7t{9K-aR;yq5G20*cvJCWViK$sB?9K3G!|6 zW1`$e$5%#47c*g64*XtDTsxlw9<T+_Vh)DP^Q)vd5XcOJoPdPbhjB zpq_8u(Dswv(vQo`U$r%oy0>2q=Hq%PF-C&Ng_cONUVZH3;FzCUb$gC}{ZVDEGpoq# z<83Df;?6`p19|z;G46w4V?$!Ykf6RHbol?VV7VSf|33x$MXi$qEzFemI14-oOIhQX zf(+Cp#Kgj>kG9KV;0*aBDj6=GRR;_s&B{5xtlrqTvLxvWZVXms;MhM$i9PBh{AMn5ZqBq~`N2FvY$2&op3vf`m}OP z>n#Q?6PU>BF?6I^;wVg_l1xdJ1V#pO7!8cSx7%+9Y7Up~niNPsR!Os1;{iu!fTj|Es_V|I5hz*O)DM=Hvq5 zz`A3mQ$V7brJ2AT6rg>}vO#bZX14h7?vzMR0;!*RzGiUpX!r zi@fxG>+YdiV39|Ns98!%VSp9?(Sj4BH9&Yq7%6V7L4gB+K#Ewejo?C`Ul6Cul&?)q zXj=R{4rq+gsSzKwsaGqbh=|IQ?Zcx`Yyjw7P|gLgw=EDNpw29L=FWyOG-t^b5}wH%6EKsi22IA zGa}S)FWf0BqBvE1U=s(kur8y_+zBf-IeQ| zHppKT7~A0>-F$4^)atx8N43i*V@xk_9ByRl!ms&(a#ygOG`8>T%p3RYNnWe5-#XgN z#r9PU`=Tn~!w!a}@)V~p5acc9x(?qfcDRVB=C?eKIO1ov3s3I1oR67#{h6Np$3DEN z-*N|H>(%E1%pt$!40uPUV@Y=##E}S+eX)2+ToKpTh|NK{^XUe5b2IhFHMgG`ieAs( zMC2i^UT6Fe+Iu!u^GIHZDCf56MSzdk?ak3f@Bqwo$3AgzCMD3MCJ3?=WSO}5FIX_V@B-o7!a2oDb zfrYJ;yXOpf=h+tOPn_Lu5+W?Z`NATD`U#U=+KiJTt!?*2vL+^1En66xP;DliCILmT zN(y=wXFd-5Ha!cVOd}kE=TU2T%~5tRajqXZCI&laWM^0Jz#Qa_oz(OCR59eM19h2? zt+p;L6Xy`0rT4gVTO3-2@Od&fh7x6MmkK=ovNs&bO@mcj%;q6}lPBxW37Hc`P8u&6!po-3v8-iQ_PyT1NL z_mzFINPs}!{i$1M84fMOxy`;9{Y0V(Il|Q78&Q*RAYM1Sf!4^-HW-KO{T?$NZ)}JpIdoI?}{03TSI_8!1}7j z3PO)0a{?eQ$@w6DNyWogMBy6b#RuIxcq`>y=zC zZfFr}Hn$X&Iqx7Y-&W!~Rdo3SNa0Pu$$oy5vnghs&%HLDc%91uKv(+0^HK+|^!tg2 zFL&biMcohGy){FCfG<;N*A~Sq@6>WyZ3i7qY}r-?ji04CthkK>&6noE{ec0=L9*wW zt*mdIGUZ3F7|R*HCvSEG z0UG%~Tw27JXRv))df%kyKUwu{h|=JD{+a%$4Y?D>=t@p_-L;+Xv$=LLA%W6w&{}EG zJ>P0#V@B+S7v+0xYqR$A-&W@tV|;^ji$ixNi*w%n(iQ8a*!;vEBJ`=1B{EjBQO9^= z4shTgP@LYpQ`P2{(`w4>FZgn)r>U*t2c;ajg$FLKm!(QTlwemX9o=rv^c|sZcx6l0 zJ8?RJu176dAI0f}x@1&U=A$DpI920aL}e{l+#p&s?NpW~GS_f-^X-?30E*BYtlZaGd}H%S9mm^mW>B4w`DY=wPJgWi1rc39bmOKdd*GQ z^o+;9@~*2ond%vig{Mff?KGcknVQ7>$mRj96fKwveJtr~`KhKN9;ZqO* z2U9Ly@K8H~N%(Ngsj>O!*Ik>Rdaw(3m)kO!GjDuMa&KUE7(_DULeuCdM#QE?GsbL5 zjmCL4V9tzPhhy&Bp)yrbssn@fLxMzs+Zd*v9&9;8i1M{|g0;8@bw}v+w#STUck6Yc z3x%~S#SuCTNv34+|vM`t$h!?udaV(`oh+e(uph zF*?hKzvefTpjYKgI3FgEjNNNW5z{6?LT!=UT^THpjHOJcmbJX9?XadT6-6hTslZJt zP{FXg_Gp}}nwAq<^d&F6U6j-ReR#g5R@VA9&GS&v{P1hp`2~B`tnzQp_r7wJg6%-H@2c7Y5*dT_`UqMOIZY z?m$v5RKu}_Uh!f=9;v=iErT8DNrbCz&5&E*5Fdea?Q$j^#pCRP<|eKEh752?0Yq+< zSzoBc67$8d{Exb1HC$!+dfFPR9f_LcBLrpJX&6ZsQfWun%1V|H*0e1`i++gWs)};9 zTF&y0$KDRl54vG3y<-mwImbCWw3mcWyI?Euwl|5l(?>A1;_3|@un}0&gcLIs0k^I+ zIIz(61U=s+qNdS8%*)syT&^I~_!6aa5!JEWKYz|XxPq0^2|H-sKLP!TrhP>J*QJp1 zQixgRG*Kr%sbYAu1$et>p71mdy;FmCjyNN*qGg(+t1JF#Z!WDCeFXQ;d-50=s+Gxc zph(mSoRUB?Qoikp;Hoo-CNF%nx-yBFY+xo1I~1;U3!;U=nkEGO>=Vn9>eiD3n{ zs137)wE8aG8$B-11Oe`Z5^nm;@w5>wC9{?vld+r~Mu-+NIk&J$1?AsSk1xi5AvV7F;f#L;w~@YHfxbmno{y$)mJ1$X)vVF#N!zMCZ~@=_;QnxPfjm$ zYn#WGMn0@Pk-b52U@AMVtvsI_VO}++-J>;~0}pmU}sXBNJMmgS6^2oY_v# zdP$h6V97DfI1CfCPmjlu-Ntyu@`lnTHrvtcj1w_af%@ZVUxCLcrrfbx{s?5Rw9K#H zxoV?|cqp>o^ONu4_2JGIyD}SDM$yvF*43)!g}*Z!nd;Kk`ReGoKbeup<6+2|lXnF> z|Bmu`Y>i+4)Pz}@XmiD7_O(HB^HLJehdm2Oi`&VtmgZFV?#Y5fGFz3~^+zC?9={qrBqV)h<8>SGupV3L(|;X|3?>*dw5Pt1`(mHHP8Iyc*TGRfQ;3ZsZ>2Ry8D1yG)@FpjyG~3{xQ~>{f43 ziHxTa50%7b8Rq^Dubh8~sDISgK`bYRq%22x#J~7{9ZSW3Co)0iX&E|leF9uu4ypj)$ttPs2%R` zb%e`YSH7yqURZFw)7U5-sbf_MI8V0^FWk-|!4rLy8&KqiOlhqCgoMegMV&7%~n@BmDl@fJE zd01}rHhMMz;y?fkZ=&$w$7DndbQ7!VFlj(`GGg{X5X)MhL<5J4G+im2khMUPXXDJ zh$BCi1EUwfa}QcYfc-rND%tPPXCkl71L?Ui@@j!5GH1;?^Fb|i6Y2l`-Xk#!{_ zwzIYLFN6?^II^=-vWc)_;t;JQ%neFXJv1+37~;(rP>HHO2n7i97o>BiHCSfN(DtD{$qp2Ur->~#36)_R( z>HKEUT&-X0@#PNe_9bJabQ;456~Mvf^NJP?NIOf3P+EzPQn5QV51TEiaxRDj&cfPF zM;@6+EQ~3i8cXg+yc@W3$fc(VOF2LMY;s*5r}VS}24Uj^9Mk*efI2n?czerqW00!=7%_Au4< zakX|gesH+`4)9SF|FRs)MFPDX+OR(f4BCRW#mdD}!_CFjo!#8k_1|&ZV7rJ@K{-XB z*Fv-E{vo4i1MGO|8j-@E|rVV^|4=}V1dvl#KUU- z4+4YSpn`@r>`%a7p?*jCHTmUp8&sQh_e57{xf6rKL=fV{hxsTOnv;%L0y9X6VRVIe7}SKn&$J6e)b1}LDwNa zLH|oK+V2Rz=2bkT1N}i@Pzf_C?i14 S4GauE^luVsz${80&i)T@O=vIx From ad2cd17749511f3997663a316e30d7bd54aa6d5e Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Wed, 12 Jul 2023 14:17:44 +0000 Subject: [PATCH 43/74] Fixed naming issue with global options --- R/helper.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/R/helper.R b/R/helper.R index 83aba32..56db6ff 100644 --- a/R/helper.R +++ b/R/helper.R @@ -56,7 +56,7 @@ verifyDataUngrouped <- function(data) { #' @returns A character string #' @keywords internal #' @noRd -inputHelperSource <- function(source, prefix = getOption("prefix_source"), +inputHelperSource <- function(source, prefix = getOption("statR_prefix_source"), collapse = getOption("statR_collapse")) { if (all(is.na(source))) { @@ -79,7 +79,7 @@ inputHelperSource <- function(source, prefix = getOption("prefix_source"), #' @returns A character vector #' @keywords internal #' @noRd -inputHelperMetadata <- function(metadata, prefix = getOption("prefix_metadata"), +inputHelperMetadata <- function(metadata, prefix = getOption("statR_prefix_metadata"), collapse = getOption("statR_collapse")) { if (all(is.na(metadata))) { @@ -197,7 +197,7 @@ inputHelperPhone <- function(phone, prefix = getOption("statR_prefix_phone")) { #' @keywords internal #' @seealso format #' @noRd -inputHelperDateCreated <- function(prefix = getOption("prefix_date"), +inputHelperDateCreated <- function(prefix = getOption("statR_prefix_date"), date_format = getOption("date_format")) { paste(prefix, format(Sys.Date(), format = date_format)) } @@ -212,7 +212,7 @@ inputHelperDateCreated <- function(prefix = getOption("prefix_date"), #' @seealso format #' @noRd inputHelperOrderNumber <- function(order_num, - prefix = getOption("prefix_order_id")) { + prefix = getOption("statR_prefix_order_id")) { if (!is.null(order_num)) { order_num <- paste(prefix, order_num) } @@ -232,7 +232,7 @@ inputHelperOrderNumber <- function(order_num, #' @noRd #' inputHelperAuthorName <- function(author, - prefix = getOption("prefix_author")) { + prefix = getOption("statR_prefix_author")) { if (author == "user") { sys_vals <- c(Sys.getenv("USERNAME"), Sys.getenv("USER")) author_name <- sys_vals[which(sys_vals != "")[1]] From fafb43245b01ea3c1addc9fb9457468b340f646b Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Wed, 12 Jul 2023 15:13:19 +0000 Subject: [PATCH 44/74] Attempt at fixing the workflow; updated NEWS.md; preliminary updates to vignette --- DESCRIPTION | 7 +- NEWS.md | 10 ++ vignettes/Excel-Tabellen.Rmd | 206 +++++++++++++++++++---------- vignettes/Sonstige_Funktionen.Rmd | 34 +++-- vignettes/Visualisierungen.Rmd | 106 +++++++++------ vignettes/html_report_template.Rmd | 6 +- 6 files changed, 246 insertions(+), 123 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6dad7db..320ca40 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -36,5 +36,10 @@ Suggests: tidyr, rmarkdown, ggrepel, - magrittr + magrittr, + downloader, + zip, + sf, + dichromat, + ggrepel VignetteBuilder: knitr diff --git a/NEWS.md b/NEWS.md index 60a6644..999d9f4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,15 @@ # statR 2.3.0 +## New Features +* Users can now create, load, and switch between configurations, allowing for more personalized output files. +* grouplines and second header functionality is now available in all functions which generate worksheets. +* base::histogram objects can now be passed to datasetsXLSX +* Prefixes for fields like auftrags_id are now customizable +* Positioning of content in worksheets is now relative to last inserted content + +## Bugfixes +* Fixed undesired behavior where inserting an image by path resulted in the source file being deleted + # statR 2.2.0 * implemented new color palettes according to the ZH.CH Design System diff --git a/vignettes/Excel-Tabellen.Rmd b/vignettes/Excel-Tabellen.Rmd index 695ad83..d945788 100644 --- a/vignettes/Excel-Tabellen.Rmd +++ b/vignettes/Excel-Tabellen.Rmd @@ -16,81 +16,134 @@ knitr::opts_chunk$set( ## Allgemeine Informationen -`statR` enthält mehrere Funktionen, mit welchen Datensätze aus `R` als Excel-Dateien exportiert werden können. Die Funktionen bauen auf dem [openxlsx-package](https://github.com/awalker89/openxlsx) auf. +`statR` enthält mehrere Funktionen, mit welchen Datensätze aus `R` als +Excel-Dateien exportiert werden können. Die Funktionen bauen auf dem [openxlsx-package](https://github.com/awalker89/openxlsx) auf. + +Per Default wird bei allen Funktionen das Logo des Statistischen Amts eingefügt +und es werden die Kontaktangaben des Data Shops angegeben +(`contactdetails = "statzh", logo = "statzh", source = "statzh"`). + +Mit den Funktionsargumenten können die Dateinamen, Titel, Quellenangaben sowie +Metadaten und Namenskürzel spezifiziert werden. Um längere Quellen- und +Metadatenangaben über mehrere Zeilen eines Arbeitsblatts zu verteilen, kann man +sie in verschiedene Vektorelemente aufteilen +(Beispiel: `c("Text Zeile 1, "Text Zeile 2", "Text Zeile 3")`. + +Mit dem Argument `grouplines` werden zudem vertikale Linien zwischen +ausgewählten Spalten in der Excel-Tabelle eingefügt und die Spalten optisch +voneinander separiert. + +Die Spalteninhalte können bei allen Funktionen entsprechend ihrer Einheit +formatiert werden, indem pro Variablennamen die `class` festlegt wird. +Mit `class(data$variable1) <- "percentage"` können die Werte der `variable1` +(reichen von 0 bis 1) als Prozent mit Prozentzeichen ausgegeben werden. + +Weblinks können mit `class(data$variable2) <- "hyperlink"` aufrufbar gemacht +werden und mit `class(data$variable3) <- "scientific"` können Zahlen in der +wissenschaftlichen Notation dargestellt werden. -Per Default wird bei allen Funktionen das Logo des Statistischen Amts eingefügt und es werden die Kontaktangaben des Data Shops angegeben (`contactdetails = "statzh", logo = "statzh", source = "statzh"`). Mit den Funktionsargumenten können die Dateinamen, Titel, Quellenangaben sowie Metadaten und Namenskürzel spezifiziert werden. Um längere Quellen- und Metadatenangaben über mehrere Zeilen eines Arbeitsblatts zu verteilen, kann man sie in verschiedene Vektorelemente aufteilen (Beispiel: `c("Text Zeile 1, "Text Zeile 2", "Text Zeile 3")`. Mit dem Argument `grouplines` werden zudem vertikale Linien zwischen ausgewählten Spalten in der Excel-Tabelle eingefügt und die Spalten optisch voneinander separiert (aktuell nicht möglich bei `datasetsXLSX()`). -Die Spalteninhalte können bei allen Funktionen entsprechend ihrer Einheit formatiert werden, indem pro Variablennamen die `class` festlegt wird. Mit `class(data$variable1) <- "percentage"` können die Werte der `variable1` (reichen von 0 bis 1) als Prozent mit Prozentzeichen ausgegeben werden. Weblinks können mit `class(data$variable2) <- "hyperlink"` aufrufbar gemacht werden und mit `class(data$variable3) <- "scientific"` können Zahlen in der wissenschaftlichen Notation dargestellt werden. ## Funktionen und Beispiele ### aXLSX() -Mit der Funktion `aXLSX()` kann ein einzelner Datensatz aus `R` als vorformatierte XLSX-Datei exportiert werden. Die Funktion hat zum Ziel, möglichst __barrierefreie__ Excel-Tabellen zu erstellen, die sich auch für die Publikation auf [zh.ch](zh.ch) eignen (siehe: https://statistikzh.github.io/axguide/grafiken.html#components), indem die Daten und Metadateninformationen in separate Arbeitsblätter abgefüllt werden. Das erste Arbeitsblatt beinhaltet einen Titel, eine Quellenangabe und die Daten, das zweite Arbeitsblatt Hinweise zu den Daten sowie Kontaktinformationen. Mit dem Argument `author` kann vermerkt werden, wer die Datei erstellt hat. Per Default werden die Initialen bzw. letzten zwei Ziffern des hinterlegten Benutzernamens eingefügt. - -```{r,echo=T,eval=F} +Mit der Funktion `aXLSX()` kann ein einzelner Datensatz aus `R` als +vorformatierte XLSX-Datei exportiert werden. Die Funktion hat zum Ziel, +möglichst __barrierefreie__ Excel-Tabellen zu erstellen, die sich auch für die +Publikation auf [zh.ch](zh.ch) eignen +(siehe: https://statistikzh.github.io/axguide/grafiken.html#components), indem +die Daten und Metadateninformationen in separate Arbeitsblätter abgefüllt +werden. + +Das erste Arbeitsblatt beinhaltet einen Titel, eine Quellenangabe und die Daten, +das zweite Arbeitsblatt Hinweise zu den Daten sowie Kontaktinformationen. +Mit dem Argument `author` kann vermerkt werden, wer die Datei erstellt hat. Per +Default werden die Initialen bzw. letzten zwei Ziffern des hinterlegten +Benutzernamens eingefügt. + +```{r, echo = TRUE, eval = FALSE} dat <- mtcars aXLSX(data = dat, - title = "Motor trend car road tests", - file = "motor_trend_car_road_tests", # '.xlsx' is automatically added - source = "Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.", - metadata = c("The data was extracted from the 1974 Motor Trend US magazine and comprises fuel consumption and 10 aspects of automobile design and performance for 32 automobiles (1973–74 models)."), - contactdetails = "statzh", - grouplines = NA, - logo = "statzh", - author = "MD") + title = "Motor trend car road tests", + file = "motor_trend_car_road_tests", + source = paste0("Henderson and Velleman (1981). ", + "Building multiple regression models interactively. ", + "Biometrics, 37, 391–411."), + metadata = paste0("The data was extracted from the 1974 Motor ", + "Trend US magazine and comprises fuel consumption ", + "and 10 aspects of automobile design and performance ", + "for 32 automobiles (1973–74 models).") +) ``` - ![Screenshot des Datenblatts in der Datei motor_trend_car_road_tests.xlsx](./output-aXLSX-1.PNG){width=95%} ![Screenshot des Metadatenblatts der Datei motor_trend_car_road_tests.xlsx](./output-aXLSX-2.PNG){width=95%} + ### quickXLSX() -Mit der Funktion `quickXLSX()` kann -- wie mit `aXLSX()` -- ein Datensatz aus `R` als vorformatierte Excel-Datei exportiert werden. Der Unterschied zu `aXLSX()` besteht darin, dass `quickXLSX()` die Metadaten und die Daten auf ein einzelnes Excel-Sheet exportiert, während `aXLSX()` die Daten und Metadaten voneinander trennt, indem sie auf zwei Excel-Sheets verteilt werden. +Mit der Funktion `quickXLSX()` kann -- wie mit `aXLSX()` -- ein Datensatz aus +`R` als vorformatierte Excel-Datei exportiert werden. Der Unterschied zu +`aXLSX()` besteht darin, dass `quickXLSX()` die Metadaten und die Daten auf ein +einzelnes Excel-Sheet exportiert, während `aXLSX()` die Daten und Metadaten +voneinander trennt, indem sie auf zwei Excel-Sheets verteilt werden. -```{r,echo=T,eval=F,error=F} +```{r, echo = TRUE, eval = FALSE} # Beispiel anhand des Datensatzes 'mtcars' dat <- mtcars quickXLSX(data = dat, title = "Motor trend car road tests", file = "motor_trend_car_road_tests", # '.xlsx' wird automatisch hinzugefügt - source = "Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.", - metadata = c("The data was extracted from the 1974 Motor Trend US magazine and comprises fuel consumption and 10 aspects of automobile design and performance for 32 automobiles (1973–74 models)."), - contactdetails = "statzh", - logo = "statzh", - grouplines = FALSE, - author = "MD") - + source = paste0("Henderson and Velleman (1981). Building multiple ", + "regression models interactively. ", + "Biometrics, 37, 391–411.", + metadata = paste0("The data was extracted from the 1974 Motor Trend ", + "US magazine and comprises fuel consumption and ", + "10 aspects of automobile design and performance ", + "for 32 automobiles (1973–74 models).") +) ``` ![Screenshot der Datei motor_trend_car_road_tests.xlsx](./output-quickXLSX.PNG){width=95%} + + ### splitXLSX() -Mit der Funktion `splitXLSX()` kann ein Datensatz aus R in eine XLSX-Datei exportiert und auf mehreren Arbeitsblättern verteilt werden. Die Funktion ist besonders dann geeignet, wenn man einen Datensatz für verschiedene Ausprägungen einer Gruppierungsvariable (z.B. Altersklassen) separat aufführen möchte. Mit dem Argument `author` kann vermerkt werden, wer die Datei erstellt hat. Per Default werden die Initialen bzw. letzten zwei Ziffern des hinterlegten Benutzernamens eingefügt. +Mit der Funktion `splitXLSX()` kann ein Datensatz aus R in eine XLSX-Datei +exportiert und auf mehreren Arbeitsblättern verteilt werden. Die Funktion ist +besonders dann geeignet, wenn man einen Datensatz für verschiedene Ausprägungen +einer Gruppierungsvariable (z.B. Altersklassen) separat aufführen möchte. -Im Beispiel unten wird ein Arbeitsblatt pro Zylinderanzahl der Autos im `mtcars`-Datensatz generiert. +Mit dem Argument `author` kann vermerkt werden, wer die Datei erstellt hat. +Per Default werden die Initialen bzw. letzten zwei Ziffern des hinterlegten +Benutzernamens eingefügt. +Im Beispiel unten wird ein Arbeitsblatt pro Zylinderanzahl der Autos im +`mtcars`-Datensatz generiert. -```{r,echo=T,eval=F} -# Beispiel anhand des Datensatzes 'mtcars' + +```{r,echo = TRUE, eval = FALSE} dat <- mtcars -# Beispiel mit Standardlogo (Logo des Statistischen Amts) splitXLSX(data = dat, title = "Motor trend car road tests", - file = "motor_trend_car_road_tests", # '.xlsx' wird automatisch hinzugefügt - sheetvar = cyl, # Variable, nach der die Daten auf die Tabellenblätter aufgeteilt werden sollen - source = "Source: Henderson and Velleman (1981), Building multiple regression models interactively. Biometrics, 37, 391–411.", - metadata = c("The data was extracted from the 1974 Motor Trend US magazine and comprises fuel consumption and 10 aspects of automobile design and performance for 32 automobiles (1973–74 models)."), - contactdetails = "statzh", - grouplines = FALSE, - logo = "statzh", - author = "MD") + file = "motor_trend_car_road_tests", + # Variable, nach der die Daten auf die Tabellenblätter aufgeteilt + # werden sollen + sheetvar = cyl, + source = paste0("Henderson and Velleman (1981), Building multiple ", + "regression models interactively. ", + "Biometrics, 37, 391–411."), + metadata = paste0("The data was extracted from the 1974 Motor Trend ", + "US magazine and comprises fuel consumption and ", + "10 aspects of automobile design and performance ", + "for 32 automobiles (1973–74 models).") +) ``` ![Screenshot der Datei motor_trend_car_road_tests.xlsx](./output-splitXLSX.PNG){width=95%} @@ -98,66 +151,83 @@ splitXLSX(data = dat, ### datasetsXLSX() -Die Funktion `datasetsXLSX()` erlaubt es, mehrere Datensätze und/oder Grafiken aus R in eine XLSX-Datei zu exportieren. Pro Arbeitsblatt wird ein Datensatz oder eine Grafik dargestellt. Es kann auch eine Auftragsnummer hinzugefügt werden. Die Funktion eignet sich besonders für Fälle, wo man mehrere Datensätze an eine/n Empfänger/in verschicken möchte. +Die Funktion `datasetsXLSX()` erlaubt es, mehrere Datensätze und/oder Grafiken +aus R in eine XLSX-Datei zu exportieren. Pro Arbeitsblatt wird ein Datensatz +oder eine Grafik dargestellt. Es kann auch eine Auftragsnummer hinzugefügt +werden. Die Funktion eignet sich besonders für Fälle, wo man mehrere Datensätze +an eine/n Empfänger/in verschicken möchte. -Die Datensätze, die zusammen in einer Excel-Datei erscheinen sollen, müssen dem Funktionsargument `datasets` als Liste übergeben werden (`datasets = list(dataset1, dataset2, ...)`. +Die Datensätze, die zusammen in einer Excel-Datei erscheinen sollen, müssen dem +Funktionsargument `datasets` als Liste übergeben werden +(`datasets = list(dataset1, dataset2, ...)`. -```{r,echo=T,eval=F} -# Beispiel mit zwei Datensätzen: +```{r, echo = TRUE, eval = FALSE} dat1 <- mtcars dat2 <- PlantGrowth -datasetsXLSX(file="twoDatasets", # '.xlsx' wird automatisch hinzugefügt +datasetsXLSX(file = "twoDatasets", maintitle = "Autos und Pflanzen", datasets = list(dat1, dat2), sheetnames = c("Autos","Blumen"), - titles = c("mtcars-Datensatz","PlantGrowth-Datensatz"), - sources = c("Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.", - "Dobson, A. J. (1983) An Introduction to Statistical Modelling. London: Chapman and Hall."), - metadata1 = c("Bemerkungen zum mtcars-Datensatz: x", - "Bemerkungen zum PlantGrowth-Datensatz: x"), - auftrag_id="A2021_0000", - logo = "statzh", - homepage = "statzh", - contact = "statzh", - openinghours = "statzh", - titlesource = "Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.") + titles = c("mtcars-Datensatz", "PlantGrowth-Datensatz"), + sources = c( + paste0("Henderson and Velleman (1981). Building multiple ", + "regression models interactively. ", + "Biometrics, 37, 391–411."), + paste0("Dobson, A. J. (1983) An Introduction to Statistical ", + "Modelling. London: Chapman and Hall.") + ), + metadata = c("Bemerkungen zum mtcars-Datensatz: x", + "Bemerkungen zum PlantGrowth-Datensatz: x"), + auftrag_id="A2021_0000" +) ``` ![Screenshot des Titelblatts der Datei twoDatasets.xlsx](./output-datasetsXLSX-1.PNG){width=95%} ![Screenshot des ersten Blatts der Datei twoDatasets.xlsx](./output-datasetsXLSX-2.PNG){width=95%} +Um eine Grafik in die Excel-Datei einzufügen, muss sie der `datasets`-Liste +hinzugefügt werden: `datasets = list(dataset1, dataset2, grafik1)`. -Um eine Grafik in die Excel-Datei einzufügen, muss sie der `datasets`-Liste hinzugefügt werden: `datasets = list(dataset1, dataset2, grafik1)`. +Mit den Argumenten `startrows` und `startcols` kann bestimmt werden, wo im +Arbeitsblatt die Grafik platziert werden soll und mit `widths` und `heights` +kann man die Höhe und die Breite adjustieren (aktuell in Zoll/*inches*, +1 Zoll = 2.54 cm). Die Grösse und Position wird mittels eines Vektors bestimmt, +wobei es pro Arbeitsblatt ein Vektorelement gibt. Die Vektorelemente müssen +überall auf `= 0` gesetzt sein ausser bei den Visualisierungen. Bei zwei +Datensätzen und einer Grafik sieht der Vektor bspw. folgendermassen aus: +`c(0,0,4)`. -Mit den Argumenten `startrows` und `startcols` kann bestimmt werden, wo im Arbeitsblatt die Grafik platziert werden soll und mit `widths` und `heights` kann man die Höhe und die Breite adjustieren (aktuell in Zoll/*inches*, 1 Zoll = 2.54 cm). Die Grösse und Position wird mittels eines Vektors bestimmt, wobei es pro Arbeitsblatt ein Vektorelement gibt. Die Vektorelemente müssen überall auf `= 0` gesetzt sein ausser bei den Visualisierungen. Bei zwei Datensätzen und einer Grafik sieht der Vektor bspw. folgendermassen aus: `c(0,0,4)`. Hätte man einen Datensatz und zwei Grafiken, sähe der Vektor hingegen so aus: `c(0,4,4)`. +Hätte man einen Datensatz und zwei Grafiken, sähe der Vektor hingegen so aus: +`c(0,4,4)`. -```{r,echo=T,eval=F} - +```{r, echo = TRUE, eval = FALSE} dat1 <- mtcars dat2 <- PlantGrowth fig <- hist(mtcars$disp) -datasetsXLSX(file="twoDatasetsandFigure", - maintitle = "Autos und Pflanzen", # '.xlsx' wird automatisch hinzugefügt +datasetsXLSX(file = "twoDatasetsandFigure", + index_title = "Autos und Pflanzen", datasets = list(dat1, dat2, fig), widths = c(0,0,5), heights = c(0,0,5), startrows = c(0,0,3), startcols = c(0,0,3), sheetnames = c("Autos","Blumen", "Histogramm"), - logo = "statzh", titles = c("mtcars-Datensatz","PlantGrowth-Datensatz", "Histogramm"), - sources = c("Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.", - "Source: Dobson, A. J. (1983) An Introduction to Statistical Modelling. London: Chapman and Hall."), - metadata1 = c("Bemerkungen zum mtcars-Datensatz: x", - "Bemerkungen zum PlantGrowth-Datensatz: x"), - auftrag_id="A2021_0000", - contact = "statzh", - openinghours = "statzh", - titlesource = "Source: Henderson and Velleman (1981). Building multiple regression models interactively. Biometrics, 37, 391–411.") + sources = c( + paste0("Henderson and Velleman (1981). Building multiple ", + "regression models interactively. ", + "Biometrics, 37, 391–411."), + paste0("Dobson, A. J. (1983) An Introduction to Statistical ", + "Modelling. London: Chapman and Hall.") + ), + metadata = c("Bemerkungen zum mtcars-Datensatz: x", + "Bemerkungen zum PlantGrowth-Datensatz: x"), + auftrag_id = "A2021_0000" +) ``` diff --git a/vignettes/Sonstige_Funktionen.Rmd b/vignettes/Sonstige_Funktionen.Rmd index 008bbcf..27f9318 100644 --- a/vignettes/Sonstige_Funktionen.Rmd +++ b/vignettes/Sonstige_Funktionen.Rmd @@ -14,27 +14,45 @@ knitr::opts_chunk$set( ) ``` -Neben Funktionen zur Excel-Dateierzeugung und Visualisierungen beinhaltet `statR` auch zwei weitere Hilfsfunktionen. `quick_sum()` erleichtert das Erstellen von deskriptiven Übersichtstabellen. `interpolate2()` kann zur Generierung von individualisierten Farbpaletten verwendet werden. +Neben Funktionen zur Excel-Dateierzeugung und Visualisierungen beinhaltet +`statR` auch zwei weitere Hilfsfunktionen. `quick_sum()` erleichtert das +Erstellen von deskriptiven Übersichtstabellen. `interpolate2()` kann zur +Generierung von individualisierten Farbpaletten verwendet werden. + # quick_sum() -Mit der Funktion `quick_sum()` können deskriptive Statistiken berechnet werden. Je nach Spezifikation des `stats`-Arguments wird eine andere Anzahl Statistiken angezeigt (Durchschnitt, Median, Standardabweichung, Quantile, etc.). Siehe `?quick_sum()`. +Mit der Funktion `quick_sum()` können deskriptive Statistiken berechnet werden. +Je nach Spezifikation des `stats`-Arguments wird eine andere Anzahl Statistiken +angezeigt (Durchschnitt, Median, Standardabweichung, Quantile, etc.). +Siehe `?quick_sum()`. -Im Beispiel unten wird mittels der Funktion berechnet, wie viele `mpg` (Miles/(US) gallon) die Autos abhängig von der Zylinderanzahl (`cyl`) und ihres Motorentyps (`vs`; 'V-shaped' oder 'straight') haben. Ausgegeben werden die Ausprägungen der Gruppierungsvariablen, die Anzahl sowie der Durchschnitt und die Quartile. +Im Beispiel unten wird mittels der Funktion berechnet, wie viele `mpg` +(Miles/(US) gallon) die Autos abhängig von der Zylinderanzahl (`cyl`) und ihres +Motorentyps (`vs`; 'V-shaped' oder 'straight') haben. Ausgegeben werden die +Ausprägungen der Gruppierungsvariablen, die Anzahl sowie der Durchschnitt und +die Quartile. -```{r, eval = T, warning = F, message = F} +```{r, eval = TRUE, warning = FALSE, message = FALSE} library(statR) -quick_sum(df=mtcars, var=mpg, cyl, vs, stats="base", protect=FALSE) +quick_sum(df = mtcars, var = mpg, cyl, vs, stats = "base", protect = FALSE) ``` + # interpolate2() -Mit der Funktion `interpolate2()` können neue Farbpaletten erstellt werden, indem `zhpal`-Paletten mit einer oder mehreren Farben interpoliert werden. Die Funktion baut auf `grDevices::colorRamp()` auf. Mit dem Argument `degree` kann die Stärke der Interpolation bestimmt werden (von 1 bis 7) und mit dem Argument `number` die Anzahl der Farben, die die neue Palette enthalten soll. +Mit der Funktion `interpolate2()` können neue Farbpaletten erstellt werden, +indem `zhpal`-Paletten mit einer oder mehreren Farben interpoliert werden. +Die Funktion baut auf `grDevices::colorRamp()` auf. Mit dem Argument `degree` +kann die Stärke der Interpolation bestimmt werden (von 1 bis 7) und mit dem +Argument `number` die Anzahl der Farben, die die neue Palette enthalten soll. -Im Beispiel unten wird die Palette `zhpal$zhblue` mit schwarz ("#000000") interpoliert. +Im Beispiel unten wird die Palette `zhpal$zhblue` mit schwarz ("#000000") +interpoliert. ```{r, results = 'hide', message = F, warning = F} -new <- interpolate2(palette = zhpal$zhblue, color = c("#000000"), degree = 3, number = 7) +new <- interpolate2(palette = zhpal$zhblue, color = c("#000000"), degree = 3, + number = 7) ``` So sieht die ursprüngliche Palette aus: diff --git a/vignettes/Visualisierungen.Rmd b/vignettes/Visualisierungen.Rmd index 965f046..622b958 100644 --- a/vignettes/Visualisierungen.Rmd +++ b/vignettes/Visualisierungen.Rmd @@ -30,9 +30,14 @@ library(dichromat) library(ggrepel) ``` -Das **statR**-ggplot2-theme ist darauf ausgelegt, sich gut ins kantonale Corporate Design einzufügen. Es basiert auf dem ggplot2-theme 'minimal' und bestimmt diejenigen Grafikeigenschaften, die nichts mit den Daten an sich zu tun haben (z.B. die Schriftart). +Das **statR**-ggplot2-theme ist darauf ausgelegt, sich gut ins kantonale +Corporate Design einzufügen. Es basiert auf dem ggplot2-theme 'minimal' und +bestimmt diejenigen Grafikeigenschaften, die nichts mit den Daten an sich zu +tun haben (z.B. die Schriftart). -Innerhalb des themes kann die Schriftgrösse, die Position der Achsenbeschriftungen sowie das Vorhandensein von Achsenlinien, Achsen-Ticks und Gitterlinien bestimmt werden (siehe `?theme_stat()`). +Innerhalb des themes kann die Schriftgrösse, die Position der +Achsenbeschriftungen sowie das Vorhandensein von Achsenlinien, Achsen-Ticks +und Gitterlinien bestimmt werden (siehe `?theme_stat()`). ```{r} ggplot(mpg, aes(class,fill = drv))+ @@ -49,7 +54,8 @@ ggplot(mpg, aes(class,fill = drv))+ ``` -Mit der Funktion `flush_left()` können Titel, Untertitel und Fussnote nach links verschoben werden, sodass sie bündig sind mit der y-Achse der Grafik: +Mit der Funktion `flush_left()` können Titel, Untertitel und Fussnote nach +links verschoben werden, sodass sie bündig sind mit der y-Achse der Grafik: ```{r} p <- ggplot(mpg, aes(class,fill = drv))+ @@ -93,9 +99,11 @@ ggsave("map.png") # Farbpaletten & Barrierefreiheit -Das Farbpalettenobjekt `zhpal` enthält alle im Package vorhandenen Farbpaletten und ist mit dem geladenen `statR`-Package global verfügbar. +Das Farbpalettenobjekt `zhpal` enthält alle im Package vorhandenen Farbpaletten +und ist mit dem geladenen `statR`-Package global verfügbar. -Mit der Funktion `display.statcol.all()` können alle vorhandenen Farbpaletten angezeigt werden: +Mit der Funktion `display.statcol.all()` können alle vorhandenen Farbpaletten +angezeigt werden: ```{r} display.statcol.all() @@ -107,7 +115,8 @@ Mit der Funktion `display()` kann man sich die Farben einer Palette anschauen: display(zhpal$zhwebdataviz) ``` -Mit der Funktion `grDevices::colorRampPalette()` kann eine beliebige Anzahl Farbtöne basierend auf einer statR-Farbpalette erstellt werden: +Mit der Funktion `grDevices::colorRampPalette()` kann eine beliebige Anzahl +Farbtöne basierend auf einer statR-Farbpalette erstellt werden: ```{r} #Mische 20 Farbtöne auf Basis der zhdiagonal-Palette @@ -128,26 +137,22 @@ ggplot(mpg, aes(class,fill = drv))+ Bei Grafiken, welche auf [zh.ch](zh.ch) publiziert werden sollen, gilt es folgendes zu berücksichtigen: -- Maximale Bildgrösse 4000x4000 - -- Grafik-Titel, Untertitel, Legende, Quelle und Alt-Text müssen direkt im CMS (Bild-Komponente) hinterlegt und nicht in die Grafik selber integriert werden -- es muss eine auf Farbsehschwächen optimierte Farbpalette verwendet werden +* Maximale Bildgrösse 4000x4000 +* Grafik-Titel, Untertitel, Legende, Quelle und Alt-Text müssen direkt im CMS (Bild-Komponente) hinterlegt und nicht in die Grafik selber integriert werden +* es muss eine auf Farbsehschwächen optimierte Farbpalette verwendet werden Im [Designsystem](https://www.zh.ch/de/webangebote-entwickeln-und-gestalten/inhalt/barrierefreiheit/vorgaben-zur-barrierefreiheit/barrierefreiheit-von-infografiken-und-visualisierungen.zhweb-noredirect.zhweb-cache.html?node-id=21442%3A184215&node-id=21330%3A183551&node-id=21297%3A183984) ist die offizielle Farbpalette für Grafiken im Web publiziert. Die offiziellen Farbpaletten sind im statR-Package integriert. - -- die Palette __zhwebdataviz__ enthält die Farben, die im Web genutzt werden sollen -- die Palette __zhwebaccent__ enthält die Akzentfarben des Designsystems. Diese sollten ber vor allem für Hintergründe verwendet werden und nicht für Visualisierungen. Diese Palette ist nicht auf Barrierefreiheit ausgelegt. +* die Palette __zhwebdataviz__ enthält die Farben, die im Web genutzt werden sollen +* die Palette __zhwebaccent__ enthält die Akzentfarben des Designsystems. Diese sollten aber vor allem für Hintergründe verwendet werden und nicht für Visualisierungen. Diese Palette ist nicht auf Barrierefreiheit ausgelegt. ```{r} - ggplot(mpg, aes(class,fill = drv))+ geom_bar()+ theme_stat()+ scale_fill_manual(values=zhpal$zhwebdataviz[11:13]) - # ggsave(file = "zhweb_plot.png", width=18, height=8, unit="cm") ``` @@ -156,44 +161,55 @@ ggplot(mpg, aes(class,fill = drv))+ Bei der Erstellung von Grafiken ist es besonders wichtig darauf zu achten, dass die Grafiken auch für Personen mit (Farb-)Sehschwächen und Sehbehinderungen interpretierbar sind. Um solche barrierefreie Grafiken zu erstellen, bieten sich im Allgemeinen verschiedene Strategien an: -- Daten, die der Grafik zugrunde liegen, zusätzlich als csv oder -html-Tabelle einbinden +* Daten, die der Grafik zugrunde liegen, zusätzlich als csv oder -html-Tabelle einbinden +* Einen Alternativtext (alt-Text) hinterlegen, der beschreibt, was auf der Grafik abgebildet ist und wo die Daten zu finden sind +* Farbpaletten wählen, die für Farbsehschwächen optimiert sind +* Die Grafik soll nicht ausschliesslich aufgrund einer Farbpalette interpretierbar sein +* Die Komplexität der Grafiken sollte auf ein Minimum beschränkt werden -- Einen Alternativtext (alt-Text) hinterlegen, der beschreibt, was auf der Grafik abgebildet ist und wo die Daten zu finden sind +Einige dieser Punkte können direkt bei der Erstellung der Grafiken in R +berücksichtigt werden. -- Farbpaletten wählen, die für Farbsehschwächen optimiert sind - -- Die Grafik soll nicht ausschliesslich aufgrund einer Farbpalette interpretierbar sein - -- Die Komplexität der Grafiken sollte auf ein Minimum beschränkt werden - -Einige dieser Punkte können direkt bei der Erstellung der Grafiken in R berücksichtigt werden. ### 1. Farbsehschwächen -Damit Grafiken auch für Personen mit Farbsehschwächen möglichst gut interpretierbar sind, sollten Farben in Grafiken sowohl bezüglich der *Farbanteile* als auch der *Farbsättigung* variiert werden. Wenn möglich, sollten unterschiedliche Datenkategorien zudem nicht nur über die Farben sondern auch über unterschiedliche Darstellungsformen unterscheidbar sein (z.B. Schraffuren, Punkt- oder Linientypen; siehe 1.3). Auch die direkte Beschriftung von Kategorien bietet sich hier als Mittel an (siehe 1.4). +Damit Grafiken auch für Personen mit Farbsehschwächen möglichst gut +interpretierbar sind, sollten Farben in Grafiken sowohl bezüglich der +*Farbanteile* als auch der *Farbsättigung* variiert werden. Wenn möglich, +sollten unterschiedliche Datenkategorien zudem nicht nur über die Farben +sondern auch über unterschiedliche Darstellungsformen unterscheidbar sein +(z.B. Schraffuren, Punkt- oder Linientypen; siehe 1.3). Auch die direkte +Beschriftung von Kategorien bietet sich hier als Mittel an (siehe 1.4). + ### 1.2 Auswahl Farbpaletten -In R können mit dem [dichromat-Package](https://cran.r-project.org/web/packages/dichromat/index.html) diverse Ausprägungen von Farbsehschwäche simuliert werden. Dies erlaubt es Farbpaletten auszuwählen, die möglichst farbsehschwächenfreundlich sind. Je heller die Paletten sind, desto weniger geeignet sind sie. Das trifft vor allem auf Farbpaletten wie *zhextralight* oder *zhultralight* zu. +In R können mit dem [dichromat-Package](https://cran.r-project.org/web/packages/dichromat/index.html) +diverse Ausprägungen von Farbsehschwäche simuliert werden. Dies erlaubt es +Farbpaletten auszuwählen, die möglichst farbsehschwächenfreundlich sind. Je +heller die Paletten sind, desto weniger geeignet sind sie. Das trifft vor allem +auf Farbpaletten wie *zhextralight* oder *zhultralight* zu. ```{r out.width="20%", out.height="20%"} library(dichromat) # Anzeige der Farbpalette zhdiagonal display(zhpal$zhdiagonal) + # Simulation Grünsehschwäche (Deuteranomalie) display(dichromat(zhpal$zhdiagonal)) + # Simulation Blaublindheit (Tritanopie) -display(dichromat(zhpal$zhdiagonal,type="tritan")) +display(dichromat(zhpal$zhdiagonal,type = "tritan")) ``` Die Simulation kann auch anhand von Grafiken vorgenommen werden. ```{r} -p <- ggplot(diamonds, aes(clarity, fill=cut)) + - geom_bar(position = "stack", width= 0.5) +p <- ggplot(diamonds, aes(clarity, fill = cut)) + + geom_bar(position = "stack", width = 0.5) p + theme_stat() + - scale_fill_manual(values=dichromat(zhpal$zhdiagonal, type=c("tritan"))) + scale_fill_manual(values = dichromat(zhpal$zhdiagonal, type = c("tritan"))) ``` ### 1.3 Form- oder Linientypen @@ -211,26 +227,26 @@ Wenn immer möglich sollten unterschiedliche Kategorien nicht nur mit unterschie __Beispiel : Liniengrafik__ ```{r} - # Datenzugriff von: https://www.zh.ch/de/politik-staat/opendata.zhweb-noredirect.zhweb-cache.html?keywords=ogd#/datasets/544@oberjugendanwaltschaft-kanton-zuerich/distributions/1031 data <- read.csv("daten/KTZH_00000544_00001031.csv") %>% pivot_longer(cols=2:3) -gg_ojuga <- ggplot(data, aes(Jahr, value ,color=name,linetype=name)) + +gg_ojuga <- ggplot(data, aes(Jahr, value, color = name, linetype = name)) + geom_line()+ theme_stat() +gg_ojuga ``` __Beispiel : Säulendiagramm__ ```{r} -ggplot(mpg, aes(class,fill = drv,linetype=drv))+ - geom_bar(col ="black")+ - theme_stat()+ - scale_fill_manual(values=zhpal$zhblue)+ - theme(legend.position="right", axis.text.x = element_text(angle=90,vjust = 0.5, hjust=0)) - +ggplot(mpg, aes(class, fill = drv, linetype = drv))+ + geom_bar(col = "black") + + theme_stat() + + scale_fill_manual(values = zhpal$zhblue) + + theme(legend.position = "right", + axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 0)) ``` ### 1.4 Direkte Beschriftung @@ -243,10 +259,12 @@ library(ggrepel) data <- read.csv("daten/KTZH_00000544_00001031.csv") %>% pivot_longer(cols=2:3) -ggplot(data, aes(Jahr, value ,color=name)) + - geom_text_repel(data=data %>% filter(Jahr==max(Jahr)), aes(label=name), direction = "y") + - geom_line()+ - theme_stat()+ - guides(color="none") -``` +ggplot(data, aes(Jahr, value, color = name)) + + geom_text_repel(data = data %>% + filter(Jahr == max(Jahr)), + aes(label = name), direction = "y") + + geom_line() + + theme_stat() + + guides(color = "none") +``` diff --git a/vignettes/html_report_template.Rmd b/vignettes/html_report_template.Rmd index ee536db..9625258 100644 --- a/vignettes/html_report_template.Rmd +++ b/vignettes/html_report_template.Rmd @@ -18,9 +18,11 @@ knitr::opts_chunk$set( __Alpha-Version__ -Das statR-Package enthält ein Template für html-Berichte, die dem kantonalen Corporate Design entsprechen. +Das statR-Package enthält ein Template für html-Berichte, die dem kantonalen +Corporate Design entsprechen. -Dieses ist in R Studio im Menü unter __'File > New File > R Markdown'__ verfügbar. +Dieses ist in R Studio im Menü unter __'File > New File > R Markdown'__ +verfügbar. ![Auswahl des Templates](./rmd_template.PNG) From e3830e4d1d0d27da37f8b865e2f566d4de93a9b1 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Fri, 14 Jul 2023 14:32:15 +0000 Subject: [PATCH 45/74] Hotfix: malformed path on Windows systems --- R/user_config.R | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/R/user_config.R b/R/user_config.R index 353df96..bd68f60 100644 --- a/R/user_config.R +++ b/R/user_config.R @@ -12,8 +12,11 @@ getUserConfigs <- function() { #' @param name The name of the configuration #' @export readUserConfig <- function(name = "default") { - config_path <- system.file("extdata/config/", package = "statR") - config_file <- paste0(config_path, name) + # config_path <- system.file("extdata/config/", package = "statR") + # config_file <- paste0(config_path, name) + + config_path <- system.file("extdata/config", package = "statR") + config_file <- paste0(c(config_path, "name"), collapse = "/") if (file.exists(config_file)) { config <- yaml::read_yaml(config_file) @@ -29,9 +32,13 @@ readUserConfig <- function(name = "default") { #' @param config_list List of options set by user #' @export writeUserConfig <- function(name, config_list) { - config_path <- system.file("extdata/config/", package = "statR") + # config_path <- system.file("extdata/config/", package = "statR") + config_path <- system.file("extdata/config", package = "statR") + config_file <- paste0(c(config_path, "name"), collapse = "/") + config_list[["statR_config_name"]] <- name - yaml::write_yaml(config_list, paste0(config_path, name)) + # yaml::write_yaml(config_list, paste0(config_path, name)) + yaml::write_yaml(config_list, config_file) } @@ -51,8 +58,10 @@ getActiveConfigName <- function() { #' startup #' @export setActiveConfig <- function(name, persistent = FALSE) { - config_path <- system.file("extdata/config/", package = "statR") - config_file <- paste0(config_path, name) + # config_path <- system.file("extdata/config/", package = "statR") + # config_file <- paste0(config_path, name) + config_path <- system.file("extdata/config", package = "statR") + config_file <- paste0(c(config_path, "name"), collapse = "/") if (getActiveConfigName() != name & file.exists(config_file)) { config <- yaml::read_yaml(config_file) From 16a3e11317ee0f4bf547e133a1f8b8a0d391cfdf Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Fri, 14 Jul 2023 14:39:06 +0000 Subject: [PATCH 46/74] Added example to writeUserConfig --- R/user_config.R | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/R/user_config.R b/R/user_config.R index bd68f60..484a6c1 100644 --- a/R/user_config.R +++ b/R/user_config.R @@ -30,6 +30,27 @@ readUserConfig <- function(name = "default") { #' @description Writes a user config into a YAML file #' @param name Name of the configuration #' @param config_list List of options set by user +#' @examples +#' \dontrun{ +#' # statzh config list +#' config_list <- list( +#' statR_config_name = "statzh", +#' statR_organization = "Statistisches Amt des Kantons Zürich", +#' statR_name = "Datashop", +#' statR_phone = "+41 43 259 75 00", +#' statR_email = "datashop@statistik.zh.ch", +#' statR_homepage = "http://www.statistik.zh.ch", +#' statR_openinghours = c("Bürozeiten", +#' "Montag bis Freitag", +#' "09:00 bis 12:00", +#' "13:00 bis 16:00"), +#' statR_logo = "statzh", +#' statR_source = "Statistisches Amt des Kantons Zürich" +#' ) +#' +#' # Write config list to disk +#' writeUserConfig("statzh", config_list) +#' } #' @export writeUserConfig <- function(name, config_list) { # config_path <- system.file("extdata/config/", package = "statR") From a870b3dc1148cb86c41b12e6838c1ca49f2f7a11 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Mon, 24 Jul 2023 07:09:12 +0000 Subject: [PATCH 47/74] Version -> 2.3.1 --- DESCRIPTION | 2 +- NEWS.md | 6 ++++++ man/writeUserConfig.Rd | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 320ca40..5ceef64 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: statR Title: statR -Version: 2.3.0 +Version: 2.3.1 Authors@R: as.person(c( "Andrea Schnell [aut]", "Michelle Donzallaz [aut]", diff --git a/NEWS.md b/NEWS.md index 999d9f4..42b223f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,9 @@ +# statR 2.3.1 + +## Bugfixes + +* Fixed a problem with user configurations on Windows systems + # statR 2.3.0 ## New Features diff --git a/man/writeUserConfig.Rd b/man/writeUserConfig.Rd index 464d075..f82c5be 100644 --- a/man/writeUserConfig.Rd +++ b/man/writeUserConfig.Rd @@ -14,3 +14,25 @@ writeUserConfig(name, config_list) \description{ Writes a user config into a YAML file } +\examples{ +\dontrun{ +# statzh config list +config_list <- list( + statR_config_name = "statzh", + statR_organization = "Statistisches Amt des Kantons Zürich", + statR_name = "Datashop", + statR_phone = "+41 43 259 75 00", + statR_email = "datashop@statistik.zh.ch", + statR_homepage = "http://www.statistik.zh.ch", + statR_openinghours = c("Bürozeiten", + "Montag bis Freitag", + "09:00 bis 12:00", + "13:00 bis 16:00"), + statR_logo = "statzh", + statR_source = "Statistisches Amt des Kantons Zürich" +) + +# Write config list to disk +writeUserConfig("statzh", config_list) +} +} From 5da6bdc26ee71d1c807ac792443b0b7d044aa3da Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Mon, 31 Jul 2023 12:29:40 +0000 Subject: [PATCH 48/74] Hotfix: configs not being detected --- R/user_config.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/user_config.R b/R/user_config.R index 932469c..fdfc6bb 100644 --- a/R/user_config.R +++ b/R/user_config.R @@ -17,7 +17,7 @@ readUserConfig <- function(name = "default") { # config_file <- paste0(config_path, name) config_path <- system.file("extdata/config", package = "statR") - config_file <- paste0(c(config_path, "name"), collapse = "/") + config_file <- paste0(c(config_path, name), collapse = "/") if (file.exists(config_file)) { config <- yaml::read_yaml(config_file) @@ -56,7 +56,7 @@ readUserConfig <- function(name = "default") { writeUserConfig <- function(name, config_list) { # config_path <- system.file("extdata/config/", package = "statR") config_path <- system.file("extdata/config", package = "statR") - config_file <- paste0(c(config_path, "name"), collapse = "/") + config_file <- paste0(c(config_path, name), collapse = "/") config_list[["statR_config_name"]] <- name # yaml::write_yaml(config_list, paste0(config_path, name)) @@ -83,7 +83,7 @@ setActiveConfig <- function(name, persistent = FALSE) { # config_path <- system.file("extdata/config/", package = "statR") # config_file <- paste0(config_path, name) config_path <- system.file("extdata/config", package = "statR") - config_file <- paste0(c(config_path, "name"), collapse = "/") + config_file <- paste0(c(config_path, name), collapse = "/") if (getActiveConfigName() != name & file.exists(config_file)) { From 7bcbbfb2645c9c491ff73c42a60674ab5d0a5f15 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Mon, 31 Jul 2023 12:32:59 +0000 Subject: [PATCH 49/74] Bumped patch number --- DESCRIPTION | 2 +- NEWS.md | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 5ceef64..eaa093f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: statR Title: statR -Version: 2.3.1 +Version: 2.3.2 Authors@R: as.person(c( "Andrea Schnell [aut]", "Michelle Donzallaz [aut]", diff --git a/NEWS.md b/NEWS.md index 42b223f..175762d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,11 @@ +# statR 2.3.2 + +## Bugfix +* Fixed a problem where user configurations were not being applied properly + # statR 2.3.1 ## Bugfixes - * Fixed a problem with user configurations on Windows systems # statR 2.3.0 From bd8d6d00c43ca3055a75880ba662536cc8279696 Mon Sep 17 00:00:00 2001 From: Thomas Caspar Fischer <101653804+Thomas-Caspar-Fischer@users.noreply.github.com> Date: Fri, 26 Jan 2024 09:46:17 +0100 Subject: [PATCH 50/74] Rework stat r (#59) Version 2.4.0 * redesigned user configurations * further modularized the functions used to generate worksheets * revised vignette on creating excel files & regenerated pkgdown Co-authored-by: tknecht --- .Rbuildignore | 2 + .gitignore | 4 + DESCRIPTION | 10 +- NAMESPACE | 32 +- NEWS.md | 32 + R/aXLSX.R | 48 - R/checks.R | 37 +- R/content.R | 226 +++++ R/datasetsXLSX.R | 165 ---- R/get_groupline_index_by_pattern.R | 13 - R/globals.R | 5 + R/helper.R | 271 +++--- R/imports.R | 4 + R/insert_hyperlinks.R | 83 +- R/insert_image.R | 67 +- R/insert_index_sheet.R | 108 +-- R/insert_metadata_sheet.R | 84 +- R/insert_second_header.R | 28 +- R/insert_worksheet.R | 271 ++++-- R/insert_worksheet_nh.R | 125 --- R/namespace.R | 26 +- R/output_xlsx.R | 363 +++++++ R/quickXLSX.R | 44 - R/splitXLSX.R | 66 -- R/statzh_info.R | 28 - R/styles.R | 87 +- R/test_helpers.R | 4 + R/theme_stat.r | 41 +- R/user_config.R | 199 ++-- R/writeText.R | 38 + docs/404.html | 124 +-- docs/LICENSE.html | 898 ++++-------------- docs/articles/Excel-Tabellen.html | 692 ++++++++++---- docs/articles/Sonstige_Funktionen.html | 69 +- .../figure-html/unnamed-chunk-4-1.png | Bin 6714 -> 6736 bytes .../figure-html/unnamed-chunk-5-1.png | Bin 6791 -> 6828 bytes docs/articles/Visualisierungen.html | 414 ++++---- .../figure-html/unnamed-chunk-10-1.png | Bin 6882 -> 6860 bytes .../figure-html/unnamed-chunk-10-2.png | Bin 6821 -> 6808 bytes .../figure-html/unnamed-chunk-10-3.png | Bin 6802 -> 6790 bytes .../figure-html/unnamed-chunk-11-1.png | Bin 24220 -> 26057 bytes .../figure-html/unnamed-chunk-12-1.png | Bin 53447 -> 48281 bytes .../figure-html/unnamed-chunk-13-1.png | Bin 53447 -> 57232 bytes .../figure-html/unnamed-chunk-2-1.png | Bin 28636 -> 29908 bytes .../figure-html/unnamed-chunk-3-1.png | Bin 28228 -> 29106 bytes .../figure-html/unnamed-chunk-4-1.png | Bin 184962 -> 172214 bytes .../figure-html/unnamed-chunk-6-1.png | Bin 7365 -> 7362 bytes .../figure-html/unnamed-chunk-7-1.png | Bin 7841 -> 7773 bytes .../figure-html/unnamed-chunk-8-1.png | Bin 24825 -> 25723 bytes .../figure-html/unnamed-chunk-9-1.png | Bin 24889 -> 25811 bytes docs/articles/html_report_template.html | 36 +- docs/articles/index.html | 136 +-- docs/articles/map.png | Bin 308053 -> 298860 bytes docs/authors.html | 198 ++-- docs/index.html | 116 +-- docs/pkgdown.css | 83 +- docs/pkgdown.js | 4 +- docs/pkgdown.yml | 6 +- docs/reference/index.html | 281 +++--- inst/extdata/config/default | 21 + inst/extdata/config/statzh | 21 + man-roxygen/shared_parameters.R | 8 - man/aXLSX.Rd | 68 +- man/addUserConfig.Rd | 19 + man/add_attribute.Rd | 111 +++ man/check_for_attributes.Rd | 16 + man/datasetsXLSX.Rd | 206 ++-- man/dot-onLoad.Rd | 12 - man/excelIndexToRowCol.Rd | 2 +- man/extract_attribute.Rd | 28 + man/getActiveConfigName.Rd | 11 - man/getUserConfigs.Rd | 11 - man/get_groupline_index_by_pattern.Rd | 18 - man/initUserConfigStore.Rd | 18 + man/inputHelperContactInfo.Rd | 20 + man/inputHelperHomepage.Rd | 17 + man/insert_hyperlink.Rd | 23 - man/insert_hyperlinks.Rd | 23 +- man/insert_index_hyperlinks.Rd | 29 + man/insert_index_sheet.Rd | 41 +- man/insert_metadata_sheet.Rd | 40 +- man/insert_second_header.Rd | 15 +- man/insert_worksheet.Rd | 111 ++- man/insert_worksheet_image.Rd | 27 +- man/insert_worksheet_nh.Rd | 63 -- man/loadUserConfig.Rd | 17 + man/missingToNull.Rd | 12 + man/namedRegionBoundary.Rd | 32 + man/namedRegionColumnExtent.Rd | 18 - man/namedRegionExtent.Rd | 6 +- ...ionRowExtent.Rd => namedRegionExtent1D.Rd} | 11 +- man/namedRegionFirstCol.Rd | 22 - man/namedRegionFirstRow.Rd | 22 - man/namedRegionLastCol.Rd | 22 - man/namedRegionLastRow.Rd | 22 - man/quickXLSX.Rd | 88 +- man/readUserConfig.Rd | 11 +- man/readUserConfigStore.Rd | 17 + man/removeUserConfig.Rd | 17 + man/setActiveConfig.Rd | 18 - man/splitXLSX.Rd | 85 +- man/theme_stat.Rd | 2 +- man/updateUserConfig.Rd | 19 + man/verifyInputSheetname.Rd | 26 + man/writeText.Rd | 32 + man/writeUserConfig.Rd | 38 - tests/testthat.R | 12 + tests/testthat/example_userconf/test | 34 + tests/testthat/example_userconf/testone | 34 + tests/testthat/fixtures/logo.png | Bin 0 -> 32048 bytes tests/testthat/setup.R | 8 + tests/testthat/test-output.R | 37 + tests/testthat/test-userconfig.R | 148 +++ vignettes/Excel-Tabellen.Rmd | 488 ++++++---- vignettes/Sonstige_Funktionen.Rmd | 25 +- vignettes/Visualisierungen.Rmd | 76 +- .../GEN_A4_GEMEINDEN_2020_epsg2056.json | 0 .../GEN_A4_GEMEINDEN_SEEN_2020_epsg2056.json | 0 .../GEN_A4_GEMEINDEN_2020_epsg4326.json | 0 .../GEN_A4_GEMEINDEN_SEEN_2020_epsg4326.json | 0 .../GEN_A4_GEMEINDEN_2020.gpkg | Bin .../GEN_A4_GEMEINDEN_SEEN_2020.gpkg | Bin .../GEN_A4_GEMEINDEN_2020.dbf | Bin .../GEN_A4_GEMEINDEN_2020.prj | 0 .../GEN_A4_GEMEINDEN_2020.shp | Bin .../GEN_A4_GEMEINDEN_2020.shp.xml | 0 .../GEN_A4_GEMEINDEN_2020.shx | Bin .../GEN_A4_GEMEINDEN_SEEN_2020.dbf | Bin .../GEN_A4_GEMEINDEN_SEEN_2020.prj | 0 .../GEN_A4_GEMEINDEN_SEEN_2020.shp | Bin .../GEN_A4_GEMEINDEN_SEEN_2020.shp.xml | 0 .../GEN_A4_GEMEINDEN_SEEN_2020.shx | Bin .../KTZH_00000544_00001031.csv | 0 vignettes/{ => data}/Metadaten.pdf | Bin vignettes/data/geodata.zip | Bin 0 -> 548787 bytes vignettes/html_report_template.Rmd | 8 +- vignettes/img/aXLSX_1.PNG | Bin 0 -> 75354 bytes vignettes/img/aXLSX_2.PNG | Bin 0 -> 46398 bytes vignettes/img/datasetsXLSX_1.PNG | Bin 0 -> 44364 bytes vignettes/img/datasetsXLSX_2.PNG | Bin 0 -> 83559 bytes vignettes/img/datasetsXLSX_3.PNG | Bin 0 -> 60526 bytes vignettes/img/map.png | Bin 0 -> 502753 bytes vignettes/img/quickXLSX.PNG | Bin 0 -> 96520 bytes vignettes/img/quickXLSX_grouped.PNG | Bin 0 -> 96058 bytes vignettes/img/quickXLSX_pct.PNG | Bin 0 -> 103159 bytes vignettes/{ => img}/rmd_template.PNG | Bin vignettes/{ => img}/sample_report.PNG | Bin vignettes/{ => img}/zh_report.PNG | Bin vignettes/map.png | Bin 308053 -> 0 bytes vignettes/output-aXLSX-1.PNG | Bin 82139 -> 0 bytes vignettes/output-aXLSX-2.PNG | Bin 42171 -> 0 bytes vignettes/output-datasetsXLSX-1.PNG | Bin 40890 -> 0 bytes vignettes/output-datasetsXLSX-2.PNG | Bin 81058 -> 0 bytes vignettes/output-quickXLSX.PNG | Bin 53123 -> 0 bytes vignettes/output-splitXLSX.PNG | Bin 51710 -> 0 bytes 155 files changed, 4243 insertions(+), 3711 deletions(-) delete mode 100644 R/aXLSX.R create mode 100644 R/content.R delete mode 100644 R/datasetsXLSX.R delete mode 100644 R/get_groupline_index_by_pattern.R create mode 100644 R/globals.R create mode 100644 R/imports.R delete mode 100644 R/insert_worksheet_nh.R create mode 100644 R/output_xlsx.R delete mode 100644 R/quickXLSX.R delete mode 100644 R/splitXLSX.R delete mode 100644 R/statzh_info.R create mode 100644 R/test_helpers.R create mode 100644 R/writeText.R delete mode 100644 man-roxygen/shared_parameters.R create mode 100644 man/addUserConfig.Rd create mode 100644 man/add_attribute.Rd create mode 100644 man/check_for_attributes.Rd delete mode 100644 man/dot-onLoad.Rd create mode 100644 man/extract_attribute.Rd delete mode 100644 man/getActiveConfigName.Rd delete mode 100644 man/getUserConfigs.Rd delete mode 100644 man/get_groupline_index_by_pattern.Rd create mode 100644 man/initUserConfigStore.Rd create mode 100644 man/inputHelperContactInfo.Rd create mode 100644 man/inputHelperHomepage.Rd delete mode 100644 man/insert_hyperlink.Rd create mode 100644 man/insert_index_hyperlinks.Rd delete mode 100644 man/insert_worksheet_nh.Rd create mode 100644 man/loadUserConfig.Rd create mode 100644 man/missingToNull.Rd create mode 100644 man/namedRegionBoundary.Rd delete mode 100644 man/namedRegionColumnExtent.Rd rename man/{namedRegionRowExtent.Rd => namedRegionExtent1D.Rd} (54%) delete mode 100644 man/namedRegionFirstCol.Rd delete mode 100644 man/namedRegionFirstRow.Rd delete mode 100644 man/namedRegionLastCol.Rd delete mode 100644 man/namedRegionLastRow.Rd create mode 100644 man/readUserConfigStore.Rd create mode 100644 man/removeUserConfig.Rd delete mode 100644 man/setActiveConfig.Rd create mode 100644 man/updateUserConfig.Rd create mode 100644 man/verifyInputSheetname.Rd create mode 100644 man/writeText.Rd delete mode 100644 man/writeUserConfig.Rd create mode 100644 tests/testthat.R create mode 100644 tests/testthat/example_userconf/test create mode 100644 tests/testthat/example_userconf/testone create mode 100644 tests/testthat/fixtures/logo.png create mode 100644 tests/testthat/setup.R create mode 100644 tests/testthat/test-output.R create mode 100644 tests/testthat/test-userconfig.R rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_epsg2056_json/GEN_A4_GEMEINDEN_2020_epsg2056.json (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_epsg2056_json/GEN_A4_GEMEINDEN_SEEN_2020_epsg2056.json (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_epsg4326_json/GEN_A4_GEMEINDEN_2020_epsg4326.json (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_epsg4326_json/GEN_A4_GEMEINDEN_SEEN_2020_epsg4326.json (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_gpkg/GEN_A4_GEMEINDEN_2020.gpkg (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_gpkg/GEN_A4_GEMEINDEN_SEEN_2020.gpkg (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_shp/GEN_A4_GEMEINDEN_2020.dbf (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_shp/GEN_A4_GEMEINDEN_2020.prj (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_shp/GEN_A4_GEMEINDEN_2020.shp (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_shp/GEN_A4_GEMEINDEN_2020.shp.xml (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_shp/GEN_A4_GEMEINDEN_2020.shx (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_shp/GEN_A4_GEMEINDEN_SEEN_2020.dbf (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_shp/GEN_A4_GEMEINDEN_SEEN_2020.prj (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_shp/GEN_A4_GEMEINDEN_SEEN_2020.shp (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_shp/GEN_A4_GEMEINDEN_SEEN_2020.shp.xml (100%) rename vignettes/{ => data}/GEN_A4_GEMEINDEN_2020_shp/GEN_A4_GEMEINDEN_SEEN_2020.shx (100%) rename vignettes/{daten => data}/KTZH_00000544_00001031.csv (100%) rename vignettes/{ => data}/Metadaten.pdf (100%) create mode 100644 vignettes/data/geodata.zip create mode 100644 vignettes/img/aXLSX_1.PNG create mode 100644 vignettes/img/aXLSX_2.PNG create mode 100644 vignettes/img/datasetsXLSX_1.PNG create mode 100644 vignettes/img/datasetsXLSX_2.PNG create mode 100644 vignettes/img/datasetsXLSX_3.PNG create mode 100644 vignettes/img/map.png create mode 100644 vignettes/img/quickXLSX.PNG create mode 100644 vignettes/img/quickXLSX_grouped.PNG create mode 100644 vignettes/img/quickXLSX_pct.PNG rename vignettes/{ => img}/rmd_template.PNG (100%) rename vignettes/{ => img}/sample_report.PNG (100%) rename vignettes/{ => img}/zh_report.PNG (100%) delete mode 100644 vignettes/map.png delete mode 100644 vignettes/output-aXLSX-1.PNG delete mode 100644 vignettes/output-aXLSX-2.PNG delete mode 100644 vignettes/output-datasetsXLSX-1.PNG delete mode 100644 vignettes/output-datasetsXLSX-2.PNG delete mode 100644 vignettes/output-quickXLSX.PNG delete mode 100644 vignettes/output-splitXLSX.PNG diff --git a/.Rbuildignore b/.Rbuildignore index e9d79b2..9131e48 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -9,3 +9,5 @@ ^\.github$ ^_pkgdown\.yml$ +^doc$ +^Meta$ diff --git a/.gitignore b/.gitignore index 10c71b2..13a64cb 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,7 @@ .RData inst/doc docs +*.xlsx +sqlnet.log +/doc/ +/Meta/ diff --git a/DESCRIPTION b/DESCRIPTION index eaa093f..6d8df7d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: statR Title: statR -Version: 2.3.2 +Version: 2.4.0 Authors@R: as.person(c( "Andrea Schnell [aut]", "Michelle Donzallaz [aut]", @@ -13,8 +13,7 @@ Description: statR beinhaltet eine Reihe von Funktionen mit denen unter anderem Depends: R (>= 3.3.0) License: GPL-3 Encoding: UTF-8 -LazyData: true -RoxygenNote: 7.2.1 +RoxygenNote: 7.2.3 Imports: dplyr, ggplot2, @@ -35,11 +34,12 @@ Suggests: knitr, tidyr, rmarkdown, - ggrepel, magrittr, downloader, zip, sf, dichromat, - ggrepel + ggrepel, + testthat (>= 3.0.0) VignetteBuilder: knitr +Config/testthat/edition: 3 diff --git a/NAMESPACE b/NAMESPACE index 3d5c8d3..e0ba4ac 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,26 +1,41 @@ # Generated by roxygen2: do not edit by hand export(aXLSX) +export(addUserConfig) +export(add_attribute) +export(add_group_names) +export(add_grouplines) +export(add_metadata) +export(add_plot_size) +export(add_sheetname) +export(add_source) +export(add_title) export(datasetsXLSX) export(display) export(display.statcol.all) +export(extract_attribute) +export(extract_attributes) export(flush_left) -export(getActiveConfigName) -export(getUserConfigs) +export(initUserConfigStore) +export(inputHelperContactInfo) +export(inputHelperHomepage) +export(insert_header) export(insert_hyperlinks) +export(insert_index_hyperlinks) export(insert_index_sheet) export(insert_metadata_sheet) export(insert_worksheet) export(insert_worksheet_image) export(insert_worksheet_nh) export(interpolate2) +export(loadUserConfig) export(quickXLSX) export(quick_sum) -export(readUserConfig) -export(setActiveConfig) +export(removeUserConfig) export(splitXLSX) export(theme_stat) -export(writeUserConfig) +export(updateUserConfig) +export(writeText) export(zhpal) importFrom(dplyr,"%>%") importFrom(ggplot2,aes) @@ -38,10 +53,17 @@ importFrom(ggplot2,unit) importFrom(grDevices,"colorRampPalette") importFrom(graphics,"rect") importFrom(methods,is) +importFrom(openxlsx,addStyle) +importFrom(openxlsx,makeHyperlinkString) +importFrom(openxlsx,writeFormula) importFrom(rlang,":=") importFrom(rlang,.data) importFrom(scales,manual_pal) importFrom(stats,median) importFrom(stats,quantile) importFrom(stats,sd) +importFrom(utils,head) +importFrom(utils,read.table) importFrom(utils,stack) +importFrom(utils,tail) +importFrom(utils,write.table) diff --git a/NEWS.md b/NEWS.md index 175762d..ee53f22 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,35 @@ +# statR 2.4.0 +* User configuration files are now stored at path pointed to by + tools::R_user_dir. This eliminates the problem that configuration files would + be lost on updates +* Deprecated and removed inputHelperSource, inputHelperMetadata, and associated + global options. If multiple sources need to be shown in one row, users should + create the string via paste() or similar functions. +* Fixed an issue where Excel Worksheets created using datasetsXLSX could become + corrupted. +* When defining a second header (either by numeric index or variable name at + the beginning of a block) are now properly merged and centered. Last block + terminates at the final column of the dataset. +* splitXLSX is now based on datasetsXLSX. +* When including images with datasetsXLSX, users can now specify a title, + source, and metadata. +* Users can now attach an additional metadata sheet in datasetsXLSX. +* insert_worksheet allows users to leave the source and metadata arguments at + NULL. In these instances, the function no longer includes an empty row. +* Reworked datasetsXLSX to allow a tidyverse-like workflow where titles, + sources, metadata, etc. are attached as attributes to objects (see examples). +* As part of this syntax, users can more easily control how sources and + metadata are displayed. add_source() and add_metadata() both take prefix and + collapse as input. +* insert_hyperlinks now (formally) allows users to point to external files. + +## Problems +* Found an issue where output .xlsx is considered corrupt by Excel when using + sheetnames with special characters or spaces. The reason is that sheetnames + are used to construct named regions. The resulting illegal names don't cause + issues in R, but are detected and removed by Microsoft Excel. To ensure that + warnings aren't accidentally shown, + # statR 2.3.2 ## Bugfix diff --git a/R/aXLSX.R b/R/aXLSX.R deleted file mode 100644 index 116c22f..0000000 --- a/R/aXLSX.R +++ /dev/null @@ -1,48 +0,0 @@ -#' aXLSX() -#' -#' @description Function to export data from R to a formatted .xlsx-file. The -#' data is exported to the first sheet. Metadata information is exported to -#' the second sheet. -#' @inheritParams insert_worksheet -#' @param file Path of output xlsx-file. -#' @examples -#' aXLSX(data = mtcars, -#' title = "Motor trend car road tests", -#' file = tempfile(fileext = ".xlsx"), -#' source = paste("Source: Henderson and Velleman (1981). Building", -#' "multiple regression models interactively.", -#' "Biometrics, 37, 391–411."), -#' metadata = paste("The data was extracted from the 1974", -#' "Motor Trend US magazine and comprises fuel", -#' "consumption and 10 aspects of automobile design", -#' "and performance for 32 automobiles", -#' "(1973–74 models).")) -#' @keywords aXLSX -#' @export -aXLSX <- function(data, - file, - title = "Title", - source = getOption("statR_source"), - metadata = NA, - logo = getOption("statR_logo"), - contactdetails = inputHelperContactInfo(), - author = "user", - grouplines = NA, - group_names = NA) { - - # Initialize Workbook object ------- - wb <- openxlsx::createWorkbook() - - # Insert data ----- - insert_worksheet_nh(wb, data = data, title = title, source = source, - metadata = NA, grouplines = grouplines, - group_names = group_names) - - # Insert metadata ------- - insert_metadata_sheet(wb, title = title, source = source, metadata = metadata, - logo = logo, contactdetails = contactdetails, - author = author) - - # Write workbook to disk -------- - openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) -} diff --git a/R/checks.R b/R/checks.R index 19deb1f..100c1b8 100644 --- a/R/checks.R +++ b/R/checks.R @@ -1,22 +1,27 @@ -#' checkGroupOptionCompatibility() +#' Check if image is an implemented plot type #' -#' @description Check if group_names and grouplines match -#' @param group_names A character vector with group names -#' @param grouplines A character or integer vector of columns to put grouplines at -#' @keywords internal -#' @noRd -checkGroupOptionCompatibility <- function (group_names, grouplines){ - if (any(!is.na(group_names)) & all(is.na(grouplines))) { - stop("For a second header, the grouplines must be specified") - } -} - -#' checkImplementedPlotType() -#' -#' @description Check if image is an implemented plot type #' @param image Any R object #' @keywords internal #' @noRd checkImplementedPlotType <- function(image) { - length(setdiff(class(image), c("gg", "ggplot", "histogram"))) == 0 + + valid_objects <- c("gg", "ggplot", "histogram", "character") + + correct_object_type <- inherits(image, valid_objects) + + if (!correct_object_type) { + return(FALSE) + + } else if (is.character(image)) { + + if (!(grepl("(.jpeg|.jpg|.png|.bmp)$", image))) { + return(FALSE) + } + + if (!file.exists(image)) { + warning("Image ", image, " not found!") + } + } + + return(TRUE) } diff --git a/R/content.R b/R/content.R new file mode 100644 index 0000000..b89a39f --- /dev/null +++ b/R/content.R @@ -0,0 +1,226 @@ +#' Helper functions for adding attributes to input objects +#' +#' @description A set of helper functions which serve the purpose of allowing +#' users to assign information like sheetnames, titles, sources, metadata, and +#' more to an object. These attributes are then used in place of the function +#' arguments. +#' +#' @details +#' \code{add_sheetname}: Adds a sheetname. +#' +#' \code{add_title}: Adds a title +#' +#' \code{add_source}: Adds a source. Behavior can be modified further via the +#' prefix and collapse argument. Setting collapse to a value other than NULL +#' will result in the input provided in value being concatenated. +#' +#' \code{add_metadata}: Adds metadata. Behavior can be modified further via the +#' prefix and collapse argument, just like with \code{add_source}. +#' +#' \code{add_grouplines}: Adds group lines. Throws an error if input object is +#' not a data.frame. +#' +#' \code{add_group_names}: Adds group names. Throws an error if group lines +#' have not been set. +#' +#' \code{add_plot_height}: Adds plot height. Throws an error if input object is +#' not a valid plot type. +#' +#' \code{add_plot_width}: Adds plot width. Throws an error if input object is +#' not a valid plot type. +#' +#' \code{add_plot_size}: Assigns both height and width in one call. Expects a +#' vector of length 2, with the first element corresponding to width, and the +#' second to height. +#' @param object The object to add an attribute to +#' @param value A value +#' @param prefix A prefix, default to NULL +#' @param collapse Separator to collapse character vectors on, defaults to NULL +#' @rdname add_attribute +#' @examples +#' library(dplyr) +#' library(ggplot2) +#' +#' # Load data and assign attributes in one pipeline +#' df <- mtcars %>% +#' add_sheetname("Cars") %>% +#' add_title("Motor Trend Car Road Tests") %>% +#' add_source( +#' c("Henderson and Velleman (1981),", +#' "Building multiple regression models interactively.", +#' "Biometrics, 37, 391–411.")) %>% +#' add_metadata( +#' c("The data was extracted from the 1974 Motor", +#' "Trend US magazine and comprises fuel consumption", +#' "and 10 aspects of automobile design and", +#' "performance for 32 automobiles (1973–74 models).")) +#' +#' # Create a plot and assign attributes in one pipeline +#' plt <- (ggplot(mtcars) + +#' geom_histogram(aes(x = hp))) %>% +#' add_sheetname("PS") %>% +#' add_title("Histogram of horsepower") %>% +#' add_plot_size(c(6, 3)) +#' +#' # Generate outputfile using minimal call +#' \dontrun{ +#' datasetsXLSX( +#' file = tempfile(fileext = ".xlsx"), +#' datasets = list(df, plt)) +#' } +#' @export +add_attribute <- function(object, what, value) { + UseMethod("add_attribute", object) +} + +#' @rdname add_attribute +#' @keywords internal +add_attribute.default <- function(object, what, value) { + attr(object, what) <- value + class(object) <- c(class(object), "Content") + return(object) +} + +#' @rdname add_attribute +#' @keywords internal +add_attribute.Content <- function(object, what, value) { + attr(object, what) <- value + return(object) +} + +#' @rdname add_attribute +#' @export +add_sheetname <- function(object, value) { + add_attribute(object, "sheetname", value) +} + +#' @rdname add_attribute +#' @export +add_title <- function(object, value) { + add_attribute(object, "title", value) +} + +#' @rdname add_attribute +#' @export +add_source <- function(object, value) { + add_attribute(object, "source", value) +} + +#' @rdname add_attribute +#' @export +add_metadata <- function(object, value) { + add_attribute(object, "metadata", value) +} + +#' @rdname add_attribute +#' @export +add_grouplines <- function(object, value) { + if (!inherits(object, "data.frame")) { + warning("Ignoring attribute: grouplines only relevant for data.frames") + return(object) + } + + add_attribute(object, "grouplines", value) +} + +#' @rdname add_attribute +#' @export +add_group_names <- function(object, value) { + if (!inherits(object, "data.frame")) { + warning("Ignoring attribute: group names only relevant for data.frames") + return(object) + } + + if (is.null(extract_attribute(object, "grouplines"))) { + warning("Ignoring attribute: group names require non-null grouplines") + return(object) + } + + add_attribute(object, "group_names", value) +} + +#' @rdname add_attribute +#' @export +add_plot_size <- function(object, value) { + + if (all(is.na(value))) return(object) + + if (!checkImplementedPlotType(object)) { + warning("Tried to attach plot dimension attributes to non-plot object") + return(object) + } + + if (length(value) != 2) { + stop("Expected 2 values but got ", length(value)) + } + + object %>% + add_attribute("plot_width", value[1]) %>% + add_attribute("plot_height", value[2]) +} + +#' Check for presence of keyword attributes in input data.frame +#' +#' A function which checks for presence of certain attributes in an input +#' data.frame. +#' @param object Input data.frame +#' @keywords internal +check_for_attributes <- function(object){ + attributes_to_check <- c("title", "source", "metadata", "grouplines", + "group_names", "metadata_sheet", "plot_width", + "plot_height") + + check <- names(attributes(object)) + return(any(attributes_to_check %in% check)) +} + + +#' Extract attributes from target object +#' +#' @description Function to extract attributes from objects. +#' \code{extract_attribute} expects the input object to be the target. When +#' the target object is nested in a list (as is the case in +#' \code{datasetsXLSX}), \code{extract_attributes} should be used instead. +#' @param object Object to extract attribute from. In practice a data.frame, +#' ggplot object, or a character string providing a path to an image. +#' @param object_list A list of objects of arbitrary types. +#' @param which Name of the attribute to extract. +#' @param required_val Boolean, if TRUE tries to look up a default in global +#' options if attribute not found, and raises an error if none was defined. +#' @rdname extract_attribute +#' @export +extract_attribute <- function(object, which, required_val = FALSE) { + + value <- attr(object, which) + + if (all(is.null(value))) { + + if (required_val) { + value <- getOption(paste0("statR_default_", which)) + + if (all(is.null(value))) { + stop("No default value found for required argument ", which) + } + + } else { + value <- NA + } + } + + return(value) +} +#' @rdname extract_attribute +#' @export +extract_attributes <- function(object_list, which, required_val = FALSE) { + values <- list() + + for (i in seq_along(object_list)) { + values[[i]] <- tryCatch( + extract_attribute(object_list[[i]], which, required_val), + error = function(err) { + stop("missing value in required field '", which, "' of dataset ", i) + }) + } + + return(values) +} diff --git a/R/datasetsXLSX.R b/R/datasetsXLSX.R deleted file mode 100644 index 792b96d..0000000 --- a/R/datasetsXLSX.R +++ /dev/null @@ -1,165 +0,0 @@ -#'datasetsXLSX() -#' -#'@description Function to export several datasets and/or figures from R to an -#' .xlsx-file. The function creates an overview sheet and separate sheets for -#' each dataset/figure. -#'@details When including figures, the heights and widths need to be specified -#' as a vector. For example, say you have one dataset and two figures that you -#' would like to export. widths = c(5,6) then suggests that the first figure -#' will be 5 inches wide, the second 6. To include a figure either save it as a -#' ggplot object or indicate a file path to an existing file (possible formats: -#' png, jpg, bmp). -#'@note For some attributes like plot_widths and plot_heights, if a single value -#' is provided, it will be reused (behavior of purrr::pmap). This is not the -#' case for grouplines and group_names. These must be specified for each dataset. -#'@param file file name of the spreadsheet. The extension ".xlsx" is added -#' automatically. -#'@param index_title Title to be put on the first (overview) sheet. -#'@param datasets datasets or plots to be included. -#'@param plot_widths width of figure in inch (1 inch = 2.54 cm). See details. -#'@param plot_heights height of figure in inch (1 inch = 2.54 cm). See details. -#'@param sheetnames names of the sheet tabs. -#'@param titles titles of the different sheets. -#'@param logo file path to the logo to be included in the index-sheet. Can be -#' "statzh" or "zh". Defaults to "statzh". -#'@param index_source source to be mentioned on the title sheet beneath the title -#'@param sources source of the data. Defaults to "statzh". -#'@param metadata metadata information to be included. Defaults to NA. -#'@param auftrag_id order number. -#'@param contactdetails contact information on the title sheet. Defaults to "statzh" -#'@param homepage web address to be put on the title sheet. Default to "statzh" -#'@param openinghours openinghours written on the title sheet. Defaults to Data -#' Shop -#'@param grouplines Column for second header(s). Format: List e.g list(c(2,4,6)) -#'@param group_names Name(s) of the second header(s). Format: List e.g -#' list(c("title 1", "title 2", "title 3")) -#'@param overwrite overwrites the existing excel files with the same file name. -#' default to FALSE -#'@examples -#'# Example with two datasets and one figure -#'fig <- ggplot2::ggplot(mtcars, ggplot2::aes(x = disp))+ -#' ggplot2::geom_histogram() -#' -#'datasetsXLSX(file = tempfile(fileext = ".xlsx"), -#' datasets = list(mtcars, PlantGrowth, fig), -#' titles = c("mtcars-Datensatz", -#' "PlantGrowth-Datensatz", -#' "Histogramm"), -#' plot_widths = c(5), -#' plot_heights = c(5), -#' sources = c(paste("Source: Henderson and Velleman (1981).", -#' "Building multiple regression models", -#' "interactively. Biometrics, 37, 391–411."), -#' paste("Source: Dobson, A. J. (1983) An Introduction", -#' "to Statistical Modelling.", -#' "London: Chapman and Hall.")), -#' metadata = c("Bemerkungen zum mtcars-Datensatz: x", -#' "Bemerkungen zum PlantGrowth-Datensatz: x"), -#' sheetnames = c("Autos","Blumen", "Histogramm"), -#' index_title = "Autos und Pflanzen", -#' auftrag_id = "A2021_0000", -#' overwrite = TRUE) -#' @keywords datasetsXLSX -#' @importFrom dplyr %>% -#' @export -datasetsXLSX <- function(file, - datasets, - sheetnames, - titles, - sources, - plot_widths = NULL, - plot_heights = NULL, - metadata = NA, - grouplines = NA, - group_names = NA, - index_title = getOption("statR_toc_title"), - index_source = getOption("statR_source"), - logo = getOption("statR_logo"), - contactdetails = inputHelperContactInfo(), - homepage = getOption("statR_homepage"), - openinghours = getOption("statR_openinghours"), - auftrag_id = NULL, - overwrite = FALSE) { - - # Run checks on arguments ------ - checkGroupOptionCompatibility(group_names, grouplines) - - # Initialize new Workbook ------ - wb <- openxlsx::createWorkbook() - - # Create indexes of which inputs correspond to data.frames or plots----- - dataframes_index <- which(vapply(datasets, is.data.frame, TRUE)) - - implemented_plot_types <- c("gg", "ggplot", "histogram", "character") - plot_index <- which(vapply(datasets, function(x) { - length(setdiff(class(x), implemented_plot_types)) == 0 - }, TRUE)) - - # Index from input lists using index ----------- - ### data.frames - dataframe_datasets <- datasets[dataframes_index] - dataframe_sheetnames <- sheetnames[dataframes_index] - dataframe_titles <- titles[dataframes_index] - dataframe_sources <- sources[dataframes_index] - dataframe_metadata <- metadata[dataframes_index] - dataframe_grouplines <- grouplines[dataframes_index] - dataframe_group_names <- group_names[dataframes_index] - - ### Plots - plot_datasets <- datasets[plot_index] - plot_sheetnames <- sheetnames[plot_index] - - - # Insert the initial index sheet ---------- - insert_index_sheet(wb = wb, - title = index_title, - auftrag_id = auftrag_id, - logo = logo, - contactdetails = contactdetails, - homepage = homepage, - openinghours = openinghours, - source = index_source) - - - # Insert datasets according to dataframes_index ------- - if (length(dataframes_index) > 0) { - list(dataframe_datasets, - dataframe_sheetnames, - dataframe_titles, - dataframe_sources, - dataframe_metadata, - dataframe_grouplines, - dataframe_group_names) %>% - purrr::pwalk(~insert_worksheet_nh(wb = wb, - data = ..1, - sheetname = ..2, - title = ..3, - source = ..4, - metadata = ..5, - grouplines = ..6, - group_names = ..7)) - } - - - # Insert images according to plot_index -------- - if (length(plot_index) > 0) { - list(plot_datasets, - plot_sheetnames, - plot_widths, - plot_heights) %>% - purrr::pmap(~insert_worksheet_image(wb = wb, - image = ..1, - sheetname = ..2, - width = ..3, - height = ..4)) - } - - - # Create a table of hyperlinks in index sheet (assumed to be "Index") ------ - insert_hyperlinks(wb, sheetnames, titles, index_sheet_name = "Index", - sheet_start_row = 15) - - - # Save workbook at path denoted by argument file --------- - openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = overwrite) -} diff --git a/R/get_groupline_index_by_pattern.R b/R/get_groupline_index_by_pattern.R deleted file mode 100644 index 05ce6b9..0000000 --- a/R/get_groupline_index_by_pattern.R +++ /dev/null @@ -1,13 +0,0 @@ -#' get_groupline_index_by_pattern() -#' -#' @description Derive groupline index by matching names -#' @inheritParams insert_worksheet -#' @keywords internal -get_groupline_index_by_pattern <- function(grouplines, data) { - - get_lowest_col <- function(groupline, data) { - min(which(grepl(groupline, names(data)))) - } - - unlist(lapply(grouplines, function(x) get_lowest_col(x, data))) -} diff --git a/R/globals.R b/R/globals.R new file mode 100644 index 0000000..1321a95 --- /dev/null +++ b/R/globals.R @@ -0,0 +1,5 @@ +utils::globalVariables( + c( + "Anzahl" # quick_sum + ) +) diff --git a/R/helper.R b/R/helper.R index 56db6ff..b2aeeb5 100644 --- a/R/helper.R +++ b/R/helper.R @@ -1,4 +1,4 @@ -#' verifyInputSheetname() +#' Ensure that a sheetname are unique and legal according to MS Excel #' #' @description Function which truncates a sheetname to 31 characters #' @details MS Excel imposes a character limit of 31 characters for names of @@ -7,17 +7,44 @@ #' @param sheetname A character string with the name for an XLSX worksheet #' @returns A character string #' @keywords internal -#' @noRd +#' @rdname verifyInputSheetname verifyInputSheetname <- function(sheetname) { + + forbidden_chars <- c("/", "\\", "?", "*", ":", "[", "]") + pattern <- paste0("(", paste0( + paste0("\\", forbidden_chars), collapse = "|"), ")") + if (nchar(sheetname) > 31) { - message("sheetname truncated at 31 characters to satisfy MS-Excel limit.") + message("sheetname ", sheetname, "truncated at 31 characters (Excel limit).") + sheetname <- substr(sheetname, 0, 31) + } + + if (grepl(pattern, sheetname)) { + message("Found (and replaced with '_') forbidden characters: ", + paste(forbidden_chars, collapse = " ")) + sheetname <- gsub(pattern, "_", sheetname) + } + + return(sheetname) +} + +#' @rdname verifyInputSheetname +verifyInputSheetnames <- function(sheetnames) { + + output_sheetnames <- lapply(sheetnames, verifyInputSheetname) + counts <- table(unlist(output_sheetnames)) + + if (any(counts > 1)) { + duplicates <- names(counts)[counts > 1] + stop("Duplicate sheetnames after truncation for datasets ", + paste(which(output_sheetnames %in% duplicates), collapse = ", ")) } - return(substr(sheetname, 0, 31)) + return(output_sheetnames) } -#' verifyInputFilename() +#' Ensure that filename has file extension #' #' @description Function which adds a file extension to a filename if missing . #' @param filename A character string with the filename @@ -25,13 +52,12 @@ verifyInputSheetname <- function(sheetname) { #' @returns A character string #' @keywords internal #' @noRd -verifyInputFilename <- function(filename, extension = ".xlsx") { - regex_pattern <- paste0(extension, "$") - paste0(gsub(regex_pattern, "", filename), extension) +verifyInputFilename <- function(filename, extension = "xlsx") { + regex_pattern <- paste0("[.]", extension, "$") + paste0(gsub(regex_pattern, "", filename), ".", extension) } - -#' verifyDataUngrouped() +#' Ensure that input data is ungrouped #' #' @description Function which checks if a data.frame is a grouped_df, in which #' case it calls dplyr::ungroup(). @@ -47,54 +73,8 @@ verifyDataUngrouped <- function(data) { return(dplyr::ungroup(data)) } -#' inputHelperSource() -#' -#' @description Substitute default value "statzh" with official title -#' @param source A character vector with source information -#' @param prefix A character string giving prepended to the sources -#' @param collapse Separator for collapsing multiple sources with -#' @returns A character string -#' @keywords internal -#' @noRd -inputHelperSource <- function(source, prefix = getOption("statR_prefix_source"), - collapse = getOption("statR_collapse")) { - - if (all(is.na(source))) { - return("") - } - - if (!is.null(collapse)) { - return(paste(prefix, paste0(source, collapse = collapse))) - } - - return(c(prefix, source)) -} - - -#' inputHelperMetadata() -#' -#' @description Concatenate metadata into a formatted string. -#' @inheritParams inputHelperSource -#' @param metadata A character vector with metadata information -#' @returns A character vector -#' @keywords internal -#' @noRd -inputHelperMetadata <- function(metadata, prefix = getOption("statR_prefix_metadata"), - collapse = getOption("statR_collapse")) { - - if (all(is.na(metadata))) { - return("") - } - - if (!is.null(collapse)) { - return(paste(prefix, paste0(metadata, collapse = collapse))) - } - - return(c(prefix, metadata)) -} - -#' inputHelperLogoPath() +#' Set up logo path and attach settings for width and height #' #' @description Replace default values "zh" and "statzh" with the file path to #' the respective logo (included in /extdata), otherwise returns the input value. @@ -102,29 +82,38 @@ inputHelperMetadata <- function(metadata, prefix = getOption("statR_prefix_metad #' @returns A character string #' @keywords internal #' @noRd -inputHelperLogoPath <- function(logo) { +inputHelperLogoPath <- function( + logo, width = getOption("statR_logo_width"), + height = getOption("statR_logo_height")) { + if (is.null(logo)) { message("No logo added.") - } else if (logo == "statzh") { - logo <- paste0(find.package("statR"), "/extdata/", statzh_logo) + } else { + + if (logo == "zh") { + logo <- system.file("extdata/Stempel_Kanton_ZH.png", package = "statR") + + } else if (logo == "statzh") { + logo <- system.file("extdata/Stempel_STAT-01.png", package = "statR") + } - } else if (logo == "zh") { - logo <- paste0(find.package("statR"), "/extdata/", zh_logo) + logo <- add_plot_size(logo, c(width, height)) } return(logo) } -#' inputHelperContactInfo() +#' Construct a vector with contact information from defaults #' -#' @description Replaces default value "statzh" with the contact information of -#' the Statistics Office of Canton Zurich, otherwise returns the input value. -#' @param compact A boolean which controls the format of the contact information. Default: FALSE +#' A helper function which constructs a character vector from the contact +#' information defined in the user profile. If \code{compact = TRUE}, the +#' organization is dropped, and the name and phone number are displayed in the +#' same row. +#' @param compact A boolean. If TRUE, a shortened version is displayed #' @returns A character vector -#' @keywords internal -#' @noRd +#' @export inputHelperContactInfo <- function(compact = FALSE) { phone <- inputHelperPhone(getOption("statR_phone")) @@ -138,32 +127,12 @@ inputHelperContactInfo <- function(compact = FALSE) { phone, getOption("statR_email"))) } - -#' inputHelperOfficeHours() -#' -#' @description Replace default value "statzh" with the office hours -#' of the Statistics Office of Canton Zurich, otherwise returns -#' the input value. -#' @param openinghours A character vector with opening hours. -#' @returns A character vector -#' @keywords internal -#' @noRd -inputHelperOfficeHours <- function(openinghours) { - if (openinghours == "statzh") { - openinghours <- statzh_openinghours - } - - return(openinghours) -} - - -#' inputHelperHomepage() +#' Set homepage to a hyperlink #' -#' @description Formats homepage as a hyperlink object. +#' Formats homepage as a hyperlink object. #' @param homepage A character string #' @returns A character string or a 'hyperlink' object -#' @keywords internal -#' @noRd +#' @export inputHelperHomepage <- function(homepage) { if (!is.null(homepage)) { class(homepage) <- "hyperlink" @@ -187,7 +156,6 @@ inputHelperPhone <- function(phone, prefix = getOption("statR_prefix_phone")) { return(phone) } - #' inputHelperDateCreated() #' #' @description Returns current date as a string with format specified by date_format @@ -198,11 +166,10 @@ inputHelperPhone <- function(phone, prefix = getOption("statR_prefix_phone")) { #' @seealso format #' @noRd inputHelperDateCreated <- function(prefix = getOption("statR_prefix_date"), - date_format = getOption("date_format")) { + date_format = getOption("statR_date_format")) { paste(prefix, format(Sys.Date(), format = date_format)) } - #' inputHelperOrderNumber() #' #' @description Returns current date as a string with format specified by date_format @@ -220,7 +187,6 @@ inputHelperOrderNumber <- function(order_num, return(order_num) } - #' inputHelperAuthorName() #' #' @description Function extracts initials from global environment if @@ -233,6 +199,11 @@ inputHelperOrderNumber <- function(order_num, #' inputHelperAuthorName <- function(author, prefix = getOption("statR_prefix_author")) { + + if (is.null(author) || is.na(author)) { + return(NULL) + } + if (author == "user") { sys_vals <- c(Sys.getenv("USERNAME"), Sys.getenv("USER")) author_name <- sys_vals[which(sys_vals != "")[1]] @@ -242,9 +213,7 @@ inputHelperAuthorName <- function(author, return(paste(prefix, author)) } - - -#' excelIndexToRowCol() +#' Convert Excel index to row/column indices #' #' @description Converts an Excel style index (e.g. A1) into numeric row and #' column indices. Handles cells (A1) as well as matrices (A1:B2) @@ -282,7 +251,7 @@ excelIndexToRowCol <- function(index) { } -#' namedRegionExtent() +#' Determine the row and column extent of named regions #' #' @description Get extent of a named region in a workbook object #' @details If a single name is provided, returns the extent of the associated @@ -290,7 +259,7 @@ excelIndexToRowCol <- function(index) { #' returned instead. If left at default (NULL), the combined extent of all #' regions is returned. #' @param wb A workbook object -#' @param sheet Name of a worksheet +#' @param sheetname Name of a worksheet #' @param region_name names of regions in Workbook. #' @param which either "row", "col", or "both" (default). #' @returns A list with two numeric vectors row and col, containing @@ -302,12 +271,13 @@ namedRegionExtent <- function(wb, sheetname, region_name = NULL, if (!(sheetname %in% names(wb))) { stop("Sheetname does not exist in Workbook") + + } else if (all(is.null(named_regions))) { + stop("No named regions defined.") } sheet_ind <- which(sheetname == attr(named_regions, "sheet")) region_names <- named_regions[sheet_ind] - - positions <- attr(named_regions, "position")[sheet_ind] if (which == "both") { @@ -335,69 +305,86 @@ namedRegionExtent <- function(wb, sheetname, region_name = NULL, } -#' namedRegionRowExtent() +#' Determine the extent of a named region in a particular direction #' -#' @description Get row extent of a named region in a workbook object +#' @description Get row or column extent of a named region in a workbook object. #' @inheritParams namedRegionExtent -#' @returns A numeric vector of row indices +#' @returns A numeric vector of indices +#' @rdname namedRegionExtent1D #' @keywords internal -#' namedRegionRowExtent <- function(wb, sheetname, region_name = NULL) { unlist(namedRegionExtent(wb, sheetname, region_name, "row")) } - - -#' namedRegionColumnExtent() -#' -#' @description Get column extent of a named region in a Workbook object -#' @inheritParams namedRegionExtent -#' @returns A numeric vector of column indices +#' @rdname namedRegionExtent1D #' @keywords internal -#' -namedRegionColumnExtent <- function(wb, sheetname, name = NULL) { - unlist(namedRegionExtent(wb, sheetname, name, "col")) +namedRegionColumnExtent <- function(wb, sheetname, region_name = NULL) { + unlist(namedRegionExtent(wb, sheetname, region_name, "col")) } -#' namedRegionFirstRow() +#' Functions to determine the outer boundaries of named regions #' -#' @description Get first row number of named region +#' @description Methods for determining the first and last index of +#' a namedRegion in row and column directions. #' @inheritParams namedRegionExtent -#' @returns Numeric value corresponding to first row of named region +#' @returns Numeric value #' @keywords internal -namedRegionFirstRow <- function(wb, sheet, region_name = NULL) { - min(namedRegionRowExtent(wb, sheet, region_name)) +#' @rdname namedRegionBoundary +namedRegionFirstRow <- function(wb, sheetname, region_name = NULL) { + min(namedRegionRowExtent(wb, sheetname, region_name)) } - - -#' namedRegionLastRow() -#' -#' @description Get last row number of named region -#' @inheritParams namedRegionExtent -#' @returns Numeric value corresponding to last row of named region +#' @rdname namedRegionBoundary +#' @keywords internal +namedRegionLastRow <- function(wb, sheetname, region_name = NULL) { + max(namedRegionRowExtent(wb, sheetname, region_name)) +} +#' @rdname namedRegionBoundary +#' @keywords internal +namedRegionFirstCol <- function(wb, sheetname, region_name = NULL) { + min(namedRegionColumnExtent(wb, sheetname, region_name)) +} +#' @rdname namedRegionBoundary #' @keywords internal -namedRegionLastRow <- function(wb, sheet, region_name = NULL) { - max(namedRegionRowExtent(wb, sheet, region_name)) +namedRegionLastCol <- function(wb, sheetname, region_name = NULL) { + max(namedRegionColumnExtent(wb, sheetname, region_name)) } -#' namedRegionFirstCol() +#' cleanNamedRegions() #' -#' @description Get first col number of named region -#' @inheritParams namedRegionExtent -#' @returns Numeric value corresponding to first column of named region +#' @description Function to clean up unneeded named regions. +#' @details Named regions are used as a convenient tool during the construction +#' of the output workbook. This function can be used to remove some or all +#' named regions. Note: this doesn't extend to the data contained in a named +#' region. +#' @note When working with insert-like functions to construct a custom output, +#' this function should only be called just before the conversion of the workbook into an .xlsx file. +#' @param wb A workbook object +#' @param which Either "keep_data" (to keep any named regions pertaining to tables), +#' or "all". #' @keywords internal -namedRegionFirstCol <- function(wb, sheet, region_name = NULL) { - min(namedRegionColumnExtent(wb, sheet, region_name)) +#' @noRd +cleanNamedRegions <- function(wb, which = c("keep_data", "all")) { + named_regions <- openxlsx::getNamedRegions(wb) + delete_regions <- c() + + if (which == "keep_data") { + delete_regions <- named_regions[!grepl("_data", named_regions)] + } else if (which == "all") { + delete_regions <- named_regions + } + + if (length(delete_regions > 0)) { + purrr::walk(delete_regions, ~openxlsx::deleteNamedRegion(wb, .)) + } } -#' namedRegionLastCol() + +#' Convert missing input to NULL #' -#' @description Get last col number of named region -#' @inheritParams namedRegionExtent -#' @returns Numeric value corresponding to last column of named region #' @keywords internal -namedRegionLastCol <- function(wb, sheet, region_name = NULL) { - max(namedRegionColumnExtent(wb, sheet, region_name)) +missingToNull <- function(input_value) { + if (!missing(input_value)) + return(input_value) } diff --git a/R/imports.R b/R/imports.R new file mode 100644 index 0000000..4cd185f --- /dev/null +++ b/R/imports.R @@ -0,0 +1,4 @@ +#' Imports +#' @importFrom utils read.table write.table +#' @noRd +NULL diff --git a/R/insert_hyperlinks.R b/R/insert_hyperlinks.R index 141d8b2..24be33b 100644 --- a/R/insert_hyperlinks.R +++ b/R/insert_hyperlinks.R @@ -1,58 +1,59 @@ -#' insert_hyperlink() +#' Insert hyperlinks with titles and sheetnames #' #' @description Function for inserting hyperlinks within an openxlsx Workbook #' @inheritParams insert_worksheet -#' @param sheet_row Row where hyperlink should be inserted #' @param index_sheet_name Name of sheet where hyperlink should be created -#' @keywords internal -insert_hyperlink <- function(wb, sheetname, title, sheet_row, - index_sheet_name) { - - openxlsx::writeData(wb, index_sheet_name, title, startCol = 3, - startRow = sheet_row) - openxlsx::addStyle(wb, index_sheet_name, hyperlinkStyle(), sheet_row, - cols = 3) - openxlsx::mergeCells(wb, index_sheet_name, rows = sheet_row, cols = 3:8) - - # Set up hyperlink ------- - worksheet <- wb$sheetOrder[1] - - field_t <- wb$worksheets[[worksheet]]$sheet_data$t - field_t[length(field_t)] <- 3 +#' @param sheetname Names of sheets to create hyperlinks to +#' @param title Titles of Hyperlinks +#' @param sheet_start_row Initial row after which hyperlinks should be created +#' @keywords insert_hyperlinks +#' @importFrom openxlsx makeHyperlinkString writeFormula addStyle +#' @export +insert_index_hyperlinks <- function(wb, sheetname, title, + index_sheet_name = "Index", + sheet_start_row = 15) { - field_v <- wb$worksheets[[worksheet]]$sheet_data$v - field_v[length(field_v)] <- NA + insert_hyperlinks( + wb, sheetname, sheetname, index_sheet_name, sheet_start_row) - field_f <- wb$worksheets[[worksheet]]$sheet_data$f - field_f[length(field_f)] <- paste0("=HYPERLINK("#'", sheetname, - "'!A1", "", title, - "")") + openxlsx::writeData( + wb, index_sheet_name, unlist(title), startCol = 7, startRow = sheet_start_row) - wb$worksheets[[worksheet]]$sheet_data$t <- as.integer(field_t) - wb$worksheets[[worksheet]]$sheet_data$v <- field_v - wb$worksheets[[worksheet]]$sheet_data$f <- field_f + purrr::walk( + sheet_start_row + seq_along(sheetname) - 1, + ~openxlsx::mergeCells(wb, index_sheet_name, 3:6, .x)) + purrr::walk( + sheet_start_row + seq_along(sheetname) - 1, + ~openxlsx::mergeCells(wb, index_sheet_name, 7:20, .x)) } -#' insert_hyperlinks() +#' Insert hyperlinks #' -#' @description Function for inserting hyperlinks within an openxlsx Workbook +#' @description Function for inserting hyperlinks within an openxlsx Workbook. +#' Provides support for links to external .xlsx. #' @inheritParams insert_worksheet -#' @inheritParams insert_hyperlink -#' @param sheetnames Names of sheets to create hyperlinks to -#' @param titles Titles of Hyperlinks -#' @param sheet_start_row Initial row after which hyperlinks should be created +#' @param sheetname Names of sheets to create hyperlinks to +#' @param text Text to display in the cell with the hyperlink +#' @param where Name of the worksheet where the hyperlinks should be inserted +#' @param start_row First row from which hyperlink should be inserted +#' @param file External file. Default: NULL #' @keywords insert_hyperlinks +#' @importFrom openxlsx makeHyperlinkString writeFormula addStyle #' @export -insert_hyperlinks <- function(wb, sheetnames, titles, - index_sheet_name = "Index", - sheet_start_row = 15) { +insert_hyperlinks <- function(wb, sheetname, text, where, + start_row = 15, file = NULL) { - sheet_rows <- sheet_start_row + seq(0, length(sheetnames) - 1) + # If File not found or not an xlsx, set to NULL and raise warning + if (!is.null(file) && !(file.exists(file) || !grepl(".xlsx", file))) { + warning("File not found or not an xlsx.") + } - list(sheetnames, titles, sheet_rows) %>% - purrr::pwalk(~insert_hyperlink(wb, sheetname = ..1, title = ..2, - sheet_row = ..3, - index_sheet_name = index_sheet_name)) -} + hyperlink_strings <- makeHyperlinkString(sheetname, text = text, + file = file) + writeFormula(wb, where, hyperlink_strings, startCol = 3, + startRow = start_row) + addStyle(wb, where, hyperlinkStyle(), + rows = start_row + seq_along(sheetname) - 1, cols = 3) +} diff --git a/R/insert_image.R b/R/insert_image.R index ebc26c8..5aea0a5 100644 --- a/R/insert_image.R +++ b/R/insert_image.R @@ -1,19 +1,25 @@ -#' insert_worksheet_image() +#' Insert image into workbooks #' -#' @description Insert an image into a worksheet +#' @description Inserts an image into a new worksheet, optionally with title, +#' source, and metadata. Images must be provided either as a ggplot object +#' or as a path to the image file. #' @note The function does not write the result into a .xlsx file. A separate #' call to openxlsx::saveWorkbook() is required. A temporary file is created #' for inputs of type gg, ggplot or histogram object at path given by #' `tempfile()`. -#' @param image image or plot #' @param wb workbook object to write new worksheet in -#' @param sheetname name of the sheet tab +#' @param sheetname Name of the sheet where the image should be inserted +#' @param image Image, either a ggplot object or the path to an existing image. +#' @param title Title of the image. Can be NULL +#' @param source Source associated with the image. Can be NULL. +#' @param metadata Metadata associated with the image. Can be NULL. #' @param startrow row coordinate of upper left corner of figure #' @param startcol column coordinate of upper left corner of figure #' @param width width of figure #' @param height height of figure #' @param units unit of measurement (default: in) #' @param dpi image resolution (default: 300) +#' #' @examples #' figure <- ggplot2::ggplot(mtcars, ggplot2::aes(x = disp)) + #' ggplot2::geom_histogram() @@ -24,52 +30,63 @@ #' @keywords insert_worksheet_image #' @importFrom methods is #' @export -insert_worksheet_image <- function(wb, sheetname, image, startrow = 3, - startcol = 3, width, height, +insert_worksheet_image <- function(wb, sheetname, image, title = NULL, + source = NULL, metadata = NULL, width = NULL, + height = NULL, startrow = 3, startcol = 3, units = "in", dpi = 300) { + for (value in c("title", "source", "metadata")) { + if (is.null(eval(as.name(value)))) { + assign(value, extract_attribute(image, value)) + } + } + + if (is.null(width)) width <- extract_attribute(image, "plot_width", TRUE) + if (is.null(height)) height <- extract_attribute(image, "plot_height", TRUE) + # If image is.null, pass if (is.null(image)) return() - else if (is.character(image)) image_path <- image - - else if (checkImplementedPlotType(image)) { - image_path <- tempfile(fileext = ".png") + if (checkImplementedPlotType(image)) { + image_path <- ifelse(is.character(image), image, tempfile(fileext = ".png")) } else { - stop("Plot muss als ggplot Objekt oder als Filepath vorliegen.") + stop("Plot muss ein ggplot Objekt oder Dateipfad sein.") } - - # Create png of plot ---------- - if (is(image, "histogram")) { - grDevices::png(image_path, width = width, height = height, units = units, - res = dpi) - plot(image) - grDevices::dev.off() - } - - else if (is(image, "gg") | is(image, "ggplot2")) { + if (inherits(image, c("gg", "ggplot"))) { ggplot2::ggsave(image_path, plot = image, device = "png", width = width, height = height, units = units, dpi = dpi) } - # If file not found at image_path, warn and pass if (!file.exists(image_path)) { - warning("Image not found.") + warning("Datei ", image_path, " nicht gefunden.") return() } - # Add worksheet if not already defined --------- if (!(sheetname %in% names(wb))) { openxlsx::addWorksheet(wb, sheetName = sheetname, gridLines = FALSE) } + if (is.character(title)) { + writeText(wb, sheetname, title, startrow, startcol + 0:17, style_title(), "imgtitle") + startrow <- namedRegionLastRow(wb, sheetname, "imgtitle") + 1 + } + + if (is.character(source)) { + writeText(wb, sheetname, source, startrow, startcol + 0:17, style_subtitle(), "imgsource") + startrow <- namedRegionLastRow(wb, sheetname, "imgsource") + 1 + } + + if (is.character(metadata)) { + writeText(wb, sheetname, metadata, startrow, startcol + 0:17, style_subtitle(), "imgmetadata") + startrow <- namedRegionLastRow(wb, sheetname, "imgmetadata") + 1 + } + # Insert image --------- openxlsx::insertImage(wb, sheet = sheetname, file = image_path, width = width, height = height, startRow = startrow, startCol = startcol, units = units, dpi = dpi) - } diff --git a/R/insert_index_sheet.R b/R/insert_index_sheet.R index 313729b..9d58bcd 100644 --- a/R/insert_index_sheet.R +++ b/R/insert_index_sheet.R @@ -1,94 +1,44 @@ -#' insert_index_sheet() +#' Insert empty index sheet #' -#' @description Function which generates an index sheet inside an openxlsx -#' workbook. +#' @description Function which initializes an empty index sheet. The function is +#' intended to be called at the beginning of a workflow (just after the +#' initialization of the Workbook object), and paired with the function +#' \code{insert_index_hyperlinks()}. +#' @details The logo can be customized via the `statR_logo` global option. This +#' should point to the path of the logo file. Other options such as the image +#' size in the final .xlsx can either be changed via the options +#' `statR_logo_width` and `statR_logo_height`, or set along with contact +#' information in a custom profile. #' @inheritParams insert_worksheet #' @param openinghours statzh or a character string or vector with opening hours #' @param auftrag_id Order ID #' @keywords insert_index_sheet #' @export -insert_index_sheet <- function(wb, - sheetname = "Index", - title, - auftrag_id, - logo = getOption("statR_logo"), - contactdetails = inputHelperContactInfo(), - homepage = getOption("statR_homepage"), - openinghours = getOption("statR_openinghours"), - source = getOption("statR_source")) { +insert_index_sheet <- function( + wb, sheetname = "Index", title, auftrag_id, logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), homepage = getOption("statR_homepage"), + openinghours = getOption("statR_openinghours"), source = getOption("statR_source"), + author = "user") { - # Initialize new worksheet as index sheet ------ - openxlsx::addWorksheet(wb, sheetname) + insert_header(wb, sheetname, logo, contactdetails, homepage, auftrag_id, author, + openinghours, contact_col = 15) + ### Title - needs to exist + writeText(wb, sheetname, title, + namedRegionLastRow(wb, sheetname, "header_body") + 3, + 3:18, style_maintitle(), "title") - # Insert logo ---------- - insert_worksheet_image(wb = wb, sheetname = sheetname, - image = inputHelperLogoPath(logo), - startrow = 1, startcol = 1, - width = 2.145, height = 0.7865) - - - # Insert contact info, title, metadata, and sources into worksheet -------- - ### Contact information - openxlsx::writeData(wb, sheetname, contactdetails, - startCol = 15, startRow = 2, - name = paste(sheetname,"contact", sep = "_")) - - ### Office hours - openxlsx::writeData(wb, sheetname, openinghours, - startCol = 18, - startRow = namedRegionFirstRow(wb, sheetname, "contact"), - name = paste(sheetname, "officehours", sep = "_")) - - ### Homepage - openxlsx::writeData(wb, sheetname, inputHelperHomepage(homepage), - startCol = 15, - startRow = namedRegionLastRow(wb, sheetname, "contact") + 1, - name = paste(sheetname, "homepage", sep = "_")) - - - - ### Add Headerline - openxlsx::addStyle(wb, sheetname, style_headerline(), - namedRegionLastRow(wb, sheetname, "homepage") + 1, 1:20, - gridExpand = TRUE, stack = TRUE) - - ### Request information - openxlsx::writeData(wb, sheetname, - c( - inputHelperDateCreated(), - inputHelperOrderNumber(auftrag_id) - ), - startCol = 15, - startRow = namedRegionLastRow(wb, sheetname, "homepage") + 3, - name = paste(sheetname, "info", sep = "_")) - - ### Title - openxlsx::writeData(wb, sheetname, title, 3, - namedRegionLastRow(wb, sheetname, "info") + 1, - name = paste(sheetname, "title", sep = "_")) - openxlsx::addStyle(wb, sheetname, style_maintitle(), - namedRegionLastRow(wb, sheetname, "title"), 3) - - ### Source - openxlsx::writeData(wb, sheetname, - inputHelperSource(source, collapse = "; "), - startCol = 3, - startRow = namedRegionLastRow(wb, sheetname, "title") + 1, - name = paste(sheetname, "source", sep = "_")) + ### Source - needs to exist + writeText(wb, sheetname, source, + namedRegionLastRow(wb, sheetname, "title") + 1, + 3:18, style_subtitle(), "source") ### Table of content caption - openxlsx::writeData(wb, sheetname, getOption("toc_title"), 3, - namedRegionLastRow(wb, sheetname, "source") + 3, - name = paste(sheetname, "toc", sep = "_")) - openxlsx::addStyle(wb, sheetname, subtitleStyle(), - namedRegionLastRow(wb, sheetname, "toc"), 3) - + writeText(wb, sheetname, getOption("statR_toc_title"), + namedRegionLastRow(wb, sheetname, "source") + 3, + 3, style_indextitle(), "toc") - # Format --------- - ### Set column width of first column to 1 + # Set column width of first column to 1 and hide gridlines openxlsx::setColWidths(wb, sheetname, 1, 1) - - ### Hide gridlines openxlsx::showGridLines(wb, sheetname, FALSE) } diff --git a/R/insert_metadata_sheet.R b/R/insert_metadata_sheet.R index 25916f2..2bb2f28 100644 --- a/R/insert_metadata_sheet.R +++ b/R/insert_metadata_sheet.R @@ -1,77 +1,41 @@ -#' insert_metadata_sheet() +#' Insert sheet with metadata #' #' @description Function to add a formatted worksheet with metadata to an #' existing Workbook object. #' @inheritParams insert_worksheet -#' @examples -#' # Create Workbook -#' wb <- openxlsx::createWorkbook() -#' -#' # Insert a simple metadata sheet -#' insert_metadata_sheet(wb, title = "Title of mtcars", -#' metadata = c("Meta data information.")) -#' +#' @param meta_infos a list with title, source, and metadata as named objects #' @keywords insert_metadata_sheet #' @seealso createWorkbook, addWorksheet, writeData #' @export -insert_metadata_sheet <- function(wb, - sheetname = "Metadaten", - title = "Title", - source = getOption("statR_source"), - metadata = NA, - logo = getOption("statR_logo"), - contactdetails = inputHelperContactInfo(compact = TRUE), - author = "user") { - - # Add a new worksheet ------ - sheetname <- verifyInputSheetname(sheetname) - openxlsx::addWorksheet(wb, sheetname) - +insert_metadata_sheet <- function( + wb, sheetname, meta_infos, logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(compact = TRUE), + homepage = getOption("statR_homepage"), author = "user") { - # Insert logo -------- - insert_worksheet_image(wb = wb, sheetname = sheetname, - image = inputHelperLogoPath(logo), - startrow = 1, startcol = 1, - width = 2.145, height = 0.7865) + title <- meta_infos[["title"]] + source <- meta_infos[["source"]] + metadata <- meta_infos[["metadata"]] + insert_header(wb, sheetname, logo, contactdetails, homepage, NULL, author, + NULL, 15) - # Insert contact info, title, metadata, and sources into worksheet -------- - ### Contact info - openxlsx::writeData(wb, sheetname, contactdetails, - 12, 2, name = paste(sheetname, "contact", sep = "_")) + start_row <- namedRegionLastRow(wb, sheetname, "info") + 3 - ### Request information - openxlsx::writeData(wb, sheetname, - x = paste(inputHelperDateCreated(), - inputHelperAuthorName(author)), - startCol = 12, - startRow = namedRegionLastRow(wb, sheetname, "contact") + 1, - name = paste(sheetname, "info", sep = "_")) - ### Headerline - openxlsx::addStyle(wb, sheetname, style_headerline(), - namedRegionLastRow(wb, sheetname, "contact") + 1, 1:26, - gridExpand = TRUE, stack = TRUE) + if (is.character(title)){ + writeText(wb, sheetname, title, start_row, 1:18, style_title(), "title") + start_row <- namedRegionLastRow(wb, sheetname, "title") + 1 + } - ### Title - openxlsx::writeData(wb, sheetname, title, - startRow = namedRegionLastRow(wb, sheetname, "info") + 3, - name = paste(sheetname, "title", sep = "_")) - openxlsx::addStyle(wb, sheetname, style_title(), - rows = namedRegionLastRow(wb, sheetname, "title"), cols = 1) + if (is.character(source)) { + writeText(wb, sheetname, source, start_row, 1:18, style_subtitle(), "source") + start_row <- namedRegionLastRow(wb, sheetname, "source") + 1 + } - ### Source and metadata - openxlsx::writeData(wb, sheetname, inputHelperSource(source, collapse = NULL), - startRow = namedRegionLastRow(wb, sheetname, "title") + 1, - name = paste(sheetname, "source", sep = "_")) - openxlsx::writeData(wb, sheetname, - inputHelperMetadata(metadata, collapse = NULL), - startRow = namedRegionLastRow(wb, sheetname, "source") + 1, - name = paste(sheetname, "metadata", sep = "_")) - openxlsx::addStyle(wb, sheetname, style_subtitle2(), - c(namedRegionFirstRow(wb, sheetname, "source"), - namedRegionFirstRow(wb, sheetname, "metadata")), 1) + if (is.character(metadata)) { + writeText(wb, sheetname, metadata, start_row, 1:18, style_subtitle(), "metadata") + start_row <- namedRegionLastRow(wb, sheetname, "metadata") + 1 + } - ### Hide gridlines openxlsx::showGridLines(wb, sheetname, FALSE) } diff --git a/R/insert_second_header.R b/R/insert_second_header.R index c74f346..3d40596 100644 --- a/R/insert_second_header.R +++ b/R/insert_second_header.R @@ -4,11 +4,12 @@ #' @inheritParams insert_worksheet #' @param data_start_row Row index for first row with data #' @keywords internal +#' @importFrom utils head tail insert_second_header <- function(wb, sheetname, data_start_row, group_names, grouplines, data) { if (is.character(grouplines)) { - groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) + groupline_numbers <- match(grouplines, colnames(data)) } else if (is.numeric(grouplines)) { groupline_numbers <- grouplines @@ -19,7 +20,26 @@ insert_second_header <- function(wb, sheetname, data_start_row, group_names, ~openxlsx::writeData(wb, sheet = sheetname, x = .y, startCol = .x, startRow = data_start_row)) - # Apply style --------- - openxlsx::addStyle(wb, sheet = sheetname, style = style_header(), - rows = data_start_row, cols = 1:ncol(data)) + # # Apply style --------- + # openxlsx::addStyle( + # wb, sheet = sheetname, style = style_header(), rows = data_start_row, + # cols = 1:ncol(data)) + + # Merge cells for second header + groupline_numbers <- unique(c(sort(groupline_numbers), ncol(data) + 1)) + purrr::walk2( + head(groupline_numbers, -1), tail(groupline_numbers, -1) - 1, + ~openxlsx::mergeCells(wb, sheetname, .x:.y, data_start_row)) + + purrr::walk(head(groupline_numbers, - 1), + ~openxlsx::addStyle(wb, sheet = sheetname, style = style_leftline(), + rows = data_start_row, cols = ., stack = TRUE)) + # Center second header + purrr::walk2( + head(groupline_numbers, -1), tail(groupline_numbers, -1) - 1, + ~openxlsx::addStyle( + wb, sheet = sheetname, + style = openxlsx::createStyle(halign = "center", textDecoration = "bold"), + rows = data_start_row, cols = .x:.y, stack = TRUE)) } + diff --git a/R/insert_worksheet.R b/R/insert_worksheet.R index 59d1909..20f8478 100644 --- a/R/insert_worksheet.R +++ b/R/insert_worksheet.R @@ -1,105 +1,216 @@ -#' insert_worksheet() +#' Functions for generating formatted worksheets for data #' -#' @description Function to insert a formatted worksheet into an existing -#' Workbook object. -#' @note The function does not write the result into a .xlsx file. -#' A separate call to openxlsx::saveWorkbook() is required. +#' @description Inserts a data.frame into a new formatted worksheet. +#' The distinction between \code{insert_worksheet} and +#' \code{insert_worksheet_nh} is that the former also generates a header with +#' contact information using the function \code{insert_header}. +#' Some arguments have default values which are pulled from the active user +#' configuration. When using the default configuration, the logo and contact +#' information of the Statistical Office of Kanton Zurich will be inserted. +#' +#' @note This function does not output an .xlsx file on its own. A separate call +#' to \code{openxlsx::saveWorkbook()} is required. #' @param data data to be included. #' @param wb workbook object to add new worksheet to. #' @param title title to be put above the data. -#' @param sheetname name of the sheet tab. -#' @param source source of the data. Defaults to "statzh". -#' @param metadata metadata information to be included. Defaults to NA. -#' @param logo path of the file to be included as logo (png / jpeg / svg). -#' Defaults to "statzh" -#' @param contactdetails contact details of the data publisher. Defaults to -#' "statzh". -#' @param homepage Homepage of data publisher. Defaults to "statzh". -#' @param grouplines defaults to NA. Can be used to separate grouped -#' variables visually. +#' @param sheetname Names of the worksheet in output file. Note that this name +#' will be truncated to 31 characters, must be unique, and cannot contain +#' some special characters (namely the following: /, \, ?, *, :, [, ]). +#' @param source source of the data. Default can be adjusted via user profiles +#' @param metadata metadata information to be included. Defaults to NA, meaning +#' no metadata are attached. +#' @param grouplines Can be used to visually group variables. Values should +#' either correspond to numeric column indices or column names, denoting the +#' first variable in a group. Defaults to NA, meaning no lines are added. +#' @param group_names A vector of names for groups to be displayed in a +#' secondary header. Should be of the same length as grouplines, and cannot +#' be used unless these are set. Defaults to NA, meaning no secondary header +#' is created. +#' @param logo File path to the logo to be included in the index-sheet. +#' Defaults to the logo of the Statistical Office of Kanton Zurich. This can +#' either be overridden with a path to an image file, or configured in a user +#' profile. +#' @param contactdetails Character vector with contact information to be displayed +#' on the title sheet. By default uses \code{inputHelperContactInfo()} to +#' construct it based on values defined in the active user configuration. +#' @param homepage Homepage of data publisher. Default can be adjusted via user +#' configuration. #' @param author defaults to the last two letters (initials) or numbers of the #' internal user name. -#' @param group_names Names for groupings in secondary header. Format: -#' List e.g list(c("title 1", "title 2", "title 3")) +#' @param auftrag_id An ID associated with the Excel file. Defaults to NULL ( +#' no output). +#' @param openinghours A character vector with office hours. Defaults to NULL ( +#' no output). +#' @param contact_col Column number at which the contact information should be +#' inserted. #' @examples #' # Initialize Workbook #' wb <- openxlsx::createWorkbook() #' -#'# Insert mtcars dataset with STATZH design -#' insert_worksheet(data = mtcars, -#' wb = wb, -#' title = "mtcars dataset", -#' sheetname = "carb") +#' # Insert mtcars dataset with STATZH design +#' insert_worksheet( +#' wb, sheetname = "cars1", data = mtcars, title = "mtcars dataset", +#' source = "Source: ...", metadata = "Note: ...", +#' grouplines = c(5,8), group_names = c("First group", "Second group") +#' ) +#' +#' # The same, but without header +#' insert_worksheet_nh( +#' wb, sheetname = "cars2", data = mtcars, title = "mtcars dataset (no header)", +#' source = "Source: ...", metadata = "Note: ...", +#' grouplines = c(5,8), group_names = c("First group", "Second group") +#' ) #' #' @keywords insert_worksheet #' @export -insert_worksheet <- function(wb, - sheetname = "Daten", - data, - title = "Title", - source = getOption("statR_source"), - metadata = NA, +insert_worksheet <- function(wb, sheetname, data, title = NULL, + source = NULL, metadata = NULL, + grouplines = NULL, group_names = NULL, logo = getOption("statR_logo"), contactdetails = inputHelperContactInfo(), homepage = getOption("statR_homepage"), - author = "user", - grouplines = NA, - group_names = NA) { + author = "user") { + + sheetname <- verifyInputSheetname(sheetname) + insert_header(wb, sheetname, logo, contactdetails, homepage, NULL, author, + NULL, contact_col = max(ncol(data) - 2, 4)) + insert_worksheet_nh(wb, sheetname, data, title = title, source = source, + metadata = metadata, grouplines = grouplines, + group_names = group_names) +} + +#' @rdname insert_worksheet +#' @export +insert_worksheet_nh <- function(wb, sheetname, data, title = NULL, source = NULL, + metadata = NULL, grouplines = NULL, + group_names = NULL) { + + for (value in c("title", "source", "metadata", "grouplines", "group_names")) { + if (is.null(eval(as.name(value)))) { + assign(value, extract_attribute(data, value)) + } + } - # Initialize new worksheet ------ sheetname <- verifyInputSheetname(sheetname) - openxlsx::addWorksheet(wb, sheetname) + if (!(sheetname %in% names(wb))) { + openxlsx::addWorksheet(wb, sheetname) + start_row <- 1 + + } else { + start_row <- namedRegionLastRow(wb, sheetname) + 3 + } + + openxlsx::createNamedRegion(wb, sheetname, 1, start_row, paste0(sheetname, "_content_start")) + + # Insert title, metadata, and sources into worksheet -------- + if (is.character(title)) { + writeText(wb, sheetname, title, start_row, 1:18, style_title(), "title") + start_row <- namedRegionLastRow(wb, sheetname, "title") + 1 + } + + if (is.character(source)) { + writeText(wb, sheetname, source, start_row, 1:18, style_subtitle(), "source") + start_row <- namedRegionLastRow(wb, sheetname, "source") + 1 + } + + if (is.character(metadata)) { + writeText(wb, sheetname, metadata, start_row, 1:18, style_subtitle(), "metadata") + start_row <- namedRegionLastRow(wb, sheetname, "metadata") + 1 + } + + data_start_row <- max(namedRegionLastRow(wb, sheetname, c("content_start, title", "source", "metadata")) + 2, + start_row) + + # Grouplines --------- + if (!any(is.null(grouplines)) & !any(is.na(grouplines))) { + if (is.numeric(grouplines)) { + groupline_numbers <- grouplines + + } else if (is.character(grouplines)) { + groupline_numbers <- match(grouplines, colnames(data)) + } + + ### Insert second header + if (!any(is.null(group_names)) & !any(is.na(group_names))) { + insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) + data_start_row <- data_start_row + 1 + } + + data_row_extent <- data_start_row + 0:nrow(data) + openxlsx::addStyle(wb, sheetname, style_leftline(), + data_row_extent, groupline_numbers, + gridExpand = TRUE, stack = TRUE) + } + + ### Pad colnames using whitespaces for better auto-fitting of column width + colnames(data) <- paste0(colnames(data), " ", sep = "") + + openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), + startRow = data_start_row, rowNames = FALSE, + withFilter = FALSE, + name = paste(sheetname, "data", sep = "_")) + openxlsx::addStyle(wb, sheetname, style_header(), data_start_row, + 1:ncol(data), gridExpand = TRUE, stack = TRUE) + + ### Define minimum column width + options("openxlsx.minWidth" = 5) + + ### Use automatic column width for columns with data + openxlsx::setColWidths(wb, sheetname, 1:ncol(data), "auto", + ignoreMergedCells = TRUE) +} + +#' @rdname insert_worksheet +#' @export +insert_header <- function(wb, sheetname, logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), + homepage = getOption("statR_homepage"), + auftrag_id = NULL, author = "user", + openinghours = NULL, contact_col = 13) { + + sheetname <- verifyInputSheetname(sheetname) + if (!(sheetname %in% names(wb))) openxlsx::addWorksheet(wb, sheetname) # Insert logo ------ - insert_worksheet_image(wb = wb, sheetname = sheetname, - image = inputHelperLogoPath(logo), - startrow = 1, startcol = 1, - width = 2.145, height = 0.7865) + insert_worksheet_image(wb, sheetname, image = inputHelperLogoPath(logo), + startrow = 1, startcol = 1) + + start_row <- 2 + openxlsx::createNamedRegion(wb, sheetname, contact_col + 0:3, start_row, + paste0(sheetname, "_header_start")) + fields <- list( + contact = contactdetails, + homepage = inputHelperHomepage(homepage), + info = c(paste(inputHelperDateCreated(), inputHelperAuthorName(author)), + inputHelperOrderNumber(auftrag_id)) + ) # Insert contact info, date created, and author ----- - ### Contact info - contact_start_col <- max(ncol(data) - 2, 4) - - openxlsx::writeData(wb, sheetname, contactdetails, - contact_start_col, 2, - name = paste(sheetname, "contact", sep = "_")) - - openxlsx::writeData(wb, sheetname, inputHelperHomepage(homepage), - contact_start_col, - namedRegionLastRow(wb, sheetname, "contact") + 1, - name = paste(sheetname, "homepage", sep = "_")) - - ### Information string about time of generation and responsible user - openxlsx::writeData(wb, sheetname, - paste( - inputHelperDateCreated(), - inputHelperAuthorName(author) - ), - contact_start_col, - startRow = namedRegionLastRow(wb, sheetname, "homepage") + 1, - name = paste(sheetname, "info", sep = "_")) - - - ### Horizontally merge cells to ensure that contact entries are displayed properly - purrr::walk(namedRegionRowExtent(wb, sheetname, c("contact", "homepage", "info")), - ~openxlsx::mergeCells(wb, sheetname, - cols = contact_start_col:26, - rows = .)) - - - ### Insert headerline after contacts ------ - openxlsx::addStyle(wb, sheetname, style_headerline(), - rows = namedRegionLastRow(wb, sheetname, "info"), - cols = 1:ncol(data), gridExpand = TRUE, stack = TRUE) - - insert_worksheet_nh(wb, - sheetname = sheetname, - data = data, - title = title, - source = source, - metadata = metadata, - grouplines = grouplines, - group_names = group_names) + for (field_name in names(fields)){ + if (is.character(fields[[field_name]])) { + writeText(wb, sheetname, fields[[field_name]], start_row, contact_col + 0:3, + NULL, field_name) + start_row <- namedRegionLastRow(wb, sheetname, field_name) + 1 + } + } + + # Needs to be handled separately + if (is.character(openinghours)) { + writeText(wb, sheetname, openinghours, + namedRegionFirstRow(wb, sheetname, "header_start"), + contact_col + 4:6, NULL, "openinghours") + } + + header_entries <- c("header_start", "contact", "homepage", "info", + "openinghours") + openxlsx::createNamedRegion(wb, sheetname, + namedRegionColumnExtent(wb, sheetname, header_entries), + namedRegionRowExtent(wb, sheetname, header_entries), + paste0(sheetname, "_header_body")) + + openxlsx::addStyle(wb, sheetname, style_headerline(), start_row, + 1:namedRegionLastCol(wb, sheetname, "header_body"), + gridExpand = TRUE, stack = TRUE) } diff --git a/R/insert_worksheet_nh.R b/R/insert_worksheet_nh.R deleted file mode 100644 index 9aa5e84..0000000 --- a/R/insert_worksheet_nh.R +++ /dev/null @@ -1,125 +0,0 @@ -#' insert_worksheet_nh -#' -#' @description Function to add formatted worksheets to an existing Workbook. -#' The worksheets do not include contact information or logos. -#' @note The function does not write the result into a .xlsx file. A separate -#' call to `openxlsx::saveWorkbook()` is required. -#' @inheritParams insert_worksheet -#' @examples -#' ## Create workbook -#' wb <- openxlsx::createWorkbook() -#' -#' ## insert a new worksheet -#' insert_worksheet_nh(wb, sheetname = "data1", data = head(mtcars), -#' title = "Title", source = "statzh", metadata = "Note: ...") -#' -#' ## insert a further worksheet -#' insert_worksheet_nh(wb, sheetname = "data2", data = tail(mtcars), -#' title = "Title", source = "statzh", metadata = "Note: ...") -#' -#' ## insert a worksheet with group lines and second header -#' insert_worksheet_nh(wb, sheetname = "data3", data = head(mtcars), -#' title = "grouplines", source = "statzh", -#' metadata = "Note: ...", -#' grouplines = c(1,5,6), group_names = "carb") -#' @keywords insert_worksheet_nh -#' @export -insert_worksheet_nh <- function(wb, - sheetname = "Daten", - data, - title = "Title", - source = getOption("statR_source"), - metadata = NA, - grouplines = NA, - group_names = NA) { - # Initialize new worksheet ------ - - sheetname <- verifyInputSheetname(sheetname) - - if (!(sheetname %in% names(wb))) { - openxlsx::addWorksheet(wb, sheetname) - start_row <- 1 - - } else { - start_row <- namedRegionLastRow(wb, sheetname) + 3 - } - - # Insert title, metadata, and sources into worksheet -------- - ### Title - openxlsx::writeData(wb, sheetname, title, startCol = 1, startRow = start_row, - name = paste(sheetname, "title", sep = "_")) - openxlsx::addStyle(wb, sheetname, style_title(), start_row, 1) - - ### Source - openxlsx::writeData(wb, sheetname, - inputHelperSource(source), - startRow = namedRegionLastRow(wb, sheetname, "title") + 1, - name = paste(sheetname, "source", sep = "_")) - openxlsx::addStyle(wb, sheetname, style_subtitle(), - namedRegionFirstRow(wb, sheetname, "source"), 1, - stack = TRUE, gridExpand = TRUE) - - ### Metadata - openxlsx::writeData(wb, sheetname, - inputHelperMetadata(metadata), - startRow = namedRegionLastRow(wb, sheetname, "source") + 1, - name = paste(sheetname, "metadata", sep = "_")) - openxlsx::addStyle(wb, sheetname, style_subtitle(), - namedRegionFirstRow(wb, sheetname, "metadata"), 1, - stack = TRUE, gridExpand = TRUE) - - - ### Merge cells with title, metadata, and sources to ensure that they're displayed properly - purrr::walk(namedRegionRowExtent(wb, sheetname, c("title", "source", "metadata")), - ~openxlsx::mergeCells(wb, sheetname, cols = 1:26, rows = .)) - - ### Add Line wrapping - openxlsx::addStyle(wb, sheetname, style_wrap(), - namedRegionRowExtent(wb, sheetname, c("title", "source", "metadata")), 1, - stack = TRUE, gridExpand = TRUE) - - - # Insert data -------- - data_start_row <- namedRegionLastRow(wb, sheetname, "metadata") + 2 - - - # Grouplines --------- - if (!any(is.null(grouplines)) & !any(is.na(grouplines))) { - if (is.numeric(grouplines)) { - groupline_numbers <- grouplines - - } else if (is.character(grouplines)) { - groupline_numbers <- get_groupline_index_by_pattern(grouplines, data) - } - - ### Insert second header - if (!any(is.null(group_names)) & !any(is.na(group_names))) { - insert_second_header(wb, sheetname, data_start_row, group_names, grouplines, data) - data_start_row <- data_start_row + 1 - } - - data_row_extent <- data_start_row + 1:nrow(data) - 1 - openxlsx::addStyle(wb, sheetname, style_leftline(), - data_row_extent, groupline_numbers, - gridExpand = TRUE, stack = TRUE) - } - - ### Pad colnames using whitespaces for better auto-fitting of column width - colnames(data) <- paste0(colnames(data), " ", sep = "") - - ### Write data after checking for leftover grouping - openxlsx::writeData(wb, sheetname, verifyDataUngrouped(data), - startRow = data_start_row, rowNames = FALSE, - withFilter = FALSE, - name = paste(sheetname, "data", sep = "_")) - openxlsx::addStyle(wb, sheetname, style_header(), - data_start_row, 1:ncol(data), - gridExpand = TRUE, stack = TRUE) - - # Format -------- - ### Define minimum column width - options("openxlsx.minWidth" = 5) - - ### Use automatic column width for columns with data - openxlsx::setColWidths(wb, sheetname, 1:ncol(data), "auto", ignoreMergedCells = TRUE) -} diff --git a/R/namespace.R b/R/namespace.R index 1ffa469..b99b88c 100644 --- a/R/namespace.R +++ b/R/namespace.R @@ -1,27 +1,9 @@ -#' .onLoad() -#' #' @keywords internal .onLoad <- function(libname, pkgname) { + initUserConfigStore() +} - # Set default values for some format options - defaults <- list( - date_format = "%d.%m.%Y", - statR_prefix_date = "Aktualisiert am:", - statR_prefix_author = "durch:", - statR_prefix_phone = "Tel.", - statR_prefix_source = "Quelle:", - statR_prefix_metadata = "Hinweise:", - statR_prefix_order_id = "Auftragsnr.:", - statR_collapse = ";", - statR_toc_title = "Inhalt" - ) - - options(defaults) - - if ("persistent" %in% getUserConfigs()) { - readUserConfig("persistent") +#' @keywords internal +.onUnload <- function(libname, pkgname) { - } else { - readUserConfig("default") - } } diff --git a/R/output_xlsx.R b/R/output_xlsx.R new file mode 100644 index 0000000..5ecce7d --- /dev/null +++ b/R/output_xlsx.R @@ -0,0 +1,363 @@ +#' Export datasets and graphics into a multi-worksheet workbook +#' +#' Function to export multiple datasets and/or figures from R to a workbook. +#' The function creates an index sheet, separate worksheets for each input +#' object, hyperlinks to each content worksheet, and an optional sheet for +#' long-form metadata. +#' +#' @details The arguments datasets, sheetnames, titles, sources, and metadata +#' should be of equal length. For more complex workbooks, it may be more +#' convenient to parametrize these for each individual input using functions +#' like \code{add_sheetname()}, which can be chained using %>% operators. +#' +#' All elements in datasets must be of type data.frame, ggplot, or character. +#' In the latter case, the inputs must correspond to paths to existing image +#' files. +#' @inheritParams insert_worksheet +#' @inheritParams quickXLSX +#' @param datasets A list of an arbitrary number of data.frames, ggplot objects, +#' and file paths for images in the order in which they should appear in the +#' output file. +#' @param sheetname Names of individual worksheets in output file. Note that +#' these names will be truncated to 31 characters, must be unique, and cannot +#' contain some special characters (namely the following: /, \, ?, *, :, [, ]). +#' @param title Titles shown at the top of the different worksheets. +#' @param source A list of sources for the different elements of `datasets`. +#' Elements of this list can also be character vectors to insert more than one source. +#' @param metadata A list containing metadata for each element of `datasets`. +#' Elements of this list can also be character vectors to insert more than one source. +#' @param grouplines A list containing vectors of indices/names of columns at +#' the beginning of a group. +#' @param group_names A list of character vectors containing the names of the +#' groups as defined in `grouplines`. Should not be specified unless +#' grouplines is also specified. +#' @param plot_width Either a single numeric value denoting the width of all included plots +#' in inches (1 inch = 2.54 cm), or a list of the same length as `datasets` +#' @param plot_height Either a single numeric value denoting the height of all included plots +#' in inches (1 inch = 2.54 cm), or a list of the same length as `datasets` +#' @param index_title Title to be put on the index sheet. +#' @param index_source Source to be shown below the index title. +#' @param metadata_sheet A list with named elements 'title', 'source', and 'text'. +#' Intended for conveying long-form information. Default is NULL, not included. +#' @param overwrite Overwrites the existing excel files with the same file name. +#' default to TRUE +#' @examples +#' library(dplyr) +#' library(statR) +#' library(ggplot2) +#' +#'# Example with two datasets and one figure - legacy method +#' fig <- ggplot2::ggplot(mtcars, ggplot2::aes(x = disp)) + +#' ggplot2::geom_histogram() +#' +#' \dontrun{ +#' datasetsXLSX(file = tempfile(fileext = ".xlsx"), +#' datasets = list(mtcars, PlantGrowth, fig), +#' title = c("mtcars-Datensatz", +#' "PlantGrowth-Datensatz", +#' "Histogramm"), +#' plot_width = c(5), +#' plot_height = c(5), +#' source = list( +#' paste( +#' "Source: Henderson and Velleman (1981).", +#' "Building multiple regression models", +#' "interactively. Biometrics, 37, 391–411."), +#' paste( +#' "Source: Dobson, A. J. (1983) An Introduction", +#' "to Statistical Modelling.", +#' "London: Chapman and Hall."), +#' NULL), +#' metadata = list( +#' "Bemerkungen zum mtcars-Datensatz: x", +#' "Bemerkungen zum PlantGrowth-Datensatz: x", +#' NULL), +#' sheetname = c("Autos","Blumen", "Histogramm"), +#' index_title = "Autos und Pflanzen", +#' auftrag_id = "A2021_0000", +#' overwrite = TRUE) +#' } +#' +#' # Newer method +#' df <- mtcars %>% +#' add_sheetname("cars") %>% +#' add_title("Cars dataset") %>% +#' add_source(paste("Henderson and Velleman (1981). Building multiple", +#' "regression models interactively.", +#' "Biometrics, 37, 391–411.")) %>% +#' add_metadata("Obtained in R by calling 'mtcars'") %>% +#' add_grouplines(c(2, 5, 8)) %>% +#' add_group_names(c("Group1", "Group2", "Group3")) +#' +#' df2 <- airquality %>% +#' add_sheetname("airquality") %>% +#' add_title("Airquality") %>% +#' add_metadata("Obtained in R by calling 'airquality'") +#' +#' plt <- (ggplot(mtcars) + geom_histogram(aes(x = cyl))) %>% +#' add_sheetname("Histogram") %>% +#' add_title("A histogram") %>% +#' add_source("mtcars data from R package 'datasets'") %>% +#' add_plot_size(c(6,3)) +#' +#' metadata_sheet <- list( +#' title = "Title of the metadata sheet", +#' source = "A reference to the responsible organization or similar", +#' text = c("The metadatasheet is intended for universally applicable", +#' "long-form explanations which don't fit neatly above the data.", +#' "", +#' "Each element is printed in a new row.")) +#' +#' \dontrun{ +#' datasetsXLSX( +#' file = tempfile(fileext = ".xlsx"), +#' datasets = list(df, df2, plt), +#' metadata_sheet = metadata_sheet, +#' overwrite = TRUE) +#' } +#' +#' @keywords datasetsXLSX +#' @importFrom dplyr %>% +#' @export +datasetsXLSX <- function( + file, datasets, sheetname = NULL, title = NULL, source = NULL, + metadata = NULL, grouplines = NULL, group_names = NULL, plot_width = NULL, + plot_height = NULL, index_title = getOption("statR_toc_title"), + index_source = getOption("statR_source"), logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), + homepage = getOption("statR_homepage"), + openinghours = getOption("statR_openinghours"), + auftrag_id = NULL, author = "user", metadata_sheet = NULL, overwrite = TRUE) { + + # "Optional" input arguments + for (value in c("title", "source", "metadata", "grouplines", "group_names")){ + if (!is.null(eval(as.name(value)))) { + datasets <- purrr::map2(datasets, eval(as.name(value)), + ~add_attribute(..1, value, ..2)) + } + } + + # Required input arguments + for (value in c("sheetname")){ + if (is.null(eval(as.name(value)))) { + assign(value, extract_attributes(datasets, value, required_val = TRUE)) + } + } + + # Plot related arguments + is_plot <- sapply(datasets, checkImplementedPlotType) + + if (any(is_plot)) { + + # Reads object with name == arg, if NULL tries to extract attribute. + # If length == 1, all plots are assigned the same plot size, otherwise + # assigns plot_size in order of plots. Overrides all attributes if non-null + # plot_size is provided. + for (arg in c("plot_height", "plot_width")){ + buffer <- as.list(rep(NA, length.out = length(datasets))) + + if (is.null(values <- eval(as.name(arg)))) { + values <- unlist(extract_attributes(datasets, arg)) + } + + if (!(sum(!is.na(values)) %in% c(1, sum(is_plot)))) { + stop("Invalid number of values for ", arg) + } + + buffer[which(is_plot)] <- na.omit(values) + assign(arg, buffer) + } + + plot_size_list <- purrr::map2(plot_width, plot_height, ~c(..1,..2)) + datasets <- purrr::map2(datasets, plot_size_list, ~add_plot_size(..1, ..2)) + } + + sheetname <- verifyInputSheetnames(sheetname) + + wb <- openxlsx::createWorkbook() + insert_index_sheet(wb, sheetname = "Index", title = index_title, + auftrag_id = auftrag_id, logo = logo, + contactdetails = contactdetails, homepage = homepage, + openinghours = openinghours, source = index_source, + author = author) + + # Iterate over datasets + for (i in seq_along(datasets)) { + if (is_plot[i]) { + insert_worksheet_image(wb, sheetname = sheetname[i], image = datasets[[i]]) + + } else if (is.data.frame(datasets[[i]])) { + insert_worksheet_nh(wb, sheetname = sheetname[i], data = datasets[[i]]) + } + } + + insert_index_hyperlinks(wb, sheetname, extract_attributes(datasets, "title"), + index_sheet_name = "Index", + sheet_start_row = namedRegionLastRow(wb, "Index", "toc") + 1) + + # Metadata sheets are constructed from a list with title, source, and + # long-form metadata by insert_metadata_sheet. It is meant to be used to + # provide globally applicable information for multiple analyses. + if (!is.null(metadata_sheet)) { + insert_metadata_sheet(wb, "Beiblatt", metadata_sheet, logo = logo, + contactdetails = contactdetails, homepage = homepage, + author = author) + } + + # Clean unneeded named regions - keep_data or all. Using 'all' here as a + # quick fix for region names with non-standard characters. See NEWS.md + cleanNamedRegions(wb, "all") + openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = overwrite) +} + + +#' Export a dataset split by a covariate into a workbook +#' +#' @description Function to export data from R as a formatted .xlsx-file, +#' distributed over multiple worksheets based on a grouping variable (e.g., year). +#' @note User should make sure that the grouping variable is of binary, +#' categorical or other types with a limited number of levels. +#' @inheritParams insert_worksheet +#' @inheritParams quickXLSX +#' @param sheetvar name of the variable used to split the data and spread them +#' over several sheets. +#' @examples +#' \dontrun{ +#' splitXLSX(file = tempfile(fileext = ".xlsx"), +#' data = mtcars, +#' sheetvar = "cyl", +#' title = "Motor trend car road tests", +#' source = paste("Source: Henderson and Velleman (1981),", +#' "Building multiple regression models interactively.", +#' "Biometrics, 37, 391–411."), +#' metadata = paste("The data was extracted from the 1974 Motor Trend", +#' "US magazine and comprises fuel consumption and", +#' "10 aspects of automobile design and performance", +#' "for 32 automobiles (1973–74 models).")) +#' } +#' @keywords splitXLSX +#' @export +splitXLSX <- function( + file, data, sheetvar, title = NULL, source = NULL, metadata = NULL, + grouplines = NULL, group_names = NULL, logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(compact = TRUE), + homepage = getOption("statR_homepage"), author = "user") { + + # Shared values: these are attached to the source data.frame before + # splitting on sheetvar using split.data.frame(), which preserves attributes + for (value in c("source", "metadata", "grouplines", "group_names")) { + if (!is.null(eval(as.name(value)))) { + data <- add_attribute(data, value, eval(as.name(value))) + } + } + + datasets <- split.data.frame(data, data[,sheetvar]) + sheetnames <- paste0(sheetvar, "_", names(datasets)) + titles <- paste0(title, " (", sheetvar, ": ", names(datasets), ")") + + datasetsXLSX(file = file, datasets = datasets, sheetname = sheetnames, + title = titles, logo = logo, contactdetails = contactdetails, + homepage = homepage, author = author) +} + + +#' Export a single dataset to a workbook with an index sheet +#' +#' @description Function to export data from R to a formatted .xlsx-file. The +#' data is exported to the first sheet. Metadata information is exported to +#' the second sheet. +#' @note This function is well-suited for applications where a single dataset +#' needs to be accompanied by a second sheet with explanations or other complex +#' metadata. +#' @inheritParams insert_worksheet +#' @inheritParams quickXLSX +#' @examples +#' \dontrun{ +#' aXLSX(file = tempfile(fileext = ".xlsx"), +#' data = mtcars, +#' title = "Motor trend car road tests", +#' source = paste("Source: Henderson and Velleman (1981). Building", +#' "multiple regression models interactively.", +#' "Biometrics, 37, 391–411."), +#' metadata = paste("The data was extracted from the 1974", +#' "Motor Trend US magazine and comprises fuel", +#' "consumption and 10 aspects of automobile design", +#' "and performance for 32 automobiles", +#' "(1973–74 models).")) +#' } +#' @keywords aXLSX +#' @export +aXLSX <- function( + file, data, title = NULL, source = NULL, metadata = NULL, grouplines = NULL, + group_names = NULL, logo = getOption("statR_logo"), + contactdetails = inputHelperContactInfo(), + homepage = getOption("statR_homepage"), author = "user") { + + for (value in c("title", "source", "metadata", "grouplines", "group_names")) { + if (!is.null(eval(as.name(value)))) { + data <- add_attribute(data, value, eval(as.name(value))) + } + } + + meta_info_list <- list( + title = extract_attribute(data, "title"), + source = extract_attribute(data, "source"), + metadata = extract_attribute(data, "metadata") + ) + + wb <- openxlsx::createWorkbook() + insert_worksheet_nh(wb, sheetname = "Data", data = data, metadata = NA) + insert_metadata_sheet(wb, "Metadaten", meta_info_list, logo, + contactdetails, homepage, author) + cleanNamedRegions(wb, "all") + openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) +} + + +#' Export a single dataset to a single formatted worksheet +#' +#' @description A simple function for exporting data from R to a single formatted +#' .xlsx-spreadsheet. +#' @inheritParams insert_worksheet +#' @param file file name of the xlsx-file. The extension ".xlsx" is added +#' @keywords quickXLSX +#' @export +#' @examples +#' +#' title <- "Motor trend car road tests" +#' source <- paste( +#' "Henderson and Velleman (1981). Building", +#' "multiple regression models interactively.", +#' "Biometrics, 37, 391–411.") +#' metadata <- paste( +#' "The data was extracted from the 1974 Motor", +#' "Trend US magazine and comprises fuel consumption", +#' "and 10 aspects of automobile design and", +#' "performance for 32 automobiles (1973–74 models).") +#' \dontrun{ +#' quickXLSX(file = tempfile(fileext = ".xlsx"), +#' data = mtcars, +#' title = title, +#' source = source, +#' metadata = metadata) +#' } +quickXLSX <- function( + data, file, title = NULL, source = NULL, metadata = NULL, grouplines = NULL, + group_names = NULL, logo = getOption("statR_logo"), + contactdetails = statR:::inputHelperContactInfo(compact = TRUE), + homepage = getOption("statR_homepage"), + author = "user") { + + for (value in c("title", "source", "metadata", "grouplines", "group_names")) { + if (!is.null(eval(as.name(value)))) { + data <- add_attribute(data, value, eval(as.name(value))) + } + } + + wb <- openxlsx::createWorkbook() + insert_worksheet(wb, sheetname = "Inhalt", data = data, logo = logo, + contactdetails = contactdetails, homepage = homepage, + author = author) + cleanNamedRegions(wb, "all") + openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) +} diff --git a/R/quickXLSX.R b/R/quickXLSX.R deleted file mode 100644 index f88fa3e..0000000 --- a/R/quickXLSX.R +++ /dev/null @@ -1,44 +0,0 @@ -#' quickXLSX() -#' -#' @description Function to export data from R to a formatted .xlsx-spreadsheet. -#' @inheritParams insert_worksheet -#' @param data data to be exported. -#' @param file file name of the xlsx-file. The extension ".xlsx" is added -#' @keywords quickXLSX -#' @export -#' @examples -#'quickXLSX(data = mtcars, -#' title = "Motor trend car road tests", -#' file = tempfile(fileext = ".xlsx"), -#' source = paste("Source: Henderson and Velleman (1981). Building", -#' "multiple regression models interactively.", -#' "Biometrics, 37, 391–411."), -#' metadata = paste("The data was extracted from the 1974 Motor", -#' "Trend US magazine and comprises fuel consumption", -#' "and 10 aspects of automobile design and", -#' "performance for 32 automobiles (1973–74 models).")) -quickXLSX <- function(data = NA, - file, - title = "Title", - source = getOption("statR_source"), - metadata = NA, - logo = getOption("statR_logo"), - contactdetails = inputHelperContactInfo(compact = TRUE), - author = "user", - grouplines = NA, - group_names = NA) { - - # Create workbook -------- - wb <- openxlsx::createWorkbook() - - - # Insert data -------- - insert_worksheet(wb, sheetname = "Inhalt", data = data, title = title, - source = source, metadata = metadata, logo = logo, - contactdetails = contactdetails, author = author, - grouplines = grouplines, group_names = group_names) - - - # Save workbook--------- - openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) -} diff --git a/R/splitXLSX.R b/R/splitXLSX.R deleted file mode 100644 index 0973d92..0000000 --- a/R/splitXLSX.R +++ /dev/null @@ -1,66 +0,0 @@ -#' splitXLSX() -#' -#' @description Function to export data from R as formatted .xlsx-file and spread -#' them over several worksheets based on a grouping variable (e.g., year). -#' @note User should make sure that the grouping variable is of binary, -#' categorical or other types with a limited number of levels. -#' @inheritParams insert_worksheet -#' @param file file name of the output .xlsx-file. The extension is added -#' automatically. -#' @param sheetvar name of the variable used to split the data and spread them -#' over several sheets. -#' @examples -#'splitXLSX(data = mtcars, -#' title = "Motor trend car road tests", -#' file = tempfile(fileext = ".xlsx"), -#' sheetvar = cyl, -#' source = paste("Source: Henderson and Velleman (1981),", -#' "Building multiple regression models interactively.", -#' "Biometrics, 37, 391–411."), -#' metadata = paste("The data was extracted from the 1974 Motor Trend", -#' "US magazine and comprises fuel consumption and", -#' "10 aspects of automobile design and performance", -#' "for 32 automobiles (1973–74 models).")) -#' @keywords splitXLSX -#' @export -splitXLSX <- function(data, - file, - sheetvar, - title = "Titel", - source = getOption("statR_source"), - metadata = NA, - logo = getOption("statR_logo"), - contactdetails = inputHelperContactInfo(compact = TRUE), - homepage = getOption("statR_homepage"), - author = "user", - grouplines = NA, - group_names = NA) { - - # create workbook ------ - wb <- openxlsx::createWorkbook() - - # get values of the variable that is used to split the data ------- - data <- as.data.frame(data) - sheetvalues <- unique(data[, c(deparse(substitute(sheetvar)))]) - col_name <- rlang::enquo(sheetvar) - - # loop to split values of the variable used to split the data ----- - for (sheetvalue in sheetvalues){ - sheettitle <- paste0(title, " (", deparse(substitute(sheetvar)), ": ", sheetvalue, ")") - data_subset <- verifyDataUngrouped(data) %>% - dplyr::filter((!!col_name) == sheetvalue) - - sheetname <- paste(deparse(substitute(sheetvar)), sheetvalue, sep = "_") - insert_worksheet(wb, sheetname = sheetname, data = data_subset, - title = sheettitle, source = source, metadata = metadata, - logo = logo, contactdetails = contactdetails, - homepage = homepage, author = author, - grouplines = grouplines, group_names = group_names) - } - - # Reverse order - openxlsx::worksheetOrder(wb) <- rev(openxlsx::worksheetOrder(wb)) - - # Save xlsx ------ - openxlsx::saveWorkbook(wb, verifyInputFilename(file), overwrite = TRUE) -} diff --git a/R/statzh_info.R b/R/statzh_info.R deleted file mode 100644 index b8cfbdb..0000000 --- a/R/statzh_info.R +++ /dev/null @@ -1,28 +0,0 @@ -#################### STAT ZH Farbpaletten -#' statzh_info -#' -#' Commonly used info for the Statistical Office of Canton Zurich -#' -#' @format A \code{list}. -#' @noRd -#' -statzh_info <- { - # Contact info - #--------------- - statzh_name <- "Statistisches Amt des Kantons Z\u00fcrich" - statzh_department <- "Datashop" - statzh_phone <- "Tel.: +41 43 259 75 00" - statzh_email <- "datashop@statistik.zh.ch" - statzh_homepage <- "http://www.statistik.zh.ch" - - statzh_contact <- c(statzh_department, statzh_phone, statzh_email) - statzh_contact_compact <- c(paste(statzh_department, statzh_phone, sep = ", "), - statzh_email, statzh_homepage) - statzh_openinghours <- c("B\u00fcrozeiten", "Montag bis Freitag", "09:00 bis 12:00", "13:00 bis 16:00") - - # Logo filenames (located in /extdata/ folder) - #------------- - statzh_logo <- "Stempel_STAT-01.png" - zh_logo <- "Stempel_Kanton_ZH.png" - -} diff --git a/R/styles.R b/R/styles.R index bc1ea73..3dfa864 100644 --- a/R/styles.R +++ b/R/styles.R @@ -1,53 +1,12 @@ #' Style definitions #' -#' Functions which generate style objects. Not intended to be called directly by the user. +#' Functions which generate style objects. Not intended to be called directly +#' by the user. #' @keywords internal #' @noRd -### Metadata -style_metadata_title <- function() { - openxlsx::createStyle(fontSize = 14, textDecoration = "bold", fontName = "Arial") -} -style_metadata_subtitle <- function() { - openxlsx::createStyle(fontSize = 12, textDecoration = "bold", fontName = "Arial") -} -style_metadata_headerline <- function() { - openxlsx::createStyle(border = "Bottom", borderColour = "#009ee0", - borderStyle = getOption("openxlsx.borderStyle", "thick")) -} - -### Index - - -### worksheet -style_worksheet_title <- function() { - openxlsx::createStyle(fontSize = 14, textDecoration = "bold", - fontName = "Arial") -} - -style_worksheet_subtitle <- function() { - openxlsx::createStyle(fontSize = 12, textDecoration = "italic", - fontName = "Arial") -} - -style_worksheet_header <- function() { - openxlsx::createStyle(fontSize = 12, fontColour = "#000000", halign = "left", - border = "Bottom", borderColour = "#009ee0", - textDecoration = "bold") -} - -style_worksheet_headerline <- function() { - -} - ### Worksheet no header - -mainTitleStyle <- function() { - openxlsx::createStyle(fontSize = 20, textDecoration = "bold", halign = "left", - fontName = "Arial") -} - style_maintitle <- function() { openxlsx::createStyle(fontSize = 20, textDecoration = "bold", halign = "left", fontName = "Arial") @@ -58,50 +17,38 @@ style_title <- function() { fontName = "Arial") } -subtitleStyle <- function() { - openxlsx::createStyle(fontSize = 11, textDecoration = "bold", halign = "left", - fontName = "Arial") +style_indextitle <- function() { + openxlsx::createStyle(fontSize = 10, textDecoration = "bold", halign = "left", + fontName = "Arial", valign = "top" ) } style_subtitle <- function() { - openxlsx::createStyle(fontSize = 12, textDecoration = "italic", - fontName = "Arial") + openxlsx::createStyle(fontSize = 10, textDecoration = NULL, + fontName = "Arial", halign = "left", valign = "top", + wrapText = TRUE) } -style_subtitle3 <- function() { - openxlsx::createStyle(fontSize = 11, fontName = "Calibri") -} - -style_subtitle2 <- function() { - openxlsx::createStyle(fontSize = 12, textDecoration = "bold", - fontName = "Arial") -} - - hyperlinkStyle <- function() { - openxlsx::createStyle(fontSize = 11, fontName = "Calibri", + openxlsx::createStyle(fontSize = 10, fontName = "Arial", fontColour = "blue", textDecoration = "underline") } style_header <- function() { - openxlsx::createStyle(fontSize = 12, fontName = "Calibri", halign = "left", - fontColour = "#000000", border="Bottom", - borderColour = "#009ee0", textDecoration = "bold") + openxlsx::createStyle( + fontSize = 12, fontName = "Arial", halign = "left", fontColour = "#000000", + border = "Bottom", borderColour = "#009ee0", borderStyle = "medium", + textDecoration = "bold") } - # Linien -------------- style_headerline <- function() { - openxlsx::createStyle(border = "Bottom", borderColour = "#009ee0", - borderStyle = getOption("openxlsx.borderStyle", "thick")) -} - -style_bottomline <- function() { - openxlsx::createStyle(border="Bottom", borderColour = "#009ee0") + openxlsx::createStyle( + border = "Bottom", borderColour = "#009ee0", borderStyle = "medium") } style_leftline <- function() { - openxlsx::createStyle(border = "Left", borderColour = "#009ee0") + openxlsx::createStyle( + border = "Left", borderColour = "#009ee0", borderStyle = "thin") } # Linewrap text --------- diff --git a/R/test_helpers.R b/R/test_helpers.R new file mode 100644 index 0000000..bb98463 --- /dev/null +++ b/R/test_helpers.R @@ -0,0 +1,4 @@ +cleanup_test <- function(test_env = "test_env") { + unlink(test_env, recursive = TRUE) + dir.create(test_env) +} diff --git a/R/theme_stat.r b/R/theme_stat.r index 1c37983..898a606 100644 --- a/R/theme_stat.r +++ b/R/theme_stat.r @@ -1,16 +1,26 @@ #' theme_stat() #' -#' This ggplot2 theme is based on ggplot2::theme_minimal(). It controls the non-data related characteristics of a plot (e.g., the font type). -#' On top of that, the font size, the major and minor grid lines, axis lines, axis ticks and the axis label positions can be specified. +#' This ggplot2 theme is based on ggplot2::theme_minimal(). It controls the +#' non-data related characteristics of a plot (e.g., the font type). +#' On top of that, the font size, the major and minor grid lines, axis lines, +#' axis ticks and the axis label positions can be specified. +#' +#' To use this theme in a R Markdown generated PDF document, +#' insert `dev="cairo_pdf"` into `knitr::opts_chunk$set()`. #' -#' To use this theme in a R Markdown generated PDF document, insert `dev="cairo_pdf"` into `knitr::opts_chunk$set()`. #' @inheritParams ggplot2::theme_minimal -#' @param axis.label.pos position of x and y-axis labels, can be set to "top", "center", or "bottom". -#' @param axis.lines presence of axis lines, can be set to "x", "y", "both", or "none". -#' @param ticks presence of axis ticks, can be set to "x", "y", "both", or "none". -#' @param major.grid.lines presence of major grid lines, can be set to "x", "y", "both", or "none". -#' @param minor.grid.lines presence of minor grid lines, can be set to "x", "y", "both", or "none". -#' @param map whether the theme should be optimized for maps, can be set to TRUE or FALSE. +#' @param axis.label.pos position of x and y-axis labels, can be set to "top", +#' "center", or "bottom". +#' @param axis.lines presence of axis lines, can be set to "x", "y", "both", or +#' "none". +#' @param ticks presence of axis ticks, can be set to "x", "y", "both", or +#' "none". +#' @param major.grid.lines presence of major grid lines, can be set to "x", "y", +#' "both", or "none". +#' @param minor.grid.lines presence of minor grid line 1) { + purrr::walk(row_extent, + ~openxlsx::mergeCells(wb, sheetname, cols = col_extent, rows = .)) + } + + if (inherits(style, "Style")) { + openxlsx::addStyle( + wb, sheetname, style, row_extent, min(column)) + } + + if (!is.null(attr(x, "row_heights")) && length(attr(x, "row_heights")) == length(x)) { + openxlsx::setRowHeights(wb, sheetname, row_extent, attr(x, "row_heights")) + } +} diff --git a/docs/404.html b/docs/404.html index 5843133..8a97c9f 100644 --- a/docs/404.html +++ b/docs/404.html @@ -1,72 +1,32 @@ - - - - + + + + - Page not found (404) • statR - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - + + + - - -

-
- + +
+ +
+ - - -
+
+
-
- +
+ + - - diff --git a/docs/LICENSE.html b/docs/LICENSE.html index e11180e..442b335 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -1,72 +1,17 @@ - - - - - - - -GNU General Public License • statR - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -GNU General Public License • statR - - - - - - - + + -
-
- -
- -
+