我在R中写一个能解决方程的函数。我希望它适用于该等式的所有不同重新排列。我只想要一个函数,以便我可以使用不同的默认值对其进行别名。
为简单起见,假设我想解决a = b / c,给出其中2个变量
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)
这显然是错误的做法。请有人建议更好的方式。
答案 0 :(得分: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中是预期的。