3

中是否有substringforraw向量的等价物R

假设我有一个大的二进制原始向量x,例如使用readBin. 现在我过去常常grepRaw在我想访问的原始向量中找到一些片段的索引。一个玩具例子:

x <- charToRaw("foobar");
n <- 2;
m <- 5;

现在我想从位置 2 和 5 中提取“子字符串”。这样做的本机方法是:

x[n:m]

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

4

1 回答 1

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 <= 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 

subraw(xx, 10L, 9L)返回raw(0)

于 2013-06-14T05:09:23.157 回答