R in production

Антон Антонов

@tonytonov

vk.com/spbrug

stepic.org/course/497

Зачем вообще нужен R

  • Для задач, связанных с анализом данных
  • Для численных методов
  • Для визуализации
  • Для быстрого прототипирования
  • Task views: https://cran.r-project.org/web/views/

Зачем вообще нужен R

Use case: некий численный алгоритм

(в моём проекте)

numeric input -- numeric output

Gramacy, R.B., Lee JH. (2007). On estimating covariances between many assets with histories of highly variable length. arXiv:0710.5837

install.packages("monomvn")
library(monomvn)

Если от R можно отказаться,

то это стоит сделать!

  • Продакшен (написание "приложений") не является нишей R
  • R -- довольно медленный язык
  • R непросто параллелить
  • Весь код открыт, можно смотреть исходники
  • У пакетов могут быть тяжелые зависимости
Depends: R (>= 2.14.0), pls, lars, MASS
Imports: quadprog, mvtnorm
monomvn(y, pre = TRUE, method = c("plsr", "pcr", "lasso", "lar",
        "forward.stagewise", "stepwise", "ridge", "factor"), p = 0.9,
        ncomp.max = Inf, batch = TRUE, validation = c("CV", "LOO", "Cp"),
        obs = FALSE, verb = 0, quiet = TRUE)

R на сервере

  • В целом, всё хорошо
  • Полный контроль окружения (версионность, настройки, репозитории)
  • Package management
  • Rocker (R + Docker)
    https://hub.docker.com/u/rocker/

R на клиенте

  • В целом, всё плохо
  • Нужна локальная установка
  • Нужно как-то деплоить код
  • Можно ожидать сложностей с windows...

Что делать?

  • Не паникуйте
  • Попробуйте завести сервер
  • Пишите пакеты, а не скрипты
  1. Системы контроля версий
  2. Dependencies
  3. Unit tests + continuous integration
  4. Документация

Полезная идея

Например, для C# есть R.NET

https://rdotnet.codeplex.com/

REngine engine = REngine.GetInstance();
NumericVector group2 = engine.Evaluate("rnorm(10)").AsNumeric();

Для некоторых языков есть расширения, поддерживающие обращение к R

Полезная идея #2

Репозиторий в локальной сети

> library(miniCRAN)
> pkgList <- pkgDep("monomvn", type="source", suggests = FALSE)
> pkgList
[1] "monomvn"  "pls"      "lars"     "MASS"     "quadprog" "mvtnorm" 
> makeRepo(pkgList, path=pth, type=c("source", "win.binary"))
  • Все пакеты в одном месте (в т.ч. свои)
  • Нет зависимости от интернета

Полезная идея #3

Shiny: "A web application framework for R"

  • Серверная часть может содержать любой R код
  • Можно делать наглядные интерактивные визуализации

Summary

  1. По возможности не используйте R в продакшене
  2. В особенности на клиенте
  3. Впрочем, всё возможно
  4. Особенно если разрабатывать пакеты
  5. И это не отменяет того, что R -- отличный язык

Спасибо!

R in production

By Antonov Anton

R in production

The talk I gave at ITGM #8, St. Petersburg IT Global Meetup (23.07.2016).

  • 992