substring
中的raw
向量是否等同R
?
假设我有一个大的二进制原始向量x
,例如使用readBin
读取文件的结果。现在我使用grepRaw
来查找我想要访问的原始向量中的某个片段的索引。玩具示例:
x <- charToRaw("foobar");
n <- 2;
m <- 5;
现在我想提取&#34; substring&#34;从第2和第5位开始。这样做的原生方式是:
x[n:m]
然而,这对于大片段来说很难缩放,因为R首先创建一个大的向量n:m
,然后迭代这个向量以逐一从这些索引中提取x
的元素。是否有更本地的方法来提取raw
向量的一部分,类似于substr
的字符向量?我不认为我可以使用rawToChar
因为文件可能包含非文本二进制数据。
答案 0 :(得分:5)
这是一个C实现
library(inline)
subraw <- cfunction(c(x="raw", i="integer", j="integer"), "
int n = INTEGER(j)[0] - INTEGER(i)[0] + 1;
SEXP result;
if (n < 0)
Rf_error(\"j < i - 1\");
result = Rf_allocVector(RAWSXP, n);
memcpy(RAW(result), RAW(x) + INTEGER(i)[0] - 1L, n);
return result;
")
关于缺少健全性检查的常见警告(例如,i,j标量而不是NA,i> 0; j <=长度(x)等)。在行动
> xx = readBin("~/bin/R-devel/lib/libR.so", raw(), 6000000)
> length(xx)
[1] 5706046
> length(subraw(xx, 1L, length(xx)))
[1] 5706046
> system.time(subraw(xx, 1L, length(xx)))
user system elapsed
0.000 0.000 0.001
subraw(xx, 10L, 9L)
返回raw(0)
。