首页 > 解决方案 > R:使用 RDCOMClient 循环两个变量

问题描述

我有一个名称和邮件的数据框,我想创建一个循环,在其中 R 使用 RDCOMClient 库向所有这些人发送邮件,但使用他们各自的名称。数据框是

df <- data.frame("Name" = c("Name1", "Name2"), "Mail" = c("mail1@mail.com", "mail2@mail.com"))

由于我刚刚在一个考试项目中使用了 Python,因此我多次创建了带有多个变量的循环,例如:

for i,j in zip(df[1], df[2])

理想情况下,我的代码类似于


for (mail in df$Mail, name in df$Name) {

  outApp <- COMCreate("Outlook.Application")
  outMail = outApp$CreateItem(0)

  outMail[["To"]] = mail
  outMail[["subject"]] = "Subject"
  outMail[["body"]] = paste(" Dear", name, "\n \n bla bla bla.")

  outMail$Send()

  Sys.sleep(0.5)

  if (mail == df$Mail[-1]) cat("Done!")
}

但是,这会产生错误。

我想使用循环的原因有两个:

  1. 我希望 R 在开始下一次迭代之前暂停一下(我不知道这是否真的有必要,但如果我的数据框有超过一百封邮件,它可能会更好——我在这里可能是错的)。
  2. 我希望 R 打印消息“完成!” 完成后。

如果您有其他建议(我已经看到关于 lapply、sapply 等软件包的一些建议),他们非常欢迎!

我希望有人在那里知道该怎么做。

提前致谢,

埃米尔

标签: remailfor-looprdcomclient

解决方案


我无法重现您的问题,因为我不在 Windows 上,但这是一个使用包的示例mailR

library(mailR)
library(purrr)
df <- tibble("Name" = c("Name1", "Name2"), "Mail" = c("mail1@mail.com", "mail2@mail.com"))

mail_fun <- function(name, mail){
send.mail(from = "sender@gmail.com",
          to = mail,
          subject = "Subject of the email",
          body = paste(" Dear", name, "\n \n bla bla bla."),
          smtp = list(host.name = "aspmx.l.google.com", port = 25),
          authenticate = FALSE,
          send = TRUE)

  Sys.sleep(0.5)

  print("Done!")

}

mail_fun("filip", "filip.wastberg@ferrologic.se")

map2(df$Name, df$Mail, ~mail_fun(name = .x, mail = .y))

这应该让您总体了解如何将代码放入函数中,然后用于purrr迭代 data.frame。


推荐阅读