Я пишу функцию, которая требует взвешенной регрессии. Я неоднократно получал сообщение об ошибке с параметром weights, и я создал минимальный воспроизводимый пример, который вы можете найти здесь:
wt_reg <- function(form, data, wts) {
lm(formula = as.formula(form), data = data,
weights = wts)
}
wt_reg(mpg ~ cyl, data = mtcars, wts = 1:nrow(mtcars))
Это возвращает
Ошибка в eval (extras, data, env): объект 'wts' не найден
Если вы запустите все это отдельно, он будет работать нормально. Я копался в lm, и, похоже, проблема в вызове eval(mf, parent.frame())
. Несмотря на то, что wts находится в parent.frame (), он не оценивается правильно в вызове. Вот немного подробнее:
mf назначается так, что он такой же, как
stats::model.frame(formula = as.formula(form), data = data, weights = wts,
drop.unused.levels = TRUE)
Когда я запускаю
parent.frame()$wts
, он возвращает цифру c вектор. Но когда я запускаю
eval(stats::model.frame(formula = as.formula(form), data = data, weights = wts,
drop.unused.levels = TRUE), parent.frame())
, это не так.
Я могу запустить
stats::model.frame(formula = as.formula(parent.frame()$form),
data = parent.frame()$data, weights = parent.frame()$wts,
drop.unused.levels = TRUE)
, и это работает. Вы можете проверить это сами, если хотите использовать пример сверху.
Есть мысли? Я действительно понятия не имею, что здесь происходит ...