【问题标题】:Is there a way to create an R function using a string formula with ', and " =~"?有没有办法使用带有'和“=〜”的字符串公式来创建R函数?
【发布时间】:2020-07-06 01:23:35
【问题描述】:

我正在尝试创建一个 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"))

但是我收到了这个错误:

Error in lavParseModelString(model) : lavaan ERROR: left hand side (lhs) of this formula: 'visual =~ x1+x2+x3' contains either a reserved word (in R) or an illegal character: “'visual” See ?reserved for a list of reserved words in R Please use a variable name that is not a reserved word in R and use only characters, digits, or the dot symbol.

为了提供更多上下文,这里将使用该函数。请看下面的代码:

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)

任何帮助将不胜感激。感谢您的宝贵时间。

【问题讨论】:

  • 你能用R的公式吗,比如visual ~ x1 + x2 + x3?使用它,它可以直接与其他 R 基本函数 (model.matrix?) 一起使用,而不是解析字符串。
  • @r2evans 这是个好主意。我还没有尝试过model.matrix。它可以与 =~ 一起使用吗?
  • 不,R 中没有任何东西可以与=~ 一起使用,但很多东西都可以与~ 一起使用:这是它自己的东西,formula

标签: r function stringr


【解决方案1】:

您不应该将单引号粘贴到您的公式中。您已经使用paste() 构建字符串。只需使用

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"))

【讨论】:

  • 它工作了,但我能做到所有三行吗?
  • 好吧,如果你想让它在所有三行中运行,你想怎么调用你的函数呢?它只是一个字符串,因此您可以通过在它们之间粘贴“\n”(新行)来组合任意多行。
  • 感谢您的回答。这很有帮助。最终,我想创建一个包含无数行的函数。我可以在函数中指定吗?我也在试图找出在哪里包含“\n”。
  • "\n" 将分隔不同的行。在不知道您的输入会是什么样子的情况下,很难准确地说出它应该是什么样子。但归根结底,您只是在构建一个字符串。 paste()没有什么是你不能做的
  • 我是这样想的:myFunction("visual", c("x1", "x2", "x3"), "textual", c("x4", "x5", "x6"), "speed", c("x7", "x8", "x9")) 最后,如果可能的话,我想做很多行。
猜你喜欢
  • 2011-11-30
  • 1970-01-01
  • 2017-08-17
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2019-11-13
  • 2014-08-23
相关资源
最近更新 更多