Parse a formula into fixed formula and random effect terms, treating 'special' terms (of the form foo(x|g[,m])) appropriately
splitForm(
formula,
defaultTerm = "us",
allowFixedOnly = TRUE,
allowNoSpecials = TRUE,
debug = FALSE,
specials = findReTrmClasses()
)
noSpecials(term, delete = TRUE, debug = FALSE, specials = findReTrmClasses())
a list containing elements fixedFormula
;
reTrmFormulas
list of x | g
formulas for each term;
reTrmAddArgs
list of function+additional arguments, i.e. list()
(non-special), foo()
(no additional arguments), foo(addArgs)
(additional arguments); reTrmClasses
(vector of special functions/classes, as character)
Taken from Steve Walker's lme4ord, ultimately from the flexLambda branch of lme4 https://github.com/stevencarlislewalker/lme4ord/blob/master/R/formulaParsing.R. Mostly for internal use.
splitForm(~x+y) ## no specials or RE
#> $fixedFormula
#> ~x + y
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> NULL
#>
#> $reTrmAddArgs
#> NULL
#>
#> $reTrmClasses
#> NULL
#>
splitForm(~x+y+(f|g)) ## no specials
#> $fixedFormula
#> ~x + y
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> $reTrmFormulas[[1]]
#> f | g
#>
#>
#> $reTrmAddArgs
#> $reTrmAddArgs[[1]]
#> us()
#>
#>
#> $reTrmClasses
#> [1] "us"
#>
splitForm(~x+y+diag(f|g)) ## one special
#> $fixedFormula
#> ~x + y
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> $reTrmFormulas[[1]]
#> f | g
#>
#>
#> $reTrmAddArgs
#> $reTrmAddArgs[[1]]
#> diag()
#>
#>
#> $reTrmClasses
#> [1] "diag"
#>
splitForm(~x+y+(diag(f|g))) ## 'hidden' special
#> $fixedFormula
#> ~x + y
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> $reTrmFormulas[[1]]
#> f | g
#>
#>
#> $reTrmAddArgs
#> $reTrmAddArgs[[1]]
#> diag()
#>
#>
#> $reTrmClasses
#> [1] "diag"
#>
splitForm(~x+y+(f|g)+cs(1|g)) ## combination
#> $fixedFormula
#> ~x + y
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> $reTrmFormulas[[1]]
#> f | g
#>
#> $reTrmFormulas[[2]]
#> 1 | g
#>
#>
#> $reTrmAddArgs
#> $reTrmAddArgs[[1]]
#> us()
#>
#> $reTrmAddArgs[[2]]
#> cs()
#>
#>
#> $reTrmClasses
#> [1] "us" "cs"
#>
splitForm(~x+y+(1|f/g)) ## 'slash'; term
#> $fixedFormula
#> ~x + y
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> $reTrmFormulas[[1]]
#> 1 | g:f
#>
#> $reTrmFormulas[[2]]
#> 1 | f
#>
#>
#> $reTrmAddArgs
#> $reTrmAddArgs[[1]]
#> us()
#>
#> $reTrmAddArgs[[2]]
#> us()
#>
#>
#> $reTrmClasses
#> [1] "us" "us"
#>
splitForm(~x+y+(1|f/g/h)) ## 'slash'; term
#> $fixedFormula
#> ~x + y
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> $reTrmFormulas[[1]]
#> 1 | h:g:f
#>
#> $reTrmFormulas[[2]]
#> 1 | g:f
#>
#> $reTrmFormulas[[3]]
#> 1 | f
#>
#>
#> $reTrmAddArgs
#> $reTrmAddArgs[[1]]
#> us()
#>
#> $reTrmAddArgs[[2]]
#> us()
#>
#> $reTrmAddArgs[[3]]
#> us()
#>
#>
#> $reTrmClasses
#> [1] "us" "us" "us"
#>
splitForm(~x+y+(1|(f/g)/h)) ## 'slash'; term
#> $fixedFormula
#> ~x + y
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> $reTrmFormulas[[1]]
#> 1 | h:g:f
#>
#> $reTrmFormulas[[2]]
#> 1 | g:f
#>
#> $reTrmFormulas[[3]]
#> 1 | f
#>
#>
#> $reTrmAddArgs
#> $reTrmAddArgs[[1]]
#> us()
#>
#> $reTrmAddArgs[[2]]
#> us()
#>
#> $reTrmAddArgs[[3]]
#> us()
#>
#>
#> $reTrmClasses
#> [1] "us" "us" "us"
#>
splitForm(~x+y+(f|g)+cs(1|g)+cs(a|b,stuff)) ## complex special
#> $fixedFormula
#> ~x + y
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> $reTrmFormulas[[1]]
#> f | g
#>
#> $reTrmFormulas[[2]]
#> 1 | g
#>
#> $reTrmFormulas[[3]]
#> a | b
#>
#>
#> $reTrmAddArgs
#> $reTrmAddArgs[[1]]
#> us()
#>
#> $reTrmAddArgs[[2]]
#> cs()
#>
#> $reTrmAddArgs[[3]]
#> cs(stuff)
#>
#>
#> $reTrmClasses
#> [1] "us" "cs" "cs"
#>
splitForm(~(((x+y)))) ## lots of parentheses
#> $fixedFormula
#> ~(((x + y)))
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> NULL
#>
#> $reTrmAddArgs
#> NULL
#>
#> $reTrmClasses
#> NULL
#>
splitForm(~1+rr(f|g,n=2))
#> $fixedFormula
#> ~1
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> $reTrmFormulas[[1]]
#> f | g
#>
#>
#> $reTrmAddArgs
#> $reTrmAddArgs[[1]]
#> rr(n = 2)
#>
#>
#> $reTrmClasses
#> [1] "rr"
#>
splitForm(~1+s(x, bs = "tp"))
#> $fixedFormula
#> ~1
#> <environment: 0x56443e8821a0>
#>
#> $reTrmFormulas
#> $reTrmFormulas[[1]]
#> x
#>
#>
#> $reTrmAddArgs
#> $reTrmAddArgs[[1]]
#> s(bs = "tp")
#>
#>
#> $reTrmClasses
#> [1] "s"
#>
noSpecials(y~1+us(1|f))
#> y ~ 1
#> <environment: 0x56443e8821a0>
noSpecials(y~1+us(1|f),delete=FALSE)
#> y ~ 1 + (1 | f)
#> <environment: 0x56443e8821a0>
noSpecials(y~us(1|f))
#> y ~ 1
#> <environment: 0x56443e8821a0>
noSpecials(y~us(1|f), delete=FALSE)
#> y ~ (1 | f)
#> <environment: 0x56443e8821a0>
noSpecials(y~us(1|f), debug=TRUE)
#> y ~ us(1 | f)
#> <environment: 0x56443e8821a0>
#> [1] "not special"
#> y
#> us(1 | f)
#> term[[3]] NULL
#> y ~ 1
#> <environment: 0x56443e8821a0>
noSpecials(y~us+1) ## should *not* delete unless head of a function
#> y ~ us + 1
#> <environment: 0x56443e8821a0>
noSpecials(~us(1|f)+1) ## should work on a one-sided formula!
#> ~1
#> <environment: 0x56443e8821a0>
noSpecials(~s(stuff) + a + b, specials = "s")
#> ~a + b
#> <environment: 0x56443e8821a0>
noSpecials(cbind(b1, 20-b1) ~ s(x, bs = "tp"))
#> cbind(b1, 20 - b1) ~ 1
#> <environment: 0x56443e8821a0>