2013-05-27 48 views
0

我希望函數'count'來計算符合'critvalue''操作符'= 1(<),= 2(=)的'data'中的條目數, = 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'不接受操作符參數,它以某種方式工作

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

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

任何幫助弄清楚爲什麼這不適用於應用函數將不勝感激。

此外,我一定會對已經算過的基本函數感興趣。我嘗試了'總和',但不知道如何在應用中使用它。

sum(m == 6) #works 

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

你的第一個問題是'm'不是矩陣。閱讀「?矩陣」和「?c」。 – Roland

+0

哎呀,是的,我注意到了,並打算將它改爲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 

編輯:爲什麼你的功能不起作用。

?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(operator == 3){...}。然而,當數據是一個向量並且不使用apply函數時,該函數可以工作(請參閱post中的第二個代碼塊)。如果問題是缺乏回報,爲什麼該功能仍然在上面提供的矢量上工作? – jhjudd