еквівалент піктону в R


83

Я хочу зробити еквівалент dict python у R. В основному, у python я маю:

visited = {}

if atom_count not in visited:
  Do stuff
  visited[atom_count] = 1

Ідея полягає в тому, що якщо я побачив цю конкретну кількість_атомів, я відвідав [кількість_атомів] = 1. Таким чином, якщо я знову бачу цю кількість_атомів, я не "робити речі". Atom_Count - ціле число.

Дякую!


5
Подивіться пакет R hashз його майже подібними до Python функціями доступу.
Ганс В.

@Chase, який коштував би O (n). Доступ до елемента Dict є постійним.
anilbey

Відповіді:


74

Найближче до dict dict в R просто перелік. Як і більшість типів даних R, списки можуть мати атрибут names, який може дозволити спискам діяти як набір пар ім'я-значення:

> l <- list(a = 1,b = "foo",c = 1:5)
> l
$a
[1] 1

$b
[1] "foo"

$c
[1] 1 2 3 4 5

> l[['c']]
[1] 1 2 3 4 5
> l[['b']]
[1] "foo"

Тепер щодо звичайного застереження: вони не зовсім однакові; будуть розбіжності. Тож ви запросите розчарування, щоб спробувати буквально використовувати списки саме так, як ви могли б використовувати dict в python.


як ви можете програмно переглядати такий список? наївний, l$names(l)[1]очевидно, зазнає невдачі. я також не зміг l[which()]
приступити

@MikePalmice Окрім forциклу, який є свого роду варіантом майже в усіх мовах навколо, є lapply. Є також пов’язані речі з різним синтаксисом, наприклад Map, і цілий пакет, який мурчить для багатьох функціональних програмних матеріалів.
Джоран

@MikePalmice, я думаю, це l[[names(l)[1]]має спрацювати. У будь-якому випадку, ви можете просто повторити так: l[[1]]без використання імен. Зверніть увагу, що одинарні дужки []повернуть список, тоді як подвійні дужки [[]]повернуть об’єкт усередині списку.
Javi_VM

1
вау, така проста річ іншими мовами складна в г? Скажімо, у мене є рядок, що міститься у змінній. Якщо я намагаюся зробити це ключем, він просто вибирає ім'я змінної як ім'я ключа замість значення змінної.
wondim

1
@wondim Ви можете встановити імена елемента списку з змінного с names(list) <- vector_of names, subsetted призначення робіт , а також, names(list)[1] <- "foo". Дивіться також setNames().
Джоран,

5

Я вважаю, що використання хеш-таблиці (створення нового середовища) може бути рішенням вашої проблеми. Я набрав би, як це зробити, але я щойно зробив це вчора на talkstats.com.

Якщо ваш словник великий і має лише дві колонки, то це може бути правильним шляхом. Ось посилання на ланцюжок обговорень із зразком коду R:

ХАШ ТАБЛИЦЯ ПОСИЛАННЯ


Примітка data.tableі власні іменовані векторні пошуки R значно збільшились із цього часу.
Тайлер Рінкер,

5

Якщо, як у вашому випадку, ви просто хочете, щоб у вашому "словнику" зберігалися значення того самого типу, ви можете просто використати вектор і назвати кожен елемент.

> l <- c(a = 1, b = 7, f = 2)
> l
a b f 
1 7 2

Якщо ви хочете отримати доступ до "клавіш", використовуйте names.

> names(l)
[1] "a" "b" "f"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.