Запуск функций R на нескольких машинах. Что получилось в результате

При работе с R скриптом может потребоваться обновлять его автоматически. Пакет “taskscheduleR” помогает настроить расписание для запуска R скрипта в Windows Task Schedule ежедневно, еженедельно, каждые N минут, после запуска Windows и так далее.

  1. Устанавливаем пакет “taskscheduleR” library(devtools) install.packages("devtools") install_github("jwijffels/taskscheduleR") library(taskscheduleR)

    Используем пакет «devtools», который позволяет скачивать и устанавливать пакеты напрямую с GitHub.

  2. Далее для настройки запуска скрипта можно воспользоваться либо интерактивной настройкой через форму, либо написав пару строк кода.

Настройка расписания R скрипта в Task Scheduler через Addins:

Настройка расписания R скрипта через функции пакета taskscheduleR:

Функции пакета:

  • Получить список всех задач в Windows Task Sheduler
  • Удалить задачу из Windows Task Sheduler
  • Добавить задачу запуска R скрипта
    • Доступны следующие расписания: ‘ONCE’, ‘MONTHLY’, ‘WEEKLY’, ‘DAILY’, ‘HOURLY’, ‘MINUTE’, ‘ONLOGON’, ‘ONIDLE’
## Указываем название файла R скрипта для последующей работы с ним myscript <- system.file("extdata", "helloworld.R", package = "taskscheduleR") ## Запуск скрипта разово через 35 секунд taskscheduler_create(taskname = "myscript", rscript = myscript, schedule = "ONCE", starttime = format(Sys.time() + 35, "%H:%M")) ## Запуск скрипта ежедневно в 10:15, начиная с завтрашнего дня ## Важно: необходимо поменять формат даты, если он не совпадает с тем, что стоит на компьютере (пример: %m/%d/%Y) taskscheduler_create(taskname = "myscriptdaily", rscript = myscript, schedule = "DAILY", starttime = "10:15", startdate = format(Sys.Date()+1, "%d/%m/%Y")) ## Запуск скрипта каждую неделю в 10:15 по понедельникам taskscheduler_create(taskname = "myscript_mon", rscript = myscript, schedule = "WEEKLY", starttime = "10:15", days = "MON") ## Запуск каждые 5 минут, начиная с 10:15 taskscheduler_create(taskname = "myscript_5min", rscript = myscript, schedule = "MINUTE", starttime = "10:15", modifier = 5) ## Получить data.frame со всеми задачами tasks <- taskscheduler_ls() str(tasks) ## Удалить задачи taskscheduler_delete(taskname = "myscript") taskscheduler_delete(taskname = "myscriptdaily") taskscheduler_delete(taskname = "myscript_,mon") taskscheduler_delete(taskname = "myscript_5min") taskscheduler_delete(taskname = "myscript_withargs_a") taskscheduler_delete(taskname = "myscript_withargs_b")

На что обращаем внимание:

  • Формат даты . Он должен совпадать с форматом даты на компьютере. В противном случае получим либо ошибку настройки расписания запуска скрипта, либо совсем другую дату.
  • Активность компьютера . Компьютер должен быть включен в момент запуска скрипта
  • Наличие других расписаний скрипта . При настройке нового расписания с тем же названием, предыдущее расписание удаляется.

Как-то попалась мне задача, в которой нужно было преобразовать 800 000 текстовых строк в несколько этапов. Большинство подобных задач я решаю с помощью R, потому и в этом случае начал пробовать использовать знакомый мне язык. Если первые несколько преобразований занимали секунды, то последующие начали занимать десятки минут.

Такая ситуация меня совсем не устраивала. Если нужно было внести изменения в данные на входе последовательности операций, приходилось очень долго ждать. А ведь это был еще не окончательный результат вычислений. В этот момент я решил попробовать поднять R в облаке и решать задачу там. Давайте посмотрим, что из этого получилось.

Неоценимый вклад в написание этого поста внес Антоша . Без него я бы потратил кучу времени на выбор операционной системы и установку программ в ней.

Как создать виртуальную машину (инстанс) в Google Cloud Platform

В первую очередь следует создать виртуальную машину в Google Cloud Platform. Довольно сложно выбрать из списка доступных машин , если вы не знаете необходимые для решения вашей задачи технические характеристики. Потому я начал с самого слабого варианта — f1-micro, который доступен бесплатно для региона US. Вы тоже можете начать с него.

