Как писал Ричи, вставка кажется самым простым решением. Вот более полный пример:
myvar <- "AGE"
f <- as.formula(paste("dat ~ contrasts *", myvar, "+ Error(ID/contrasts)"))
x <- summary( aov(f, data=set) )
... и вместо set$myvar
вы бы написали
set[[myvar]]
Более сложный ответ заключается в том, что формула на самом деле является вызовом оператора "~". Вы можете изменить вызов напрямую, что будет несколько более эффективным внутри цикла:
> f <- dat ~ contrasts * PLACEHOLDER + Error(ID/contrasts) # outside loop
> f[[3]][[2]][[3]] <- as.name(myvar) # inside loop
> f # see what it looks like...
dat ~ contrasts * AGE + Error(ID/contrasts)
Магия [[3]] [[2]] [[3]] определяет часть формулы, которую вы хотите заменить. Формула на самом деле выглядит примерно так (дерево разбора):
`~`(dat, `+`(`*`(contrasts, PLACEHOLDER), Error(`/`(ID, contrasts))
Поиграйтесь с индексированием формулы, и вы поймете:
> f[[3]]
contrasts * AGE + Error(ID/contrasts)
> f[[3]][[2]]
contrasts * AGE
ОБНОВЛЕНИЕ: Каковы преимущества этого? Ну, это более надежно - особенно если вы не контролируете имена столбцов данных. Если myvar <- "AGE GROUP"
текущий раствор пасты не работает. И если myvar <- "file.create('~/OWNED')"
, у вас есть серьезная угроза безопасности ...