Кстати, несколько замечаний для людей, заинтересовавшихся R (как раз недавно хотел об этом развёрнутую статью написать, но всё времени нет).
Во-первых, для R есть замечательная среда разработки — RStudio. Как и сам R доступна для всех трёх основных платформ, плюс есть серверная версия для работы через бразер. Преимущества — есть редактор файлов с подсветкой синтаксиса, список созданных объектов, графики и документация открываются в отдельной области, ну и в целом поприятней голой консоли.
Во-вторых, R во многом похож на Scheme, только с JavaScript-подобным синтаксисом и без макросов. Зато с такой же системой environment-ов, с такой же нежёсткой типизацией, символами (symbols) и выражениями (expressions) и т.д. Последние 2 фичи, кстати, позволяют решать многие из задач, решаемых в Лиспах за счёт макросов.
В-третьих, сразу стоит понимать, что R — язык с историей, т.е. многие его «странности» объясняются именно историческими причинами. Например, в R есть сразу 2 системы объектно-ориентированного программирования — S3 и S4 (про их отличия был вопрос на StackOverflow). При этом нельзя сказать, что одна система вляется устаревшей — отнюдь, обе используются довольно часто. Историческими же причинами объясняется и отсутствие единой конвенции кода: изначально в R было принято писать всё маленькими буквами и разделять слова точками ("." в R — вполне законный символ в имени, так же, как "_" в Си, например). Но потом пришла S3, в которой точка использовалась при диспетчеризации методов объектов, и имена функций с точками стали не очень очевидными.
В-четвёртых, типизация в R может поначалу сломать мозг. В R у каждого объекта есть как минимум 2 атрибута типа — mode и class (их можно узнать с помощью одноимённых функций — mode() и class()). Грубо говоря, class — это тип самого объекта (например, matrix или table), а mode — это тип примитивов, хранимых в объекте (например, numeric или character). При этом numeric, integer, character и т.д. — это не число, целое и чар, как это принято в других языках, а вектор этих значений. И даже `5` — это не просто число, а вектор из одно элемента. В общем, что касается типов, в R всё очень и очень необычно :)
В-пятых, в R обращение к данным производится посредствам индексации. Например, к пятому элементу (привет, Мила Йовович) вектора `x` можно обратиться как `x[5]`. Но у вектора также может быть атрибут `names`, и тогда к тому же элементу можно обратиться, например, `x[«fifth_element»]`. Кроме оператора `[ ]` есть оператор `[[ ]]` (в основном используется для поиска по спискам — lists) и оператор `$`, который работает только для обращения через имя элемента, но и то не для всех типов. Так что не удивляйтесь, а внимательно читайте документацию и/или туториалы.
Кроме того, обратите внимание, что у любого объекта кроме основного значения может быть любое количество атрибутов. Например, class и mode — это просто атрибуты объекта (которые, кстати, можно перезаписывать). Часто можно встретить и такие атрибуты как dim, names/dimnames и др.
В-шестых, R использует pass-by-promise механизм. Для тех, кто незнаком с ленивыми вычислениями поясню: в функцию передаётся не сам объект, а специальная «обёртка», которая «обещает» вычислить объект, когда он понадобится. Впрочем, данные во внутренних структурах R преобразуются настолько часто, что эффект ленивых вычислений практически незаметен и в целом механизм становится похож на pass-by-value.
Основные типы данных, на которые сразу надо обратить внимание:
* векторы (numeric, character) — на них строится всё. Пример создания числового вектора: `c(1, 2, 3, 4)`
* списки (list) — то же самое, но может хранить элементы любого типа
* матрицы и дейта фреймы (matrix и data.frama, соответственно) — для хранения двумерных данных. Матрицы быстрее и «легче», но могут хранить только один тип данных. Дейта фреймы просто удобней — в разных колонках можно хранить разные типы, плюс можно обращаться к колонкам по имени, плюс ещё несколько приятностей. Про сравнение матриц и дейта фреймов можно также почитать на StackOverflow.
* факторы (factor) — для представления категориальных данных. Например, есть у вас данные о нарушениях ПДД с колонкой «цвет сфетофора», которые могут принимать всего три значения — green, yellow и red. Вы можете создать фактор с тремя «уровнями» (не спрашивайте почему такие названия — это что-то из глубоких понятий статистики):
factor(«green», c(«green», «yellow», «red»))
[1] green
Levels: green yellow red
[1] green — [одномерный] строковый вектор green — значение вектора
Levels: green yellow red — уровни фактора
* выражения (expressions) — обычно вводятся с помощью символа тильды (~). Например, если вы видите выражение `z ~ x + log(y)`, это значит, что мы задаём зависимость переменной `z` от `x` и `y` как сумму первого и логарифм от второго. Смотрите примеры, будет понятней.
Топ-10 функций R, которые лучше выучить сразу:
mode
class
print
summary
attributes и attr
apply и sapply
plot
library и install.package
dim
[], [[]], $
Программа действительно хорошая. Впечатляет также очень большое количество расширений-пакетов.
На русском языке материал есть, хотя его не так много как на английском. Лучшее из русского — www.inp.nsk.su/~baldin/DataAnalysis/index.html Особенно должно быть хорошо для введения в анализ данных с помощью R.
Ну и ещё в голову приходят почти классические уже материалы Шипунова herba.msu.ru/shipunov/software/r/r-ru.htm
Смысл не в том, чтобы «подгадать и купить по самой низкой цене», а в том, чтобы по уже имеющимся обязательствам исключить риск переоценки.
Пример.
Строительная компания строит дом. Договор на строительство подписан, сумма по нему, скажем 1 млн. рублей.
Для строительства нужен цемент. Причем не весь сразу, а разных количествах на разные этапы строительства.
Скажем, всего цемента надо купить 30 тонн, что в текущих ценах на момент подписания договора составляло 500 тыс., на зарплату строителям уйдет 400 тыс., на прибыть компании — все что осталось.
А теперь представьте, что через месяц после начала строительства цемент подорожал на 30%, а его еще надо 20 тонн. В итоге дебет с кредитом не сходятся, надо идти к заказчику и просить его перезаключить договор строительства на новых условиях. А если заказчик не согласится бабла добавить? Остается только банкротиться и судиться с заказчиком.
Фьючерс позволяет уравновесить обязательства, выраженные в цементе, требованиями, выраженными в деньгах. Для этого надо купить фьючерс на 30 тонн цемента и при каждой поставке цемента на стройку уменьшать объем фьючерсной позиции на величину поставки. Такая операция называется хеджированием.
Зря вы так про Ассанжа. Термин — «изнасилование» в Шведском законодательстве и в нашем с вами, достаточно сильно различаются.
«В заявлении указано, что они были введены в заблуждение, потому что быстрая смена партнерши – это обман, а обман – это изнасилование. Кроме того, он не представил им справку из вендиспансера. Это тоже обман и изнасилование.»
«Анна Ардин (одна из „жертв“) читает в университете лекции на тему сексуальных домогательств. Она не только теоретик, но и применяет свои знания на практике. Во время ее лекции один из студентов просматривал свой конспект. Она обратилась с жалобой на сексуальные домогательства, потому что, не обращая на нее должного внимания, студент дискриминировал ее как женщину и использовал прием «подавление женщины своим мужским превосходством». А это уже почти изнасилование и уж точно сексуальное домогательство. Студент попросил прощения. Тогда Ардин подала на него новое заявление о сексуальном домогательстве, потому что он пытался «умалить ее чувства и переживания, утверждая мужское превосходство».»
github.com/geometer/FBReader/tree/qt-mobile-zltree/zlibrary/ui/src/qml
вот, набросал недавно gui для FBReader'а на QtQuick, там же есть и настройки. правда стоит посмотреть на несколько ревизий назад, а то только что буквально переделал принятие настроек с нажатия на кнопку на выход из настроек (правда один фиг призыв на сохранение вызывается из qml кода), что больше соответствует Meego стилю
Во-первых, для R есть замечательная среда разработки — RStudio. Как и сам R доступна для всех трёх основных платформ, плюс есть серверная версия для работы через бразер. Преимущества — есть редактор файлов с подсветкой синтаксиса, список созданных объектов, графики и документация открываются в отдельной области, ну и в целом поприятней голой консоли.
Во-вторых, R во многом похож на Scheme, только с JavaScript-подобным синтаксисом и без макросов. Зато с такой же системой environment-ов, с такой же нежёсткой типизацией, символами (symbols) и выражениями (expressions) и т.д. Последние 2 фичи, кстати, позволяют решать многие из задач, решаемых в Лиспах за счёт макросов.
В-третьих, сразу стоит понимать, что R — язык с историей, т.е. многие его «странности» объясняются именно историческими причинами. Например, в R есть сразу 2 системы объектно-ориентированного программирования — S3 и S4 (про их отличия был вопрос на StackOverflow). При этом нельзя сказать, что одна система вляется устаревшей — отнюдь, обе используются довольно часто. Историческими же причинами объясняется и отсутствие единой конвенции кода: изначально в R было принято писать всё маленькими буквами и разделять слова точками ("." в R — вполне законный символ в имени, так же, как "_" в Си, например). Но потом пришла S3, в которой точка использовалась при диспетчеризации методов объектов, и имена функций с точками стали не очень очевидными.
В-четвёртых, типизация в R может поначалу сломать мозг. В R у каждого объекта есть как минимум 2 атрибута типа — mode и class (их можно узнать с помощью одноимённых функций — mode() и class()). Грубо говоря, class — это тип самого объекта (например, matrix или table), а mode — это тип примитивов, хранимых в объекте (например, numeric или character). При этом numeric, integer, character и т.д. — это не число, целое и чар, как это принято в других языках, а вектор этих значений. И даже `5` — это не просто число, а вектор из одно элемента. В общем, что касается типов, в R всё очень и очень необычно :)
В-пятых, в R обращение к данным производится посредствам индексации. Например, к пятому элементу (привет, Мила Йовович) вектора `x` можно обратиться как `x[5]`. Но у вектора также может быть атрибут `names`, и тогда к тому же элементу можно обратиться, например, `x[«fifth_element»]`. Кроме оператора `[ ]` есть оператор `[[ ]]` (в основном используется для поиска по спискам — lists) и оператор `$`, который работает только для обращения через имя элемента, но и то не для всех типов. Так что не удивляйтесь, а внимательно читайте документацию и/или туториалы.
Кроме того, обратите внимание, что у любого объекта кроме основного значения может быть любое количество атрибутов. Например, class и mode — это просто атрибуты объекта (которые, кстати, можно перезаписывать). Часто можно встретить и такие атрибуты как dim, names/dimnames и др.
В-шестых, R использует pass-by-promise механизм. Для тех, кто незнаком с ленивыми вычислениями поясню: в функцию передаётся не сам объект, а специальная «обёртка», которая «обещает» вычислить объект, когда он понадобится. Впрочем, данные во внутренних структурах R преобразуются настолько часто, что эффект ленивых вычислений практически незаметен и в целом механизм становится похож на pass-by-value.
Основные типы данных, на которые сразу надо обратить внимание:
* векторы (numeric, character) — на них строится всё. Пример создания числового вектора: `c(1, 2, 3, 4)`
* списки (list) — то же самое, но может хранить элементы любого типа
* матрицы и дейта фреймы (matrix и data.frama, соответственно) — для хранения двумерных данных. Матрицы быстрее и «легче», но могут хранить только один тип данных. Дейта фреймы просто удобней — в разных колонках можно хранить разные типы, плюс можно обращаться к колонкам по имени, плюс ещё несколько приятностей. Про сравнение матриц и дейта фреймов можно также почитать на StackOverflow.
* факторы (factor) — для представления категориальных данных. Например, есть у вас данные о нарушениях ПДД с колонкой «цвет сфетофора», которые могут принимать всего три значения — green, yellow и red. Вы можете создать фактор с тремя «уровнями» (не спрашивайте почему такие названия — это что-то из глубоких понятий статистики):
factor(«green», c(«green», «yellow», «red»))
[1] green
Levels: green yellow red
[1] green — [одномерный] строковый вектор green — значение вектора
Levels: green yellow red — уровни фактора
* выражения (expressions) — обычно вводятся с помощью символа тильды (~). Например, если вы видите выражение `z ~ x + log(y)`, это значит, что мы задаём зависимость переменной `z` от `x` и `y` как сумму первого и логарифм от второго. Смотрите примеры, будет понятней.
Топ-10 функций R, которые лучше выучить сразу:
mode
class
print
summary
attributes и attr
apply и sapply
plot
library и install.package
dim
[], [[]], $
Приятного изучения :)
На русском языке материал есть, хотя его не так много как на английском. Лучшее из русского — www.inp.nsk.su/~baldin/DataAnalysis/index.html Особенно должно быть хорошо для введения в анализ данных с помощью R.
Ну и ещё в голову приходят почти классические уже материалы Шипунова herba.msu.ru/shipunov/software/r/r-ru.htm
Спасибо за обзор и изложенный опыт.
Пример.
Строительная компания строит дом. Договор на строительство подписан, сумма по нему, скажем 1 млн. рублей.
Для строительства нужен цемент. Причем не весь сразу, а разных количествах на разные этапы строительства.
Скажем, всего цемента надо купить 30 тонн, что в текущих ценах на момент подписания договора составляло 500 тыс., на зарплату строителям уйдет 400 тыс., на прибыть компании — все что осталось.
А теперь представьте, что через месяц после начала строительства цемент подорожал на 30%, а его еще надо 20 тонн. В итоге дебет с кредитом не сходятся, надо идти к заказчику и просить его перезаключить договор строительства на новых условиях. А если заказчик не согласится бабла добавить? Остается только банкротиться и судиться с заказчиком.
Фьючерс позволяет уравновесить обязательства, выраженные в цементе, требованиями, выраженными в деньгах. Для этого надо купить фьючерс на 30 тонн цемента и при каждой поставке цемента на стройку уменьшать объем фьючерсной позиции на величину поставки. Такая операция называется хеджированием.
«В заявлении указано, что они были введены в заблуждение, потому что быстрая смена партнерши – это обман, а обман – это изнасилование. Кроме того, он не представил им справку из вендиспансера. Это тоже обман и изнасилование.»
«Анна Ардин (одна из „жертв“) читает в университете лекции на тему сексуальных домогательств. Она не только теоретик, но и применяет свои знания на практике. Во время ее лекции один из студентов просматривал свой конспект. Она обратилась с жалобой на сексуальные домогательства, потому что, не обращая на нее должного внимания, студент дискриминировал ее как женщину и использовал прием «подавление женщины своим мужским превосходством». А это уже почти изнасилование и уж точно сексуальное домогательство. Студент попросил прощения. Тогда Ардин подала на него новое заявление о сексуальном домогательстве, потому что он пытался «умалить ее чувства и переживания, утверждая мужское превосходство».»
landc.ru/photos/evp.fon
вот, набросал недавно gui для FBReader'а на QtQuick, там же есть и настройки. правда стоит посмотреть на несколько ревизий назад, а то только что буквально переделал принятие настроек с нажатия на кнопку на выход из настроек (правда один фиг призыв на сохранение вызывается из qml кода), что больше соответствует Meego стилю
Тут и сервера от Level3, Cisco и других: