当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。