Это запишет объект lm
в родительский фрейм или другое окружение, указанное в env
, нанесет его на график, напечатает и невидимо вернет. Также мы удостоверимся, что среда формулы равна env
, что позволяет iv_string ссылаться на объекты в env
, а также на столбцы в ds
. (Если бы мы знали, что iv_string
ссылается только на имена столбцов в ds
, то мы могли бы просто использовать fo <- paste("income ~", iv_string)
, так как lm
будет принимать символьные строки в качестве формул.) Мы используем do.call(...)
, чтобы обеспечить вывод lm
показывает фактическую формулу, а не просто fo
. Мы использовали родительский фрейм в качестве значения по умолчанию для env
, что более привычно, но если вы действительно хотите, чтобы значением по умолчанию было глобальное окружение, замените parent.frame()
на .GlobalEnv
или globalenv()
.
regress <- function(iv_string, custom_name = iv_string, env = parent.frame()) {
fo <- as.formula(paste("income ~", iv_string), env)
env[[custom_name]] <- results <- do.call("lm", list(fo, quote(ds)))
plot(results)
print(results)
invisible(results)
}
regress("age", "lm_age")
дает:
Call:
lm(formula = income ~ age, data = ds) <-- note that formula shows, not just fo
Coefficients:
(Intercept) age
695.1540 0.1699
Тем не менее, обычный стиль в R - это не запись объектов в родительский фрейм или в глобальную среду, а их возврат:
regress <- function(iv_string, env = parent.frame()) {
fo <- as.formula(paste("income ~", iv_string), env)
results <- do.call("lm", list(fo, quote(ds)))
plot(results)
print(results)
invisible(results)
}
lm_age <- regress("age")