Yandex.Direct API рдЙрджрд╛рд╣рд░рдг (рднрд╛рдЧ 2) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд░-рднрд╛рд╖рд╛ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдЧрддрд┐ рдХреИрд╕реЗ рджреЗрдВ

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА рдХрд┐ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИ рдФрд░ RAND рдореЗрдВ Yandex.Direct API рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рд╣реИрдВ, doParallel , doParallel рдФрд░ foreach рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред


рдпрд╣ рд▓реЗрдЦ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд░ рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд╛рдпрддреНрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдпрд╣рд╛рдВ, рдПрд▓реЗрдХреНрд╕реА_рдореЛрд╕реНрдХ , рд╕реЕрдХрдЯреИрдЯ , рдЖрдирди_рдЬреЗрдирд░реАрд╣ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж), рдЬрд┐рд╕рдореЗрдВ рдореБрдЭреЗ рдХрдИ рдкреИрдХреЗрдЬ рджрд┐рдП рдЧрдП рдереЗ рдЬреЛ рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдЖрд░ рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рд╣рдо рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред


рдмрд╣реБ рд╕реВрддреНрд░рдг


рд╕рд╛рдордЧреНрд░реА



рдХрд╛рд░реНрдп


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХреА рдЧрдИ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдореЛрдб рдореЗрдВ, 4 Yandex.Direct рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЦрд╛рддреЛрдВ рд╕реЗ рдХреАрд╡рд░реНрдб рдХреА рдПрдХ рд╕реВрдЪреА рдПрдХрддреНрд░ рдХрд░реЗрдВред


Yandex.Direct API рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо ryandexdirect рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд▓рд┐рдВрдХ рдкрд░ рд╣реИ , рд▓реЗрдХрд┐рди рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ 2 рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  • yadirAuth - Yandex.Direct API рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг;
  • yadirGetKeyWords - рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЦрд╛рддреЛрдВ рд╕реЗ рдХреАрд╡рд░реНрдб рдХреА рдПрдХ рд╕реВрдЪреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред

рдпрд╣ рд╕рд┐рд░реНрдл рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреАрд╡рд░реНрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЪреБрдирд╛, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ Yandex.Direct API рдореЗрдВ рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рдСрдкрд░реЗрд╢рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рджреВрд╕рд░реЗ, рд╕рднреА рдЦрд╛рддреЛрдВ рдореЗрдВ рдХреАрд╡рд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реЛрдЧрд╛, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 1 рд╕реЗ 20 рд╕реЗрдХрдВрдб рддрдХред


рдЯреНрд░реЗрдирд┐рдВрдЧ


рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рд╕рднреА рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдХреЛрдб 1: рд╕рдВрдХреБрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛
 #    install.packages("ryandexdirect") install.packages("tictoc") install.packages("rbenchmark") install.packages("dplyr") install.packages("purrr") install.packages("future") install.packages("promises") install.packages("furrr") install.packages("future.apply") 

рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ library рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рджрд┐рдП рдЧрдП рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдЬреЛрдбрд╝реВрдВрдЧрд╛ред


рд╣рдо Yandex.Direct logins рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╣рдо рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВрдЧреЗ:


рдХреЛрдб 2: рдПрдХ рд▓реЙрдЧрд┐рди рд╡реЗрдХреНрдЯрд░ рдмрдирд╛рдирд╛
 logins <- c("login1", "login2", "login3", "login4") 

Yandex.Direct API рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдЦрд╛рддреЗ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


рдХреЛрдб 3: Yandex.Direct API рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг
 lapply(logins, function(l) { yadirAuth(Login = l)}) 

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдЦрд╛рддреЗ рдХреЗ рддрд╣рдд рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреБрд▓ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдЕрдкрдиреЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рд╕рд╛рдордЧреНрд░реА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП ryandexdirect рдХреА рдЕрдиреБрдорддрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рдкреБрдирдГ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ R рдХрдВрд╕реЛрд▓ рдореЗрдВ рджрд░реНрдЬ рдХрд░рдХреЗ, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВред рдпрд╣ рдХрд╛рд░реНрдп рд╡реЗрдХреНрдЯрд░ рд▓реЙрдЧрд┐рди рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рддреНрдпреЗрдХ рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдХрд┐рд╕реА рддреГрддреАрдп-рдкрдХреНрд╖ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЗ рддрдереНрдп рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЖрдкрдХреЗ рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЦрддрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд▓реЗрдЦ "рдПрдбрд╡рд░реНрдЯрд╛рдЗрдЬрд╝рдореЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ" рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред


