2016-08-25 7 views
0

"FuncType"引数で示される、特定の形式の別の関数をリニアまたは漸近的に返す関数を開発しています。返される関数の "params"引数にデフォルト値のベクトルを代入したいと思います。R:関数内に関数を作成し、引数をデフォルトとして渡します。

# FuncType is either "lin" or "asymp" 
# params is a numerical vector of parameters (length 3 if FuncType is "lin", 
# length 4 if FuncType is "asymp") 

GenerateFunc <- function(FuncType = "lin", params) { 

    # Linear case: m (slope), b (intercept), and err (error) 
    if (FuncType == "lin") { 
    outfunc <- function(x, params){ 
    m <- params[1] 
    b <- params[2] 
    err <- params[3] 
    outval <- m*x + b + rnorm(1, 0, err) 
    return(outval) 
    } 
    } 

    # Asymptotic case: a (slope), b (curvature), c (rate of convergence), and err (error) 
    if (FuncType == "asymp") { 
    outfunc <- function(x, params){ 
    a <- params[1] 
    b <- params[2] 
    c <- params[3] 
    err <- params[4] 
    outval <- (a * x)/(b*x + c) + rnorm(1, 0, err) 
    return(outval) 
    } 
    } 

return(outfunc) 
} 

は「GenerateFunc」は、所望の機能を作成しますが、デフォルトの引数として「outfunc」に「のparams」を渡しません:あなたの指導を事前に

myfunc <- GenerateFunc("asymp", params = rep(1,4)) 
myfunc(x = 10) 

Error in myfunc(x = 10) : argument "params" is missing, with no default 

感謝を。

乾杯、 ネイト

それはあなたがそれを教えていないため、デフォルトの引数として paramsを使用していない

答えて

0

これを行う必要があります。名前を変更する必要があります。デフォルトのパラメータを指定すると、params = paramsは機能しません。

GenerateFunc <- function(FuncType = "lin", params) { 
    defaults <- params 

    if (FuncType == "lin") { 
     outfunc <- function(x, params = defaults) { 
      m <- params[1] 
      b <- params[2] 
      err <- params[3] 
      m*x + b + rnorm(1, 0, err) 
     } 
    } 

    … etc. 
} 
+0

ありがとう!私は "params = params"を以前にうまく試してみましたが、私の再現可能なバージョンにそれを含めるのを忘れました。 –

1

あなたはoutfuncparams引数のデフォルト値としてGenerateFuncに行くparams引数が渡されていません。デフォルトのparamsに別の名前を付けるために混乱を少なくする(実際には再帰的なエラーを避けるために)必要はありません。ここで私は、 'paramsdefault' それを呼び出す:

GenerateFunc <- function(FuncType = "lin", paramsdefault) { 

    # Linear case: m (slope), b (intercept), and err (error) 
    if (FuncType == "lin") { 
    outfunc <- function(x, params = paramsdefault){ 
     m <- params[1] 
     b <- params[2] 
     err <- params[3] 
     outval <- m*x + b + rnorm(1, 0, err) 
     return(outval) 
    } 
    } 

    # Asymptotic case: a (slope), b (curvature), c (rate of convergence), and err (error) 
    if (FuncType == "asymp") { 
    outfunc <- function(x, params = paramsdefault){ 
     a <- params[1] 
     b <- params[2] 
     c <- params[3] 
     err <- params[4] 
     outval <- (a * x)/(b*x + c) + rnorm(1, 0, err) 
     return(outval) 
    } 
    } 

    return(outfunc) 
} 
+0

ソリューションをありがとう! –

関連する問題