使用方程列表创建 R 函数

Creating an R function with a list of equations

并获得了使用相同类型方程创建函数的帮助:

转换为:

HS.model <- ' visual  =~ x1 + x2 + x3 
              textual =~ x4 + x5 + x6
              speed   =~ x7 + x8 + x9 '

对此:

myFunction <- function(...) {
  params <- list(...)
  lefts = params[seq(1,length(params), by=2)]
  rights = params[seq(2,length(params), by=2)]
  rights <- Map(paste, rights, collapse="+")
  paste(paste0(lefts, " =~", rights), collapse="\n")

使用此输入:

myFunction("visual", c("x1", "x2", "x3"), 
          "textual", c("x4", "x5", "x6"), 
          "speed"  , c("x7", "x8", "x9"))

以上函数只用了“=~” 现在我想组合多种类型的方程式,例如“~~”和“~”。例如,方程式列表如下所示:

model <- '
  # latent variable definitions (latvars)
    ind60 =~ x1 + x2 + x3
    dem60 =~ y1 + y2 + y3 + y4
    dem65 =~ y5 + y6 + y7 + y8
  # regressions                 (regress)
    dem60 ~ ind60
    dem65 ~ ind60 + dem60
  # residual (co)variances      (covars)
    y1 ~~ y5
    y2 ~~ y4 + y6
    y3 ~~ y7
    y4 ~~ y8
    y6 ~~ y8
'

我想新的函数输入应该是这样的:

myFunction(latvars = ("ind60", c("x1", "x2", "x3"), 
                      "dem60", c("y1", "y2", "y3", "y4"), 
                      "dem65", c("y5", "y6", "y7", "y8")),
           regress = ("dem60", c("ind60"),
                      "dem65", c("ind60", "dem60")),
           covars  = ("y1", c("y5"),
                      "y2", c("y4", "y6"),
                      "y3", c("y7"),
                      "y4", c("y8"),
                      "y6", c("y8"))
          )

我试过这样做

myFunction <- function(...) {
  params <- list(...)
  lefts = params[seq(1,length(params), by=2)]
  rights = params[seq(2,length(params), by=2)]
  rights <- Map(paste, rights, collapse="+")
  
  lefts2 = params[seq(3,length(params), by=2)]
  rights2 = params[seq(4,length(params), by=2)]
  rights2 <- Map(paste, rights2, collapse="+")

  paste(paste0(lefts, " =~", rights), paste0(lefts2, " ~", rights2), collapse="\n")

}
 

我显然遇到了错误,而且我无法找到提出各种论据的方法。需要一些帮助请。谢谢你的时间。

您可以使用以下函数生成表达式。在这里,我试图简化代码和参数。如果您注意到,不同模型类型之间的唯一区别是您传入的分隔符,lhs 和 rhs 保持相似。

这是一个常用函数,它接受左手和右手以及用于分隔左手和右手的分隔符。通过更改分隔符,可以将此函数重新用于其他模型类型。

input = list(
  'visual' = c('x1', 'x2', 'x3'),
  'textual' = c('x4', 'x5', 'x6'),
  'speed' = c('x7', 'x8', 'x9')
)

myFunc2 = function(variable, separator){
  #variable is a named list, where name is the lhs and values are the rhs
  lapply(
    list(names(variable)),
    paste,
    lapply(variable, paste, collapse = '+'),
    sep = separator
  )
}

myFunc2(input, '=')
#> [[1]]
#> [1] "visual=x1+x2+x3"  "textual=x4+x5+x6" "speed=x7+x8+x9"

reprex package (v0.3.0)

于 2020-07-06 创建

在不同的模型类型上重用函数:

latvars = list('ind60' = c('x2', 'x3'), sep = '=')
regress = list('ind30' = c('x4', 'x5'), sep = '~~')

expr = list(latvars, regress)

output = c()

for(i in 1:2){
  output[i] = myFunc2(expr[[i]][1], expr[[i]][[2]])
}

output
#> [[1]]
#> [1] "ind60=x2+x3"
#> 
#> [[2]]
#> [1] "ind30~~x4+x5"

reprex package (v0.3.0)

于 2020-07-06 创建