當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R hashtab 哈希表(實驗)


R語言 hashtab 位於 utils 包(package)。

說明

創建和操作可變哈希表。

用法

hashtab(type = c("identical", "address"), size)
gethash(h, key, nomatch = NULL)
sethash(h, key, value)
remhash(h, key)
numhash(h)
typhash(h)
maphash(h, FUN)
clrhash(h)
is.hashtab(x)
## S3 method for class 'hashtab'
h[[key, nomatch = NULL, ...]]
## S3 replacement method for class 'hashtab'
h[[key, ...]] <- value
## S3 method for class 'hashtab'
print(x, ...)
## S3 method for class 'hashtab'
format(x, ...)
## S3 method for class 'hashtab'
length(x)
## S3 method for class 'hashtab'
str(object, ...)

參數

type

character 指定哈希表類型的字符串。

size

指定預期條目數的整數。

h , object

一個哈希表。

key

一個R用作鍵的對象。

nomatch

如果 key 不匹配則返回值。

value

key 關聯的新值。

FUN

包含兩個參數(鍵和值)的 function,用於為每個條目調用。

x

要測試、打印或格式化的對象。

...

附加參數。

細節

哈希表是一種用於有效地將鍵與值關聯起來的數據結構。哈希表與 environment 類似,但鍵可以是任意對象。與環境類似,但與 R 中的命名列表和大多數其他對象不同,哈希表是可變的,即修改時不會複製它們,而賦值意味著隻是為同一對象賦予新名稱。

新的哈希表由 hashtab 創建。有兩種可用變體:如果鍵是identical()(type = "identical",默認值),或者它們在內存中的地址相等(type = "address"),則可以認為鍵匹配。默認的 "identical" 類型幾乎總是正確的選擇。 size 參數提供了設置初始哈希表大小的提示。如果需要,哈希表將會增長,但指定預期大小可能會更有效。

gethash 返回與 key 關聯的值。如果表中不存在key,則返回nomatch 的值。

sethash 添加新的鍵/值關聯或更改現有鍵的當前值。 remhash 刪除 key 的條目(如果有)。

maphash 使用兩個參數(條目鍵和條目值)為哈希表中的每個條目調用 FUN。處理條目的順序是不可預測的。 FUN 在表中添加條目或從表中刪除條目的結果也是不可預測的,除非刪除當前正在處理的條目將達到預期的效果。

clrhash 從哈希表中刪除所有條目。

hashtab 返回指定的 type 的新哈希表。

gethash 返回與 key 關聯的值,如果沒有這樣的值,則返回 nomatch

sethash 以不可見方式返回value

如果找到並刪除了 key 的條目,則 remhash 會無形地返回 TRUE;如果未找到條目,則會返回 FALSE

numhash 返回表中當前的條目數。

typhash 返回指定哈希表類型的字符串,為 "identical""address" 之一。

maphashclrhash 不可見地返回NULL

注意

接口設計鬆散地基於 Common Lisp 中的哈希表支持。

"identical" 哈希表使用的哈希函數和相等性測試與 duplicatedunique 內部使用的相同,但有兩個異常:

  • 比較閉包時,不會忽略閉包環境。這對應於使用 ignore.environment = FALSE 調用 identical() ,這是 identical() 的默認設置。

  • 外部指針對象作為引用對象進行比較,對應於調用 identical()extptr.as.ref = TRUE 。這確保了帶有包含外部指針的鍵的哈希表在序列化和反序列化時表現得合理。

作為實驗性函數,元素運算符[[還可以用於獲取或設置哈希表條目,並且length可以用於獲取條目數。目前尚不清楚這是否是一個好主意。

例子

## Create a new empty hash table.
h1 <- hashtab()
## IGNORE_RDIFF_BEGIN
h1
## IGNORE_RDIFF_END

## Add some key/value pairs.
sethash(h1, NULL, 1)
sethash(h1, .GlobalEnv, 2)
for (i in seq_along(LETTERS)) sethash(h1, LETTERS[i], i)

## Look up values for some keys.
gethash(h1, NULL)
gethash(h1, .GlobalEnv)
gethash(h1, "Q")

## Remove an entry.
(remhash(h1, NULL))
gethash(h1, NULL)
(remhash(h1, "XYZ"))

## Using the element operator.
h1[["ABC"]]
h1[["ABC", nomatch = 77]]
h1[["ABC"]] <- "DEF"
h1[["ABC"]]

## Integers and real numbers that are equal are considered different
## (not identical) as keys:
identical(3, 3L)
sethash(h1, 3L, "DEF")
gethash(h1, 3L)
gethash(h1, 3)

## Two variables can refer to the same hash table.
h2 <- h1
identical(h1, h2)
## set in one, see in the "other"  <==> really one object with 2 names
sethash(h2, NULL, 77)
gethash(h1, NULL)
## IGNORE_RDIFF_BEGIN
str(h1)
## IGNORE_RDIFF_END

## An example of using  maphash():  get all hashkeys of a hash table:
hashkeys <- function(h) {
  val <- vector("list", numhash(h))
  idx <- 0
  maphash(h, function(k, v) { idx <<- idx + 1
                              val[idx] <<- list(k) })
  val
}

## IGNORE_RDIFF_BEGIN
kList <- hashkeys(h1)
str(kList) # the *order* is "arbitrary" & cannot be "known"
## IGNORE_RDIFF_END

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Hash Tables (Experimental)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。