Come inviare e-mail da R e Gmail

Ad un certo punto della tua vita R, probabilmente vorrai condividere i risultati della tua analisi con colleghi che non usano R. Ci sono molti modi per farlo. Uno dei metodi più semplici (e meno costosi) è inviare i risultati tramite posta elettronica.

Ma è un po 'triste automatizzare l'intero flusso di lavoro di analisi, solo per creare manualmente e inviare un'e-mail alla fine. Fortunatamente, non devi. Esistono diversi pacchetti R che consentono di inviare e-mail direttamente da uno script R. In questo articolo, ne dimostrerò uno: gmailr di Jim Hester, che ora è un ingegnere del software presso RStudio.

Ovviamente, avrai bisogno di un account Gmail, che è gratuito se non ne hai uno. Quindi, prima di poter utilizzare quell'account da R, dovrai configurarlo per l'accesso API. Ecco come.

Vai a console.developers.google.com (sì, questo è un sottodominio). Se non hai già un progetto per sviluppatori, ti verrà chiesto di crearne uno. 

Nella parte superiore della dashboard, dovresti vedere l'opzione "Abilita API e servizi". Fare clic su quello.

Sharon Machlis,

Successivamente dovrai cercare l'API di Gmail. Fare clic su questo e quindi fare clic su Abilita. 

Lo script R avrà bisogno di credenziali, quindi fai clic su Crea credenziali in alto a destra.

Sharon Machlis

Secondo le istruzioni di Jim Hester, abbiamo bisogno di un ID cliente, quindi sceglierò l'ID cliente.

Sharon Machlis,

Ora richiede un tipo di applicazione. Poiché la "sceneggiatura R" non è presente, desidero scegliere "Altro". Ma tutti i pulsanti di opzione sono disattivati. Questo perché non ho configurato la schermata di consenso. È facile non vederlo se ti concentri sulle scelte dei pulsanti di opzione; è in alto a destra. Fare clic su quello.

Sharon Machlis,

Il tuo indirizzo email dovrebbe essere già presente nel modulo della schermata di consenso. L'unico altro requisito è un nome per l'applicazione. Puoi chiamarlo come preferisci.

Jim dice che il resto delle impostazioni predefinite va bene, quindi scorri verso il basso e salva. Ora dovresti essere in grado di selezionare il tipo di applicazione Altro, assegnare un nome all'applicazione e fare clic su Crea.

La console dovrebbe quindi fornire un ID client e un client secret. Puoi usarli aggiungendoli al tuo ambiente R, se lo desideri. Ma Jim suggerisce invece di scaricare il file JSON. Puoi scaricarlo nella directory di lavoro del tuo progetto R e ricordare il nome del file che gli dai.

Sharon Machlis,

Finisce la configurazione sul lato Google ed è finalmente il momento per un po 'di codice R. 

Innanzitutto, assicurati di aver installato il pacchetto gmailr. È disponibile su CRAN, quindi puoi installarlo con install.packages("gmailr"). Quindi carica il pacchetto nel tuo script con library(gmailr).

Prima di fare qualsiasi altra cosa, ti consigliamo di impostare la tua sessione R di lavoro per utilizzare il file delle credenziali JSON scaricato. Puoi farlo con la use_secret_file()funzione e il nome del tuo file JSON come argomento. Se chiamassi il mio file delle credenziali JSON DoMoreWithR.json, il comando sarebbe 

use_secret_file("DoMoreWithR.json")

In realtà inviare un messaggio è abbastanza facile.

Per alcuni dati di esempio, ho scaricato i tassi di disoccupazione mensili negli Stati Uniti e quindi ho creato una stringa di testo chiamata latest_msg con informazioni sull'ultimo tasso di disoccupazione. Nota che nel codice seguente utilizzo il pacchetto glue per assemblare la stringa di caratteri che voglio per il mio messaggio, ma è perché mi piace farlo in questo modo; paste()o paste0()funzionano altrettanto bene.

Puoi utilizzare qualsiasi dato generato da R che desideri nel tuo messaggio di posta elettronica. Se vuoi seguire il mio, ecco il codice (avrai bisogno del pacchetto pacman installato):

pacman :: p_load (quantmod, glue, xts, dplyr, ggplot2)
getSymbols ("UNRATE", src = "FRED")

disoccupazione <- coredata (UNRATE)

month_starting <- index (UNRATE)

series_length <- length (disoccupazione)

