2016-11-08 2 views
1

Я пишу функцию отправки писем моим клиентам в R. Я использую пакет mailR для этого, но мой поставщик услуг разрешает мне отправлять 100 писем в час. То, что я хочу сделать, если предположить, что мой список адресов электронной почты содержит 270 адресов электронной почты, я хочу пролить это на chunk1=100 , chunk2 = 100 & chunk3 = 70. Затем он должен отправить электронные письма на первый кусок, а затем ждать часа, а затем chunk2 и т. Д. Это моя функция.как разбить dataframe на определенное количество строк в if loop in 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

Чтобы разделить вектор на куски в списке, вы можете использовать что-то вроде 'х <- 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(), и это сработало, но вы должны проверить его самостоятельно с более низким временем и отправив письма себе.

Edit: Для того, чтобы опустить задержку на последней итерации, используйте:

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

Смежные вопросы