2016-03-14 79 views
0

我正在写一个R函数来解决一个方程。我希望它适用于该等式的所有不同重排。我只需要一个函数,以便我可以用不同的默认值进行别名。编写测试多个条件的R函数的最佳方法是什么?

为了简单起见,假设我要解决A = B/C,这些变量

my_fun <- function(a,b,c) { 
    if(is.na(a)) { 
     return(b/c) 
    } else if(is.na(b)) { 
     return(a*c) 
    } else if(is.na(c)) { 
     return(b/a) 
    } 
} 

my_fun(a=NA,b=2,c=4) 
> [1] 0.5 
my_fun(a=NA,b=c(2,5),c=4) 

这显然是错误的方法的给定2。请有人建议一个更好的方法。

+0

该方法有什么问题?当我去学校时,“2/4 = 0.5”是正确的:-o – RHA

+0

我想不出有什么好的情况,你真的想这样做(把争论看作是可以互换的)。 –

+0

@ hong-ooi我想用与不同解决方案相关的不同默认值来替代此函数。你会如何处理这个问题? – whanrott

回答

3

我认为这是一个switch函数的调用,它提供了像其他声明性语言中的case语句那样的功能。它可以采用数字或字符结果来评估第一个参数EXPR。在数字结果的情况下,评估参数列表中的后续项目。我认为,这个实现的抛出一个错误或者零个或多个缺失值的行为是期望的结果:

my_fun <- function(a,b,c) {stopifnot(which(is.na(list(a,b,c))) == 1, 
             "Test for exactly one missing parameter") 

      switch(which(is.na(list(a,b,c))), 
            b/c, 
            a*c, 
            b/a)} 
my_fun(a=NA,b=2,c=4) 
#[1] 0.5 

my_fun(a=NA,b=c(2,5),c=4) 
#[1] 0.50 1.25 

>  my_fun(a=NA,b=2,c=4) 
Error: "Test for exactly one missing parameter" is not TRUE 

从第二调用返回的两个值被设定为R可以预料,由于参数回收。

+1

不错,尽管'navec < - is.na(list(a,b,c)); if(sum(navec)== 0)stop(“无法指定所有三个值”); if(sum(navec)> 1)stop(“informative error”);开关(哪个(navec)),...)'长期运行可能会更好 –

+0

同意:一个提供信息的错误信息会更好。并且在这个用例中它可能会测试“== 1”,因为目标是为了解决缺少的参数。 –

+0

@ ben-bolker谢谢。看起来很有希望。我会考虑!= 1失踪,但你的方式更优雅。我会尝试一下。 – whanrott

相关问题