Передача многоточия в функцию с переменным числом аргументов, которая использует purrr::map

Я пытаюсь создать оболочку для функции для создания отчетов о модели; Я хочу, чтобы некоторые эстетические значения по умолчанию были одинаковыми, а затем изменяли любые другие аргументы по мере необходимости. Вдохновленный в основном этим ответом, я подумал об использовании многоточия следующим образом:

library(sjPlot)

mods <- list(lm(1 ~ 1), lm(1 ~ 1))

my_tab_model <- function(x, ...) {

  defargs <- list(show.aic = TRUE, 
                   prefix.labels = "varname", 
                   rm.terms = "Log(theta)", 
                   p.style = "asterisk", 
                   p.threshold = c(0.1, 0.05, 0.01))

  args <- list(...)

  defargs[names(args)] <- args

  do.call(tab_model, list(x, args, defargs))

  }

my_tab_model(mods, dv.labels = c("One model", "Another model"), 
             title = "mods")

Но я получаю следующую ошибку:

#> Error: $ operator is invalid for atomic vectors
Traceback:
4. .f(.x[[i]], .y[[i]], ...) 
3. purrr::map2(models, 1:length(models), function(model, i) {
    fam.info <- insight::model_info(model)
    if (insight::is_multivariate(model)) 
        fam.info <- fam.info[[1]] ... 
2. tab_model(args, show.aic = TRUE, prefix.labels = "varname", rm.terms = "Log(theta)", 
    p.style = "asterisk", p.threshold = c(0.1, 0.05, 0.01)) 
1. my_tab_model(mod, dv.labels = c("One model", "Another model"), 
    title = "mods") 

После чтения вокруг немного, я все еще в замешательстве. Я думал, что где-то читал, что map не принимает многоточие без какого-либо обходного пути; поэтому я подозреваю, что это может иметь какое-то отношение к самой функции tab_model, вызывающей map для обработки собственного многоточия в качестве первого аргумента. Однако я не могу найти этот источник и этот ответ не упомянуть любые подобные проблемы; так что я все еще не совсем уверен, что происходит.

Чтобы усугубить мое недоумение, когда я запускаю его на фактических данных, ошибка отличается:

Error in names(models) <- unlist(lapply(match.call(expand.dots = F)$..., : 'names' attribute [74] must be the same length as the vector [4]
3. (function (..., transform, show.intercept = TRUE, show.est = TRUE, show.ci = 0.95, show.ci50 = TRUE, show.se = NULL, show.std = NULL, show.p = TRUE, show.stat = FALSE, show.df = FALSE, show.zeroinf = TRUE, show.r2 = TRUE, show.icc = TRUE, show.re.var = TRUE, show.ngroups = TRUE, ...
2. do.call(tab_model, c(x, args, defargs))
1. my_tab_model(negbin_alliance_mods, dv.labels = party_levels, title = "negbin_alliance_mods without supply")

Могу ли я использовать многоточие таким образом для такой функции, как tab_model case, и если да, то как?

Любые указатели будут очень признательны!


person Fons MA    schedule 02.08.2019    source источник
comment
Можете ли вы попробовать изменить свой do.call на do.call(tab_model, c(list(x), args, defargs))?   -  person Alexis    schedule 03.08.2019
comment
Спасибо, Алексис. Извините, я был занят другими делами. С вашим предложением ошибка становится: Error in (function (..., transform, show.intercept = TRUE, show.est = TRUE, : formal argument "title" matched by multiple actual arguments Я не знаю, почему это так...   -  person Fons MA    schedule 13.08.2019
comment
О, это потому, что defargs[names(args)] <- args копирует все из args в defargs, и все дублируется, если вы передаете оба в do.call. Вы должны немного изменить свою стратегию, например. присваивайте значения от defargs до args только в том случае, если они еще не присутствовали в args, а затем передайте только одно из двух в do.call.   -  person Alexis    schedule 13.08.2019
comment
Ах, верно; этого и следовало ожидать... так что технически defargs[names(args)] <- args, а затем do.call(tab_model, c(list(x), defargs)) должны работать? Я быстро протестировал его и выдает другую ошибку: Error in attr(lbs, "category.value") <- fl : attempt to set an attribute on NULL ... может быть, это тоже очевидно, но я чувствую себя довольно вяло. Спасибо за вашу помощь!   -  person Fons MA    schedule 13.08.2019