Не знаете, что такое списки в R?

Я имею опыт работы с Python, но для работы мне нужно изучить R, и меня смущают списки.

Я понимаю, что именованные списки могут (примерно) эквивалентны словарям Python, и я могу искать элементы по индексу, используя example_list[[1]] или example_list$name, если знаю имя ключа.

example_list <- list(a=1, b=3, c = "d", f=list(1:4))

example_list$C#"d"
example_list$f #[[1]] [1] 1 2 3 4
example_list$f[[1]] # [1] 1 2 3 4
example_list[["f"]][[1]][[1]] # [1] 1

Когда я играл, я заметил, что чтобы получить «1» от f, мне пришлось использовать [[1]] дважды? Я ожидал, что f будет [1, 2, 3, 4], но кажется [[1,2,3,4]], я правильно понимаю?

Привет, вы создали список внутри списка, который называется «f». Попробуйте f=c(1:4)

flaviomcosta 10.07.2024 00:01

@flaviomcosta c() совершенно не нужен. f=1:4 было бы хорошо.

MrFlick 10.07.2024 00:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Имейте в виду различие в R между списками и векторами. В R 1:4 — вектор. list(1:4) — список длины 1, содержащий вектор длины 4. as.list(1:4) — список длины 4, где каждый элемент содержит вектор длины 1.

Рассмотрите эти альтернативы

example_list <- list(a=1, b=3, c = "d", f=1:4)
example_list[["f"]][1]
# [1] 1
example_list$f[1]
# [1] 1

или

example_list <- list(a=1, b=3, c = "d", f=as.list(1:4))
example_list$f[[1]]
# [1] 1
example_list[["f"]][[1]]
# [1] 1

или

example_list <- list(a=1, b=3, c = "d", f=list(1,2,3,4))
example_list$f[[1]]
# [1] 1
example_list[["f"]][[1]]
# [1] 1

В вашем случае вы добавили дополнительный уровень вложенности с помощью вызова list(), который вы обычно не используете, если просто сохраняете вектор. list(1:4) отличается от list(1,2,3,4)

Если так будет проще понять, вы также можете взглянуть на представление JSON, чтобы увидеть дополнительный уровень вложенности.

example_list <- list(a=1, b=3, c = "d", f=list(1:4))
jsonlite::toJSON(example_list, auto_unbox = TRUE)
# {"a":1,"b":3,"c":"d","f":[[1,2,3,4]]} 

@MrFlick дает хорошее объяснение деталей (хотя у меня есть один недостаток ниже). Добавлю немного (надеюсь) полезной информации.

В R вы используете [[ ]] для извлечения элемента и [ ] для подмножества вектора. Оператор $ — это версия [[ ]] с некоторыми синтаксическими отличиями.

Итак, с помощью example_list <- list(a=1, b=3, c = "d", f=1:4) вы можете прочитать свои выражения следующим образом:

example_list$c           # Extract the element named c
example_list$f           # Extract the element named f
example_list$f[[1]]      # Extract the first element of the element named f 

# and finally,

example_list[["f"]][[1]][[1]] 
# Extract the first element of the first element of the element named f

Моя единственная придирка к ответу @MrFlick - это когда он говорит, что существует «различие между списками и векторами». Списки — это своего рода вектор, элементами которого являются объекты R. Другие виды векторов содержат такие вещи, как числа или строки.

Вы можете использовать оператор подмножества [ ] для векторов любого типа, включая списки. Например:

example_list[1:2]    # The first two elements of the list
                     # returned as a list with two elements

x <- c("a", "b", "c")
x[1:2]               # The first two elements of x
                     # returned as a character vector with two elements

Вы также можете использовать [[ ]] для других векторов, но это не очень полезно. Для пример

x[[1]]

извлекает первую строку из x, но поскольку R не позволяет иметь строки вне вектора, он помещает результат в новый вектор символов длиной 1. В итоге вы получите тот же результат, что и x[1], хотя мышление отличается.

Другие вопросы по теме