2013-03-13 3 views
1

Итак, я пытаюсь создать оператор if, где, если число столбцов больше 1, то оно будет делать несколько форм манипуляции с этой матрицей, и если в матрице меньше или равно 1 столбца он не будет проводить анализ. Вот некоторые из кода:Если инструкция else в R

M < - NxN матрицы

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

Однако, когда я делаю это я получаю следующее сообщение об ошибке:

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

Похоже, что М это не то, что вы думаете. Отправьте вывод 'str (M)' перед запуском блока if/else. – Dason

+1

Чтобы быть в безопасности, вы также должны переместить 'else' до той же строки, что и закрывающая скобка на' if', чтобы избежать синтаксических ошибок. – joran

+6

Я предполагаю, что вы создаете 'M', подмножая некоторую другую матрицу или data.frame' x'. Если вы действительно используете 'M <- x [, my.subset, drop = FALSE]' иначе 'M' будет превращен в вектор, если вы просто извлечете один столбец. – Backlin

ответ

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" 

В будущем, когда у вас есть проблемы, как этот, дают str и class функции а попробовать: они покажут вам структуру и класс любого объекта.

Смежные вопросы