原始向量的等价物

Jer*_*oen 3 r cran

是否有一个等同substringraw在载体R

假设我有一个大的二进制原始向量x,例如使用读取文件的结果readBin.现在我常常grepRaw在原始向量中找到我想要访问的一些片段的索引.玩具示例:

x <- charToRaw("foobar");
n <- 2;
m <- 5;
Run Code Online (Sandbox Code Playgroud)

现在我想从位置2和5中提取"子串".本地方法是:

x[n:m]
Run Code Online (Sandbox Code Playgroud)

然而,这对于大片段来说很难缩放,因为R首先创建一个大向量n:m,然后迭代这个向量以x逐个从这些索引中提取元素.是否有更原生的方法来提取raw矢量的一部分,类似于substr字符矢量?我不认为我可以使用,rawToChar因为文件可能包含非文本二进制数据.

Mar*_*gan 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;
")
Run Code Online (Sandbox Code Playgroud)

关于缺少健全性检查的常见警告(例如,i,j标量而非NA,i> 0; j <= length(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 
Run Code Online (Sandbox Code Playgroud)

subraw(xx, 10L, 9L)回报raw(0).