首页 > 解决方案 > 根据 tibble 中的数据发送电子邮件

问题描述

我正在尝试迭代 tibble 以从每一行发送电子邮件,但无法使其正常工作。这是示例:

library(tidyverse)
library(sendmailR)
library(pander)

首先创建我想包含在电子邮件中的表

tbl <- tibble(A = c(1,2,3),
              B = c(4,5,6),
              C = c(7,8,9))

table <- pander_return(tbl)

创建 tibble,每列对应我要包含到电子邮件的某些信息

emails <- tibble(from = c("jane.doe@gm.com", "john.doe@gm.com"),
                 to = c("jane.doe@gm.com", "john.doe@gm.com"),
                 subject = "This is test",
                 greetings = "Happy Christmas",
                 data = list(table, table))

现在我想将map每一列添加到正确的位置以sendmail从 sendmailR 包中运行。这是我如何发送 1 封电子邮件的示例。唯一有趣的是如何greetingstable它们连接在一起以创建 msg 字段。

from <- "jane.doe@gm.com"
to <- "jane.doe@gm.com"
subject <- "This is test"
msg <- c(greetings, table)

sendmailR::sendmail(from = from, to = to, subject = subject, msg = msg)

那么我怎样才能将这些电子邮件映射到sendmail功能上,以便每一行都发送电子邮件。

标签: rpurrrsendmailr

解决方案


这是pmap函数的完美用例purrr

您可以执行以下操作

pmap( list(emails$from, emails$to, emails$subject, emails$data) 
      , ~sendmailR::sendmail(from = ..1, 
                            to = ..2, 
                            subject = ..3, 
                            msg = ..4))

这会创建一个参数列表,然后使用 ~ 我们定义函数。..x表示参数出现在输入列表中的顺序。

完全代表

library(tidyverse)
library(sendmailR)
library(pander)

tbl <- tibble(A = c(1,2,3),
              B = c(4,5,6),
              C = c(7,8,9))

table <- pander_return(tbl)

emails <- tibble(from = c("jane.doe@gm.com", "john.doe@gm.com"),
                 to = c("jane.doe@gm.com", "john.doe@gm.com"),
                 subject = "This is test",
                 greetings = "Happy Christmas",
                 data = list(greetings, table))

pmap( list(emails$from, emails$to, emails$subject, emails$data) 
      , ~sendmailR::sendmail(from = ..1, 
                            to = ..2, 
                            subject = ..3, 
                            msg = ..4))

并且只是为了表明它适用于较低风险的功能:

pmap( list(emails$from, emails$to, emails$subject, emails$data) 
      , ~paste(..1, 
                            ..2, 
                            ..3))

输出:

[[1]]
[1] "jane.doe@gm.com jane.doe@gm.com This is test"

[[2]]
[1] "john.doe@gm.com john.doe@gm.com This is test"

推荐阅读