Menu
Coddy logo textTech

Доступ к элементам списка

Часть раздела Основы путешествия по R на Coddy — урок 72 из 78.

Списки используют другой синтаксис для доступа к элементам по сравнению с векторами. Ключевое различие заключается в использовании одинарных скобок [ ] и двойных скобок [[ ]].

Двойные квадратные скобки извлекают сам элемент из списка:

my_list <- list(42, "hello", TRUE)
print(my_list[[1]])

Вывод:

[1] 42

Одинарные квадратные скобки возвращают подсписок, содержащий элемент, а не сам элемент:

my_list <- list(42, "hello", TRUE)
print(my_list[1])

Вывод:

[[1]]
[1] 42

Это различие имеет значение, когда вы хотите работать с самим значением. Если элемент списка является вектором, двойные скобки позволяют получить к нему прямой доступ, а затем использовать индексацию вектора:

my_list <- list(c(10, 20, 30), "text")
print(my_list[[1]][2])

Вывод:

[1] 20

Здесь my_list[[1]] извлекает вектор, а [2] обращается к его второму элементу. Помните: используйте [[ ]], когда вам нужно само содержимое, и [ ], когда вам нужен список меньшего размера.

challenge icon

Задание

Легко

Вы получите две строки входных данных:

  1. Три значения разных типов, разделенных запятыми (например, 100,hello,TRUE)
  2. Список чисел, разделенных запятыми, представляющий вектор, который должен быть сохранен как четвертый элемент (например, 5,10,15,20)

Выполните следующие операции:

  1. Создайте список из четырех элементов: числовое значение, текст, логическое значение и вектор чисел
  2. Используйте двойные скобки для извлечения и вывода второго элемента (текстового значения)
  3. Используйте одинарные скобки для извлечения третьего элемента и выведите результат (обратите внимание на разницу в формате вывода)
  4. Получите доступ к вектору, хранящемуся в четвертом элементе, используя двойные скобки, затем извлеките и выведите его третье значение, используя индексацию вектора
  5. Выведите сумму всех чисел в четвертом элементе (получите доступ к вектору с помощью двойных скобок и используйте sum())

Например, если входные данные:

42,world,FALSE
8,16,24,32,40

Вывод должен быть:

[1] "world"
[[1]]
[1] FALSE

[1] 24
[1] 120

Объяснение:

  • my_list[[2]] извлекает само текстовое значение: "world"
  • my_list[3] возвращает подсписок, содержащий FALSE (обратите внимание на [[1]] в выводе)
  • my_list[[4]][3] обращается к вектору, а затем получает его третий элемент: 24
  • sum(my_list[[4]]) вычисляет 8+16+24+32+40 = 120

Шпаргалка

Списки используют различный синтаксис скобок для доступа к элементам:

Двойные скобки [[ ]] извлекают сам элемент:

my_list <- list(42, "hello", TRUE)
print(my_list[[1]])  # Вывод: [1] 42

Одинарные скобки [ ] возвращают подсписок, содержащий элемент:

my_list <- list(42, "hello", TRUE)
print(my_list[1])  # Вывод: [[1]] [1] 42

Доступ к вложенным элементам: Используйте двойные скобки для извлечения вектора из списка, а затем используйте индексацию вектора:

my_list <- list(c(10, 20, 30), "text")
print(my_list[[1]][2])  # Вывод: [1] 20

Используйте [[ ]], когда вам нужно само содержимое, и [ ], когда вам нужен подсписок.

Попробуйте сами

# Чтение входных данных
con <- file("stdin", "r")
input1 <- suppressWarnings(readLines(con, n = 1))  # Первая строка: три значения, разделенные запятыми
input2 <- suppressWarnings(readLines(con, n = 1))  # Вторая строка: числа для вектора, разделенные запятыми
close(con)

# Разбор первой строки ввода на отдельные значения
values <- strsplit(input1, ",")[[1]]
numeric_val <- as.numeric(values[1])
text_val <- values[2]
logical_val <- as.logical(values[3])

# Разбор второй строки ввода в числовой вектор
vector_val <- as.numeric(strsplit(input2, ",")[[1]])

# TODO: Напишите ваш код ниже
# 1. Создайте список из четырех элементов: numeric_val, text_val, logical_val и vector_val
# 2. Используйте двойные скобки [[ ]], чтобы извлечь и вывести второй элемент
# 3. Используйте одинарные скобки [ ], чтобы извлечь третий элемент и вывести его
# 4. Обратитесь к четвертому элементу с помощью двойных скобок, затем извлеките его третье значение
# 5. Выведите сумму всех чисел в четвертом элементе
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы