R 应用具有多个可选参数的函数时出现问题
我希望函数“count”通过“operator”=1()计算“data”中满足“critvalue”的条目数 当我将此函数应用于矩阵以按行计数时,它不起作用: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)
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