我很难使用低级别API (特别是函数)使用hdf5文件中的rhdf5将字符串写入组。
这是我的数据:
# strings
v <- c("val1", "val2", "cat", "dog")我希望这个向量v存在于一个名为“元数据”的hdf5组中。在这里,我尝试将这个一维char数组写入文件:
filename <- '/tmp/test.hdf5'
if(file.exists(filename)) {
file.remove(filename)
}
h5createFile(filename)
fid <- H5Fcreate(filename)
g2 <- H5Gcreate(fid, "/metadata")
dtype <- "H5T_C_S1"
sid <- H5Screate_simple(NROW(v))
g <- H5Dcreate(g2, "v", dtype, sid)
H5Dwrite(g, v, h5spaceMem = sid, h5spaceFile = sid)
H5Dclose(g)
H5Sclose(sid)
h5closeAll()但当我读到:
> h5read(filename,"/metadata/", bit64conversion="bit64")
$v
[1] "" "" "" ""完全是空白的。维度和类型都是正确的,但是没有内容。
您可以看到它/那里/但我不能提取数据:
> h5ls(filename, all=TRUE)
group name ltype corder_valid corder cset otype
0 / metadata H5L_TYPE_HARD FALSE 0 0 H5I_GROUP
1 /metadata v H5L_TYPE_HARD FALSE 0 0 H5I_DATASET
num_attrs dclass dtype stype rank dim maxdim
0 0 0
1 0 STRING H5T_STRING SIMPLE 1 4 4我可以用hdf5 /读取/ rhdf5文件,也可以在python中使用h5py写/写,这样我就知道机器是用正确的二进制文件设置的,用于hdf5访问。但是,我不能用R写hdf5字符向量,我做错了什么呢?
发布于 2019-12-01 11:10:12
为什么不直接做这样的事:
if(file.exists(filename)) {
file.remove(filename)
}
h5createFile(filename)
h5createGroup(file = filename, group = "/metadata")
h5write(file = filename, obj = v, name = "/metadata/v")
h5closeAll()
h5ls(filename)
h5read(file = filename, name = "/metadata/v")发布于 2022-06-07 15:16:47
这里的问题是,对于"H5T_C_S1"数据类型,您必须设置它要保存的字符串的长度。你可以通过:
tid <- H5Tcopy("H5T_C_S1")
H5Tset_size(tid, size = 4)另一种选择是使用允许可变长度字符串的size = NULL。这两个选项之间的区别将在手册页中对h5createDataset()函数进行更详细的讨论。
为了完整起见,这里使用{rhdf5}写入并读取数据集。
library(rhdf5)
v <- c("val1", "val2", "cat", "dog")
filename <- tempfile(fileext = ".h5")
fid <- H5Fcreate(filename)
g2 <- H5Gcreate(fid, "/metadata")
## create a string datatype
tid <- H5Tcopy("H5T_C_S1")
## set a fixed size that accommodates all the strings to be written
H5Tset_size(tid, size = 4)
sid <- H5Screate_simple(NROW(v))
g <- H5Dcreate(g2, "v", dtype_id = tid, sid)
H5Dwrite(g, v, h5spaceMem = sid, h5spaceFile = sid)
h5closeAll()
h5read(filename, name = "/metadata/")
#> $v
#> [1] "val1" "val2" "cat" "dog"https://stackoverflow.com/questions/59123506
复制相似问题