latest_msg <- glue ("L'ultimo tasso di disoccupazione negli Stati Uniti è stato {disoccupazione [series_length]}, nel mese che inizia {month_starting [series_length]}. Questo è {disoccupazione [series_length] - disoccupazione [series_length - 1]} differenza di punti percentuali rispetto al precedente mese.")

Successivamente, voglio creare un oggetto di posta elettronica MIME, quindi aggiungere un indirizzo di destinazione, un indirizzo del mittente, il testo dell'oggetto e il corpo del messaggio.

my_email_message%

a ("[email protected]")%>%

da ("[email protected]")%>%

oggetto ("Il mio messaggio di prova")%>%

text_body (latest_msg)

Se lo fai e poi controlli la struttura di my_email_message con str(my_text_message)te vedrai che è un elenco con una classe di mime.

Dopo aver creato l'oggetto messaggio MIME, puoi inviarlo con la send_message()funzione. L'argomento è solo il nome del mio oggetto MIME, in questo caso my_email_message. Quindi il comando completo in questo caso è

send_message (my_email_message)

Quando esegui send_message () per la prima volta, probabilmente ti verrà chiesto se desideri memorizzare nella cache l'autorizzazione tra le sessioni R. Ti suggerisco di dire di sì. La prima volta che lo esegui, ti verrà anche chiesto nel tuo browser di autorizzare lo script R a utilizzare il tuo account Google.

Puoi fare di più con gmailr. Un'opzione è creare un messaggio HTML, in modo da poter utilizzare markup come grassetto e corsivo.

Qui il corpo del mio messaggio include segni di paragrafo simili a HTML e grassetto e corsivo, e lo invierò al mio indirizzo di lavoro. 

html_msg_text <- glue ("

L'ultimo tasso di disoccupazione negli Stati Uniti è stato

{disoccupazione [series_length]} , nel mese che inizia

{month_starting [series_length]}. Quello è

{disoccupazione [series_length] - disoccupazione [series_length - 1]}

differenza di punti percentuali rispetto al mese precedente.

Dati del Bureau of Labor Statistics degli Stati Uniti.

")
my_html_message%

a ("[email protected]")%>%

da ("[email protected]")%>%

oggetto ("Il mio messaggio di prova")%>%

html_body (html_msg_text)

send_message (my_html_message)

Sfortunatamente, non conosco un modo per includere facilmente un'immagine generata da R direttamente nel corpo del messaggio. Ma è abbastanza semplice includerne uno come allegato. 

Nella parte superiore dello script seguente, sto trasformando i miei dati sul tasso di disoccupazione in un frame di dati con le metriche dal 2000 in poi, così posso usare ggplot per rappresentare graficamente e quindi salvare il grafico in un file. 

This next part of the code is what’s important to know for email, though. First, like before, I’m creating a text string for my message text with the glue package. What’s new is the last two lines of code creating my MIME object. That last line, attach_file(), attaches my PNG file to the email. The line before is important if you want text to show up in the body of the email. Without using both text_body()andattach_part() for the body text, text won’t show up when you attach a file. Just something to remember.

Then I can use the same send_message() function to send it.

un_df %

filter(month_starting >= as.Date("2000-01-01")) %>%

rename(unemployment = UNRATE)

mygraph <- ggplot(un_df, aes(month_starting, unemployment)) +

geom_line() +

ggtitle("US Monthly Unemployment") +

xlab("Month Starting") +

ylab ("")

ggsave("unemployment_graph.png")
msg_text <- glue("The latest US unemployment rate was {unemployment[series_length]}, in the month starting {month_starting[series_length]}. That's {unemployment[series_length] - unemployment[series_length - 1]} percentage points difference from the prior month. A graph of the data since January 2000 is attached.")

message2 %

to("[email protected]") %>%

from("[email protected]") %>%

subject("My text message with attached graph") %>%

text_body(msg_text) %>%

attach_part(msg_text) %>%

attach_file("unemployment_graph.png")

send_message(message2)

Se lo desideri, puoi utilizzare la funzione create_draft() per creare una bozza di messaggio nel tuo account Gmail, se desideri verificarne l'aspetto prima di inviarlo. In questo caso, create_draft(message2)creerei una bozza del mio messaggio di file allegato.

Se desideri vedere come tutto questo appare in azione, guarda il video all'inizio di questo articolo. E per altri suggerimenti R, vai alla pagina del video Fai di più con R o dai un'occhiata alla playlist di YouTube Fai di più con R.