рдЕрдЧрд▓рд╛, рд╣рдо рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб, рдФрд░ рдЗрд╕рдХреЗ рдЖрдЧреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдзрд╛рд░рдгрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред


рд╕реАрд░рд┐рдпрд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реЙрд▓реНрдпреВрд╢рди рдЙрджрд╛рд╣рд░рдг, рд╕реИрдкрд▓реА рдлрдВрдХреНрд╢рди рдФрд░ purrr рдкреИрдХреЗрдЬ



рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ , рдореИрдВрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓реВрдк рдХреЗ for рдПрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ foreach рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдерд╛, рдЬреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд▓реВрдк рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╡рд╣рд╛рдВ рдЙрдкрдпреБрдХреНрдд рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд▓реВрдк рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЬрд┐рди рдкреИрдХреЗрдЬреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд╡реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдзрд┐рдХ рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ; рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрд░рд┐рдпрд▓ рдореЛрдб рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред


sapply рдХрд╛рд░реНрдп


рдЖрджреЗрд╢реЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рд╣рдо tictoc рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдХреЛрдб 4: рдиреАрд▓рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдореЛрдб рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рдзрд╛рди
 library(tictoc) library(dplyr) tic() #   kw.sapply <- sapply( logins, #  ,     function(x) #        #     { yadirGetKeyWords(Login = x) %>% mutate(login = x) }, simplify = FALSE #     ) toc() #   #       result.sapply <- do.call("rbind", kw.sapply) 

39.36 sec elapsed рд╕рдордп: 39.36 sec elapsed


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, apply рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЫреЛрд░реЛрдВ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред


sapply(X, FUN)


рдЬрд╣рд╛рдВ:


  • рдПрдХреНрд╕ - рдПрдХ рд╡рд╕реНрддреБ рдЬрд┐рд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдмрджрд▓реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд▓реВрдк рдХреЗ рд▓рд┐рдП рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛: рдХреЗ for(i in X) ;
  • FUN - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХреНрд╕ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдмрджрд▓реЗ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЕрдЧрд░ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓реВрдк рдХрд╛ рд╢рд░реАрд░ рд╣реИред

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг 4 рдореЗрдВ , рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рд▓реЙрдЧрд┐рди рд╡реЗрдХреНрдЯрд░ рдХреЛ X рддрд░реНрдХ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЙрдЧрд┐рди рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди function(x) { yadirGetKeyWords(Login = x) %>% mutate(login = x) } рд▓рд┐рдП рдХреЗрд╡рд▓ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ FUN рддрд░реНрдХ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдпрд╛рдиреА sapply FUN 4 рдмрд╛рд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛, рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдЗрд╕рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░реЗрдЧрд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ 4 рддрддреНрд╡реЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рд╕реВрдЪреА (рд╡рд░реНрдЧ рд╕реВрдЪреА рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ) рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЦрд╛рддреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред


  1. yadirGetKeyWords(Login = "login1") %>% mutate(login = "login1")
  2. yadirGetKeyWords(Login = "login2") %>% mutate(login = "login2")
  3. yadirGetKeyWords(Login = "login3") %>% mutate(login = "login3")
  4. yadirGetKeyWords(Login = "login4") %>% mutate(login = "login4")

