R 应用具有多个可选参数的函数时出现问题

R 应用具有多个可选参数的函数时出现问题,r,return-value,apply,R,Return Value,Apply,我希望函数“count”通过“operator”=1()计算“data”中满足“critvalue”的条目数 当我将此函数应用于矩阵以按行计数时,它不起作用: m = rbind(1:10,1:10,1:10) apply(m, 1, count, critvalue = 6) 但是,当我定义函数“count”不接受运算符参数时,它会以某种方式工作 count = function(data,critvalue,operator=2) { sum(data == critvalue)

我希望函数“count”通过“operator”=1()计算“data”中满足“critvalue”的条目数

当我将此函数应用于矩阵以按行计数时,它不起作用:

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)
如果您能帮助我们找出这在apply函数中不起作用的原因,我们将不胜感激

另外,我肯定会对已经像这样计数的基函数感兴趣。我试过“sum”,但不知道如何在apply中使用它

sum(m == 6)  #works

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

我会使用
开关

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
来修复此问题:

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
count critvalue))}
应用(m,1,计数,临界值=6)
#[1] 0 0 0 0 0 3 0 0 0 0

但是,
开关在这里更方便。

您的第一个问题是
m
不是矩阵。阅读
?matrix
?c
。哦,是的,我注意到了这一点,并打算将其改为rbind…刚刚编辑了这篇文章,以反映这一点,谢谢你,这非常有效!你知道为什么我不能使用if语句吗?我只是想知道它是否能帮助我更好地理解apply函数。谢谢!补充了一个解释。此问题与应用无关。非常感谢您花时间解释。然而,我不确定我是否完全理解。根据您的解释,最后一个if语句导致了问题;由于if语句没有返回,因此到达函数末尾并返回最后一个求值表达式:if(operator==3){…}。但是,当数据是向量且未使用apply函数时,该函数将起作用(请参阅下文中的第二个代码块)。如果问题是缺少返回,为什么函数仍然在上面提供的向量上工作?真的吗?我刚刚尝试了前两段代码,但在向量上执行count时没有得到任何输出。@jhjudd在我的系统(R3.0.1 Mac OS X,R3.0.0 Win7)上,如果传递向量和
运算符,则函数返回
NULL
=3.
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
apply(m, 1, count, critvalue = 6)
#NULL
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