<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Rstudio on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/rstudio/</link>
    <description>Recent content in Rstudio on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Tue, 01 Dec 2020 06:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/rstudio/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Il CNR è anche questo: un po&#39; di codice</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2020/12/01/il-cnr-e-anche-questo-un-po-di-codice/</link>
      <pubDate>Tue, 01 Dec 2020 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2020/12/01/il-cnr-e-anche-questo-un-po-di-codice/</guid>
      <description>&lt;img src=&#34;https://imgs.xkcd.com/comics/good_code.png&#34; alt=&#34;&#34; title=&#34;XKCD, Good code&#34;&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;XKCD, &lt;a href=&#34;https://xkcd.com/844/&#34;&gt;Good code&lt;/a&gt;&lt;/em&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Per concludere nel miglior modo possibile questa serie di articoli (qui la &lt;a href=&#34;https://melabit.wordpress.com/2020/10/25/il-cnr-e-anche-questo-concorsi-senza-frontiere/&#34;&gt;prima&lt;/a&gt; e la &lt;a href=&#34;https://melabit.wordpress.com/2020/11/08/il-cnr-e-anche-questo-concorsi-in-latex/&#34;&gt;seconda&lt;/a&gt; parte), cosa ci può essere di meglio di un po&amp;rsquo; di codice?&lt;/p&gt;&#xA;&lt;h4 id=&#34;estrarre-il-testo-da-un-file-pdf&#34;&gt;Estrarre il testo da un file PDF&lt;/h4&gt;&#xA;&lt;p&gt;Cominciamo dallo script in R, &lt;code&gt;pdf2csv.R&lt;/code&gt;, che estrae il testo da un file PDF, (che in questo caso specifico ho usato per &lt;a href=&#34;https://melabit.wordpress.com/2020/11/08/il-cnr-e-anche-questo-concorsi-in-latex/&#34;&gt;estrarre i dati&lt;/a&gt; dalla domanda di partecipazione ad un concorso precedente). Qui sotto trovate l&amp;rsquo;immagine dello script, realizzata con &lt;a href=&#34;https://carbon.now.sh/&#34;&gt;Carbon&lt;/a&gt; (perché così è molto più bello), su GitHub c&amp;rsquo;è il &lt;a href=&#34;https://github.com/sabinomaggi/melabit/tree/main/un-po-di-codice&#34;&gt;sorgente vero e proprio&lt;/a&gt;, per chi voglia provare ad usarlo.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/11/pdf2csv-1.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Per eseguire lo script è necessario aver installato sul proprio computer,  non importa se è un Mac o un PC con Linux o Windows, &lt;a href=&#34;https://www.r-project.org/&#34;&gt;l&amp;rsquo;ambiente R&lt;/a&gt; (in questo momento è disponibile la versione 4.0.3), meglio ancora se accompagnato da &lt;a href=&#34;https://rstudio.com/products/rstudio/&#34;&gt;RStudio Desktop&lt;/a&gt;, che è di gran lunga il migliore sistema integrato di sviluppo (IDE) che abbia mai usato, oltre che uno strumento efficacissimo per affacciarsi all&amp;rsquo;uso di R.&lt;/p&gt;&#xA;&lt;p&gt;Il codice è molto semplificato, ho tolto tutto ciò che non è strettamente necessario a far funzionare lo script. La chiave di tutto è la libreria &lt;a href=&#34;https://cran.r-project.org/web/packages/pdftools/index.html&#34;&gt;pdftools&lt;/a&gt; per R.  Di librerie per estrarre dati dai file PDF ne ho provate moltissime, sia per R che per Python, ma &lt;code&gt;pdftools&lt;/code&gt; le batte tutte per potenza, semplicità e velocità. Ci sono dei &lt;em&gt;tool&lt;/em&gt; che convertono un PDF in testo al ritmo di una pagina al minuto, &lt;code&gt;pdftools&lt;/code&gt; riesce a convertire (molto bene, peraltro) un file di 400 pagine &lt;a href=&#34;https://www.snpambiente.it/2018/02/24/rapporto-controlli-ambientali-del-snpa-aia-seveso-edizione-2017/&#34;&gt;come questo&lt;/a&gt; in appena 5-6 secondi. C&amp;rsquo;è altro da aggiungere?&lt;/p&gt;&#xA;&lt;p&gt;Lo script può essere utilizzato dalla linea di comando (per capirci, dal Terminale), lasciandolo esattamente com&amp;rsquo;è ed eseguendo il comando &lt;code&gt;pdf2csv.R&lt;/code&gt; seguito dal nome dal file da convertire (se il nome del file contiene degli spazi va scritto fra virgolette),&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./pdf2csv.R file-da-convertire.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che produrrà due file &lt;code&gt;.csv&lt;/code&gt; contenenti il testo estratto dal file PDF. Il primo, con lo stesso nome del file di partenza, ha le righe numerate e cerca di riprodurre per quanto è possibile il &lt;em&gt;layout&lt;/em&gt; del file originale. Nel secondo, salvato con il suffisso &lt;code&gt;-clean&lt;/code&gt;, mancano i numeri di linea e vengono rimossi tutti gli spazi in eccesso, rendendolo più adatto ad una analisi automatica, in particolare quando il testo si estende per tutta la pagina (il primo file, invece, è molto più utile quando il testo è organizzato in colonne).&lt;/p&gt;&#xA;&lt;p&gt;Prima di usare per la prima volta &lt;code&gt;pdf2csv.R&lt;/code&gt; bisogna renderlo eseguibile tramite il comando &lt;code&gt;chmod&lt;/code&gt; (ne ho già scritto diffusamente &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;qui&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;chmod u+x pdf2csv.R&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In alternativa si può lanciare lo script tramite il comando &lt;code&gt;Rscript&lt;/code&gt; installato con R, senza che sia necessario renderlo eseguibile.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;Rscript ./pdf2csv.R file-da-convertire.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;È preferibile che il file PDF da convertire si trovi nella stessa cartella di &lt;code&gt;pdf2csv.R&lt;/code&gt;. In caso contrario il testo estratto viene comunque salvato nella cartella dove si trova la script (ve l&amp;rsquo;avevo detto che lo script era molto semplificato!).&lt;/p&gt;&#xA;&lt;p&gt;Per eseguire &lt;code&gt;pdf2csv.R&lt;/code&gt; all&amp;rsquo;interno di RStudio bisogna commentare la linea &lt;code&gt;12&lt;/code&gt; (basta aggiungere un &lt;code&gt;#&lt;/code&gt; all&amp;rsquo;inizio della riga) e attivare la riga 14 o 15 (ma solo da una delle due) togliendo il &lt;code&gt;#&lt;/code&gt; iniziale. Se si attiva la riga 14, si deve anche modificare la stringa &lt;code&gt;file-da-convertire.pdf&lt;/code&gt;, sostituendola con il nome del file da convertire. Se invece si attiva la riga numero 15, al momento dell&amp;rsquo;esecuzione dello script comparirà una finestra grafica da cui selezionare il file PDF desiderato.&lt;/p&gt;&#xA;&lt;p&gt;Nel &lt;a href=&#34;https://github.com/sabinomaggi/melabit/tree/main/un-po-di-codice&#34;&gt;repository su GitHub&lt;/a&gt; di questo articolo ho inserito dei file PDF di complessità crescente con cui fare qualche prova, fra cui un documento di quasi 1000 pagine (un vecchio manuale di riferimento del formato PDF, potevo scegliere qualcosa di diverso?), che può essere utile per valutare la velocità di conversione dello script. Non è necessario farlo a mano, il tempo di esecuzione di un qualunque programma o script si può misurare in modo preciso dal Terminale anteponendo il comando di sistema &lt;code&gt;time&lt;/code&gt;, come mostrato qui sotto.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;time ./pdf2csv.R PDFReference.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Come piccola chicca finale, ho aggiunto al repository su GitHub un file PDF contenente del testo (apparentemente) nascosto, provate a convertirlo e vi accorgerete di quanto sia banale recuperare il testo completo.&lt;/p&gt;&#xA;&lt;h4 id=&#34;generare-automaticamente-dei-documenti-con-awk&#34;&gt;Generare automaticamente dei documenti con AWK&lt;/h4&gt;&#xA;&lt;p&gt;Tirar fuori il testo contenuto in un file PDF è quasi sempre solo il primo passo del lavoro, perché quello che vogliamo veramente è filtrare il contenuto del documento mantenendo solo le informazioni che ci interessano. Nel &lt;a href=&#34;https://melabit.wordpress.com/2020/11/08/il-cnr-e-anche-questo-concorsi-in-latex/&#34;&gt;caso specifico&lt;/a&gt;, io avevo bisogno di selezionare dalla domanda di concorso precedente solo i dati relativi ad una specifica tipologia di attività (ad esempio tutti gli articoli scientifici pubblicati), salvandoli in un file &lt;em&gt;ad hoc&lt;/em&gt;. E, già che c&amp;rsquo;ero, volevo anche costruire una tabella LaTeX per ciascun articolo. Una cosa abbastanza facile da fare con &lt;a href=&#34;https://www.grymoire.com/Unix/Awk.html&#34;&gt;AWK&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Di AWK ho già parlato &lt;a href=&#34;https://melabit.wordpress.com/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/&#34;&gt;tempo fa&lt;/a&gt; e non mi ripeterò, dirò solo che è un linguaggio ideale per analizzare un file di testo una riga alla volta, verificando se si presentano determinate condizioni ed eseguendo le operazioni programmate corrispondenti.&lt;/p&gt;&#xA;&lt;p&gt;Nonostante i suoi tanti pregi, AWK ha una limitazione piuttosto seria: per come è strutturato, AWK deve per forza di cose esaminare tutto il file senza poter &lt;em&gt;tornare indietro&lt;/em&gt;, e quindi è piuttosto difficile fargli eseguire delle operazioni basate su condizioni multiple complesse. È molto meglio (quando è possibile) scrivere più &lt;em&gt;script&lt;/em&gt; AWK, da eseguire in sequenza sullo stesso file di partenza o sull&amp;rsquo;output generato dallo script precedente, piuttosto che cercare di combattere con le limitazioni del linguaggio, complicando a dismisura il codice.&lt;/p&gt;&#xA;&lt;p&gt;In una prima versione di questo articolo avevo pensato di utilizzare un breve estratto della mia domanda di concorso precedente per descrivere il funzionamento degli script in AWK. Ma mentre scrivevo mi sono accorto che il discorso sarebbe stato così specifico da essere quasi inutile. Ho preferito quindi preparare un piccolo file PDF tratto dagli ultimi post pubblicati su Melabit, con l&amp;rsquo;intestazione in &lt;a href=&#34;https://blog.stackpath.com/yaml/&#34;&gt;YAML&lt;/a&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; di ciascun post seguita dalla prima frase del testo in &lt;a href=&#34;https://daringfireball.net/projects/markdown/&#34;&gt;Markdown&lt;/a&gt; e, quando c&amp;rsquo;è, dal link all&amp;rsquo;immagine iniziale. L&amp;rsquo;ho scelto perché la struttura di questo file assomiglia moltissimo a quella della mia domanda di concorso ma, allo stesso tempo, può essere uno schema di partenza applicabile a casi più generali.&lt;/p&gt;&#xA;&lt;div style = &#34;border-style: solid; border-width: 0px 0px 0px 4px; border-color: midnightblue; background-color: aliceblue; padding: 1em;&#34;&gt;&#xA;Questo file PDF può essere considerato come la stampa di un piccolo _database_ di informazioni correlate, dove ogni post è un _record_, suddiviso a sua volta nei vari _campi_, rappresentati dalle righe di intestazione e dalla frase di testo.&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Il file PDF si chiama &lt;code&gt;Melabit ultimi post.pdf&lt;/code&gt; e, come gli altri file PDF, è disponibile nel &lt;a href=&#34;https://github.com/sabinomaggi/melabit/tree/main/un-po-di-codice&#34;&gt;repository su GitHub&lt;/a&gt; di questo articolo. Se lo aprite con Anteprima, noterete subito che ci sono delle righe vuote che separano chiaramente un post (nel linguaggio dei database, un &lt;em&gt;record&lt;/em&gt;) dall&amp;rsquo;altro. Ma convertendo il file in testo,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./pdf2csv.R &amp;#34;Melabit ultimi post.pdf&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(le virgolette sono necessarie perché il nome del file contiene degli spazi), le righe vuote scompaiono e le uniche interruzioni presenti nei due file CSV prodotti dallo script di conversione corrispondono al cambio pagina. Non so se questo sia un baco o una caratteristica voluta di &lt;code&gt;pdftools&lt;/code&gt;, ma sta di fatto che è una particolarità con la quale dobbiamo fare i conti se vogliamo analizzare il testo con AWK.&lt;/p&gt;&#xA;&lt;p&gt;Sembra una sciocchezza, ma senza le giuste interruzioni non è immediato riconoscere la fine di un record &lt;em&gt;prima&lt;/em&gt; di iniziare ad esaminare quello successivo, in modo da chiudere correttamente la tabella LaTeX corrispondente al record appena esaminato e ad aprire quella relativa al record successivo. Inoltre, mentre in questo caso specifico la struttura del file PDF è volutamente molto semplice e ripetibile, nella maggior parte dei casi reali il documento da cui estrarre i dati può contenere informazioni strutturate in modi diversi, i campi da analizzare possono essere distribuiti in modo irregolare o mancare del tutto e ci possono essere incongruenze nella loro denominazione. Gestire tutti i casi possibili con un unico script lo renderebbe rapidamente troppo complesso.&lt;/p&gt;&#xA;&lt;p&gt;Molto meglio affrontare il problema un pezzetto alla volta, utilizzando uno script specifico per ciascun tipo di informazione da estrarre (io ho avuto bisogno di 6 script AWK per eseguire tutto il lavoro di esportazione dei dati, o meglio &lt;em&gt;quasi tutto&lt;/em&gt; il lavoro, perché per i casi meno frequenti ho preferito il buon vecchio copia-incolla manuale). In fondo è la stessa logica di Unix, che mette a disposizione un gran numero di strumenti semplici che messi insieme, come tanti mattoncini Lego, riescono a fare cose incredibili.&lt;/p&gt;&#xA;&lt;p&gt;Un primo script, &lt;code&gt;addblanklines.awk&lt;/code&gt;, può servire per inserire nel file CSV di partenza una riga vuota &lt;em&gt;prima&lt;/em&gt; di ogni record (una cosa piuttosto semplice da fare in questo caso, dato che ogni post inizia sempre con la stringa &amp;ldquo;layout: post&amp;rdquo;). Lo script, appena quindici linee di codice, lo trovate &amp;ldquo;in bella&amp;rdquo; nell&amp;rsquo;immagine qui sotto (ma anche in questo caso il &lt;a href=&#34;https://github.com/sabinomaggi/melabit/tree/main/un-po-di-codice&#34;&gt;sorgente&lt;/a&gt; è su GitHub).&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/11/addblanklines-1.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Bastano solo due linee di codice, la #4 e la #9, per aggiungere le righe vuote al posto giusto. Ma già che ci siamo, è conveniente dare anche una &lt;em&gt;ripulita&lt;/em&gt; al file CSV togliendo le righe inutili, come quelle che contengono il numero di pagina o la stringa &lt;code&gt;---&lt;/code&gt; che segna l&amp;rsquo;inizio e la fine dell&amp;rsquo;intestazione in YAML (linee #5 e #12). Eseguendo lo script sul file CSV originale, si ottiene un nuovo file CSV con i vari record ben separati uno dall&amp;rsquo;altro.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./addblanklines.awk &amp;#34;Melabit ultimi post-clean.csv&amp;#34; &amp;gt; file-con-righe-vuote.csv&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Fatto questo, il passo successivo è semplice. Basta scansionare il file CSV appena generato, &lt;code&gt;file-con-righe-vuote.csv&lt;/code&gt;, in cerca della stringa &lt;em&gt;target&lt;/em&gt; &lt;code&gt;layout: post&lt;/code&gt; e, ogni volta che se ne trova una, generare una nuova tabella LaTeX riempiendola con i dati tratti dalle voci (o più propriamente &lt;em&gt;campi&lt;/em&gt;) successive. Il codice del secondo script, &lt;code&gt;cvs2table.awk&lt;/code&gt;, è visibile nell&amp;rsquo;immagine qui sotto (mentre il &lt;a href=&#34;https://github.com/sabinomaggi/melabit/tree/main/un-po-di-codice&#34;&gt;sorgente&lt;/a&gt; è sempre su GitHub).&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/11/cvs2table-1.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Lo script è relativamente lungo, sono più di 80 linee di codice, compresi commenti e righe vuote, ma una gran parte serve per implementare la funzione (linee #3-25) che riarrangia le informazioni presenti su più linee consecutive del file CSV in modo che vengano stampate su un&amp;rsquo;unica riga, e per generare la struttura di base del documento LaTeX (linee #35-42 e #83).&lt;/p&gt;&#xA;&lt;p&gt;Tolte queste, il resto del codice è semplice, si tratta più che altro di scrivere le stringe giuste al momento giusto e di tenere conto dei casi in cui le informazioni si estendono su più linee consecutive (come succede ad esempio alle linee #61-62 e #66-73). Non entrerò nei dettagli di come funziona lo script, questo non è un corso di AWK (né tantomeno di R), basterà per ora dire che è scritto in modo da essere facilmente adattato a gestire esigenze analoghe. Per usarlo, si deve eseguire lo script usando come file di input &lt;code&gt;file-con-righe-vuote.csv&lt;/code&gt; e salvando il risultato dell&amp;rsquo;elaborazione in un file LaTeX, che qui sotto ho chiamato (con la mia solita scarsa fantasia) &lt;code&gt; lista-articoli.tex&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./cvs2table.awk file-con-righe-vuote.csv &amp;gt; lista-articoli.tex&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;mettere-tutto-insieme&#34;&gt;Mettere tutto insieme&lt;/h4&gt;&#xA;&lt;p&gt;Proviamo allora ad eseguire tutti insieme gli script presentati in questo articolo, in modo da ottenere il risultato finale desiderato. Dobbiamo prima di tutto convertire il file PDF in CSV con&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./pdf2csv.R &amp;#34;Melabit ultimi post.pdf&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che genera automaticamente il file &amp;ldquo;Melabit ultimi post-clean.csv&amp;rdquo;. Fatto questo, si eseguono in sequenza i due script AWK, salvando l&amp;rsquo;output del primo in un file intermedio.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./addblanklines.awk &amp;#34;Melabit ultimi post-clean.csv&amp;#34; &amp;gt; file-con-righe-vuote.csv&#xA;&#x9;./cvs2table.awk file-con-righe-vuote.csv &amp;gt; lista-articoli.tex&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Il risultato finale è un file LaTeX ben ordinato con una tabella per ogni articolo, come quello mostrato nella figura qui sotto la cui regolarità, messa in evidenza dai colori delle parole chiave, fa pensare ad uno spartito musicale.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/11/lista-articoli-1.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ma ha senso creare un file intermedio solo per trasferire l&amp;rsquo;output del primo script al secondo? Molto meglio usare il &lt;a href=&#34;https://www.geeksforgeeks.org/piping-in-unix-or-linux/&#34;&gt;meccanismo di &lt;em&gt;piping&lt;/em&gt;&lt;/a&gt; tipico in Unix, con il quale si può trasferire automaticamente il risultato dell&amp;rsquo;esecuzione di un comando all&amp;rsquo;ingresso di quello successivo, collegandoli con il carattere &lt;code&gt;|&lt;/code&gt; (&lt;em&gt;pipe&lt;/em&gt;)?&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; Con il &lt;em&gt;piping&lt;/em&gt;, i due comandi AWK precedenti possono essere eseguiti uno dopo l&amp;rsquo;altro in questo modo,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./addblanklines.awk &amp;#34;Melabit ultimi post-clean.csv&amp;#34; | ./cvs2table.awk &amp;gt; lista-articoli.tex&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;evitando l&amp;rsquo;uso di un file intermedio. In questo caso non fa molta differenza, ma quando si devono trattare file molto grossi, il &lt;em&gt;piping&lt;/em&gt; è molto più efficiente (con i velocissimi dischi SSD odierni non ce ne accorgiamo più, ma ai tempi dei dischi meccanici la scrittura di grossi file sul disco era un vero collo di bottiglia) e, cosa che non guasta mai, evita di intasare il disco rigido con un gran numero di file inutili.&lt;/p&gt;&#xA;&lt;p&gt;E poi il &lt;em&gt;piping&lt;/em&gt; è un meccanismo intrinsecamente elegante, che non a caso è stato adottato anche in alcuni &lt;a href=&#34;http://leetschau.github.io/pipe-operator-in-functional-programming-languages.html&#34;&gt;linguaggi di programmazione odierni&lt;/a&gt;, come si può vedere nello script R mostrato nella prima parte di questo articolo (linee #24-25 e #35-37), dove il simbolo &lt;code&gt;|&lt;/code&gt; usato in Unix è sostituito dalla strana combinazione di caratteri &lt;code&gt;%&amp;amp;#62;%&lt;/code&gt;, piuttosto fastidiosa da scrivere con una tastiera italiana (io almeno sbaglio sempre qualcosa).&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Chi ha l&amp;rsquo;occhio allenato si accorgerà facilmente che il file LaTeX risultante contiene alcuni errori piuttosto evidenti. Li ho lasciati apposta non solo per non complicare ulteriormente il codice, ma anche per mostrare quanto sia complicato il lavoro di estrazione automatica dei dati da file strutturati in modo non perfettamente regolare. Non è certo un caso che in questo campo ci sia una grossa attività di ricerca che prova a superare gli ostacoli e a rendere il tutto il più semplice e il più efficiente possibile.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Il comando &lt;code&gt;time&lt;/code&gt; è presente di default nei sistemi operativi Unix come Linux e macOS. Su Windows &lt;code&gt;time&lt;/code&gt; non esiste, ma si possono usare degli &lt;a href=&#34;https://qastack.it/superuser/228056/windows-equivalent-to-unix-time-command&#34;&gt;strumenti equivalenti&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;YAML è un linguaggio di &lt;em&gt;markup&lt;/em&gt; particolarmente adatto per definire dei file di configurazione e, in generale, per rappresentare informazioni strutturate in modo semplice e leggibile, molto più facile da usare di strumenti più noti come XML e JSON.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Il &lt;em&gt;piping&lt;/em&gt; è uno dei meccanismi principali che rendono Unix una specie di Lego informatico.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Statististica con R ed RStudio</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2015/05/20/statististica-con-r-ed-rstudio/</link>
      <pubDate>Wed, 20 May 2015 16:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2015/05/20/statististica-con-r-ed-rstudio/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2015/05/learning-rstudio-for-r-statistical-computing.jpg&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2015/05/learning-rstudio-for-r-statistical-computing.jpg&#34; alt=&#34;Learning RStudio for R Statistical Computing in offerta oggi da Packt&#34; width=&#34;500&#34; height=&#34;616&#34; class=&#34;aligncenter size-full wp-image-1857&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Da quasi un mese &lt;a href=&#34;https://www.packtpub.com/&#34;&gt;Packt&lt;/a&gt; sta &lt;a href=&#34;https://www.packtpub.com/packt/offers/free-learning&#34;&gt;offrendo&lt;/a&gt; ogni giorno gratis solo robetta quasi inutile. Non valeva nemmeno la pena menzionare la cosa in questo blog.&lt;/p&gt;&#xA;&lt;p&gt;Oggi però Packt si riscatta con &lt;a href=&#34;https://www.packtpub.com/packt/offers/free-learning&#34;&gt;una vera prelibatezza&lt;/a&gt;, l&amp;rsquo;ebook &lt;a href=&#34;https://www.packtpub.com/big-data-and-business-intelligence/learning-rstudio-r-statistical-computing&#34;&gt;Learning RStudio for R Statistical Computing&lt;/a&gt; di&#xA;Mark van der Loo e Edwin de Jonge, che normalmente costa 17 euro, nemmeno tanto.&lt;/p&gt;&#xA;&lt;p&gt;Non fatevi spaventare, R è un software utilissimo anche per chi non conosce la statistica ed RStudio è il miglior modo per usare R tramite una interfaccia semi-grafica potente ed efficace.&#xA;Io ormai uso R ed RStudio ormai quasi ogni giorno, sono diventati rapidamente dei compagni di lavoro indispensabili.&lt;/p&gt;&#xA;&lt;p&gt;Bisogna affrettarsi però. L&amp;rsquo;offerta scade all&amp;rsquo;una di questa notte, mancano solo poche ore.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