sapply рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╡рд╕реНрддреБ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


 summary(kw.sapply) 

  Length Class Mode login1 19 data.frame list login2 19 data.frame list login3 19 data.frame list login4 19 data.frame list 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдВрдд рдореЗрдВ, рдХрдорд╛рдВрдб result.sapply <- do.call("rbind", kw.sapply) kw.sapply рд╕реВрдЪреА рдХреЗ рд╕рднреА 4 рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ result.sapply рдлреНрд░реЗрдо рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред


 # A tibble: 6,804 x 1 result.sapply$Id $Keyword $AdGroupId $CampaignId $ServingStatus $State <dbl> <fct> <dbl> <int> <fct> <fct> 1 15164230566 ~ 3597453985 39351725 ELIGIBLE ON 2 15164230567  ~ 3597453985 39351725 ELIGIBLE ON 3 15164230568  ~ 3597453985 39351725 ELIGIBLE ON 4 15164230569 ~ 3597453985 39351725 ELIGIBLE ON 5 15164230570 ~ 3597453985 39351725 ELIGIBLE ON 6 15164230571  ~ 3597453985 39351725 ELIGIBLE ON 7 15164230572 ~ 3597453985 39351725 ELIGIBLE ON 8 15164230573  ~ 3597453985 39351725 ELIGIBLE ON 9 15164230574 ~ 3597453985 39351725 ELIGIBLE ON 10 15164230575 ~ 3597453985 39351725 ELIGIBLE ON # ... with 6,794 more rows, and 13 more variables: $Status <fct>, # $StrategyPriority <fct>, $StatisticsSearchImpressions <int>, # $StatisticsSearchClicks <int>, $StatisticsNetworkImpressions <int>, # $StatisticsNetworkClicks <lgl>, $UserParam1 <chr>, $UserParam2 <chr>, # $ProductivityValue <lgl>, $ProductivityReferences <lgl>, $Bid <dbl>, # $ContextBid <dbl>, $login <chr> 

sapply рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдпреЛрдВ рдХреЗ *apply рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: apply , lapply , vapply , mapply рдФрд░ рдЕрдиреНрдпред


purrr рдкреИрдХреЗрдЬ


рдХреЛрдб 5: purrr рдкреИрдХреЗрдЬ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рдзрд╛рди
 library(purrr) library(dplyr) library(tictoc) tic() #   result.purrr <- map_df( logins, #  ,     ~ #   function(.x) { yadirGetKeyWords(Login = .x) %>% mutate(login = .x) } ) toc() #   

35.46 sec elapsed рд╕рдордп: 35.46 sec elapsed


purrr рдкреИрдХреЗрдЬ рд╣реЗрдбрд▓реА рд╡рд┐рдХрдо рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЧрдИ tidyverse рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХреЛрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред


рдЕрд░реНрде рдФрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдкреИрдХреЗрдЬ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп sapply рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


  • рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдлреИрдорд┐рд▓реА map , map , map2 , pmap map2 рдореЗрдВ рдмрд╛рдВрдЯрд╛ рдЧрдпрд╛ рд╣реИ walk рдФрд░ рдПрдХ рд╣реА рдлрд╝реИрдорд┐рд▓реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рд░рд┐рдЬрд▓реНрдЯ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ: chr , dbl , int , df , рдЖрджрд┐;
  • map2 рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдХрд╛рд░реНрдп рдЖрдкрдХреЛ рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рддрддреНрд╡реЛрдВ (рдкреБрдирд░рд╛рд╡реГрддрд┐) рдкрд░ map2 рдХрд░рдиреЗ рдХреА map2 рд╣реИрдВ;
  • pmap рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдХрд╛рд░реНрдп рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рддрддреНрд╡реЛрдВ рдкрд░ рдПрдХ рд╕рд╛рде pmap рдХрд░рдиреЗ рдХреА pmap рд╣реИрдВред рдЖрдк рдЗрдирдкреБрдЯ .l рддрд░реНрдХ ( sapply рдореЗрдВ рдПрдХреНрд╕ рддрд░реНрдХ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ) рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдореЗрдВ рд╡реЗ рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ .f (FUN рдПрдирд╛рд▓реЙрдЧ) рд╕реЗ рдкрд╛рд░рд┐рдд рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рдмрджрд▓реЗ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред рдиреАрд▓рдо) ред

