Programmering

Hvordan sende e-post fra R og Gmail

På et tidspunkt i ditt R-liv vil du sannsynligvis ønske å dele resultatene av analysen din med kolleger som ikke bruker R. Det er mange måter å gjøre dette på. En av de enkleste (og minst kostbare) er å sende resultatene dine på e-post.

Men det er litt trist å automatisere hele analysen, bare for å lage og manuelt sende en e-post på slutten. Heldigvis trenger du ikke. Det er flere R-pakker som lar deg sende e-post direkte fra et R-skript. I denne artikkelen vil jeg demonstrere en av dem: gmailr av Jim Hester, som nå er programvareingeniør i RStudio.

Åpenbart trenger du en Gmail-konto, som er gratis å konfigurere hvis du ikke har en. Så før du kan bruke den kontoen fra R, må du konfigurere den for API-tilgang. Dette er hvordan.

Gå til console.developers.google.com (ja, det er et underdomener). Hvis du ikke allerede har et utviklerprosjekt, blir du bedt om å opprette et.

Øverst på dashbordet ditt bør du velge "Aktiver APIer og tjenester." Klikk på det.

Sharon Machlis,

Deretter vil du søke etter Gmail API. Klikk på det, og klikk deretter på Aktiver.

R-skriptet trenger legitimasjon, så klikk på Opprett legitimasjon øverst til høyre.

Sharon Machlis

I følge Jim Hesters instruksjoner trenger vi en klient-ID, så jeg velger klient-ID.

Sharon Machlis,

Nå ber det om en applikasjonstype. Siden "R-skript" ikke er her, vil jeg velge "Annet". Men alle alternativknappene er gråtonet. Det er fordi jeg ikke har konfigurert samtykke-skjermen. Det er lett å savne hvis du er fokusert på valg av alternativknapp; det er øverst til høyre. Klikk på det.

Sharon Machlis,

Din e-postadresse skal allerede være i skjermbildet for samtykkeskjerm. Det eneste andre kravet er et navn på applikasjonen. Du kan kalle det hva du vil.

Jim sier at resten av standardene er fine, så bla ned og lagre. Nå skal du kunne velge Applikasjonstype Annet, gi applikasjonen et navn og klikke Opprett.

Konsollen skal da gi deg en klient-ID og klienthemmelighet. Du kan bruke dem ved å legge dem til R-miljøet ditt hvis du vil. Men Jim foreslår at du laster ned JSON-filen i stedet. Du kan laste det ned til R-prosjektets arbeidskatalog, og huske filnavnet du gir det.

Sharon Machlis,

Det fullfører oppsettet på Google-siden, og det er endelig tid for litt R-kode.

Forsikre deg først om at du har installert gmailr-pakken. Den er tilgjengelig på CRAN, slik at du kan installere den med install.packages ("gmailr"). Last deretter pakken i skriptet ditt med bibliotek (gmailr).

Før du gjør noe annet, vil du konfigurere din arbeids-R-økt for å bruke den nedlastede JSON-legitimasjonsfilen. Du kan gjøre det med bruk_sekretfil () funksjonen, og navnet på JSON-filen som argument. Hvis jeg kalte JSON-legitimasjonsfilen min DoMoreWithR.json, ville kommandoen være det

use_secret_file ("DoMoreWithR.json")

Det er ganske enkelt å sende en melding.

For noen eksempeldata lastet jeg ned månedlige arbeidsledighetsrater i USA og opprettet deretter en tekststreng kalt latest_msg med informasjon om den siste ledigheten. Vær oppmerksom på at i koden nedenfor bruker jeg limpakken til å sette sammen den karakterstrengen jeg ønsker for meldingen min, men det er fordi jeg liker å gjøre det på den måten; lim inn() eller lim inn 0 () fungerer like bra.

Du kan bruke hvilken som helst R-generert data du vil ha i e-postmeldingen. Hvis du vil følge med min, er her koden (du trenger pacman-pakken installert):

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

arbeidsledighet <- coredata (UNRATE)

måned_start <- indeks (UNRATE)

serie_lengde <- lengde (arbeidsledighet)

latest_msg <- lim ("Den siste ledigheten i USA var {ledighet [series_length]}, i måneden som startet {month_starting [series_length]}. Det er {ledighet [series_length] - arbeidsledighet [series_length - 1]} prosentpoeng forskjell fra forrige måned.")

