有没有办法使用带';的字符串公式创建R函数;,及=~&引用;?

有没有办法使用带';的字符串公式创建R函数;,及=~&引用;?,r,function,stringr,R,Function,Stringr,我正在尝试创建一个R函数,它允许我指定潜在变量和指标。有没有办法将以下三行代码转换成函数 ' visual =~ x1 + x2 + x3 textual =~ x4 + x5 + x6 speed =~ x7 + x8 + x9 ' 我尝试使用paste和paste0,但效果不太好。例如,仅使用一个潜在变量,我尝试了以下方法: myFunction <- function(z, x, ...) {

我正在尝试创建一个R函数,它允许我指定潜在变量和指标。有没有办法将以下三行代码转换成函数

            ' visual  =~ x1 + x2 + x3 
              textual =~ x4 + x5 + x6
              speed   =~ x7 + x8 + x9 '
我尝试使用paste和paste0,但效果不太好。例如,仅使用一个潜在变量,我尝试了以下方法:

myFunction <- function(z, x, ...) {
  latent_variable   <- paste0(x)
  latent_indicators <- paste0(..., collapse = " + ")
  latent_formula <- paste0(" ' ", latent_variable, "=", "~", latent_indicators, " ' ")
  
  fit <- cfa(latent_formula, data = z)
  
  summary(fit, fit.measures=TRUE)
}

myFunction(HolzingerSwineford1939, "visual", c("x1", "x2", "x3"))
为了提供更多上下文,将在此处使用该函数。请参阅下面的代码:

library(lavaan)
library(lavaanPlot)

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

fit <- cfa(HS.model, data=HolzingerSwineford1939)

summary(fit, fit.measures=TRUE)
        
lavaanPlot(model = fit)
库(拉万)
图书馆(Lavanplot)

HS.model您不应该将单引号粘贴到公式中。您正在使用
paste()
构建字符串。只用

latent_formula <- paste0(latent_variable, "=", "~", latent_indicators)

visual~x1+x2+x3
中,您可以使用R的公式吗?使用它,它可以直接与其他R基函数(
model.matrix
?)一起使用,而不是解析字符串。@r2evans这是个好主意。我还没试过model.matrix。它能用=~?不,R中的任何东西本机都不能用
=~
,但许多东西都能用
~
:这是它自己的东西,一个
公式。它能用,但我能用这三行吗?好吧,如果你想用这三行运行函数,你到底想调用什么?它只是一个字符串,因此您可以通过在它们之间粘贴“\n”(新行)来组合任意多行。谢谢您的回答。这很有帮助。最后,我想创建一个包含无限多行的函数。我能在函数中指定它吗?我还试图找出包含“\n”的位置。“\n”将分隔不同的行。如果不知道您的输入将是什么样子,就很难说它应该是什么样子。但归根结底,你只是在构建一条线。我这样想:
myFunction(“visual”,c(“x1”,“x2”,“x3”),“text”,c(“x4”,“x5”,“x6”),“speed”,c(“x7”,“x8”,“x9”)),
最后,如果可能的话,我想做很多行。
latent_formula <- paste0(latent_variable, "=", "~", latent_indicators)
myFunction <- function(...) {
  params <- list(...)
  stopifnot(length(params)%%2==0)
  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"))