64 位 - 如何在 R 的应用中取消类型转换(bit64 示例)



我在某些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)})

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

  1. 为什么要进行类型转换?在这种情况下,他们的某些规则R是否使用?
  2. 有什么方法可以避免这种类型的转换吗?

蒂亚。

这是lapply的代码:

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

现在检查这个:

!is.vector(v)
#TRUE
as.list(v)
#[[1]]
#[1] 4.940656e-324
#
#[[2]]
#[1] 9.881313e-324
#
#[[3]]
#[1] 1.482197e-323

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

包作者应考虑编写一个as.list的方法。可能值得一个功能请求...