R语言hash

hash的好处,用过才知道

R语言hash实现也很方便

install.packages("hash")
library(hash)

我们载入hash包以后就可以进行hash赋值操作了,可以一对一,多对一和一对多,但如果键和值都大于一且长度不一样就会报错,hash的键是字符型,值不做要求

c<-hash(keys="p",values="a")
c<-hash(keys="p",values=c("a","b","c"))
c<-hash(keys="p",values=1:10)
hash( a=1, b=2, c=3 )

> c<-hash(keys=c("o","p"),values=c("a","c","b"))
Error in .set(h, ...) : Keys of length 2 do not match values of length 3

根据键取值我们可以这样操作

> c$p
[1] "a" "c" "b"
> c["p"]
<hash> containing 1 key-value pair(s).
  p : a c b
> c[["p"]]
[1] "a" "c" "b"
其实相当于命名的列表

我们也可以用 .set()函数来赋值,这个在循环中会用到

h <- hash()
.set( h, keys=letters, values=1:26 )
.set( h, a="foo", b="bar", c="baz" )
.set( h, c( aa="foo", ab="bar", ac="baz" ) )

 清除hash键值对对象用clear()函数,直接用rm()函数不能清理占用的内存

clear(x)

R语言赋值也和python一样是对内存位置的引用,如果我们想复制一个hash,复制后又不想和以前的对象有关联,我们就要用copy()函数,简单的赋值只相当于建立硬链接

h <- hash( a=1, b=2 )
h.new <- copy( h )

从hash中删除键值对

用法:
del(x,hash)
delete(x,hash)
例子:
h <- hash( letters, 1:26 )
h # 26 elements
del( "a", h )
h # 25 elements

判断建是否存在

用法:
has.key(key, hash, ...)
实例:
h <- hash( letters, 1:26 )
all( has.key( letters, h ) ) # TRUE

判断是否为hash对象

is.hash(x)

判断hash是否为空

h <- hash( a=1, b=2, c=3 )
is.empty(h) # FALSE
clear(h)
is.empty(h) # TRUE
h <- hash()
is.empty(h) # TRUE

 

将hash的键和值反向

h <- hash( a=1, b=1:2, c=1:3 )
invert(h)
inverted.hash( a=1, b=1:2, c=1:3 )

返回hash的键和值

h <- hash( letters, 1:26 )
返回键
keys(h) # letters
names(h) # same
返回值
values(h)
h <- hash( letters, 1:26 )
values(h) # 1:26
values(h, simplify = FALSE )
values(h, USE.NAMES = FALSE )
h <- hash( 1:26, letters )
values(h)
values(h, keys=1:5 )
values(h, keys=c(1,1,1:5) )
values(h, keys=1:5) <- 6:10
values(h) <- rev( letters

返回键值对的个数

h <- hash( letters, 1:26 )
length(h) # 26

将其他类型对象转为hash键对象

make.keys( letters )
make.keys( 1:26 )

 参考文献:

https://cran.r-project.org/web/packages/hash/hash.pdf

posted @ 2019-05-24 14:18  xlfj1205  阅读(2102)  评论(0编辑  收藏  举报