Deretter vil jeg opprette et MIME-e-postobjekt, og deretter legge til en til adresse, en fra adresse, emnetekst og meldingsdelen min.

my_email_message%

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

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

emne ("Min testmelding")%>%

text_body (siste_msg)

Hvis du gjør dette og deretter sjekker strukturen til min_melding_melding med str (min_tekstmelding) du vil se at det er en liste med en klasse på mime.

Etter at du har opprettet MIME-meldingsobjektet, kan du sende det med sende melding() funksjon. Argumentet er bare navnet på MIME-objektet mitt, i dette tilfellet my_email_message. Så den fulle kommandoen i dette tilfellet er

send_message (my_email_message)

Når du kjører send_message () første gang, blir du sannsynligvis spurt om du vil cache autorisasjon mellom R-økter. Jeg foreslår at du sier ja. Første gang du kjører dette, blir du også bedt om i nettleseren din å autorisere R-skriptet ditt til å bruke Google-kontoen din.

Det er mer du kan gjøre med gmailr. Et alternativ er å opprette en HTML-melding, slik at du kan bruke markering som fet og kursiv.

Her inneholder meldingsdelen min HTML-lignende avsnittstegn og fet skrift og kursiv, og jeg sender den til arbeidsadressen min.

html_msg_text <- lim ("

Den siste ledigheten i USA var

{arbeidsledighet [series_length]}, i måneden som starter

{month_starting [series_length]}. Det er

{ledighet [series_length] - arbeidsledighet [series_length - 1]}

prosentpoeng forskjell fra forrige måned.

Data fra US Bureau of Labor Statistics.

")
min_html_melding%

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

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

emne ("Min testmelding")%>%

html_body (html_msg_text)

send_message (min_html_melding)

Dessverre vet jeg ikke en måte å enkelt inkludere et bilde generert fra R direkte i meldingsteksten. Men det er ganske greit å ta med en som vedlegg.

Øverst i skriptet nedenfor gjør jeg om dataene mine om arbeidsledighet til en dataramme med beregninger fra 2000 og senere, slik at jeg kan bruke ggplot til å tegne dem, og deretter lagre grafen i en fil.

Denne neste delen av koden er det som er viktig å vite for e-post. Først, som før, lager jeg en tekststreng for meldingsteksten min med limpakken. Det nye er de to siste kodelinjene som skaper MIME-objektet mitt. Den siste linjen, Legg ved fil(), legger ved PNG-filen til e-posten. Linjen før er viktig hvis du vil at tekst skal vises i e-posten. Uten å bruke begge deler text_body ()ogvedlegg_del () for brødteksten vises ikke teksten når du legger ved en fil. Bare noe å huske.

Da kan jeg bruke det samme sende melding() funksjon for å sende den.

un_df%

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

endre navn (arbeidsledighet = UNRATE)

mygraph <- ggplot (un_df, aes (måned_start, arbeidsledighet)) +

geom_line () +

ggtitle ("USAs månedlige arbeidsledighet") +

xlab ("Måned starter") +

ylab ("")

ggsave ("arbeidsløshet_graph.png")
msg_text <- lim ("Den siste ledigheten i USA var {ledighet [series_length]}, i måneden som startet {month_starting [series_length]}. Det er {ledighet [series_length] - arbeidsledighet [series_length - 1]} prosentpoeng forskjell fra forrige måned. En graf over dataene siden januar 2000 er vedlagt. ")

melding2%

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

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

emne ("Min tekstmelding med vedlagt graf")%>%

text_body (msg_text)%>%

vedleggsdel (msg_text)%>%

vedlegg_fil ("arbeidsledighet_graph.png")

send_message (melding2)

Hvis du vil, kan du bruke funksjonen create_draft () for å opprette en kladdemelding i Gmail-kontoen din, hvis du vil sjekke hvordan den ser ut før du sender den ut. I dette tilfellet, create_draft (melding2) ville lage et utkast til filvedleggsmeldingen min.

Hvis du vil se hvordan alt dette ser ut i aksjon, kan du sjekke ut videoen øverst i denne artikkelen. Og for flere R-tips, gå til Do More With R-videosiden på eller sjekk ut Do More With R YouTube-spillelisten.

$config[zx-auto] not found$config[zx-overlay] not found