# Даты и система — краткий справочник > Неочевидное поведение, подводные камни и непростые значения по умолчанию функций R. > Только то, чего Claude ещё не знает. --- ## Dates (класс Date) - Объекты `Date` хранятся как **целое число дней с 1970-01-01**. Арифметика выполняется в днях. - `Sys.Date()` возвращает текущую дату как объект Date. - `seq.Date(from, to, by = "month")` — приращения "month" могут создавать интервалы разной длины. Прибавление 1 месяца к 31 января даёт 3 марта (не 28 февраля). - `diff(dates)` возвращает объект `difftime` в днях. - `format(date, "%Y")` — год, `"%m"` — месяц, `"%d"` — день, `"%A"` — название дня недели (зависит от локали). - Годы до 1 года н. э. могут обрабатываться некорректно. - `length(date_vector) <- n` при увеличении длины дополняет вектор значениями `NA`. --- ## DateTimeClasses (POSIXct / POSIXlt) - `POSIXct`: секунды с 1970-01-01 UTC (компактный числовой вектор). - `POSIXlt`: список с компонентами `$sec`, `$min`, `$hour`, `$mday`, `$mon` (0–11!), `$year` (с 1900 года!), `$wday` (0–6, воскресенье=0), `$yday` (0–365). - Преобразование между POSIXct и Date: `as.Date(posixct_obj)` по умолчанию использует `tz = "UTC"` — может дать не ту дату, которую предполагали, если оригинал был в другом часовом поясе. - `Sys.time()` возвращает POSIXct в текущем часовом поясе. - `strptime` возвращает POSIXlt; для получения POSIXct используйте `as.POSIXct(strptime(...))`. - Арифметика `difftime`: вычитание объектов POSIXct даёт difftime. Единицы выбираются автоматически ("secs", "mins", "hours", "days", "weeks"). --- ## difftime - `difftime(time1, time2, units = "auto")` — автоматически выбирает наименьшую разумную единицу измерения. - Явные единицы: `"secs"`, `"mins"`, `"hours"`, `"days"`, `"weeks"`. Нет "months" или "years" (переменная длительность). - `as.numeric(diff, units = "hours")` извлекает числовое значение в заданных единицах. - `units(diff_obj) <- "hours"` меняет единицу непосредственно в объекте. --- ## system.time / proc.time - `system.time(expr)` возвращает время `user`, `system` и `elapsed`. - `gcFirst = TRUE` (по умолчанию): запускает сборку мусора перед замером для большей согласованности результатов. - `proc.time()` возвращает накопленное время с запуска R — для интервалов вычисляйте разности. - `elapsed` (реальное время по часам) может быть меньше `user` (многопоточный BLAS) или больше (ожидание ввода-вывода). --- ## Sys.sleep - `Sys.sleep(seconds)` — допускает дробные секунды. Фактическое ожидание может оказаться дольше (планирование ОС). - Во время ожидания процесс **уступает управление** ОС (не выполняет активное ожидание). --- ## options (ключевые параметры) Избранные неочевидные параметры: - `options(scipen = n)`: положительное значение смещает выбор к фиксированной записи, отрицательное — к научной. По умолчанию 0. Применяется к `print`/`format`/`cat`, но не к `sprintf`. - `options(digits = n)`: число значащих цифр при печати (1–22, по умолчанию 7). Только рекомендация. - `options(digits.secs = n)`: максимальное число десятичных знаков для секунд при форматировании времени (0–6, по умолчанию 0). - `options(warn = n)`: -1 = игнорировать предупреждения, 0 = собирать (по умолчанию), 1 = выводить сразу, 2 = преобразовывать в ошибки. - `options(error = recover)`: переход в отладчик при ошибке. `options(error = NULL)` сбрасывает к значению по умолчанию. - `options(OutDec = ",")`: меняет десятичный разделитель в выводе (влияет на `format`, `print`, НЕ на `sprintf`). - `options(stringsAsFactors = FALSE)`: глобальное значение по умолчанию для `data.frame` (неактуально с R 4.0.0, где оно уже FALSE). - `options(expressions = 5000)`: максимальное число вложенных вычислений. Увеличивайте для глубокой рекурсии. - `options(max.print = 99999)`: управляет усечением вывода `print`. - `options(na.action = "na.omit")`: обработка NA по умолчанию в функциях моделирования. - `options(contrasts = c("contr.treatment", "contr.poly"))`: контрасты по умолчанию для неупорядоченных/упорядоченных факторов. --- ## file.path / basename / dirname - `file.path("a", "b", "c.txt")` → `"a/b/c.txt"` (разделитель, соответствующий платформе). - `basename("/a/b/c.txt")` → `"c.txt"`. `dirname("/a/b/c.txt")` → `"/a/b"`. - `file.path` НЕ нормализует пути (не разрешает `..`); для этого используйте `normalizePath()`. --- ## list.files - `list.files(pattern = "*.csv")` — `pattern` является **регулярным выражением**, а не glob-шаблоном! Используйте `glob2rx("*.csv")` или `"\\.csv$"`. - `full.names = FALSE` (по умолчанию) возвращает только базовые имена. Для полных путей используйте `full.names = TRUE`. - `recursive = TRUE` — для поиска в подкаталогах. - `all.files = TRUE` — для включения скрытых файлов (начинающихся с `.`). --- ## file.info - Возвращает фрейм данных со столбцами `size`, `isdir`, `mode`, `mtime`, `ctime`, `atime`, `uid`, `gid`. - `mtime`: время изменения (POSIXct). Полезно использовать `file.info(f)$mtime`. - В некоторых файловых системах `ctime` — время изменения статуса, а не время создания. --- ## file_test - `file_test("-f", path)`: TRUE, если обычный файл существует. - `file_test("-d", path)`: TRUE, если каталог существует. - `file_test("-nt", f1, f2)`: TRUE, если f1 новее f2. - Надёжнее, чем `file.exists()`, для различения файлов и каталогов.