Функция с аргументами по умолчанию и ... выдает ошибку в dots_list (...): обещание уже оценивается - PullRequest
1 голос
/ 08 мая 2020

У меня есть функция с аргументами по умолчанию и ... например, следующая:

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)),
           ...)
}

Все работает нормально, пока я вызываю ее с помощью id и icon, например:

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

Но когда я хочу использовать аргументы по умолчанию icon и title, например:

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

, я получаю эту ошибку:

Ошибка в dots_list (...): обещание уже оценивается: рекурсивная ссылка на аргумент по умолчанию или более ранние проблемы?

Что я делаю не так и как мне заставить это работать?

1 Ответ

1 голос
/ 08 мая 2020

Помните, что R сопоставляет аргументы по имени или по позиции.

Поскольку аргумент, который вы передаете (например, tags$div()), не имеет имени, он используется как первый аргумент, который не соответствует имени. В обоих случаях это title.

Вы можете проверить это, поместив оператор browser() в верхнюю часть функции, вызовите его, а затем набрав title или list(...) в консоли.

Вы можете решить эту проблему, передав функциям только именованные аргументы, используя .... Или изменив порядок аргументов в определении функции.

Наконец, обратите внимание, что только одна из ваших вызовов вызывает ошибку, потому что ... ну, у вас есть аргумент в форме icon = icon; см. обещание, которое уже оценивается: рекурсивная ссылка на аргумент по умолчанию или более ранние проблемы? .

...