Семинар 3: условные конструкции, циклы, функции

Задача 1

Напишите код, который запрашивает у пользователя его имя и фамилию и если оно совпадает Вашим, выводит на экран “Hello, [name][surname], welcome to R! I missed you”, если не совпадает, то выводит на экран “Sorry, R is not available now”. Подразумевается, что R знает Ваше имя (при желании можете написать функцию, которая вытаскивает Ваше имя пользователя на компьютере и сравнивает с ним).

Примечание: на семинаре мы написали более вредную программу, которая в случае несовпадения имени и фамилии с желаемым, пытается завершить рабочую сессию R через quit():

inp <- readline("Enter your name and surname: ")
info <- unlist(strsplit(inp, split = " "))
name <- info[1]
surname <- info[2]

user_name <- "Alla"
user_surname <- "Tambovtseva"

if (name == user_name & surname == user_surname){
  print(sprintf("Hello, %s %s. Welcome to R. I missed you.", name, surname))
}else{
  quit()
} 

Задача 2

Напишите код, который сохраняет число, которое ввел пользователь с клавиатуры (предполагается, что пользователь вводит только числа, причем в правильном формате — в качестве разделителя использует точку), в переменную x и если x является целым числом, то выводит на экран сообщение “It is an integer.”, а если x не является таковым, то выводит “It is not an integer”.

# решение 1
x <- as.numeric(readline("Enter a number: "))
if (x %% 1 == 0){
  print("It is an integer.")}else{
  print("It is not an integer.")
}
# решение 2
x <- as.numeric(readline("Enter a number: "))
if (as.numeric(x) == as.integer(x)){
  print("It is an integer.")}else{
  print("It is not an integer.")
}

Задача 3

Напишите код, который запрашивает у пользователя число элементов вектора (“Enter number of elements:”), сохраняет его в переменную n и создает вектор заданной длины, состоящий из пропущенных значений.

n <- as.numeric(readline("Enter number of elements: "))
vec <- rep(NA, n)
vec  

Задача 4

Напишите код, который запрашивает у пользователя число элементов вектора (“Enter number of elements:”), сохраняет его в переменную n и создает вектор заданной длины, состоящий из пропущенных значений. Дальше, если индекс элемента четный, то этот элемент заменяется на 1, если нечетный - на 0.

n <- as.numeric(readline("Enter number of elements: "))
vec <- rep(NA, n)

for (i in 1:n){
  if (i %% 2 == 0){
    vec[i] <- 1
  }else{
    vec[i] <- 0
  }
}
vec

Задача 5

Напишите код, который запрашивает у пользователя размерность матрицы (предполагается, что пользователь вводит число строк и столбцов через пробел), сохраняет их и создает единичную матрицу заданной размерности. Если невозможно создать единичную матрицу заданной размерности, на экран выводится сообщение “Impossible to create an identity matrix with such dimensions.”.

Подсказка: единичная матрица - квадратная матрица (число строк равно числу столбцов), на главной диагонали которой стоят 1, а все остальные элементы равны 0. Пример:

[1 0 0]
[0 1 0]
[0 0 1]
dims <- unlist(strsplit(readline("Enter nrow and ncol: "), " "))
nrows <- as.integer(dims[1])
ncols <- as.integer(dims[2])

if (nrows != ncols){
  print("Impossible to create an identity matrix with such dimensions.")
}else{
M <- matrix(0, nrows, ncols)
diag(M) <- 1}

M

Задача 6

Напишите функцию, которая принимает на вход числовой вектор и возвращает вектор, состоящий из квадратов элементов вектора, поданного на вход. Можете для определенности назвать функцию get_squares().

get_squares <- function(w){
  return(w ** 2)
}

get_squares(c(-1, 4, -8, 0))
## [1]  1 16 64  0

Задача 7

Напишите функцию smart_squares(), которая принимает на вход вектор, и если он числовой, то возвращает вектор из квадратов его элементов, а если нет — возвращает вектор из пропущенных значений и выводит на экран сообщение “Your vector is not numeric.”

smart_squares <- function(w){
  if (class(w) != "character"){
    res <- w ** 2
  }else{
    print("Your vector is not numeric.")
    res <- rep(NA, length(w))
  }
  return(res)
}

smart_squares(c(-1, 6, 7))
## [1]  1 36 49
smart_squares(c("a", "b"))
## [1] "Your vector is not numeric."
## [1] NA NA