我有一个矩阵,行名和列名分别为:
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)或colnames(a)中的列名时,它将返回一个固定值,例如零。例如,对于a [“ x”,“ z”],a [“ z”,“ t”],...,为零。
答案 0 :(得分:2)
将其包装在tryCatch
中。不使用任何软件包:
tryCatch(a["x", "y"], error = function(e) 0)
## [1] 3
tryCatch(a["x", "w"], error = function(e) 0)
## [1] 0
答案 1 :(得分:1)
我们可以用tryCatch
中的possibly
或purrr
包装以实现此目的
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
答案 2 :(得分:1)
您可以使用match
来确保返回NA
:
a[match("x",rownames(a)), match("y",colnames(a))]
#[1] 3
a[match("x",rownames(a)), match("z",colnames(a))]
#[1] NA