Когда вы определились с типом инстанса, и включите в нем биллинг . Чтобы создать инстанс, перейдите из вашего проекта в Google Developers Console и откройте Google Cloud Platform:

На открывшейся странице задайте параметры машины, которую хотите получить. Я указал f1-micro в регионе us-central1-a с операционной системой Ubuntu 16.04 LTS. Также поставил две галочки Allow HTTP traffic и Allow HTTPS traffic для возможности взаимодействия с сервером по HTTP и HTTPS. Другие параметры я не трогал:

Дополнительную информацию по запуску инстансов вы можете найти в справке .

Как установить R и R Studio на инстанс в Google Cloud

Чтобы начать установку нужных вам программ, подключитесь к созданной машине по SSH (сетевой протокол Secure Shell). Для этого нажмите соответствующую кнопку напротив названия вашего инстранса.

Выполните команду:

Sudo vim /etc/apt/sources.list

Deb https://cran.rstudio.com/bin/linux/ubuntu xenial/

Далее нажмите Esc, двоеточие (обратите внимание, что нужно именно двоеточие, а не точка с запятой) и выполните команду wq. В результате в файле /etc/apt/sources.list вы укажете, откуда нужно брать файлы для установки R. Мы будем устанавливать RStudio Server , а не обычный десктопный вариант.

Sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 sudo apt update sudo apt-get install r-base sudo apt-get install gdebi-core wget https://download2.rstudio.org/rstudio-server-1.0.136-amd64.deb sudo gdebi rstudio-server-1.0.136-amd64.deb

В процессе выполнения нужно будет несколько раз подтвердить, что вы готовы установить программное обеспечение. После выполнения всех этих команд необходимо указать порт, при обращении к которому вы будете получать доступ к R Studio. Для этого выполните команду:

Sudo vim /etc/rstudio/rserver.conf

В открывшийся файл вставьте строку:

Www-port=80

Нажмите Esc, двоеточие и выполните команду wq. С помощью этой строки вы укажете, что при обращении к 80 порту, к которому происходит обращении по умолчанию, должна запускаться R Studio. После этого выполните команду:

Sudo passwd user_name

Вместо user_name следует указать свое имя пользователя. Его можно найти здесь:

Так вы зададите пароль для вашего пользователя в Ubuntu, который станет паролем при входе в R Studio.

Sudo service rstudio-server restart

Ура, у вас получилось установить R и R Studio в Google Cloud. Вернитесь в свой проект в Google Cloud Platform и перейдите по IP-адресу, который указан напротив названия вашего инстанса:

Введите имя пользователя и пароль, которые вы задали на одном из предыдущих шагов. Нажмите кнопку входа — откроется привычный вам интерфейс R Studio:

Как устанавливать пакеты R в облаке

Для решения части задач придется устанавливать дополнительные пакеты, которых нет в базовой сборке R. Здесь возникают две проблемы. Во-первых, нехватка оперативной памяти у инстанса f1-micro. При установке R рекомендуется машина с не менее чем 1 GB оперативной памяти, а у нашего инстанса 0,6 GB.

Чтобы решить этот вопрос на время установки всех пакетов можно улучшить свой инстанс. Придется остановить работу виртуальной машины — в процессе работы менять характеристики нельзя. Для этого нажмите кнопку остановки и дождитесь, пока машина перестанет работать:

Проделав эту же процедуру после установки всех нужных пакетов, можете снова выбрать f1-micro, если его достаточно для ваших задач. Если сразу хотите попробовать машину помощнее, выбирайте доступные варианты из списка.

Вторая проблема при установке пакетов — отсутствие в нашей машине необходимых для работы пакетов библиотек. Вы увидите сообщение об этом в консоли R Studio. Там будет указано название рекомендуемой библиотеки, которая решит проблему с установкой пакета.

Скопируйте из R Studio название пакета, подключитесь к инстансу по SSH и введите следующую команду:

Sudo apt install library_name

Здесь library_name — название библиотеки, скопированное из R Studio.

Что получилось в результате

