2016-08-25 2 views
0

Je développe une fonction qui renvoie une autre fonction d'une forme particulière (linéaire ou asymptotique, indiquée par l'argument "FuncType"). Je voudrais assigner un vecteur de valeurs par défaut à l'argument "params" de la fonction à retourner.R: Créer une fonction dans une fonction, en passant les arguments par défaut

# 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" crée la fonction souhaitée, mais ne passe pas "params" à "outfunc" comme argument par défaut:

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

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

Un grand merci à l'avance pour vos conseils.

Cheers, Nate

Répondre

0

Il n'utilise params comme argument par défaut parce que vous ne dites pas à!

Vous avez juste besoin de faire cela - vous devez cependant changer le nom, en spécifiant un paramètre par défaut car params = params ne fonctionnera pas.

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

Merci! J'avais essayé sans succès "params = params" plus tôt mais j'ai oublié d'inclure cela dans ma version reproductible. –

1

Vous avez pas passé l'argument params pour aller GenerateFunc comme valeurs par défaut pour l'argument params dans outfunc. Peut être moins déroutant (et réellement nécessaire pour éviter une erreur récursive) pour donner un nom différent aux params par défaut. Ici, je l'appelle '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

Merci pour la solution! –