在函数内将 R 矩阵强制转换为 dgTMatrix

Coerce R matrix to dgTMatrix inside a function

给定 R 中的矩阵对象,很容易将其强制转换为三元组格式的稀疏矩阵:

library(Matrix)
m <- matrix(rbinom(100,1,0.5),10,10)
m <- as(1*m, "dgTMatrix")

但是,在 R 函数中执行此操作的正确方法是什么(即不附加 Matrix 库)?我知道 m <- Matrix::as(1*m, "dgTMatrix") 是不正确的,但我怀疑它会是这样的。

通常你会做这样的事情

if (requireNamespace("Matrix", quietly = TRUE))
    m <- as(m, "dgTMatrix")
else
    stop("package ", sQuote("Matrix"), " not found on library path")

根据需要加载包,而不附加它。这具有注册强制(和其他)方法而不使 Matrix 导出的所有对象对用户可用的效果。

如果您的函数是 Imports 中列出的 Matrix 的 R 包的一部分,那么您可以

m <- as(m, "dgTMatrix")

直接,没有requireNamespace。如果 Matrix 列在 Suggests 中,那么您需要像上面那样使用 requireNamespace。在这两种情况下,您都希望 Imports 包含包 methods 并且 NAMESPACE 包含指令 importFrom(methods, as).

切线地,请注意,您的 1*m 有效地将 minteger 强制转换为 double 是不必要的。强制方法对你有用:

selectMethod("coerce", c("matrix", "dgTMatrix"))
Method Definition:

function (from, to = "dgTMatrix", strict = TRUE) 
{
    x <- as.double(from)
    nz <- isN0(x)
    new("dgTMatrix", Dim = dim(from), Dimnames = .M.DN(from), 
        i = row(from)[nz] - 1L, j = col(from)[nz] - 1L, x = x[nz])
}
<bytecode: 0x1079ded68>
<environment: namespace:Matrix>

Signatures:
        from     to         
target  "matrix" "dgTMatrix"
defined "matrix" "dgTMatrix"

为了在将成为 R 包一部分的函数中使用,我认为这应该可行:

m <- matrix(rbinom(100,1,0.5),10,10)
m_ <- Matrix::spMatrix(nrow(m), 
                       ncol(m), 
                       i = which(m != 0, arr.ind = T)[,1], 
                       j = which(m != 0, arr.ind = T)[,2], 
                       x = rep(1,sum(m)))