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"]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 elementsdel( "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) # FALSEclear(h)is.empty(h) # TRUEh <- 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) # lettersnames(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