Функции — это ключевой класс объектов в языке R. Они используются почти на каждом этапе анализа данных, начиная от загрузки таблицы в R и показа описательной статистики, заканчивая функциями для решения узконаправленных задач. Особое место занимают функции «собственного производства»: без них сложно обойтись, но их отнюдь не сложно создать. Именно о том, что такое функции, как их использовать и написать самим, я расскажу в этой статье!
Для чего нужны функции в R?
При анализе данных код R записывают в виде скрипта для того, чтобы в последующем можно было легко продолжить работу с ним, либо предоставить возможность воспроизвести Ваш анализ данных другому человеку. Таким образом, скриптовой программой (или скриптом) называется последовательность команд, записанная в текстовом формате. В идеале скрипт должен быть компактным и понятным для другого человека. Для того, чтобы уменьшить количество строк кода, сделать код более читабельным и удобным для редактирования используют функции.
Зачастую во время анализа приходится выполнять одни и те же действия несколько раз, то есть, писать один и тот же код, где лишь незначительная его часть изменена. Однако гораздо практичнее будет оформить подобные массивы кода в функцию. В этом случае блок кода, копируемый из раза в раз, будет телом функции, а места кода, которые Вы изменяете в этом блоке станут аргументами (параметрами) функции. Также у функции должно быть имя, чтобы ее можно было вызвать в среде R. Схема построения функции в R выглядит следующим образом:
Сначала следует написать имя функции, затем знак присвоения и слово function, которое создает объект класса функция. В скобках мы указываем аргументы, а тело функции находится внутри фигурных скобок. Важно отметить, что для использования функции требуется ввести только имя функции и ее аргументы:
Таким образом массивный скрипт с большим количеством повторяющегося кода при помощи функций становится более компактным и понятным для пользователя. Также не забывайте комментировать код, трактовка которого неочевидна, чтобы Вы или другой человек могли понять алгоритм и замысел Вашего анализа.
Использование существующих функций в R
К счастью существует множество готовых функций в R. Так например, mean() , summary() , read.table() , lm() являются базовыми функциями, которыми можно пользоваться без применения сторонних пакетов. Чтобы узнать какие именно аргументы требуется ввести для использования функции введите в консоль знак вопроса и имя функции, например: ?read.table . На открывшейся странице в разделах Usage и Arguments будет перечень аргументов для использования данной функции. Как правило, критически важные аргументы для работы функции находятся в начале списка. Аргументы, которые не будут заполнены примут значения по умолчанию:
read.table(«D:/Folder/mytable.txt», sep = «t», header = T)
Так как официальный архив R пакетов (CRAN) насчитывает более 11 тысяч R пакетов, то количество доступных функций для анализа данных стремительно приближается к 1 млн. Как же нам проводить поиск нужной функции во всех этих пакетах? Для этого существует сайт rdocumentation.org: удобный сервис поиска функций и пакетов по искомому слову или сочетанию слов.
Базовая версия R, которая была загружена на Ваш компьютер, состоит из 30 встроенных пакетов. Остальные следует загружать и подключать самостоятельно. Следовательно, сначала мы ищем к какому пакету принадлежит функция, устанавливаем этот пакет в библиотеку пакетов на компьютере, загружаем его в R и лишь после этого используем функции загруженного пакета. Не забывайте загружать пакет при повторном запуске R, если снова собираетесь использовать функции этого пакета.
Создание функций: три наглядных примера!
Сколько бы функций не существовало в CRAN, рано или поздно придется написать свои собственные. Причин на это может быть несколько: такой функции еще не написано; проще написать свою, чем искать ее в других R пакетах: и т.д. Так или иначе, создать функции совсем не сложно. Для того, чтобы это доказать, я приведу три простых примера, которые помогут понять логику построения функций.
Пример 1: сколько будет 2+2×2?
Создадим простейшую функцию, основанную исключительно на арифметических действиях. Например, вычислим знакомый нам с начальной школы пример: сколько будет 2+2*2? Усложним немного: 12+12*12? Ну и в завершении арифметических упражнений 42+42*42? Как Вы могли заметить, все эти примеры основаны на одной и той же формуле: a+a*a.
Создание функции в R будет идеальным решением для подобного рода задач.
school school(2) school(12) school(22)
Результат вычислений функции отобразится на экране консоли, т.к. для вывода информации мы использовали базовую функцию print() внутри нашей функции . Когда же нам требуется сохранить результат в виде отдельного объекта (переменной), следует воспользоваться функцией return() , что мы сделаем в следующем примере.
Пример 2: от горшка два вершка
В детстве мы все читали русские народные сказки. Меня, например, всегда интересовало что значит фраза «от горшка два вершка», а точнее сколько это в сантиметрах. Думаю, пришло время получить ответ: создадим конвертер вершков в R при помощи новой функции convershok() .
Один вершок равен 4.445 см. Пусть программа выводит на экран предложение от том, что столько вершков равняется столько-то сантиметров, используя базовую функцию для объединения текстовых и числовых объектов paste() . Также мы хотим, чтобы полученное значение сохранялись как отдельный объект, для чего в конце функции добавим return(vershok) .
convershok vershok print(paste(n, «vershok», «=», vershok, «cm»)) return(vershok) > x
Отлично, мы получили заветное сообщение и сохранили 8.89 (см), как объект x . Вот только о каком именно горшке идет речь в поговорке не сказано, поэтому измерьте высоту первого попавшегося горшка, добавьте это значение к переменной x и напишите в комментариях, сколько у Вас получилось;-)
Пример 3: ноутбук в кредит, сколько придется переплатить?
Допустим, у студента сломался ноутбук. На данный момент у него нет свободных денег на покупку нового, и он решил взять его в кредит. В банке ему предложили кредит на сумму 30.000 рублей с процентной ставкой 35% годовых и возможностью преждевременного погашения. Рассчитаем сколько денег нужно выплатить за ноутбук при погашении кредита через месяц, три месяца и год.
Для расчетов я использую формулу для вычисления суммы процентов, начисленных за пользование кредитом в течение n месяцев.
sp = p * (t + 1) / 24, где:
sp — сумма процента
p — годовая процентная ставка
t — срок кредита (месяцев).
Реализуем эту формулу в R, после чего добавим к цене ноутбука (n) высчитанный суммарный процент (sp), помноженный на цену ноутбука товара (n):
result sp total print(paste(«sp =», round(sp, 2), «%; «, «total price =», total, «rubles»)) > result(30000, 35, 1) result(30000, 35, 3) result(30000, 35, 12)
Как Вы видите, 35% годовых отнють не означает, что студент будет платить за кредит 35% от текущей стоимости ноутбука: в реальности за год он переплатит на 19%. Другой интересный вывод в том, что кредитный процент на один месяц гораздо выше, чем усредненный месячный процент на три месяца и тем более на год. То есть брать кредиты на долгий срок «выгодно» 🙂
А главное, наш студент может использовать эту же функцию для своих будущих расчетов, если решит брать кредит в другом банке с другой процентной ставкой или выбрать ноутбук в другой ценовой категории. Для этого ему лишь надо изменить значения аргументов в функции.
Заключение
На мой взгляд, создание функций — искусство особого рода, где дерзкие, а порой и совершенно нелепые идеи сочетаются с прагматичным подходом к их реализации. Надеюсь, что эта информация была для Вам полезной. В следующий раз я продолжу рассказ о функцияз, где мы сконцентрируемся на работе со структурами if else, for и while. Если у Вас появились вопросы, задавайте их в комментариях, я всегда рад на них ответить!
Комментарии: 3
Январь 21, 2020 в 10:21 Александр
Спасибо за статью. Такой вопрос как задать время/интервал между выполнением функций?
Задача в том чтобы выгрузить статистику из соц сетей но есть ограничение по количеству запросов 3 в секунду. И нужно снизить количество запросов выставив timeout. Какая есть для этого функция или метод и можно ли в цикле задать интервал выполнения?
Январь 21, 2020 в 13:46 Samoedd (Автор записи)
https://samoedd.com
Создайте цикл for, внутри код своей функции и добавьте вот эту строчку в качестве последней строки внутри тела цикла: Sys.sleep(3) Вот в качестве примера функция, которая автоматически выводит на экран какой цикл сейчас выполняется в R. Вы лишь задаете интервал задержки между циклами: kakoi.zikl
for(i in 1:10) print(i)
Sys.sleep(a)
>
> kakoi.zikl(1) # 1 sec interval
kakoi.zikl(3) # 3 sec interval
Источник: samoedd.com
Доброго времени суток начинающие программисты, в этом уроке мы будем создавать онлайн калькулятор услуг. В качестве примера мы будем брать калькулятор ремонта, который делает онлайн расчет стоимости ремонта. Живой демо пример Фишка этого калькулятора в том, что в итоге все расчеты можно сохранить в word документ и формирует он все данные за считанные мили-секунды.
Для чего мы создаем такой калькулятор расчетов услуг
- Быстрая готовая смета
- Сформированный документ можно уже отправлять клиенту
- Экономия времени пользователю, тем самым повышаем КПД
Какие методы используем
- Формирование шаблона на HTML
- Использование многомерного массива в input
- Запросы к базе данных для вывода услуг
- Расчет при помощи javascript
- Php формирование документа
Создаем калькулятор расчета за 6 простых шагов
Шаг 1. Создаем базу данных в mysql
В источниках есть дамп базы данных, в ней находится 2 таблицы. В последующих шагах мы будем к ним обращаться.
price_cat — таблица с категориями
price_item — таблица с услугами
Создаем базу данных импортируем файл calculator.sql в созданную базу данных и подключаемся к ней.
Все готово. Теперь необходимо разметить html шаблон и одновременно формировать запросы к базе.
Шаг 2. Разметим html + php шаблон
Подключаем библиотеки, которые нам понадобятся
Обратите внимания:
Я использовал bootstrap компоненты, а так же библиотеку awesome иконки, а в calculator.js мы будем писать скрипт расчетов.
Разметка калькулятора
Калькулятор ремонта
0) < ?>
«> ][name]» value=»» /> ][summa]» value=»» />
0) < ?>
][items][][name]» value=»» /> | ][items][][ed_izm]» value=»» /> | ][items][][price]» value=»» /> | ][items][][kolvo]» value=»» style=»width:70px; margin:0 auto;»> | ][items][][summa]» value=»» style=»width:80px; margin:0 auto; text-align:center;»> |
?> Итого: 0 руб. while($category = mysql_fetch_array($res_category)); ?> ?> Сохранить в WORD документ Итого: 0 руб.
Как видим ничего сложного нет, очень простые запросы к базе, очень простой html код. Единственное на что хотел обратить внимание, это на то что мы используем многомерный массив input. В файле обработчике мы будет работать с ними и научимся извлекать нужные данные из них.
Теперь самое интересное. Напишем скрипт для расчета стоимости услуг на javascript.
Шаг 3. Пишем скрипт на javascript онлайн расчета
Некоторые строки я пояснил прямо в коде.
$(function() < // смена стрелочки у категории $(«.open_category»).click(function()< var status = $(this).attr(«aria-expanded») if(status==»false») < $(this).find(«i»).attr(«class»,»fa fa-angle-up»); >else < $(this).find(«i»).attr(«class»,»fa fa-angle-down»); >>) // событие при наборе кол-ва в калькуляторе $(«.calc»).on(«change keyup», function() < var value = $(this).val(); var price = $(this).parent().prev().find(«input»).val(); price = price.replace(/s/g, »); // удаляем пробелы var item_summa = value*price; item_summa = item_summa.Crop(2); // 2 знаka после запятой $(this).parent().next().find(«input»).val(item_summa); var summa_category = 0; // сюда будем загонять сумму в каждоый категории var total_summa = 0; // сюда будем загонять итоговую сумму var item_summa_category = $(this).parent().next().find(«input»); $(item_summa_category).each(function()< // пробегаемся по всем суммам и суммируем var k = parseFloat($(this).val()); if(!k || k==0)summa_category += k; >) // записываем расчеты по категориям $(this).parents(«.category»).find(«.summa_category»).text(summa_category); $(this).parents(«.category»).find(«.summa_category_input»).val(summa_category); $(«big.summa_category»).each(function() < // пробегаемся по всем суммам в категориях и суммируем var t = parseFloat($(this).text()); if(!t || t==0)total_summa += t; // считаем общую стоимость >) // выводим итоговую сумму $(«.total»).text(total_summa); $(«.total_input»).val(total_summa); >) >) // функция знаки после запятой Number.prototype.Crop = function (x)
Отлично теперь, если вы сделали все правильно, то у наш созданный калькулятор уже должен считать.
Файл save_word.php
В некоторых моментах мне было лень присваивать классы, прописывать к ним стили, а потом подключать новую CSS. По этому я писал стили прямо в коде в тегах, конечно же плохой пример, не делайте так, но из-за 2-3 строк, тоже время терять не хочется.
Все готово, можете тестировать и визуализировать выводимый word формат.
Вывод
В этом уроке мы создали онлайн калькулятор расчета услуг, на примере калькулятора ремонта, позаимствовав идею у сайта remont-cityper.ru. Написанный нами код очень сильно отличается от кода, который использован в демо примере. ( можете убедится сами). Так же мы научились создавать word документ под средством php, использовав шаблон rtf и специальные метки. Это отличный урок по созданию счетов, бланков, прайс-листов и т.д.
Пишите комментарии по этому поводу, я буду раз услышать от вас рекомендации или советы.
Источник: kisameev.ru
Пишем свой калькулятор на JS
Калькулятор — прекрасная задача для начинающего программиста. Она помогает понять основы работы с арифметическими и строковыми операциями. Если Вы ещё не сделали свой калькулятор, то советую закрыть этот пробел вместе с этим уроком. HTML:
Используется javascript-функции: eval() — преобразует строку в javascript и выполняет его. innerHTML — получает и присваивает внутренний HTML текст DOM-элементу (div, span, label и т.д.)
// код начнёт выполняться после загрузки страницы
// когда окно загрузится, сработает метод window.onLoad
window.addEventListener( ‘load’ , function OnWindowLoaded() <
// набор кнопок
// форма калькулятора
var calc = document.getElementById( ‘calc’ );
// текстовое поле с математическим выражением
var textArea = document.getElementById( ‘inputVal’ );
// Добавление кнопок к форме калькулятора
signs.forEach( function (sign) <
var signElement = document.createElement( ‘div’ );
signElement.className = ‘btn’ ;
signElement.innerHTML = sign;
calc.appendChild(signElement);
// проходит по всем кнопкам калькулятора
// добавляет обработчик на клик
document.querySelectorAll( ‘#calc-wrap .btn’ ).forEach( function (button) <
// Добавляем действие, выполняемое при клике на любую кнопку
button.addEventListener( ‘click’ , onButtonClick);
// функция клика по кнопке калькулятора
function onButtonClick(e) <
// e — MouseEvent (содержит информацию о клике)
if (e.target.innerHTML === ‘c’ ) <
// Если нажата кнопка «с», то стирает все из текстового поля
textArea.innerHTML = ‘0’ ;
> else if (e.target.innerHTML === ‘=’ ) <
// Если нажата кнопка » line number42 index41 alt1″> // в текстовом поле к javascript, вычислить значение
textArea.innerHTML = eval(textArea.innerHTML);
> else if (textArea.innerHTML === ‘0’ ) <
// Если textarea содержит только «0», то
// стереть «0» и записать
// значения кнопки в текстовое поле
textArea.innerHTML = e.target.innerHTML;
// Добавление значения кнопки в текстовое поле
textArea.innerHTML += e.target.innerHTML;
Используются CSS-свойства: line-height — устанавливает высоту строки для текста. Текст выравнивается по центру этой высоты. text-align — выравнивает текст по горизонтали (принимает значения: left,right,center) resize — устанавливает возможно изменение размеров текстового поля (принимает значения: vertical, horizontal,both,none)
Источник: gohtml.ru