2013-05-27 3 views
0

Я бы хотел, чтобы функция «count» подсчитывала количество записей в «данных», которые соответствуют «critvalue» с помощью «operator» = 1 (<), = 2 (=), = 3 (>).Функция устранения неполадок с несколькими необязательными аргументами

count = function(data,critvalue,operator=2) { 
    if (operator == 1){ 
     sum(data < critvalue)} 
    if (operator == 2){ 
     sum(data == critvalue)} 
    if (operator == 3){ 
     sum(data > critvalue)}} 

Он работает на вектор значений:

count(rep(6,10),critvalue=5,operator=1) 

Когда я применяю эту функцию в матрицу для подсчета по строкам, он не работает:

m = rbind(1:10,1:10,1:10) 
apply(m, 1, count, critvalue = 6) 

Но когда Я определяю функцию «счет», чтобы не принимать аргумент оператора, он как-то работает

count = function(data,critvalue,operator=2) { 
    sum(data == critvalue)} 

apply(m, 1, count, critvalue = 6) 

Любая помощь в выяснении, почему это не работает в функции apply, будет с благодарностью.

Кроме того, меня определенно интересовали бы базовые функции, которые уже считаются такими. Я попробовал «сумму», но не знаю, как использовать его в приложении.

sum(m == 6) #works 

apply(m,1,sum, #no idea how set the criteria for being equal to 6 
+0

Ваша первая проблема заключается в том, что 'm' не является матрицей. Читайте '? Matrix' и'? C'. – Roland

+0

oops, да, я заметил это и хотел изменить его на rbind ... только что отредактировал сообщение, чтобы отразить это, спасибо – jhjudd

ответ

2

Я хотел бы использовать switch:

m <- matrix(c(1:10,1:10,1:10),ncol=3) 

count <- function(data,critvalue,operator=2) { 
    switch(operator, 
     sum(data < critvalue), 
     sum(data == critvalue), 
     sum(data > critvalue)) 
} 

apply(m, 1, count, critvalue = 6) 
#[1] 0 0 0 0 0 3 0 0 0 0 

apply(m, 1, count, critvalue = 6, operator = 3) 
#[1] 0 0 0 0 0 0 3 3 3 3 

Edit: Почему ваша функция не работает.

От ?return:

Если конец функции достигается без вызова возврата, значение последнего вычисленного выражения возвращается.

Последнее выражение вашей функции: if (operator == 3){ sum(data > critvalue)}.

От ?if:

, если возвращает значение выражения вычисляется, или NULL, если незримо ни один не был (что может произойти, если нет другой). !

Таким образом, в случае operator = 3 Ваша функция возвращает NULL:

apply(m, 1, count, critvalue = 6) 
#NULL 

Вы исправить с помощью return:

count <- function(data,critvalue,operator=2) { 
    if (operator == 1){ 
    return(sum(data < critvalue))} 
    if (operator == 2){ 
    return(sum(data == critvalue))} 
    if (operator == 3){ 
    return(sum(data > critvalue))}}  

apply(m, 1, count, critvalue = 6) 
#[1] 0 0 0 0 0 3 0 0 0 0 

Однако switch удобнее здесь.

+0

Отлично, что отлично работает! Вы знаете, почему я не мог использовать утверждения if? Мне просто интересно, поможет ли это мне лучше понять функцию приложения. Большое спасибо! – jhjudd

+1

Добавлено объяснение. Проблема не связана с 'apply'. – Roland

+1

Большое спасибо за то, что нашли время, чтобы объяснить. Однако я не уверен, что полностью понимаю. В соответствии с вашим объяснением, последнее утверждение if вызывает проблему; поскольку операторы if не имеют возврата, конец функции достигнут и возвращает последнее выражение выражения: if (operator == 3) {...}. Однако функция работает, когда данные являются вектором, и функция приложения не используется (см. Второй блок кода в сообщении). Если проблема заключается в отсутствии отдачи, почему функция все еще работает над вектором, указанным выше? – jhjudd

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