【问题标题】:R: Create a function within a function, passing arguments as defaultsR:在函数中创建一个函数,将参数作为默认值传递
【发布时间】:2016-08-25 17:27:25
【问题描述】:

我正在开发一个函数,它返回另一个特定形式的函数(线性或渐近,由“FuncType”参数指示)。我想为要返回的函数的“params”参数分配一个默认值向量。

# 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”创建所需的函数,但不将“params”作为默认参数传递给“outfunc”:

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

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

非常感谢您的指导。

干杯, 内特

【问题讨论】:

    标签: r function lexical-scope


    【解决方案1】:

    您尚未将 params 参数作为 outfuncparams 参数的默认值传递给 GenerateFunc。给默认参数一个不同的名称可能会更容易混淆(实际上是避免递归错误所必需的)。这里我称之为'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)
    }
    

    【讨论】:

    • 感谢您的解决方案!
    【解决方案2】:

    它不使用params 作为默认参数,因为你没有告诉它!​​

    您只需要这样做 - 但是您需要更改名称,将默认参数指定为 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.
    }
    

    【讨论】:

    • 谢谢!我之前尝试过“params = params”失败,但忘记将其包含在我的可重现版本中。
    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2012-05-22
    • 2022-11-12
    • 2018-12-03
    • 2013-09-07
    相关资源
    最近更新 更多