r - 在存在可选参数的情况下如何处理省略号 (...)?

标签 r ellipsis optional-arguments

当我在函数定义中使用可选参数时,我遇到了省略号问题。为了澄清,我定义了以下函数:

func1 <- function (x) (x-2)^2

func3 <- function (fun, arg.curve.user){
  arg.curve.user$expr <-  substitute(func1)
  arg.curve.default <- list(col = "blue", n = 1000, main = "This is a test")
  arg.curve <- modifyList (arg.curve.default, arg.curve.user)
  do.call("curve", arg.curve)
}

# optimizes func1 and call func2 to plot func1
func2 <- function (lb, ub, n.restarts = 5, n.sim = 10, ...){
  arg.curve.user <- as.list(substitute(list(...)))
  output <- gosolnp(fun = func1, LB = lb, UB = ub,  n.restarts =  n.restarts, 
  n.sim =  n.sim)$par
  func3(fun = func1, arg.curve.user = arg.curve.user)
   return(output)
}

通过调用 func2,func1 得到优化,并且还通过 func3 调用进行绘制(需要包 Rsolnp )。
func2 ( lb = 0, ub = 8, n.restarts = 5, n.sim = 10, n = 200, from = 0, to = 8)
但是假设用户拼错了 n.restarts并写道 nrestarts :
func2 ( lb = 0, ub = 8, nrestarts = 5, n.sim = 10, n = 200, from = 0, to = 8)
在这种情况下,我希望 R 实现以下计划来处理 n.restarts 的缺失问题。 :
  • 将默认值(即 5)分配给 n.restarts 作为可选参数
  • 最后声明警告:“nrestarts”不是图形参数

  • 但这不会发生和 R 将 n (200) 的值赋给 n.restarts 反而!!

    谁能帮我解决这个问题?

    非常感谢

    最佳答案

    部分匹配n论据 n.restarts当一个不是由用户提供时。相反,与@Andrie 的建议相反(当然,这会起作用),有一种机制允许您以参数 n 的方式继续。和和参数 n.restarts .诀窍是放置要匹配的参数 正好... .

    func2 <- function (lb, ub, ..., n.restarts = 5, n.sim = 10){
      writeLines(paste("Value of `n.restarts` is", n.restarts))
      arg.curve.user <- as.list(substitute(list(...)))
      output <- gosolnp(fun = func1, LB = lb, UB = ub,  n.restarts =  n.restarts, 
                        n.sim =  n.sim)$par
      func3(fun = func1, arg.curve.user = arg.curve.user)
      output
    }
    

    在使用中,这给出:
    > func2 (lb = 0, ub = 8, n.restarts = 2, n.sim = 10, n = 200,
    +        from = 0, to = 8)
    Value of `n.restarts` is 2          <---- Here!
    
    Iter: 1 fn: 6.926e-15    Pars:  2.00000
    Iter: 2 fn: 2.501e-15    Pars:  2.00000
    solnp--> Completed in 2 iterations
    
    Iter: 1 fn: 8.336e-16    Pars:  2.00000
    Iter: 2 fn: 8.336e-16    Pars:  2.00000
    solnp--> Completed in 2 iterations
    [1] 2
    > func2 (lb = 0, ub = 8, nrestarts = 2, n.sim = 10, n = 200,
    +        from = 0, to = 8)
    Value of `n.restarts` is 5          <---- Here! Default
    
    Iter: 1 fn: 2.83e-15     Pars:  2.00000
    Iter: 2 fn: 2.5e-15  Pars:  2.00000
    solnp--> Completed in 2 iterations
    
    Iter: 1 fn: 2.037e-15    Pars:  2.00000
    Iter: 2 fn: 2.037e-15    Pars:  2.00000
    solnp--> Completed in 2 iterations
    
    Iter: 1 fn: 1.087e-15    Pars:  2.00000
    Iter: 2 fn: 1.087e-15    Pars:  2.00000
    solnp--> Completed in 2 iterations
    
    Iter: 1 fn: 8.558e-16    Pars:  2.00000
    Iter: 2 fn: 8.558e-16    Pars:  2.00000
    solnp--> Completed in 2 iterations
    
    Iter: 1 fn: 7.147e-16    Pars:  2.00000
    Iter: 2 fn: 7.147e-16    Pars:  2.00000
    solnp--> Completed in 2 iterations
    [1] 2
    Warning messages:
    1: In plot.window(...) : "nrestarts" is not a graphical parameter
    2: In plot.xy(xy, type, ...) : "nrestarts" is not a graphical parameter
    3: In axis(side = side, at = at, labels = labels, ...) :
      "nrestarts" is not a graphical parameter
    4: In axis(side = side, at = at, labels = labels, ...) :
      "nrestarts" is not a graphical parameter
    5: In box(...) : "nrestarts" is not a graphical parameter
    6: In title(...) : "nrestarts" is not a graphical parameter
    

    关于r - 在存在可选参数的情况下如何处理省略号 (...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14334322/

    相关文章:

    python - 可选关键字参数的命名元组和默认值

    common-lisp - common-lisp中有关可选参数的错误

    r - 如何将 for 循环与特殊 seq 一起使用

    javascript - 如何用省略号隐藏多余的 div?

    r - 列出 sprintf 的输入(绕过省略号 ... 函数)

    c++ - cpp : catch exception with ellipsis and see the information

    Fortran 2003/2008 : Elegant default arguments?

    r - 在R中如何获得一个可以在所有列上应用AND的向量?

    r - 在 R 中使用行名和列名获取值?

    r - 将字符串列表转换为表达式列表?