如何在 R 的 apply 中取消类型转换(bit64 示例)

2023-12-10

我在一些 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) and print(x)给出不正确的 (或至少)意外的答案(FALSE 和不正确的浮点值)。 我可以通过直接索引向量来规避这个问题c但我有 两个问题:

  1. 为什么要进行类型转换? R 在这种情况下使用了一些规则吗?
  2. 有什么方法可以避免这种类型转换吗?

TIA.


这是代码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

From 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。可能值得提出功能请求...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 R 的 apply 中取消类型转换(bit64 示例) 的相关文章

随机推荐