我正在使用R并且需要创建用于检查矩阵尺寸是否为3x3的代码。我使用if()
检查nrow
和ncol
,但仍然使用正确的代码。任何帮助或建议都非常感谢。
localSmoother <- function(myMatrix = matrix(),
smoothingMatrix = matrix(1, nrow = 3, ncol = 3))
{
if(class(smoothingMatrix) != "matrix") stop ("smoothingMatrix must be a matrix.")
if(ncol(smoothingMatrix) != "3" & if(nrow(smoothingMatrix) != "3")
stop ("smoothingMatrix must have dimensions of 3x3")
print(myMatrix) # see what myMatrix is.
print(smoothingMatrix) # see what smoothingMatrix is.
return(matrix(, nrow = 3, ncol = 3))
}
# # TEST the CODE:
localSmoother(myMatrix = diag(x = 2, nrow = 5, ncol = 5), smoothingMatrix = matrix(2, nrow = 5, ncol = 3))
# # Error in localSmoother(myMatrix = diag(x = 2, nrow = 5, ncol = 5), smoothingMatrix = matrix(2, :
# # smoothingMatrix must be 3x3
答案 0 :(得分:2)
大多数情况下,您的条件中有两个if
。你应该只有一个。
if(ncol(smoothingMatrix) != "3" & if(nrow(smoothingMatrix) != "3")
## should be
if(ncol(smoothingMatrix) != "3" & nrow(smoothingMatrix) != "3")
接下来,您的逻辑询问行数何时不是3 和列数不是3.此条件按预期工作(返回TRUE并跟随{{中的stop语句1}}阻止)如果您的维度为if
,但如果您的维度为c(5,4)
则会失败。
c(5,3)
我会使用以下等效行之一:
x <- matrix(1:20,nrow=5)
dim(x)
# [1] 5 4
ncol(x) != "3" & nrow(x) != "3"
# [1] TRUE
x <- matrix(1:12,nrow=3)
dim(x)
# [1] 3 4
ncol(x) != "3" & nrow(x) != "3"
# [1] FALSE
注意两件事:
if(!(ncol(smoothingMatrix) == 3 && nrow(smoothingMatrix) == 3))
## is the same as
if(ncol(smoothingMatrix) != 3 || nrow(smoothingMatrix) != 3)
和&&
而不是向量化运算符||
和&
。试试|
与c(TRUE, FALSE) & TRUE
。c(TRUE, FALSE) && TRUE
而不是字符3
。 R会将这个数字强制转换为一个角色,所以相等测试在这里工作,但在其他情况下它可能会让你失望。可能更容易比较矩阵的维度:
"3"
(if(!isTRUE(all.equal(dim(smoothingMatrix),c(3L,3L))))
是必需的,因为isTRUE
会返回all.equal
或描述差异的字符向量。请注意TRUE
不会返回all.equal(1,0)
而是返回FALSE
描述差异的字符向量。if
周围的任何all.equal
语句如果相等不成立则会抛出错误。)
all.equal(1,0)
# [1] "Mean relative difference: 1"
if(all.equal(1,0)) print(TRUE)
# Error in if (all.equal(1, 0)) print(TRUE) :
# argument is not interpretable as logical
答案 1 :(得分:1)
@Blue Magister的回答非常好,解释很好,先去那里。
对于您的特定任务,您可能会发现stopifnot
函数很有用。来自?stopifnot
stopifnot(...)
如果...中的任何表达式都不是TRUE,则调用stop,产生一条错误消息,指出......的第一个元素不是真的。
您的代码可能是
stopifnot(is.matrix(smoothingMatrix),
ncol(smoothingMatrix) == 3,
nrow(smoothingMatrix) == 3)
缺点是错误消息的帮助有点小,好处是你不必自己编写它们,而且代码很好而且干净。