R Language
Чтение и запись строк
Поиск…
замечания
Связанные документы:
Печать и отображение строк
R имеет несколько встроенных функций, которые могут использоваться для печати или отображения информации, но print
и cat
являются самыми основными. Поскольку R - интерпретируемый язык , вы можете попробовать их прямо в консоли R:
print("Hello World")
#[1] "Hello World"
cat("Hello World\n")
#Hello World
Обратите внимание на разницу в обоих входах и выходах для двух функций. (Примечание: в значении x
созданных с помощью x <- "Hello World"
, нет никаких котировочных символов. Они добавляются print
на выходном этапе.)
cat
принимает один или несколько векторов символов в качестве аргументов и выводит их на консоль. Если вектор символов имеет длину больше 1, аргументы разделяются пробелом (по умолчанию):
cat(c("hello", "world", "\n"))
#hello world
Без символа новой строки ( \n
) вывод будет следующим:
cat("Hello World")
#Hello World>
Приглашение для следующей команды появляется сразу после выхода. (Некоторые консоли, такие как RStudio, могут автоматически добавлять новую строку к строкам, которые не заканчиваются новой линией.)
print
является примером «общей» функции, что означает, что класс первого переданного аргумента обнаружен, и для вывода используется метод класса. Для символьного вектора, такого как "Hello World"
, результат аналогичен выходу cat
. Однако символьная строка цитируется, а число [1]
выводится, чтобы указать первый элемент символьного вектора (в этом случае - первый и единственный элемент):
print("Hello World")
#[1] "Hello World"
Этот метод печати по умолчанию также является тем, что мы видим, когда просто запрашиваем R для печати переменной. Обратите внимание, как вывод ввода s
совпадает с выводом print(s)
или print("Hello World")
:
s <- "Hello World"
s
#[1] "Hello World"
Или даже не присваивая его чему-либо:
"Hello World"
#[1] "Hello World"
Если мы добавим еще одну символьную строку в качестве второго элемента вектора (используя функцию c()
чтобы c онкатировал элементы вместе), то поведение print()
выглядит немного иначе, чем поведение cat
:
print(c("Hello World", "Here I am."))
#[1] "Hello World" "Here I am."
Обратите внимание, что функция c()
не выполняет конкатенацию строк. (Для этой цели нужно использовать paste
.) R показывает, что вектор символов имеет два элемента, цитируя их отдельно. Если у нас есть вектор, достаточно длинный, чтобы охватить несколько строк, R будет печатать индекс элемента, начинающегося с каждой строки, точно так же, как он печатает [1]
в начале первой строки.
c("Hello World", "Here I am!", "This next string is really long.")
#[1] "Hello World" "Here I am!"
#[3] "This next string is really long."
Конкретное поведение print
зависит от класса объекта, переданного функции.
Если мы вызываем print
объекта с другим классом, например «числовой» или «логический», кавычки опускаются с вывода, чтобы указать, что мы имеем дело с объектом, который не является символьным классом:
print(1)
#[1] 1
print(TRUE)
#[1] TRUE
Факторные объекты печатаются так же, как символьные переменные, которые часто создают неоднозначность, когда вывод консоли используется для отображения объектов в телах вопросов SO. Редко использовать cat
или print
за исключением интерактивного контекста. Явный вызов print()
особенно редок (если вы не хотите подавить внешний вид кавычек или просмотреть объект, который возвращается как invisible
функцией), поскольку ввод foo
на консоли является ярлыком для print(foo)
. Интерактивная консоль R известна как REPL, «read-eval-print-loop». Функция cat
лучше всего сохраняется для специальных целей (например, запись вывода в открытое подключение к файлу). Иногда он используется внутри функций (когда вызовы print()
подавляются), однако использование функции cat()
внутри функции для генерации вывода на консоль является плохой практикой . Предпочтительным методом является message()
или warning()
для промежуточных сообщений; они ведут себя аналогично cat
но могут быть необязательно подавлены конечным пользователем. Конечный результат должен быть просто возвращен, чтобы пользователь мог назначить его, если необходимо, сохранить его.
message("hello world")
#hello world
suppressMessages(message("hello world"))
Чтение или запись в файл
Не всегда у нас есть свобода чтения или записи на локальный системный путь. Например, если R-stream streaming map-reduce необходимо читать и записывать в соединение с файлом. Могут быть и другие сценарии, где вы выходите за пределы локальной системы, и с появлением облака и больших данных это становится все более распространенным явлением. Один из способов сделать это - в логической последовательности.
Установите соединение с file()
для чтения с помощью команды file()
(«r» для режима чтения):
conn <- file("/path/example.data", "r") #when file is in local system
conn1 <- file("stdin", "r") #when just standard input/output for files are available
Поскольку это установит только подключение к файлу, можно прочитать данные из этих подключений файлов следующим образом:
line <- readLines(conn, n=1, warn=FALSE)
Здесь мы читаем данные из файла подключение conn
построчно , как n=1
. можно изменить значение n
(например, 10, 20 и т. д.) для чтения блоков данных для более быстрого считывания (10 или 20 строк, считанных за один раз). Чтобы прочитать полный файл за один раз, установите n=-1
.
После обработки данных или выполнения модели; можно вернуть результаты обратно к подключению к файлу, используя множество разных команд, таких как writeLines(),cat()
и т. д., которые способны записывать в соединение с файлом. Однако все эти команды будут использовать соединение с файлом, установленное для записи. Это можно сделать с помощью команды file()
:
conn2 <- file("/path/result.data", "w") #when file is in local system
conn3 <- file("stdout", "w") #when just standard input/output for files are available
Затем напишите данные следующим образом:
writeLines("text",conn2, sep = "\n")
Захват вывода команды операционной системы
Функции, возвращающие вектор символов
База R
имеет две функции для вызова системной команды. Оба требуют дополнительный параметр для захвата вывода системной команды.
system("top -a -b -n 1", intern = TRUE)
system2("top", "-a -b -n 1", stdout = TRUE)
Оба возвращают вектор символов.
[1] "top - 08:52:03 up 70 days, 15:09, 0 users, load average: 0.00, 0.00, 0.00"
[2] "Tasks: 125 total, 1 running, 124 sleeping, 0 stopped, 0 zombie"
[3] "Cpu(s): 0.9%us, 0.3%sy, 0.0%ni, 98.7%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st"
[4] "Mem: 12194312k total, 3613292k used, 8581020k free, 216940k buffers"
[5] "Swap: 12582908k total, 2334156k used, 10248752k free, 1682340k cached"
[6] ""
[7] " PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND "
[8] "11300 root 20 0 1278m 375m 3696 S 0.0 3.2 124:40.92 trala "
[9] " 6093 user1 20 0 1817m 269m 1888 S 0.0 2.3 12:17.96 R "
[10] " 4949 user2 20 0 1917m 214m 1888 S 0.0 1.8 11:16.73 R "
Для иллюстрации используется команда
top -a -b -n 1
команды UNIX. Это спецификация ОС и, возможно, ее необходимо изменить, чтобы запустить примеры на вашем компьютере.
Пакет devtools
имеет функцию для запуска системной команды и записи вывода без дополнительного параметра. Он также возвращает вектор символов.
devtools::system_output("top", "-a -b -n 1")
Функции, которые возвращают кадр данных
Функция fread
в package data.table
позволяет выполнить команду оболочки и прочитать вывод, например read.table
. Он возвращает data.table
или data.frame
.
fread("top -a -b -n 1", check.names = TRUE)
PID USER PR NI VIRT RES SHR S X.CPU X.MEM TIME. COMMAND
1: 11300 root 20 0 1278m 375m 3696 S 0 3.2 124:40.92 trala
2: 6093 user1 20 0 1817m 269m 1888 S 0 2.3 12:18.56 R
3: 4949 user2 20 0 1917m 214m 1888 S 0 1.8 11:17.33 R
4: 7922 user3 20 0 3094m 131m 1892 S 0 1.1 21:04.95 R
Обратите внимание, что fread
автоматически пропускает верхние 6 строк заголовка.
Здесь был добавлен параметр
check.names = TRUE
для преобразования%CPU
,%MEN
иTIME+
в синтаксически допустимые имена столбцов.