2016-11-08 34 views
1

我正在写一个函数向R中的客户端发送电子邮件。我正在使用mailR包来这样做,但我的服务提供者只允许我发送每小时发送100封电子邮件。我想要做的是,如果假设我的电子邮件列表中包含270个电子邮件地址,我想将其分发到chunk1=100 , chunk2 = 100 & chunk3 = 70然后,它应该发送电子邮件到第一个块,然后等待一个小时,然后块chunk2等等。 这是我的功能模样。如何将数据帧拆分为特定行数的if循环中的R

email <- function(dataframe,city,date){ 
    dataframe$registrant_email <- tolower(dataframe$registrant_email) 
    dataframe_city <- dataframe[dataframe$registrant_city == city & dataframe$create_date == date, ] 
    # Removing NA's and blank email ids 
    dataframe_city <- dataframe_city[!(is.na(dataframe_city$registrant_email)|dataframe_city$registrant_email==""), ] 
    # Removing duplicate email ids 
    dataframe_city <-dataframe_city[!duplicated(dataframe_city$registrant_email),] 
    emails <- as.vector(dataframe_city$registrant_email) 
    if(length(emails) > 100){ 

    # divide the vector into chunks of 100 


    } else{send_email(emails} 

    return(emails) 
} 

我需要if loop帮助我怎么能写拆分部分插入的100块,然后调用一个函数send_email等待了一个小时等。

+1

要在列表中拆分向量成块,你可以使用像'X < - 1:270; chunks < - split(x,(seq_along(x)-1)%/%100)' –

+1

使用'%/%'是美丽的,您应该将其添加为答案。 –

+0

你能解释一下我的一行吗?输出似乎是相同的。它是否解释了一些特殊情况? – LAP

回答

2

您可以将电子邮件,矢量分成列表,并附有一行代码:

mailinglist <- split(emails, ceiling(seq_along(emails)/100)) 

然后,你可以通过类似延迟邮件的执行:

for(i in mailinglist) { 
send_email(i) 
Sys.sleep(3600)} 

我测试用一个简单的mean()调用进行循环并且它可以工作,但是你应该用较低的时间自己测试它并发送邮件给自己。

编辑:要省略在最后一次迭代的延迟,使用此:

for(i in 1:length(mailinglist)) { 
if(i < length(mailinglist)) { 
    send_email(mailinglist[[i]]) 
    Sys.sleep(3600)} 
else { 
    send_email(mailinglist[[i]])} 
} 
+0

这是个好主意。也许OP可以用这样一种方式构建for循环,即在最后一次循环迭代中不会发生'Sys.sleep'(不需要这样做)。如果你喜欢,你也可以用'%/%'添加我的'split'注释到你的答案 –

+0

如何构建for循环,以便在最后一次循环迭代中不会发生'Sys.sleep' – Neil

+0

我问过上面,你可以吗解释我们的单线队员之间的区别?输出看起来是一样的,我没有考虑到什么? – LAP

相关问题