使用do.call()将字符和data.frame参数传递给函数

时间:2014-02-28 17:38:52

标签: r function do.call r-lavaan

我不知道我是不是白痴,但我正在尝试使用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()的引用 - 但都无济于事。因为我想将它用于一种迷你包,我想避免使用任何其他包,而只想使用基本功能。这可能吗?

非常感谢任何帮助!

最好,马丁

1 个答案:

答案 0 :(得分:2)

do.call期望它的第一个参数是函数的“名称”。通常,如果将其作为R符号(不带引号的表达式)输入或表示为单个元素字符值,则它可以工作。在这种情况下,cfalavaan的包装器,函数名称被转换为名为'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