После установки R и R Studio я попробовал решить мою задачу на f1-micro. На выполнение всех преобразований понадобилось 2 часа. Это даже хуже, чем на моем компьютере:) Задача требовала большей мощности процессора, и я улучшил инстанс до n1-highcpu-2. После этого на выполнение всех преобразований ушло около 10 минут. Локальная машина все-таки сильно уступает серверу.

Цены на использование машин в Google Cloud очень демократичные. Несколько часов работы с разными инстансами обошлись мне аж в 4 цента. Более того, для новых пользователей Google дает $300 на 12 месяцев. Вы сможете, например, без остановки использовать тот же n1-highcpu-2 без остановки 8 месяцев или месяц пользоваться машиной с 8 vCPU и 52 GB оперативной памяти. Удачной работы в облаке.

R - популярный язык программирования с открытым исходным кодом, который специализируется на статистических расчетах и графиках. Он широко используется статистиками для разработки статистического программного обеспечения и проведения анализа данных. Одной из сильных сторон R есть его расширяемость. Пользователи могут создавать и публиковать собственные пакеты. R Сообщество очень активно, постоянно добавляются пользовательские статистические пакеты для специфических областей науки. Что делает R применимым во многих сферах.

CRAN (Comprehensive R Archive Network) - это набор сайтов (зеркал) на которых размещены множество пакетов, и сами дистрибутивы R. Вы можете скачать R с любого из них но мы будем использовать RStudio.

В этом руководстве вы узнаете как установить и настроить R в Ubuntu 14.04. Большинство инструкций подойдут и для других операционных систем, нужно будет изменить лишь несколько команд. На все про все у вас должно уйти не больше 10-15 минут.

Конечно же нам потребуется Ubuntu 14.04 так как именно на нее рассчитана статья и 1 Гигабайт оперативной памяти в системе. Если памяти недостаточно, необходимо подключить раздел подкачки.

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

Подготовка системы

Для установки R мы будем использовать APT (Advanced Packaging Tool). Для хранения списка источников откуда будут загружены пакеты он использует специальный файл. Это /etc/apt/sources.list. Если мы хотим получить самую свежую версию R то нужно добавить правильный репозиторий в список источников. Для этого добавим следующую строку в /etc/apt/sources.list, в Ubuntu 14.04 она будет выглядеть вот так, но для других версий будет отличаться:

sudo sh -c ‘echo «deb http://cran.rstudio.com/bin/linux/ubuntu trusty/» >> /etc/apt/sources.list’

Репозиторий для своей версии ОС можно узнать там

Для установки пакетов из этого репозитория в APT нам нужно добавить его публичный ключ. В Ubuntu CRAN подписан ключом с ID E084DAB9. Добавляем его в систему:

gpg -keyserver keyserver.ubuntu.com -recv-key E084DAB9

А затем в apt:

gpg -a -export E084DAB9 | sudo apt-key add -

Установка R

Теперь когда APT настроен правильно мы можем переходить к установке.

Сначала нужно обновить список доступных пакетов, так как мы изменили источники:

sudo apt-get update

Теперь можем устанавливать R. Флаг y, автоматически подтверждает установку программы:

sudo apt-get -y install r-base

Теперь у вас в системе установлена самая последняя версия R. Можете протестировать ее выполнив:

Вы увидите что то на подобие этого:

R version 3.2.1 (2015-06-18) - «World-Famous Astronaut»
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type ‘license()’ or ‘licence()’ for distribution details.

Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type ‘contributors()’ for more information and
‘citation()’ on how to cite R or R packages in publications.

Type ‘demo()’ for some demos, ‘help()’ for on-line help, or
‘help.start()’ for an HTML browser interface to help.
Type ‘q()’ to quit R.

Сейчас вы в интерактивной консоли R и можете выполнять любые R команды. Для выхода используйте функцию:

> q(save = «no»)

Установка пакетов R из CRAN

По умолчанию R устанавливает несколько стандартных пакетов, но вы наверное захотите установить дополнительные пакеты. Для этого и нужно не меньше 1 Гб оперативной памяти.

Как упоминалось ранее в CRAN размещен не только сам R но и многие дополнительные пакеты. Для установки или обновления пакетов из CRAN необходимо использовать R функцию install.packages(). Например если вы хотите установить пакет package используйте следующую команду:

> install.packages(«package»)

