blob: fe61910fcaedc89375d9b55be856de50def01ce2 [file] [log] [blame]
% File src/library/utils/man/hashtab.Rd
% Part of the R package, https://www.R-project.org
% Copyright 2009-2021 R Core Team
% Distributed under GPL 2 or later
\name{hashtab}
\title{Hash Tables (Experimental)}
\alias{hashtab}
\alias{gethash}
\alias{sethash}
\alias{remhash}
\alias{numhash}
\alias{typhash}
\alias{maphash}
\alias{clrhash}
\alias{is.hashtab}
\alias{[[.hashtab}
\alias{[[<-.hashtab}
\alias{print.hashtab}
\alias{format.hashtab}
\alias{length.hashtab}
\alias{str.hashtab}
\description{
Create and manipulate mutable hash tables.
}
\usage{
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)
\method{[[}{hashtab}(h, key, nomatch = NULL, \dots)
\method{[[}{hashtab}(h, key, \dots) <- value
\method{print}{hashtab}(x, \dots)
\method{format}{hashtab}(x, \dots)
\method{length}{hashtab}(x)
\method{str}{hashtab}(object, \dots)
}
\arguments{
\item{type}{\code{\link{character}} string specifying the hash table type.}
\item{size}{an integer specifying the expected number of entries.}
\item{h, object}{a hash table.}
\item{key}{an \R object to use as a key.}
\item{nomatch}{value to return if \code{key} does not match.}
\item{value}{new value to associate with \code{key}.}
\item{FUN}{a \code{\link{function}} of two arguments, the key and the value, to call
for each entry.}
\item{x}{object to be tested, printed, or formatted.}
\item{\dots}{additional arguments.}
}
\details{
Hash tables are a data structure for efficiently associating keys with
values. Hash tables are similar to \code{\link{environment}}s, but
keys can be arbitrary objects. Like environments, and unlike named
lists and most other objects in R, hash tables are mutable, i.e., they
are \emph{not} copied when modified and assignment means just giving a
new name to the same object.
New hash tables are created by \code{hashtab}. Two variants are
available: keys can be considered to match if they are
\code{\link{identical}()} (\code{type = "identical"}, the default), or
if their addresses in memory are equal (\code{type = "address"}). The
default \code{"identical"} type is almost always the right choice.
The \code{size} argument provides a hint for setting the initial
hash table size. The hash table will grow if necessary, but specifying
an expected size can be more efficient.
\code{gethash} returns the value associated with \code{key}. If
\code{key} is not present in the table, then the value of
\code{nomatch} is returned.
\code{sethash} adds a new key/value association or changes the current
value for an existing key. \code{remhash} removes the entry for
\code{key}, if there is one.
\code{maphash} calls \code{FUN} for each entry in the hash table with
two arguments, the entry key and the entry value. The order in which
the entries are processed is not predictable. The consequence of
\code{FUN} adding entries to the table or deleting entries from the
table is also not predictable, except that removing the entry
currently being processed will have the desired effect.
\code{clrhash} removes all entries from the hash table.
}
\value{
\code{hashtab} returns a new hash table of the specified \code{type}.
\code{gethash} returns the value associated with \code{key}, or
\code{nomatch} if there is no such value.
\code{sethash} returns \code{value} invisibly.
\code{remhash} invisibly returns \code{TRUE} if an entry for
\code{key} was found and removed, and \code{FALSE} if no entry was
found.
\code{numhash} returns the current number of entries in the table.
\code{typhash} returns a character string specifying the type of the
hash table, one of \code{"identical"} or \code{"address"}.
\code{maphash} and \code{clrhash} return \code{NULL} invisibly.
}
\section{Notes}{
The interface design is based loosely on hash table support in Common
Lisp.
The hash function and equality test used for \code{"identical"} hash
tables are the same as the ones used internally by
\code{\link{duplicated}} and \code{\link{unique}}, with two
exceptions:
\itemize{
\item{Closure environments are not ignored when comparing closures.
This corresponds to calling \code{\link{identical}()} with
\code{ignore.environment = FALSE}, which is the default for
\code{\link{identical}()}.}
\item{External pointer objects are compared as reference objects,
corresponding to calling \code{\link{identical}()} with
\code{extptr.as.ref = TRUE}. This ensures that hash tables with
keys containing external pointers behave reasonably when
serialized and unserialized.}
}
As an experimental feature, the element operator \code{[[} can also be
used get or set hash table entries, and \code{length} can be used to
obtain the number of entries. It is not yet clear whether this is a
good idea.
}
\examples{
## Create a new empty hash table.
h1 <- hashtab()
h1
## 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)
str(h1)
## 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
}
\keyword{data}
\keyword{programming}
\keyword{utilities}