Pull to refresh

Comments 19

Как насчет furrr для обощения полученных знаний на область параллельных вычислений? Работает поверх future и мимикрирует под синтакс purrr. Можно спокойно использовать вместо purrr во многих местах, так как дефолтное поведение — последовательное выполнение, слабо отличающееся от purrr.
Из преимуществ — future позволяет менять топологию бэкэнда, благодаря чему можно оптимизировать вложенные вызовы future_*.
Вот reprex:


library(purrr)
library(furrr)

plan(cluster, workers = 2)
1:10 %>% future_map_int(~Sys.getpid())
#>  [1] 7112 7112 7112 7112 7112 6624 6624 6624 6624 6624

plan(sequential)

1:10 %>% future_map_int(~Sys.getpid())
#>  [1] 7032 7032 7032 7032 7032 7032 7032 7032 7032 7032

За пример в комментарии спасибо.


Параллельные вычисления — вещь сама по себе весьма нетривиальная и ее надо прочувствовать в бою. Не все задачи можно распараллелить. Не для всех задач параллельное исполнение будет быстрее. Есть масса нюансов по порождению потоков\процессов, передачу туда параметров и получение обратной связи. В рамках первичного погружения параллелизация видится слишком сложной областью. С ней лучше разбираться чуть позже. Причем, зачастую, лучше найти параллелизированную на нижнем уровне реализации алгоритма, чем делать самому руками наверху. Итераторы и %dopar% по этой же причине не хочется трогать при первом заплыве — скорее запутаешь, чем поможешь. Но это IMHO.

Я ни в коем случае не настиваю, просто предложил простое "расширение".
Я отказался от %dopar% и foreach в какой-то момент из-за произвольного unlist-a и проблем с экспортом обновленных функций.


В любом случае, за компиляцию ресурсов спасибо, для самоучек типа меня это очень полезно, так как легко пропустить какие-то важные инструменты и библиотеки, которые принято использовать в коммъюнити.

Качественная, исчерпывающая подборка. Хотелось бы поделиться некоторыми субъективными наблюдениями:
  • 50 часов на весь этот материал скорее всего хватит только на поверхностное чтение об азах и на выполнение стандартных написанных примеров. Тут работы-изучения минимум на месяц безвылазного чтения и написания кода.
  • Я бы обучал основам написания функций как можно раньше, т.к. это очень важный навык для «написания качественного и эффективного кода»: понимать, что код хорошо бы разбивать на маленькие понятные функции.
  • Нет ничего про тестирование написанного кода (testthat, covr, и т.д.). Это должно быть важно для «промышленной» разработки.
  • Сюда можно добавить азы создания пакетов, как принятого способа организации и документирования кода.
  • Очень полезная книга для такого рода «быстрого обучения написанию эффективного кода» — Efficient R programming

Полностью согласен, но… приходится делать выбор. Тут все подробно описано.


  1. Никто на практике не даст учиться несколько месяцев. В бой кидают как можно раньше. Поэтому приходится максимально ужимать материал.
  2. Функциям и функциональному подходу, а также безопасному выполнению функций внутри pipe выделяется почти целый день.
  3. Тестирование, пакеты и документирование — несомненно нужные вещи, но к этому можно приходить только после получения базовых навыков работы в R.

Основная задача — показать почти безграничные рамки, дать минимальный набор навыков и выпустить людей на реальные задачи. А дальше начинается путь развития.


Из электронных книг можно было бы еще посоветовать, если голова не опухнет,


Простите нубаса, никто не подскажет такую же подборочку по десантированию в питон?

Спасибо за богатый материал, есть что почитать. Но на мой взгляд эти требования соответствуют должности "Разработчик R" или "BI аналитик". Мат.стат, машинное обучение и какое-нибудь численное моделирование нужное для DS отсутствуют, а их постижение — это вопрос нескольких лет. Или нескольких месяцев для верхнеуровнего знакомства.

Зависит от того, кого искать будете.
В требованиях к вакансии упомянут определенный бэкграунд "Уверенное владение следующими технологиями (минимум, 30% из списка):"


Народ с ВМК, например, должен знать многие вещи, если не прогуливал.


К вопросу о программировании и знании R.
Для примера, сможете ли комбинаторно решить на R за 3-4 строчки длиной <= 80 символов такую детскую олимпиадную задачу по математике (3-ий класс)?


"Можно ли расставить знаки действий вместо _, 
чтобы значение выражения 76 _ 4 _ 51 _ 3 равнялось 36?"
Может так?
a<-as.numeric(str_split(c(«76 _ 4 _ 51 _ 3»),"_", simplify = T))
b<-c("*","-", "/","+")
for (i in 1:4) for (j in 1:4) for (k in 1:4)
if (eval(parse(text=paste0(a[1], b[i], a[2] ,b[j], a[3], b[k], a[4] )))==36) print(c(b[i],b[j],b[k]))

Точно! И поговорить про NSE и принципы quotation.


Только я память не жалею и упираю на `tidyverse`, чтобы на пальцах все шаги показать
c('*', '/', '+', '-') %>%
  {expand.grid(op1 = ., op2 = ., op3 = ., stringsAsFactors = FALSE)} %>%
  mutate(data = glue::glue("76 {op1} 4 {op2} 51 {op3} 3")) %>%
  filter(purrr::map_dbl(rlang::parse_exprs(data), rlang::eval_bare) == 36)

Одна детская задачка дает фактуру для почти дневного разговора.

signs = c('+', '-', '*', '/')
exprs = expand.grid(76, signs, 4, signs, 51, signs, 3, '==', 36, stringsAsFactors=F)
for (i in 1:nrow(exprs))
  if (eval(parse(text=(str=paste(exprs[i,], collapse='')))))
    print(str)

"
К вопросу о программировании и знании R.
"


Смогу :)


А вот коллеге, который знал про R "всё" пришлось довольно долго объяснять что такое Random Forest. А объяснить важность предположения о независимости сл.величины так и не смог, вроде. Порядок абстракций другой...

"The Art of Computer Programming" вроде пока никто не отменял и не обесценивал.


Еще раз отмечу, что изначально предполагается, что у коллеги есть какой-либо фундаментальный бэкграунд.


Есть масса прекрасных курсов по ML, тут ведь речь совершенно не про них. И на русском и на английском. Может Вашему коллеге просто надо на них обратить внимание?
Еще вот и хороший мультфильм про random forrest на 10 минут. В этой подборке вообще много короткометражных мультфильмов по математике.

«The Art of Computer Programming» вроде пока никто не отменял и не обесценивал.


Это, безусловно, важно. Говнокод никто читать не хочет, не говоря уже о производительности. Еще R Inferno можно здесь упомянуть…

Просто моя мысль в том, что B-тип дата сайентиста это программист, он тоже нужен. Но без говнокода типа A (анализ) многие проекты просто не полетят или полетят не туда.
А зачем тратить время на tidy, есть потом идет dt?

потому что на практике надо и то и то

dt %>% magrittr рулит, но весь код так убирать не стоит (ИМХО), читается не всё, хотя почти всё.

Каждая группа может выбирать для себя оптимальные правила и декларировать code convention. Кстати, нужно учитывать, что приходится не только писать код, но и читать чужой (в т.ч. SO & github), а значит надо знать разные диалекты, чтобы понимать написанное.

Знать надо, tidyverse в целом сильно распространен. Я проходил Курсерку по R, там его сразу стали продвигать.
Sign up to leave a comment.

Articles