【问题标题】:Function with default arguments and ... throws Error in dots_list(...) : promise already under evaluation具有默认参数的函数和 ... 在 dots_list(...) 中引发错误:promise 已在评估中
【发布时间】:2020-05-08 06:32:05
【问题描述】:

我有一个带有默认参数的函数,并且...如下所示:

library(shiny)
foo <- function(id = NULL, title = "Title",
                icon = icon("caret-right"),
                ...) {
  tags$div(class = "divcl", id = id,
           tags$h3(class = "hea", title,
                   tags$span(class = "spancl", icon)),
           ...)
}

只要我用idicon 调用它,一切正常:

foo(id = "id", icon = icon("cars"), tags$div())

但是当我想使用icontitle 的默认参数时,比如:

foo(id = "id", tags$div())

我收到此错误:

dots_list(...) 中的错误:promise 已在评估中: 递归默认参数引用还是更早的问题?

我做错了什么,如何让它发挥作用?

【问题讨论】:

标签: r ellipsis


【解决方案1】:

请记住,R 按名称或位置匹配参数。

由于您传递的参数(即tags$div())未命名,因此将其用作名称不匹配的第一个参数。在这两种情况下都是title

您可以通过在函数顶部放置browser() 语句来验证这一点,调用它,然后在控制台输入titlelist(...)

您可以通过使用... 仅将命名参数传递给函数来解决此问题。或者通过重新排列函数定义中参数的顺序。

最后,请注意,您的调用中只有一个错误,因为……好吧,您有一个icon = icon 形式的参数;见promise already under evaluation: recursive default argument reference or earlier problems?

【讨论】:

  • 不幸的是,我不能为 ... 使用命名参数,因为可能有很多 div 标签或任何 HTML。我不是 100% 遵循重新安排的方法。有没有办法在不更改参数名称的情况下使第二个示例工作?
  • 您必须传递函数的所有其他参数,例如,foo(id = "id", icon = icon("cars"), title = "Some title", tags$div())
  • 嗯,是的,这就是我到目前为止所做的,但我希望我可以使用函数的默认参数。
  • 如果您想使用未命名的参数,它们将始终按位置匹配。作为替代方案,您可以将所有当前命名的参数组合到一个列表中——使其成为单个参数——然后使用... 作为第二个参数。
猜你喜欢
  • 2017-08-11
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多