2013-03-13 242 views
1

所以我想创建一个if语句,如果列数大于1,那么它会对该矩阵进行多种形式的操作,并且如果该矩阵具有少于或等于1列它不会做分析。下面是一些代码:如果else语句在R

中号< - NxN矩阵

if (ncol(M) > 1) { 
     function1 
     function2 
     function3 
     ... 
} 
else {} 

然而,当我这样做我不断收到以下错误:

Error in if (ncol(M) > 1) { : argument is of length zero 
+8

听起来像M不是你想象的那样。在运行if/else块之前,发布'str(M)'的输出。 – Dason 2013-03-13 16:48:14

+1

为了安全起见,您还应该将'else'移动到与'if'上的右括号相同的行,以避免语法错误。 – joran 2013-03-13 16:50:26

+6

我想你可以通过子集化一些其他矩阵或data.frame'x'来创建'M'。如果确实使用'M < - x [,my.subset,drop = FALSE]',否则如果您只提取一列,则将M转换为向量。 – Backlin 2013-03-13 17:00:58

回答

2

M对象可能不是一个矩阵。我们将创建一个矩阵并查看您的代码输出结果,然后我们将探索一种可能会意外将其更改为向量的方式,然后我们将看到如何对矩阵进行子集化,而不会错误地结束向量。

N <- 10 
M <- matrix(sample(1:100, N*N, replace=TRUE), N, N) 

colTest <- function(M) { 
    if (ncol(M) > 1) { 
     print("More than one column.") 
    } else { 
     print("One or fewer columns.") 
    } 
} 
colTest(M) 
M.vector <- M[, 2] 
colTest(M.vector) 
class(M.vector) 
M.submatrix <- M[, 2, drop=FALSE] 
colTest(M.submatrix) 
class(M.submatrix) 

输出:

[1] "More than one column." 
Error in if (ncol(M) > 1) { : argument is of length zero 
[1] "integer" 
[1] "One or fewer columns." 
[1] "matrix" 

在未来,当你有这样一个问题,给strclass功能的尝试:他们会告诉你任何对象的结构和类。