рд╣рдореЗрдВ рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрдИ рдПрдЬреЗрдВрдЯ рдЦрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЦрд╛рддреЗ рдЬрд┐рдирд╕реЗ рдЖрдк рдХреАрд╡рд░реНрдб рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдмреАрдЪ рдмрд┐рдЦрд░реЗ рд╣реБрдП рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдПрдЬреЗрдВрдЯ рдЦрд╛рддреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЖрдк рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЦрд╛рддреЛрдВ рдХреЗ рд▓реЙрдЧрд┐рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред


рдХреЛрдб 6: рдХрдИ рдПрдЬреЗрдВрдЯ рдЦрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг
 library(purrr) #      agencies <- c("agency1", NA, "agency2", "agency1") #      #         result.pmap2 <- map2_df(.x = logins, .y = agencies, ~ { yadirGetKeyWords(Login = .x, AgencyAccount = .y) %>% mutate(login = .x) }) 

рдЕрдм рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЬрдм рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЦрд╛рддреЛрдВ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреЗ рд╕рд╛рде рд╕рд╣реЗрдЬрд╛ рд╣реИ, рдлрд┐рд░ рдЖрдкрдХреЛ рддреАрди рд╡рд╕реНрддреБрдУрдВ рдкрд░ рддреБрд░рдВрдд рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЦрд╛рддреЛрдВ рдХреЗ рд▓реЙрдЧрд┐рди, рдПрдЬреЗрдВрдЯ рдЦрд╛рддреЛрдВ рдХреЗ рд▓реЙрдЧрд┐рди, рдЬрд┐рд╕ рдкрде рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдпрд╣ рдорджрдж рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред pmap рдкрд░рд┐рд╡рд╛рд░ рдХреЗ pmap ред


рдХреЛрдб 7: pmap рдлрд╝рдВрдХреНрд╢рди рдЙрджрд╛рд╣рд░рдг
 library(purrr) #  ,       #      TokenPath <- c("C:\\proj1\\tokens", "C:\\yandex\\token", "C:\\yandex\\token", "C:\\my_yandex_acoount") #   pmap.result <- pmap_df(list(Login = logins, AgencyAccount = agencies, TokenPath = TokenPath), yadirGetKeyWords) 

рддрджрдиреБрд╕рд╛рд░, рдлрд╝рдВрдХреНрд╢рдВрд╕ map_df , map2_df рдФрд░ pmap_df рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдирд╛рдВрдХ рдлрд╝реНрд░реЗрдо рд╣реИ, рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП sapply ( do.call("rbind", kw.sapply) ) рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рдХреЛрдб рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдереЛрдбрд╝реА рддреЗрдЬреА рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг, sapply рдФрд░ purrr , рдкреНрд░рддреНрдпреЗрдХ рдЦрд╛рддреЗ рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХреАрд╡рд░реНрдб рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдХреБрд▓ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рд╕рднреА рдЪрд╛рд░ рдЦрд╛рддреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреА рдЕрд╡рдзрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред


рд╕рдордп [рдХреБрд▓] = рд╕рдордп [рд▓реЙрдЧрд┐рди 1] + рд╕рдордп [рд▓реЙрдЧрд┐рди 2] + рд╕рдордп [рд▓реЙрдЧрд┐рди 3] + рд╕рдордп [рд▓реЙрдЧрд┐рди 4]


Yandex.Direct рд╕реЗ рдХреАрд╡рд░реНрдб рдПрдХрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрд╕реНрддрд░реАрдп рд╡рд┐рдХрд▓реНрдк



рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╣реБрд╕реНрддрд░реАрдп рдореЛрдб рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:


  • рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧрд╛ рдПрдХ рд╕рд╛рдл рдХрд╛рдо рдХреЗ рдорд╛рд╣реМрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдЖрд░ рд╕рддреНрд░ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
  • рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ, рдПрдХ рдЕрд▓рдЧ рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реЗ рдЬреБрдбрд╝реЗ рдкреИрдХреЗрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдПрдХ рдХрд╛рдо рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рд╕рдВрдХреБрд▓ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред


parallel рдкреИрдХреЗрдЬ


рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг 2.14.0 рдореЗрдВ рдЖрд░ рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЖрдЬ рддрдХ рдпрд╣ рдЖрд░ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред


рдХреЛрдб 8: рд╕рдорд╛рдирд╛рдВрддрд░ рдкреИрдХреЗрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рдзрд╛рди
 library(parallel) library(tictoc) #   cl <- makeCluster(4) #      clusterExport(cl = cl, varlist = "logins") #  ,      #  ,       ryandexdirect clusterEvalQ(cl = cl, { library(ryandexdirect) library(dplyr) } ) tic() #   parallel.kw <- parSapplyLB(cl = cl, #   X = logins, # ,     FUN = function(x) { #      #      X yadirGetKeyWords(Login = x) %>% mutate(login = x) }, simplify = F) #    toc() #     #   stopCluster(cl) #      result.parallel <- dplyr::bind_rows(parallel.kw) 

16.75 sec elapsed рд╕рдордп: 16.75 sec elapsed


рдХреЛрдб 8 рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред makeCluster рдлрд╝рдВрдХреНрд╢рди 4 рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдореБрдЦреНрдп рдХрд╛рдо рдХреЗ рдорд╛рд╣реМрд▓ рд╕реЗ clusterExport рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдорд┐рдд рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  • рд╕реАрдПрд▓ - рдХреНрд▓рд╕реНрдЯрд░ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВрдЧреЗ
  • varlist - рдПрдХ рдкрд╛рда рд╡реЗрдХреНрдЯрд░ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╕реНрдЯрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд╛рдо рд╣реЛрддреЗ рд╣реИрдВред

рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╕реНрдЯрд░ рдиреЛрдб рдкрд░ рд╕рд╣реА рд╕рдВрдХреБрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ clusterEvalQ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреИрдХреЗрдЬ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк clusterEvalQ рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рднреА рдЖрд░ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╕реНрдЯрд░ рдиреЛрдб рдХреЗ рд╢реБрд░реВ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, рдЖрдкрдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдФрд░ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


parSapplyLB рдХреНрд▓рд╕реНрдЯрд░ рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рд▓реЛрдб рд╕рдВрддреБрд▓рди рдХреЗ рд╕рд╛рде sapply рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рд╡реЗ рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╕реНрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


parallel рдореЗрдВ рднреА *apply рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ *apply рдЕрдиреНрдп рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ: parLapply , parSapply , parApply , рдЖрджрд┐ред


parSapply рдХреЗрд╡рд▓ parSapplyLB рд╕реЗ рднрд┐рдиреНрди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреНрд▓рд╕реНрдЯрд░ рдиреЛрдбреНрд╕ рдкрд░ рд▓реЛрдб рд╕рдВрддреБрд▓рди рдирд╣реАрдВ рд╣реИред


рдирд┐рд░реНрдорд┐рдд рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЙрдк рдХреНрд▓рд╕реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЕрдВрддрд┐рдо рдХрдорд╛рдВрдб, dplyr::bind_rows(parallel.kw) рд╣рдо parSapplyLB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╕рдорд╛рдирд╛рдВрддрд░ . parSapplyLB рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ parSapplyLB ред


рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП, parallel рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдп рд╣реИрдВ: mclapply , mcmapply , mcMap ред рдЕрдХреНрд╕рд░ рдЗрд╕ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ, рдХрдорд╛рдВрдб рддреЗрдЬреА рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдХреЛрдб рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


