Я имею опыт работы с 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]], я правильно понимаю?
@flaviomcosta c() совершенно не нужен. f=1:4 было бы хорошо.





Имейте в виду различие в 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], хотя мышление
отличается.
Привет, вы создали список внутри списка, который называется «f». Попробуйте f=c(1:4)