用一系列方程式创建R函数

用一系列方程式创建R函数,r,function,parameters,arguments,stringr,R,Function,Parameters,Arguments,Stringr,我得到了关于创建具有相同类型方程的函数的帮助: 将此转换为: HS.model <- ' visual =~ x1 + x2 + x3 textual =~ x4 + x5 + x6 speed =~ x7 + x8 + x9 ' 上述函数仅使用“=~” 现在我想结合多种类型的方程,如“~~”和“~”。例如,方程式列表如下所示: model <- ' # latent variable definitions (l

我得到了关于创建具有相同类型方程的函数的帮助:

将此转换为:

HS.model <- ' visual  =~ x1 + x2 + x3 
              textual =~ x4 + x5 + x6
              speed   =~ 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 <- 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")

}
 

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

这是一个共同的功能,它包含lhs和rhs以及分隔符,以分离lhs和rhs。通过更改分隔符,此功能可用于其他模型类型

input=list(
“视觉”=c('x1','x2','x3'),
'文本'=c('x4','x5','x6'),
“速度”=c('x7','x8','x9')
)
myFunc2=函数(变量、分隔符){
#变量是一个命名列表,其中名称是lhs,值是rhs
拉普拉(
列表(名称(变量)),
粘贴
lapply(变量、粘贴、折叠='+'),
sep=分离器
)
}
myFunc2(输入“=”)
#> [[1]]
#>[1]“视觉=x1+x2+x3”“文字=x4+x5+x6”“速度=x7+x8+x9”
由(v0.3.0)于2020-07-06创建

在不同型号上重复使用该功能:

latvars=list('ind60'=c('x2','x3'),sep='
回归=list('ind30'=c('x4','x5'),sep='~')
expr=列表(latvars,回归)
输出=c()
(我在1:2中){
输出[i]=myFunc2(expr[[i]][1],expr[[i]][[2]]
}
输出
#> [[1]]
#>[1]“ind60=x2+x3”
#> 
#> [[2]]
#>[1]“ind30~~x4+x5”

由(v0.3.0)于2020-07-06创建的

您得到的错误是什么?请注意,错误可能是由于您在
myFunction
中传递参数的方式造成的。正如我从您的示例
myFunction(latvars=('visual',c('x1','x2','x3')中所看到的那样
,您将参数错误地传递给命名参数
latvars
。要么将其作为向量或列表传递。哦,我明白了。如何将其作为向量或列表传递?向量由
c
构成,列表由
list
构成?好的,我试试看。
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")

}