В R для вывода сообщения на экран есть две функции: print()
и cat()
. С print()
мы уже знакомы:
print(2)
## [1] 2
print("Welcome to R")
## [1] "Welcome to R"
Как можно заметить, когда с помощью print()
на экран выводится текст, он печатается в кавычках. При желании это можно изменить, добавив аргумент quote
:
print("Welcome to R", quote = FALSE)
## [1] Welcome to R
А что делает cat()
? Тоже выводит сообщение на экран, только сразу без кавычек:
cat("Welcome to R")
## Welcome to R
Видно, что cat()
при печати к тому же не выводит номер строки. Но это все мелочи. В чем состоит принципиальное отличие print()
от cat()
? Во-первых, cat()
, в отличие от print()
, умеет “склеивать” то, что мы подаем ему на вход. Сравним:
print(2, 3, 4) # выводится только первый элемент
## [1] 2
cat(2, 3, 4) # выводятся все три элемента
## 2 3 4
Во-вторых, cat()
умеет работать только с одномерными объектами (те, что называются в R atomic objects), а print()
может вывести на экран что угодно.
Оба работают:
vec <- c(2, 3, 4)
cat(vec)
## 2 3 4
print(vec)
## [1] 2 3 4
Здесь cat
выводит что-то не то:
m <- matrix(nrow = 2, ncol = 3, 3)
cat(m)
## 3 3 3 3 3 3
print(m)
## [,1] [,2] [,3]
## [1,] 3 3 3
## [2,] 3 3 3
А здесь cat
просто ломается:
l <- list(c(1, 2, 3), c(0, 1))
# cat(l)
print(l)
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [1] 0 1
В-третьих, cat()
просто выводит объект на экран, не сохраняя информацию о нем, а print()
сохраняет тип объекта:
class(cat(vec)) # тип NULL
## 2 3 4
## [1] "NULL"
class(print(vec)) # тип numeric, как у самого вектора
## [1] 2 3 4
## [1] "numeric"
Как быть, если мы хотим вывести некоторый текст и значение переменной? Для этого можем использовать cat()
, потому что он умеет “склеивать” записи:
name <- "Ann"
cat("Your name is", name)
## Your name is Ann
А если мы хотим, чтобы переменная была где-то внутри текста? Для этого есть функция sprintf()
:
name <- "Ann"
age <- 25
print(sprintf("Your name is %s. Your age is %i", name, age))
## [1] "Your name is Ann. Your age is 25"
В то место, куда мы хотим добавить значение переменной, мы вписываем знак %
и сокращенное название типа это переменной: s
для строк (string), i
- для целочисленных (integer), f
- для чисел с плавающей точкой (float). У чисел с плавающей точкой можно контролировать число знаков после запятой:
height <- 125.768
print(sprintf("Your height is %f.", height)) # по умолчанию 6 знаков
## [1] "Your height is 125.768000."
print(sprintf("Your height is %.3f.", height)) # три знака
## [1] "Your height is 125.768."
print(sprintf("Your height is %.2f.", height)) # два знака (округляется)
## [1] "Your height is 125.77."
И теперь, чтобы оживить лекцию, обсудим ввод с клавиатуры. Как быть, если мы хотим запрашивать информацию у пользователя, а затем ее использовать? Для этого есть функция readline()
. Чтобы понять, как она работает, проще всего посмотреть на пример:
input <- readline(prompt = "Enter something: ") # вводим число 45 в консоль
## Enter something:
input
## [1] ""
Число, которое мы ввели с клавиатуры в консоль, сохранилось в переменную input
. Но есть проблема: R не понимает, что перед ним число:
class(input)
## [1] "character"
Но исправлять такие вещи мы умеем.
as.integer(input)
## [1] NA
А что делать, если введено сразу несколько элементов, например несколько чисел через пробел?
inputs <- readline(prompt = "Enter something: ") # 2 3 4
## Enter something:
inputs
## [1] ""
Воспользуемся функцией strsplit
, которую мы когда-то обсуждали, и разобьем получившуюся строку по пробелу:
l <- strsplit(inputs, " ") # пока список (list)
v <- unlist(l) # теперь вектор
v <- as.numeric(v) # сделаем числовым
Для того, чтобы в R осуществлял различные действия в зависимости от того, выполняется ли определенное условие или нет, понадобятся операторы условия: if
и else
. Например, мы сохраняем в R оценку по курсу и хотим, чтобы он выводил на экран “Good!” и “You are genious!”, если она больше 5 и “Bad!” во всех остальных случаях.
mark <- 6
if (mark > 5){
print("Good!")
print("You are genious!")
}else print("Bad!")
## [1] "Good!"
## [1] "You are genious!"
Само условие записывается в круглых скобках, то, что R должен сделать в случае, если условие выполняется, – в фигурных.
Если в случае выполнения условия R должен сделать что-то, что умещается в одну строчку кода, фигурные скобки можно опустить (и вообще все записать в одну строчку):
if (mark > 5) print("Good!") else print("Bad!")
## [1] "Good!"
Часть кода с else
не является обязательной: если требуется что-то сделать только с случае выполнения условия, else
можно совсем опустить.
mark <- 3
if (mark > 5) print("Good!") # просто ничего не происходит
Иногда мы сталкиваемся с необходимостью использовать множественные условия (например, какие-то два условия должны выполняться одновременно). Для этого потребуются те же символы, которые используются в логических выражениях (&, |).
mark <- 7
if (mark < 4) print("Bad.") else {
if (mark >= 4 & mark < 6) print("Not bad.")
if (mark >= 6 & mark < 8) print("Good.")
if (mark >= 8) print("Excellent.")}
## [1] "Good."
mark <- 10
if (mark == 8 | mark == 9 | mark == 10) print("Excellent.") # хотя бы одно условие выполняется
## [1] "Excellent."