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())

Arguments

formula

a formula containing special random effect terms

defaultTerm

default type for non-special RE terms

allowFixedOnly

(logical) are formulas with no RE terms OK?

allowNoSpecials

(logical) are formulas with only standard RE terms OK?

debug

debugging mode (print stuff)?

term

language object

Value

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)

Details

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.

Author

Steve Walker

Examples

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>