2013-03-13 223 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功能的嘗試:他們會告訴你任何對象的結構和類。