Стоит заметить что пакет будет установлен только для текущего пользователя и другим будет недоступен.

Можно установить пакет R и для всех пользователей, для этого нужно использовать права суперпользователя. В качестве примера давайте установим пакет shiny который очень популярен среди разработчиков web приложений на R. Один из способов установки пакета от суперпользователя - войти как суперпользователь, запустить R и вызвать функцию install.packages (). Но этого делать не рекомендуется. Мы можем просто запустить R команду с помощью sudo. Параметр repo указывает с какого репозитория будет загружен пакет.

sudo su - -c «R -e \»install.packages(‘shiny’, repos = ‘http://cran.rstudio.com/’)\»»

Теперь пакет будет доступен для всех пользователей. Давайте проверим. Запустите R:

Загрузите пакет:

> library(shiny)

Как видите команда не вызвала ошибок. Теперь закройте R:

> q(save = «no»)

Установка пакета DevTools

Пакеты размещенные в CRAN могут быть установлены функцией install.packages() но есть еще много пакетов размещенных на GItHub. Для установки пакетов R из Github нужно использовать пакет DevTools. Давайте его установим. Для работы пакет требует три библиотеки libcurl4-gnutils-dev, libxml2-dev , и libssl-devc установите их:

sudo apt-get -y install libcurl4-gnutls-dev libxml2-dev libssl-dev

Теперь можно устанавливать devtools. Не забудьте что его нужно установить для всех пользователей как описано выше.

sudo su - -c «R -e \»install.packages(‘devtools’, repos=’http://cran.rstudio.com/’)\»»

Установка devtools займет несколько минут.

Установка пакетов R из GitHub

Теперь когда DevTools установлен, мы можем установить любой пакет из GitHub используя функцию install_github(). Также как и в установке из CRAN вы должны выполнять команду от суперпользователя для установки пактов для всех пользователей. Давайте попробуем установить shinyjs из GitHub который добавляет функциональность к пакету shiny. Пакет в GitHub определяется его автором и названием:

sudo su - -c «R -e \»devtools::install_github(‘daattali/shinyjs’)\»»

Давайте проверим корректность установки shinyjs загрузив его. Запустите R:

Попробуйте загрузить shinyjs:

> library (shinyjs)

вы уже знаете как закрыть интерпретатор R:

> q(save = «no»)

Следующие шаги

Теперь у вас в системе установлен и настроен полностью рабочий интерпретатор языка R. Для получения более подробной информации можете посетить

Чтобы создать переменную (например, х) и присвоить ей значение (например, 1234) нужно просто ввести команду х=1234 . Теперь в любых выражениях имя переменной (в нашем случае х) будет автоматически заменено значением (у нас это 1234).

Чтобы узнать значение переменной, достаточно ввести название переменной, и R выдаст ее значение. Выглядеть это будет так:
> x=1234
> х
1234

Присваивая переменной новое значение, можно использовать старое значение, то есть создавать конструкции типа
> a=5
> a
5
> a=a+3
> a
8

Важно знать, что имена переменных могут состоять из латинских букв обоих регистров, из цифр и знаков подчеркивания (например, допустимы такие имена: a, x, x1, a_x, O_o, the_Variable_with_Long_Name, a459x4h36J4lbgT62). При этом первым символом должна обязательно являться буква! Наконец, регистр имеет значение, то есть RainForest и RainFOrest - это разные переменные.

Векторы, или как работать с рядами данных?

Что такое векторы в R?

Допустим, у нас есть группа из 5 человек, и нам надо сохранить их возраста. Можно создать пять переменных, например
> age_1=25
> age_2=20
> age_3=9
> age_4=44
> age_5=37
Однако удобнее создать одну переменную, в которую поместить все 5 значений. Такой ряд данных, объединенных одним именем, хранящийся в определенном порядке - это массив данных, или вектор.

Assign("age",c(25,20,9,44,37))
или сокращенно: age

Теперь, каждый отдельный элемент можно вызвать по его порядковому номеру в ряду, например, четвертый элемент можно получить так:
> age
44
С такими отдельными элементами можно производить все те же операции, что и с обычными числами

Функция append, или как добавить элементы в существующий вектор?

Допустим, в нашей группе появился еще один человек, возраст которого 31 год. Мы можем создать заново вектор age, но теперь из шести элементов вместо пяти. Однако есть другой способ - использовать функцию append:
> append(age,31)
25 20 9 44 37 31
Замечу, что мы могли бы вставить несколько значений, вспомнив про функцию c():
> append(age,c(31,33,35))
25 20 9 44 37 31 33 35

Также функция позволяет вставить элементы в любом месте вектора с помощью параметра after. По умолчанию установлено значение after=length(x), то есть элементы добавляются в конец. Но допустим, мы захотим вставить нашего шестого человека после второго:
> append(age, 31, after=2)
25 20 31 9 44 37

Операции с векторами, или что можно делать с векторами?

Можно оперировать всеми элементами вектора одновременно. Так прибавление числа к вектору равносильно прибавление этого числа к каждому элементу вектора. Или, например, чтобы вывести, сколько десяктов лет прожил каждый человек из нашего примера, можно сделать так:
> age/10
2.5 2.0 0.9 4.4 3.7

Аналогично со сложением, вычитанием и другими операциями, описанными в пункте про

Как сравнивать векторы, элементы векторов?

Допустим, нужно выяснить, какие элементы вектора (пусть будет тот же age) больше определенного числа (например, кто из нашей маленькой выборки совершеннолетний). R для каждого элемента скажет, выполняется ли условие, то есть TRUE (верно) или FALSE (не верно) Выглядеть будет примерно так:
>age
25 20 31 9 44 37
> age >= 18
TRUE TRUE FALSE TRUE TRUE

Но может понадобиться получить один ответ, например, верно ли, что все элементы соответствуют условию? или есть ли вообще элементы, соответствующие условию? Для этого используем две функции, соответственно, all() и any()

all(x1,x2,...,xn) - ответит на вопрос, верно ли, что все условия (x1, x2, ... и xn) верны? то есть это логическая конъюнкция. Например:
> all (age >= 7, age TRUE
# действительно, все испытуемые не младше семи и младше шестидесяти
> all (age >=18, 1 > 0)
FALSE
# хотя единица, конечно, больше нуля, но среди наших испытуемых есть один девятилетний, поэтому не верно

any(x1,x2,...,xn) - ответит на вопрос, есть ли среди условий (x1, x2, ..., xn) хоть одно верное? то есть это логическая дизъюнкция. Пример:
> any (age >=18, 1 > 0)
TRUE

Наконец, можно сравнивать между собой два вектора. Но для этого нужно либо чтобы длина большего была кратна длине меньшего либо чтобы длины были равны. Примеры:
> a > a > b
FALSE FALSE FALSE TRUE TRUE

Как задать последовательность чисел?

  • оператор:
  • seq(from,to,by,length,along) - создает последовательность, начиная с from, заканчивая to с шагом by. Можно задать длину ряда параметром length или приравнять по длине к другому вектору along . Аргументы: from, to, by, length, along (такой же длины как...)
  • rep(a, times, each) - повторять вектор a times раз или each раз каждый элемент a. Аргументы: вектор, times, each

Сортировка

  • sort(v,increasing) - сортирует вектор v; increasing - булев, true - по возрастанию, false - по убыванию, можно вместо этого написать increasing=decreasing;
  • order()

Вы можете использовать system() и Rscript для запуска сценария как асинхронного фонового процесса:

system ("Rscript -e "source(\"your-script.R\")"" , wait = FALSE ) ... save.image ("script-output.RData" ) cat ("Script completed\n\n" )

Надеюсь это поможет!

Я хочу выполнить R-сценарий в фоновом режиме с консоли R.

С консоли я обычно запускаю R-скрипт как источник ("~ / .active-rstudio-document). Мне нужно подождать, пока скрипт не будет завершен, чтобы продолжить работу. Вместо этого я хочу, чтобы R работал в фоновом режиме, пока я могу продолжить работу в консоли. Также я должен быть как-то уведомлен, когда R завершает команду источника. Возможно ли это в R?

Это может быть весьма полезно, поскольку мы часто видим, что работа занимает много времени.

PS - Я хочу, чтобы исходный скрипт работал в том же пространстве памяти, а не в новом. Поэтому решения, такие как fork, system и т. Д., Не будут работать для меня. Я вижу, могу ли я запустить R-скрипт как отдельный поток, а не отдельный процесс.