2016-11-08 67 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

相關問題