Search code examples
rfunctioncustom-function

Function within a function: cramer function "Error in loglin"


I tried to embed the cramer function from sjstats package. Although the function works perfectly outside the custom function, it doesn't work within it.

Thank you very much in advance.

library (sjstats)    
cramer2 <- function(dta, x, y){
effsize <- cramer(x ~ y, data = dta)
  return(effsize)
}

cramer2(x=gender, y=age, dta=df)

Error in loglin(data, margins, start = start, fit = fitted, param = param, : falsche Spezifikationen für 'table' oder 'start'


Solution

  • This happens because x and y are not automatically substituted in a formula for the variables you have passed. Look:

    f <- function(x, y) {
      return(x ~ y)
    }
    
    f(a, b)
    #> x ~ y
    

    If you want the variables substituted, you can do something like

    f2 <- function(x, y) {
       call("~", substitute(x), substitute(y))
    }
    
    f2(a, b)
    #> a ~ b
    

    So in your case you can do:

    library (sjstats)    
    
    cramer2 <- function(dta, x, y) {
      
      f <- as.formula(call("~", substitute(x), substitute(y)))
      effsize <- cramer(f, data = dta)
      return(effsize)
    }
    

    Obviously we don't have your data, but using the built-in data set efc we can demonstrate this works as expected:

    data(efc)
    
    cramer2(efc, e16sex, c161sex)
    #> [1] 0.05258249
    

    Created on 2022-02-27 by the reprex package (v2.0.1)