2016-03-14 82 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

相關問題