在函数内将 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
有效地将 m
从 integer
强制转换为 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)))
给定 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
有效地将 m
从 integer
强制转换为 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)))