【问题标题】:Send emails based on data in tibble根据 tibble 中的数据发送电子邮件
【发布时间】:2019-12-03 11:46:41
【问题描述】:

我正在尝试迭代 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 每一列并将其添加到 sendmailR 包中 sendmail 函数的正确位置。这是我如何发送 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)

那么我怎样才能将电子邮件 tibble 映射到 sendmail 函数,以便每一行发送电子邮件。

【问题讨论】:

    标签: r purrr sendmailr


    【解决方案1】:

    这是来自purrrpmap 函数的完美用例

    您可以执行以下操作

    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"
    

    【讨论】:

    • 我尝试了 pmap,但显然语法已关闭。试过 .x、.y、.z... 非常好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多