1) Используя getTerms
из Слагаемые суммы в выражении R мы можем напрямую анализировать формулу без использования регулярных выражений.Сначала мы получаем термины tt
, а затем формируем mm
, то есть термин, имеющий более одного элемента.Из этого извлекают остальные.Пакеты не используются.
fo <- outcome ~ var1 + var2 + mm(id, mmc(var3, var4), mmw(pupils^exp(teacher * b)))
tt <- getTerms(fo[[3]])
mm <- as.list(tt[lengths(tt) > 1][[1]])[-1]
mmc <- as.list(mm[[2]][-1])
mmw <- as.list(mm[[3]][-1])
, что дает:
> mm
[[1]]
id
[[2]]
mmc(var3, var4)
[[3]]
mmw(pupils^exp(teacher * b))
> mmc
[[1]]
var3
[[2]]
var4
> mmw
[[1]]
pupils^exp(teacher * b)
2) В качестве альтернативы мы можем включить обработку прямо в getTerms
, давая getMs
следующим образом:
getMs <- function(e, x = list()) {
if (length(e) == 1) x
else if (identical(e[[1]], as.name("+")))
c( Recall(e[[2]], x), Recall(e[[3]], x) )
else if (as.character(e[[1]]) %in% c("mm", "mmw", "mmc")) {
for(i in 2:length(e)) x <- Recall(e[[i]], x)
c(setNames(list(as.list(e[-1])), as.character(e[[1]])), x)
} else x
}
res <- getMs(fo[[3]])
str(res)
дача:
List of 3
$ mm :List of 3
..$ : symbol id
..$ : language mmc(var3, var4)
..$ : language mmw(pupils^exp(teacher * b))
$ mmw:List of 1
..$ : language pupils^exp(teacher * b)
$ mmc:List of 2
..$ : symbol var3
..$ : symbol var4