函数中的函数:cramer 函数 "Error in loglin"

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

我试图从 sjstats 包中嵌入 cramer 函数。尽管该函数在自定义函数之外可以完美运行,但在自定义函数内部却无法正常运行。

非常感谢您。

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'

发生这种情况是因为 xy 不会自动替换为您传递的变量的公式。看:

f <- function(x, y) {
  return(x ~ y)
}

f(a, b)
#> x ~ y

如果你想替换变量,你可以这样做

f2 <- function(x, y) {
   call("~", substitute(x), substitute(y))
}

f2(a, b)
#> a ~ b

所以在你的情况下你可以这样做:

library (sjstats)    

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

显然我们没有您的数据,但使用 built-in 数据集 efc 我们可以证明它按预期工作:

data(efc)

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

reprex package (v2.0.1)

创建于 2022-02-27

如果您的函数不以带引号的变量为目标,即 customfunction(dta=mydata, x= gender, y=age, weight=dataweight).

,Allan 提供的解决方案可以完美运行

但是,如果您出于某种原因必须使用 引号来定位变量,例如customfunction(dta=mydata, x= "gender", y="age", weight="dataweight"). 然后将 substitute 替换为 sym:

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