# Ввод-вывод и обработка текста — краткий справочник > Неочевидное поведение, подводные камни и непростые значения по умолчанию функций R. > Только то, чего Claude ещё не знает. --- ## read.table (подводные камни) - `sep = ""` (по умолчанию) означает **любой пробельный символ** (пробелы, табуляции, переводы строк), а не буквальную пустую строку. - `comment.char = "#"` по умолчанию — строки с `#` усекаются. Для отключения используйте `comment.char = ""` (это также быстрее). - Автоопределение `header`: устанавливается TRUE, если в первой строке **на одно поле меньше**, чем в последующих (предполагается, что недостающее поле — имена строк). - `colClasses = "NULL"` полностью **пропускает** этот столбец — очень полезно для скорости. - Значения по умолчанию `read.csv` отличаются от `read.table`: `header = TRUE`, `sep = ","`, `fill = TRUE`, `comment.char = ""`. - Для больших файлов: указание `colClasses` и `nrows` резко уменьшает использование памяти. `read.table` медленна для широких фреймов данных (сотни столбцов); используйте `scan` или `data.table::fread` для матриц. - `stringsAsFactors = FALSE` начиная с R 4.0.0 (раньше было TRUE). --- ## write.table (подводные камни) - `row.names = TRUE` по умолчанию — создаёт безымянный первый столбец, мешающий повторному чтению. Используйте `row.names = FALSE` или `col.names = NA` для CSV, совместимого с Excel. - `write.csv` фиксирует `sep = ","`, `dec = "."` и использует `qmethod = "double"` — переопределить их через `...` нельзя. - `quote = TRUE` (по умолчанию) заключает символьные/факторные столбцы в кавычки. Числовые столбцы никогда не заключаются в кавычки. - Матрицеподобные столбцы во фреймах данных незаметно разворачиваются в несколько столбцов. - Медленна для фреймов данных с большим числом столбцов (сотни и больше); каждый столбец обрабатывается отдельно в соответствии с классом. --- ## read.fwf - Читает файлы с полями фиксированной ширины. `widths` — вектор ширин полей. - **Отрицательные значения ширины пропускают** соответствующее число символов (полезно для игнорирования полей). - `buffersize` управляет числом строк, читаемых за один раз; увеличивайте для больших файлов. - Внутри использует `read.table` после разделения полей. --- ## count.fields - Подсчитывает поля в каждой строке файла — полезно для диагностики ошибок чтения. - Аргументы `sep` и `quote` соответствуют аргументам `read.table`. --- ## grep / grepl / sub / gsub (подводные камни) - Три режима регулярных выражений: расширенный POSIX (по умолчанию), `perl = TRUE`, `fixed = TRUE`. В крайних случаях ведут себя по-разному. - **Явно именуйте аргументы** — безымянные аргументы после `x`/`pattern` позиционно сопоставляются с `ignore.case`, `perl` и т. д. Частый источник незаметных ошибок. - `sub` заменяет только **первое** совпадение; `gsub` заменяет **все** совпадения. - Обратные ссылки: `"\\1"` в замене (двойной обратный слеш в строках R). С `perl = TRUE`: `"\\U\\1"` для преобразования в верхний регистр. - `grep(value = TRUE)` возвращает совпавшие **элементы**; `grep(value = FALSE)` (по умолчанию) возвращает **индексы**. - `grepl` возвращает логический вектор — предпочтительна для фильтрации. - `regexpr` возвращает позицию первого совпадения + длину (как атрибуты); `gregexpr` возвращает все совпадения списком. - `regexec` возвращает позиции совпадения + захватывающих групп; `gregexec` делает это для всех совпадений. - Классы символов наподобие `[:alpha:]` в режиме POSIX должны находиться внутри `[[:alpha:]]` (двойные скобки). --- ## strsplit - Возвращает **список** (один элемент на каждую входную строку), даже для единственной строки. - `split = ""` или `split = character(0)` разбивает на отдельные символы. - Совпадение в начале строки: первый элемент результата — `""`. Совпадение в конце: завершающего `""` нет. - `fixed = TRUE` работает быстрее и исключает интерпретацию как регулярного выражения. - Частая ошибка: безымянные аргументы незаметно сопоставляются с `fixed`, `perl` и т. д. --- ## substr / substring - `substr(x, start, stop)`: извлекает/заменяет подстроку. Индексация с 1, обе границы включаются. - `substring(x, first, last)`: то же, но `last` по умолчанию равно `1000000L` (фактически «до конца»). Векторизована по `first`/`last`. - Форма присваивания: `substr(x, 1, 3) <- "abc"` выполняет замену непосредственно в объекте (замена должна иметь ту же длину). --- ## trimws - `which = "both"` (по умолчанию), `"left"` или `"right"`. - `whitespace = "[ \\t\\r\\n]"` — настраиваемое регулярное выражение, определяющее, что считать пробельным символом. --- ## nchar - `type = "bytes"` считает байты; `type = "chars"` (по умолчанию) считает символы; `type = "width"` считает ширину отображения. - `nchar(NA)` возвращает `NA` (не 2). `nchar(factor)` работает с метками уровней. - `keepNA = TRUE` (по умолчанию с R 3.3.0); задайте `FALSE`, чтобы считать `"NA"` двумя символами. --- ## format / formatC - `format(x, digits, nsmall)`: `nsmall` задаёт минимальное число знаков после десятичного разделителя. `big.mark = ","` добавляет разделитель тысяч. - `formatC(x, format = "f", digits = 2)`: форматирование в стиле C. `format = "e"` — научная запись, `"g"` — общий формат. - `format` возвращает символьный вектор; по умолчанию всегда выравнивает вправо (`justify = "right"`). --- ## type.convert - Преобразует символьные векторы в подходящие типы (логический, целочисленный, double, комплексный, символьный). - `as.is = TRUE` (рекомендуется): сохраняет символьные данные символьными, а не факторами. - Применяется по столбцам фреймов данных. `tryLogical = TRUE` (R 4.3+) преобразует столбцы "TRUE"/"FALSE". --- ## Rscript - `commandArgs(trailingOnly = TRUE)` получает аргументы скрипта (без флагов R/Rscript). - Строка `#!` в Unix: `/usr/bin/env Rscript` или полный путь. - `--vanilla` или `--no-init-file` — для пропуска загрузки `.Rprofile`. - Код выхода: `quit(status = 1)` для завершения с ошибкой. --- ## capture.output - Перехватывает вывод `cat`, `print` или любого выражения, записывающего в stdout. - `file = NULL` (по умолчанию) возвращает символьный вектор. `file = "out.txt"` записывает непосредственно в файл. - `type = "message"` вместо этого перехватывает stderr. --- ## URLencode / URLdecode - `URLencode(url, reserved = FALSE)` по умолчанию НЕ кодирует зарезервированные символы (`/`, `?`, `&` и т. д.). - Задайте `reserved = TRUE` для кодирования **компонента** URL (значения параметра запроса). --- ## glob2rx - Преобразует glob-шаблоны оболочки в регулярные выражения: `glob2rx("*.csv")` → `"^.*\\.csv$"`. - Полезно вместе с `list.files(pattern = glob2rx("data_*.RDS"))`.