通过行名和列名访问矩阵,如果不可用,return 为零

access matrix by rownames and colnames, and return zero if not available

我有一个包含行名和列名的矩阵:

a = matrix(1:4,2,2)
dimnames(a) = list(c("x","y"),c("x","y"))

我可以通过行名和列名访问矩阵元素,例如,

a["x","y"]

当我键入 a["x","z"] 时,它给我一个错误“a["x", "z"] 中的错误:下标越界",这应该是。

我的问题是如何得到零而不是那个错误。更准确地说,当我输入不在行名(a)或列名(a)中的错误行名或列名时,它 returns 一个固定值,例如零。例如,零表示 a["x","z"], a["z","t"], ...

我们可以用 purrr 中的 tryCatchpossibly 包装来实现这一点

library(purrr)
f1 <- possibly(function(mat, indx1, indx2) mat[indx1, indx2], otherwise = 0)
f1(a, 'x', 'z')
#[1] 0

f1(a, 'x', 'y')
#[1] 3

您可以使用 match 来确保返回 NA

a[match("x",rownames(a)), match("y",colnames(a))]
#[1] 3

a[match("x",rownames(a)), match("z",colnames(a))]
#[1] NA

将其包装在 tryCatch 中。没有使用包:

tryCatch(a["x", "y"], error = function(e) 0)
## [1] 3

tryCatch(a["x", "w"], error = function(e) 0)
## [1] 0