我不知道我是不是白痴,但我正在尝试使用do.call()将参数传递给lavaan cfa()函数。我已经成功完成了其他功能,但在这种情况下,参数是混合的 - 即第一个是字符串,第二个是data.frame,第三个是字符串。举个简单的例子:
require(lavaan)
#simulating data
t <- rnorm(100,0,.8)
y1 <- t + rnorm(100,0,.2)
y2 <- t + rnorm(100,0,.2)
y3 <- t + rnorm(100,0,.2)
g <- c(0,1)
data <- data.frame(y1,y2,y3,g)
#setting up the lavaan model
model <- 'f1 =~ y1 + y2 + y3'
现在只需使用这些参数就可以了。
cfa(model,data,group='g')
但是当我尝试使用do.call()
时args <- list(model=model,data=data,group='g')
do.call(cfa,args)
我收到此错误消息:
Error in as.character(mc[[1L]]) :
cannot coerce type 'closure' to vector of type 'character'
我尝试使用substitute(),引号的任何组合和do.call()的引用 - 但都无济于事。因为我想将它用于一种迷你包,我想避免使用任何其他包,而只想使用基本功能。这可能吗?
非常感谢任何帮助!
最好,马丁
答案 0 :(得分:2)
do.call
期望它的第一个参数是函数的“名称”。通常,如果将其作为R符号(不带引号的表达式)输入或表示为单个元素字符值,则它可以工作。在这种情况下,cfa
是lavaan
的包装器,函数名称被转换为名为'model.type'的列表元素,当它是字符值时成功,但当它是R符号时不成功 - 功能名称。
> do.call('cfa',args)
lavaan (0.5-15) converged normally after 56 iterations
Number of observations per group
0 50
1 50
Estimator ML
Minimum Function Test Statistic 0.000
Degrees of freedom 0
P-value (Chi-square) 0.000
Chi-square for each group:
0 0.000
1 0.000