рдХреЛрдб 9: рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП mclapply рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдзрд╛рди
 library(parallel) library(tictic) library(dplyr) library(ryandexdirect) tic() mclapply.kw <- mclapply(logins, FUN = function(x) { #      #      X yadirGetKeyWords(Login = x) %>% mutate(login = x) }, mc.cores = 4) toc() 

рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, makeCluster рдХреНрд▓рд╕реНрдЯрд░ makeCluster рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред mc.cores рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдкреИрдХреЗрдЬ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпреЗ рдСрдкрд░реЗрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


future рдкреИрдХреЗрдЬ


рдЖрд░ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрдзреБрдирд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХред


рдПрдХ рдХреЛрдб рдЬреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ future рдХреА рдорджрдж рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЯрд┐рд▓ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ, рд╣рдо рдПрдХ рдЦрд╛рддреЗ рд╕реЗ рдХреАрд╡рд░реНрдб рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВрдЧреЗред


рдХреЛрдб 10: рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг
 library(future) #    plan(multiprocess) #      #    future.kw <- future({yadirGetKeyWords(Login = logins[4])}, packages = "ryandexdirect", globals = "logins") #     resolved(future.kw) #     future.result.1 <- value(future.kw) 

рдЖрдЗрдП рдХреЛрдб 10 рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред plan рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рджрд┐рдП рдЧрдП рднрд╛рд╡реЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЛрдб рдХреЛ рд╕реЗрдЯ рдФрд░ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдореБрдЦреНрдп рд╣реИрдВ:


  • рдЕрдиреБрдХреНрд░рдорд┐рдХ - рдпрд╣ рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЖрд░ рдореЛрдб рд╣реИ, рдХрдорд╛рдВрдб рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рддреНрд░ рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  • рдмрд╣реБрдХреНрд░рд┐рдпрд╛ - рд╕рдорд╛рдирд╛рдВрддрд░ рдореЛрдб, рд╡рд░реНрддрдорд╛рди рдорд╢реАрди рдкрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рд╕рддреНрд░реЛрдВ рдореЗрдВ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЬрдмрдХрд┐ рдЖрдкрдХрд╛ рдХрд╛рдордХрд╛рдЬреА рд╕рддреНрд░ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реЛрдЧрд╛;
  • рдХреНрд▓рд╕реНрдЯрд░ - рд╕рдорд╛рдирд╛рдВрддрд░ рдореЛрдб, рдХрдорд╛рдВрдб рдХреЛ рд╡рд░реНрддрдорд╛рди рдпрд╛ рд░рд┐рдореЛрдЯ рдорд╢реАрди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╕рдорд╛рди parallel рдкреИрдХреЗрдЬ рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрдкреВрд░реНрдг future рдкреИрдХреЗрдЬ рд╡рд░реНрддрдорд╛рди рд╕рддреНрд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдХрдорд╛рдВрдб рдЪрд▓рд╛рдирд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЙрд╕реА рдирд╛рдо рдХреЗ future рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ:


 future({yadirGetKeyWords(Login = logins[4])}, packages = "ryandexdirect", globals = "logins") 

R рдореЗрдВ рд╣рдорд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рддреНрд░ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрджреЗрд╢ рдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдФрд░ R рд╕рддреНрд░ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИред


рдЖрдк resolved рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, value рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ future рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рддреНрд░ рдореЗрдВ рдЕрдкрдиреЗ future рд░рди рд╕реЗ рдкрд╣рд▓реЗ value рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рддреНрд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рд╕рддреНрд░ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рдПрдЧрд╛ред


рд╕рдмрд╕реЗ рдЙрдиреНрдирдд рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдг future promises рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рд╣реИред


рдХреЛрдб 11: `рднрд╡рд┐рд╖реНрдп` рдФрд░` рд╡рд╛рджреЛрдВ` рдХреЗ рдкреИрдХреЗрдЬ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг
 library(future) library(promises) #    plan(multiprocess) #      #    future.kw <- future({suppressMessages( yadirGetKeyWords(Login = logins[4]))}, packages = "ryandexdirect", globals = "logins") %...>% #     future, #      nrow() %...>% paste("words loaded") %...>% print() 

promises рдкреИрдХреЗрдЬ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ future рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИред


рдХреЛрдб 11 рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ, рд╣рдо рдПрдХ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЦрд╛рддреЗ рд╕реЗ рдХреАрд╡рд░реНрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдСрдкрд░реЗрдЯрд░ %...>% рдХрд╛рд░реНрдп рд╕рддреНрд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ %...>% future рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╢реЗрд╖ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред future рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЦрд╛рддреЗ рд╕реЗ рдХреАрд╡рд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреА:


 [1] "1855 words loaded" 

рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ, future рдФрд░ promises рдЧреБрдЪреНрдЫрд╛ рдХрд╛ рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, future рдкреИрдХреЗрдЬ рд╣реА рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╕реНрд╡рдпрдВ рдЧреНрд▓реЛрдмрд▓реНрд╕ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдкреИрдХреЗрдЬреЛрдВ рдХреЛ future рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП future рдПрдХ рд╡реЗрдХреНрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЙрдирдХреЗ рдирд╛рдо рдкреИрдХреЗрдЬ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╣реЛрдВред


рдЕрдм рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдкрд░ рд╡рд╛рдкрд╕, рд╕рдорд╛рдирд╛рдВрддрд░ рдореЛрдб рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЙрджрд╛рд╣рд░рдг 4 рдЦрд╛рддреЛрдВ рд╕реЗ рдХреАрд╡рд░реНрдб рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЛрдб рдХрд░реЗрдЧрд╛:


рдХреЛрдб 12: рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
 library(future) library(tictoc) #   plan("multisession", workers = 4) tic() #   futs <- lapply(logins, #      function(i) #        #   future({ yadirGetKeyWords(Login = i) %>% mutate(login = i) }, packages = c("ryandexdirect", "dplyr"))) completed <- sapply(futs, resolved) #    kw <- lapply(futs, value) #    toc() #    #     result.future <- dplyr::bind_rows(kw) 

рд▓реАрдб рд╕рдордп: 14.83 sec elapsed


рд╡реЗрдХреНрдЯрд░ рд▓реЙрдЧрд┐рди рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╕рднреА рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЦрд╛рддреЛрдВ рд╕реЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдореЛрдб рдореЗрдВ рдХреАрд╡рд░реНрдб рдХреА рд╕реВрдЪреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рдЖрдкрдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ future рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЛрдб рдЙрджрд╛рд╣рд░рдг 12 рдореЗрдВ, рд╣рдо рдЗрд╕реЗ lapply рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред


lapply рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо future рд▓реЙрдиреНрдЪ рдХреА рдЧрдИ рд╕реВрдЪреА рд╣реИред рдЖрдк sapply(futs, resolved) рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рд╡реЗрдХреНрдЯрд░ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ TRUE рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ рдХрд┐ future рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ FALSE рдХрд┐ future рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИред


рдкреНрд░рддреНрдпреЗрдХ future рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдХрд╛ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо lapply(futs, value) рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


: result.future <- dplyr::bind_rows(kw) .


future


, (
future ), .


future.apply

future.apply future , .


13: future.apply
 library(future.apply) library(tictoc) #    plan("multisession", workers = 4) tic() #   kw.future.apply <- future_sapply(logins, #    ,   function(x) { #     yadirGetKeyWords(Login = x) %>% mutate(login = x) }, simplify = FALSE, #    #   future.packages = c("ryandexdirect", "dplyr"), future.globals = TRUE ) toc() #    

: 17.28 sec elapsed


13 , future.apply future , .


4 : plan("multisession", workers = 4) .


future_sapply logins . рдпрд╛рдиреА , , sapply , .


future_sapply future.packages . future.globals . , .


furrr


future . purrr , furrr .


14: furrr
 library(furrr) library(tictoc) #   cl <- parallel::makeCluster(4) plan(cluster, workers = cl) tic() #   furrr.kw <- future_map(logins, ~ #   function(.x) yadirGetKeyWords(Login = .x) %>% mutate(login = .x), .options = future_options(packages = c("ryandexdirect", "dplyr"), globals = c())) toc() #    #      result.furrr <-dplyr::bind_rows(furrr.kw) 

: 15.45 sec elapsed


furrr purrr . purrr , .


.options . .options future_options , .


14 packages globals :


 .options = future_options(packages = c("ryandexdirect", "dplyr"), globals = c()) 


rbenchmark .


, future promises . .


, 20 4 () .


= (T[1] * 20) + (T[2] * 20) + (T[N] * 20)


15: future promises
 library(furrr) library(parallel) library(dplyr) library(future) library(ryandexdirect) library(tictoc) library(rbenchmark) #   logins <- c("login1", "login2", "login3", "login4") #        #        par par.furrr <- function(logins) { cl <- parallel::makeCluster(4) plan(cluster, workers = cl) furrr.kw <- future_map(logins, ~ yadirGetKeyWords(Login = .x) %>% mutate(login = .x), .options = future_options(packages = c("ryandexdirect", "dplyr"), globals = c())) result.furrr <-dplyr::bind_rows(furrr.kw) } par.future <- function(logins) { plan("multisession", workers = 4) futs <- lapply(logins, function(i) future({ yadirGetKeyWords(Login = i) %>% mutate(login = i) }, packages = c("ryandexdirect", "dplyr"))) completed <- sapply(futs, resolved) kw <- lapply(futs, value) result.future <- dplyr::bind_rows(kw) } par.future.apply <- function(logins) { plan("multisession", workers = 4) kw.future.apply <- future_sapply(logins, function(x) { yadirGetKeyWords(Login = x) %>% mutate(login = x) }, simplify = FALSE, future.packages = c("ryandexdirect", "dplyr"), future.globals = TRUE ) result.future.apply <- dplyr::bind_rows(kw.future.apply) } par.parallel <- function(logins) { cl <- parallel::makeCluster(4) clusterExport(cl = cl, varlist = "logins") clusterEvalQ(cl = cl, { library(ryandexdirect) library(dplyr) } ) parallel.kw <- parSapplyLB(cl = cl, X = logins, FUN = function(x) { yadirGetKeyWords(Login = x) %>% mutate(login = x) }, simplify = F) stopCluster(cl) result.parallel <- dplyr::bind_rows(parallel.kw) } #          seq seq.apply <- function(logins) { kw.sapply <- sapply( logins, function(x) { yadirGetKeyWords(Login = x) %>% mutate(login = x) }, simplify = FALSE ) result.sapply <- do.call("rbind", kw.sapply) } seq.purrr <- function(logins) { kw.purrr <- map_df( logins, ~ { yadirGetKeyWords(Login = .x) %>% mutate(login = .x) } ) result.purrr <- do.call("rbind", kw.purrr) } #       rbenchmark #   future + promises #  ,       #          plan(list(tweak(multisession, workers = 2), tweak(multisession, workers = 4))) tic() speed.test <- future({ #          within(benchmark(furrr = par.furrr(logins), future = par.future(logins), future.apply = par.future.apply(logins), parallel = par.parallel(logins), apply = seq.apply(logins), purrr = seq.purrr(logins), replications = c(20), columns = c('test', 'replications', 'elapsed'), order = c('elapsed', 'test')), { average = round(elapsed/replications, 2) }) }, packages = c("dplyr", "ryandexdirect", "rbenchmark", "parallel", "purrr", "future", "promises", "furrr", "future.apply"), globals = c("logins", "par.furrr", "par.future", "par.future.apply", "par.parallel", "seq.apply", "seq.purrr")) %...>% print() %...T>% toc() message("My Session is not blocked") 

3370 , .. .


. , future , promises , .


, . "My Session is not blocked", , , .. .


promises :


  • %...>% тАФ %>% , . рдпрд╛рдиреА , resolved , future , value . , print .
  • %...T>% тАФ %T>% , , . , , , .. .. print , , .
  • %...T!% тАФ .

15 plan tweak ( plan(list(tweak(multisession, workers = 2), tweak(multisession, workers = 4))) ), , 2 , future 4 .


:


 My Session is not blocked test replications elapsed average 4 parallel 20 393.02 19.65 1 furrr 20 402.09 20.10 2 future 20 431.19 21.56 3 future.apply 20 432.29 21.61 5 apply 20 847.77 42.39 6 purrr 20 864.19 43.21 3370.55 sec elapsed 

рдЫрд╡рд┐


, parallel , . furrr , future future.apply .


1 , , . , API . .


, 4 , .


рдирд┐рд╖реНрдХрд░реНрд╖


R, API.


, API . " R , 1" .


:


  • doSNOW / doParallel + foreach
  • future + promises
  • future.apply / furrr
  • parallel

, , .


, R .

Source: https://habr.com/ru/post/hi448404/


All Articles