Я пытаюсь создать оболочку для функции для создания отчетов о модели; Я хочу, чтобы некоторые эстетические значения по умолчанию были одинаковыми, а затем изменяли любые другие аргументы по мере необходимости. Вдохновленный в основном этим ответом, я подумал об использовании многоточия следующим образом:
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, и если да, то как?
Любые указатели будут очень признательны!
do.call
наdo.call(tab_model, c(list(x), args, defargs))
? - person Alexis   schedule 03.08.2019Error in (function (..., transform, show.intercept = TRUE, show.est = TRUE, : formal argument "title" matched by multiple actual arguments
Я не знаю, почему это так... - person Fons MA   schedule 13.08.2019defargs[names(args)] <- args
копирует все изargs
вdefargs
, и все дублируется, если вы передаете оба вdo.call
. Вы должны немного изменить свою стратегию, например. присваивайте значения отdefargs
доargs
только в том случае, если они еще не присутствовали вargs
, а затем передайте только одно из двух вdo.call
. - person Alexis   schedule 13.08.2019defargs[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