# Разные утилиты — краткий справочник > Неочевидное поведение, подводные камни и непростые значения по умолчанию функций R. > Только то, чего Claude ещё не знает. --- ## do.call - `do.call(fun, args_list)` — `args` должен быть **списком**, даже для одного аргумента. - `quote = TRUE` предотвращает вычисление аргументов перед вызовом — необходимо при передаче выражений/символов. - Поведение `substitute` внутри `do.call` отличается от прямых вызовов. Семантика для этого случая определена не полностью. - Полезный шаблон: `do.call(rbind, list_of_dfs)` для объединения списка фреймов данных. --- ## Reduce / Filter / Map / Find / Position Вспомогательные функции функционального программирования из базового R — действительно неочевидные. - `Reduce(f, x)` применяет бинарную функцию `f` накопительно: `Reduce("+", 1:4)` = `((1+2)+3)+4`. Направление важно для некоммутативных операций. - `Reduce(f, x, accumulate = TRUE)` возвращает все промежуточные результаты — эквивалент Python `itertools.accumulate`. - `Reduce(f, x, right = TRUE)` выполняет свёртку справа: `f(x1, f(x2, f(x3, x4)))`. - `Reduce` с `init` добавляет начальное значение: `Reduce(f, x, init = v)` = `f(f(f(v, x1), x2), x3)`. - `Filter(f, x)` сохраняет элементы, для которых `f(elem)` равно `TRUE`. В отличие от `x[sapply(x, f)]`, корректно обрабатывает `NULL`/пустые значения. - `Map(f, ...)` — простая обёртка над `mapply(f, ..., SIMPLIFY = FALSE)` — всегда возвращает список. - `Find(f, x)` возвращает **первый** элемент, для которого `f(elem)` равно `TRUE`. `Find(f, x, right = TRUE)` — для последнего. - `Position(f, x)` возвращает **индекс** первого совпадения (как `Find`, но возвращает позицию, а не значение). --- ## lengths - `lengths(x)` возвращает длину **каждого элемента** списка. Эквивалентна `sapply(x, length)`, но быстрее (реализована на C). - Работает с любым спископодобным объектом. Возвращает целочисленный вектор. --- ## conditions (tryCatch / withCallingHandlers) - `tryCatch` **разматывает** стек вызовов — обработчик выполняется в вызывающем окружении, а не там, где возникла ошибка. Возобновить выполнение невозможно. - `withCallingHandlers` НЕ разматывает стек — обработчик выполняется там, где было сигнализировано условие. Можно исследовать/записать его в журнал, а затем позволить условию распространяться дальше. - `tryCatch(expr, error = function(e) e)` возвращает объект условия ошибки. - `tryCatch(expr, warning = function(w) {...})` перехватывает **первое** предупреждение и завершает выполнение. Используйте `withCallingHandlers` + `invokeRestart("muffleWarning")`, чтобы подавить предупреждения, но продолжить работу. - Блок `finally` в `tryCatch` выполняется всегда (как try/finally в Java). - `globalCallingHandlers()` регистрирует обработчики, действующие в течение сессии (полезно для журналирования). - Пользовательские условия: `stop(errorCondition("msg", class = "myError"))`, затем перехват через `tryCatch(..., myError = function(e) ...)`. --- ## all.equal - Проверяет **приблизительное равенство** с допуском (по умолчанию `1.5e-8`, то есть `sqrt(.Machine$double.eps)`). - Возвращает `TRUE` или **символьную строку**, описывающую различие, — НЕ `FALSE`. В условиях используйте `isTRUE(all.equal(x, y))`. - Аргумент `tolerance` управляет числовым допуском. `scale` — абсолютным или относительным сравнением. - Проверяет атрибуты, имена, размерности — тщательнее, чем `==`. --- ## combn - `combn(n, m)` или `combn(x, m)`: генерирует все сочетания из `m` элементов `x`. - Возвращает **матрицу** с `m` строками; каждый столбец — одно сочетание. - Аргумент `FUN` применяет функцию к каждому сочетанию: `combn(5, 3, sum)` возвращает суммы всех подмножеств из 3 элементов. - `simplify = FALSE` возвращает список вместо матрицы. --- ## modifyList - `modifyList(x, val)` заменяет элементы списка `x` элементами из `val` по **имени**. - Установка значения `NULL` **удаляет** соответствующий элемент из списка. - **Действительно** добавляет новые имена, отсутствующие в `x`, — внутри используется `x[names(val)] <- val`, поэтому любое имя из `val` добавляется или заменяется. --- ## relist - Обратная операция к `unlist`: по плоскому вектору и списку-скелету восстанавливает вложенную структуру. - `relist(flesh, skeleton)` — `flesh` содержит плоские данные, `skeleton` задаёт форму. - Работает с факторами, матрицами и вложенными списками. --- ## txtProgressBar - `txtProgressBar(min, max, style = 3)` — стиль 3 показывает процент + полосу (самый полезный). - Обновление через `setTxtProgressBar(pb, value)`. Закрытие через `close(pb)`. - Стиль 1: вращающийся `|/-\`, стиль 2: простой индикатор прогресса. Только стиль 3 показывает процент. --- ## object.size - Возвращает **оценку** памяти, занимаемой объектом. Не всегда точна при общих ссылках. - `format(object.size(x), units = "MB")` — для человекочитаемого вывода. - Не учитывает размер окружений или внешних указателей. --- ## installed.packages / update.packages - `installed.packages()` может работать медленно (сканирует все пакеты). Используйте `find.package()` или `requireNamespace()` для проверки конкретного пакета. - `update.packages(ask = FALSE)` обновляет все пакеты без запросов. - `lib.loc` указывает, какую библиотеку проверять/обновлять. --- ## vignette / demo - `vignette()` перечисляет все виньетки; `vignette("name", package = "pkg")` открывает конкретную. - `demo()` перечисляет все демонстрации; `demo("topic")` запускает одну интерактивно. - `browseVignettes()` открывает HTML-браузер виньеток. --- ## Временные ряды: acf / arima / ts / stl / decompose - `ts(data, start, frequency)`: `frequency` — число наблюдений на единицу времени (12 для ежемесячных, 4 для ежеквартальных). - Для `acf` по умолчанию `type = "correlation"`. Используйте `type = "partial"` для PACF. `plot = FALSE` подавляет автоматическое построение графика. - `arima(x, order = c(p,d,q))` — для моделей ARIMA. `seasonal = list(order = c(P,D,Q), period = S)` — для сезонной компоненты. - `arima` обрабатывает значения `NA` во временном ряду (через фильтр Калмана). - `stl` требует `s.window` (сезонное окно) — его нужно указать, значения по умолчанию нет. `s.window = "periodic"` предполагает фиксированную сезонность. - `decompose`: проще, чем `stl`, использует скользящие средние. `type = "additive"` или `"multiplicative"`. - Компоненты результата `stl`: матрица `$time.series` со столбцами `seasonal`, `trend`, `remainder`.