| % 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} |