【问题标题】:Avoid argument duplication passed through (...)避免通过 (...) 传递的参数重复
【发布时间】:2011-12-20 19:49:07
【问题描述】:

我有一个功能

somefun <- function(someparameters , ...) { plot(stuff, ...)}

现在我想在用户没有指定这些参数的情况下为 plot 提供一些默认值。 (即xlab="")。

如何提供一组默认绘图选项,但仍允许用户覆盖这些参数?由于如果输入两次相同的参数,R会抛出错误:形式参数与多个实际参数匹配。

我知道我可以通过我的函数传递所有这些选项

somefun <- function(someparameters, main, xlab, ylab, xlim....)

但我不想那样做。

是否有一些简单的解决方案来实现这一点?

【问题讨论】:

  • 你对somefun &lt;- function(someparamenters, main, xlab="", ...) {plot(stuff, xlab, ...)} 有什么反对意见?我原以为这正是你想要的。
  • 不整洁。似乎没有必要,当我将此代码放入包中时,参数将显示在文档中
  • 我认为您的用户会希望在文档中包含这些参数,因此首选 Henry 的建议。
  • 我希望情节保持原样。这只是一个预防措施,这样我的函数就不会抛出错误,并且如果有人真的想修改某些东西。我不打算提供灵活的参数,用户可以根据他们的内心内容进行自定义。

标签: r


【解决方案1】:

试试modifyList,用法如下:

f <- function(x, ...) {
    defaults <- list(xlab = "x", ylab = "y")
    args <- modifyList(defaults, list(x = x, ...))
    do.call("plot", args)
}

【讨论】:

  • 感谢您的回答。但是我现在如何让列表充当参数?即plot(1,2, args) 在这种情况下肯定行不通
  • @Ellipsis 这就是do.call 的魔力:它将参数作为一个列表。另见?do.call。 +1 modifyList,不知道那个。我会使用 match.call() 结果,它远没有这样整洁。
  • @Ellipsis,我已对其进行了修改以提供plot 示例。
  • 请注意,这会破坏惰性求值。这对您的功能可能重要也可能不重要。
【解决方案2】:

你可以考虑使用rlang中的list2函数

my_dots <- rlang::list2(...)

这将返回传递给 somefun 的参数列表。然后,您可以插入自己的逻辑来确定它是否存在以及下一步要做什么。

if( has_name(my_dots, "xlab") ){
  xlab <- my_dots$xlab
} else {
  xlab <- ""
}

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多