如何在R的apply中使类型转换无效(bit64示例)

use*_*561 3 64-bit r sapply

我在一些R代码中使用bit64包.我创建了一个64位整数的向量,然后尝试sapply用来迭代向量中的这些整数.这是一个例子:

v = c(as.integer64(1), as.integer64(2), as.integer64(3))
sapply(v, function(x){is.integer64(x)})
sapply(v, function(x){print(x)})
Run Code Online (Sandbox Code Playgroud)

无论是is.integer64(x)print(x)给出不正确的(或至少)意外的答案(FALSE和不正确的浮点值).我可以通过直接索引向量来绕过这个c但我有两个问题:

  1. 为什么类型转换?他们的某些规则R是否在这种情况下使用?
  2. 任何人都可以避免这种类型的转换?

TIA.

Rol*_*and 5

这是代码lapply:

function (X, FUN, ...) 
{
    FUN <- match.fun(FUN)
    if (!is.vector(X) || is.object(X)) 
        X <- as.list(X)
    .Internal(lapply(X, FUN))
}
Run Code Online (Sandbox Code Playgroud)

现在检查一下:

!is.vector(v)
#TRUE

as.list(v)
#[[1]]
#[1] 4.940656e-324
#
#[[2]]
#[1] 9.881313e-324
#
#[[3]]
#[1] 1.482197e-323
Run Code Online (Sandbox Code Playgroud)

来自help("as.list"):

除非参数已经是列表或表达式,否则可以删除属性.

因此,要么从头开始创建列表,要么添加类属性:

v_list <- lapply(as.list(v), function(x) {
  class(x) <- "integer64"
  x
  })

sapply(v_list, function(x){is.integer64(x)})
#[1] TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)

程序包authours应该考虑编写一个方法as.list.可能值得一个功能请求......