(Не обращайте внимания на мое предыдущее предложение, используя Map
.)
Большой вывод - как вывести формулу динамически. Один способ - с as.formula
, который берет строку и преобразует ее в формулу, которую можно использовать в функции генерации модели (например).
Одна проблема с использованием lapply(as.list(delm2[,c('N','B')]), ...)
заключается в том, что остальные данные (то есть столбцы t1
и t3
) не передаются, только один вектор за один раз. (Мне интересно, является ли ваша ссылка на del
опечаткой, неопубликованными / скрытыми данными или чем-то еще.)
Попробуйте это:
lapply(c("N", "B"), function(nm) {
bmp(filename = paste(nm, ".bmp"), width = 350, height = 400)
glm.diag.plots(glm(as.formula(paste(nm, "~ t1*t3")), data = delm2))
dev.off()
})
В общем, я не люблю нарушать область видимости внутри этих функций. То есть я стараюсь не выходить за пределы lapply
для данных, когда я могу достаточно легко их передать. Вышеизложенное в педантично-языковой манере может выглядеть так:
lapply(c("N", "B"), function(nm, x) {
bmp(filename = paste(nm, ".bmp"), width = 350, height = 400)
glm.diag.plots(glm(as.formula(paste(nm, "~ t1*t3")), data = x))
dev.off()
}, x = delm2)
Хотя это сохраняет сферу, это может сбить с толку, если вы не понимаете, что происходит.
Это может быть прекрасное время для использования for
вместо одной из *apply*
функций. Все, что вы хотите, находится в побочном эффекте, и, поскольку for
и *apply
являются фактически одинаковой скоростью, вы получаете удобочитаемость:
for (nm in c("N", "B")) {
bmp(filename = paste(nm, ".bmp"), width = 350, height = 400)
glm.diag.plots(glm(as.formula(paste(nm, "~ t1*t3")), data = delm2))
dev.off()
}
(В данном случае «нарушение области видимости» отсутствует, поэтому я использовал исходную переменную.)
В скобках , чтобы связать мой отредактированный и неправильный ответ, включающий Map
. Вот пример использования Map
, который делает больше для демонстрации того, что делают Map
(и mapply
), что на самом деле улучшает ваши непосредственные потребности.
Если по какой-то причине вы хотели, чтобы они назвали что-то отличное от "N.bmp"
, вы можете сделать это:
Map(function(fn, vn, x) {
bmp(filename = paste(nm, ".bmp"), width = 350, height = 400)
glm.diag.plots(glm(as.formula(paste(nm, "~ t1*t3")), data = x))
dev.off()
}, c("N2.bmp", "b3456.bmp"), c("N", "B"), list(delm2))
Из этого следует отметить две вещи:
- Использование
list(delm2)
состоит в том, чтобы обернуть эту структуру в одну «вещь», которая передается повторяемой в отображенную функцию. Если бы мы просто сделали delm2
(без list(...)
), то он попытался бы использовать первый столбец delm2
с каждым из первых элементов. Это может быть полезно в других сценариях, но в вашем примере glm
вам нужны другие столбцы, поэтому вы не можете включать только один столбец за раз. (Ну, есть способы сделать это тоже ... но сейчас это важно.)
- При первом вызове анонимной функции
fn
равно "N2.bmp"
, vn is
"N" , and
x is the full dataset of
delm2 . The second time the anon-func is called,
fn is
"b3456.bmp" ,
уп is
"B" , and
х is again the full dataset of
delm2`.
Я помечаю эту часть как "в скобках", потому что она на самом деле не добавляет к этой проблемы, но так как я начал этот путь в своем первом ответе, я решил продолжить с методологией, «почему» моего выбора Map
. В конце концов, я думаю, что решение for
или одно из решений lapply
должно подойти вам.