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