使用多个可选参数应用函数时出错

时间:2013-05-27 17:32:09

标签: r return-value apply

我希望函数'count'计算“运算符”= 1(<),= 2(=),= 3(>)满足'critvalue'的'data'中的条目数。

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',但不知道如何在申请中使用它。

sum(m == 6)  #works

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

1 个答案:

答案 0 :(得分: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

  

如果在没有调用return的情况下到达函数的结尾,则为该值   返回最后一个评估表达式。

你的函数的最后一个表达式是if (operator == 3){ sum(data > critvalue)}

来自?if

  

如果返回所评估的表达式的值,或者如果返回NULL则为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在这里更方便。