函数中的函数: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'
发生这种情况是因为 x
和 y
不会自动替换为您传递的变量的公式。看:
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)
}
我试图从 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'
发生这种情况是因为 x
和 y
不会自动替换为您传递的变量的公式。看:
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)
.
但是,如果您出于某种原因必须使用 和 引号来定位变量,例如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)
}