【问题标题】:assigning a string to an object without double quotes将字符串分配给不带双引号的对象
【发布时间】:2013-12-24 16:10:21
【问题描述】:

我有一个以编程方式构建的字符串

 tot=~item1+item2+item3+item4+item5+item6+item7+item8+item9+item10

我需要用两个单引号括起来(字符串上没有双引号)并分配给一个对象mod:

# this is what I want
mod <- '
    tot=~item1+item2+item3+item4+item5+item6+item7+item8+item9+item10
'

我试过了:

string <- "tot=~item1+item2+item3+item4+item5+item6+item7+item8+item9+item10"
mod <- as.symbol(paste("'", string, "'", sep=" ")) # to try and remove the double quotes

但 mod 被包裹在 backtics 中

mod
`' tot=~item1+item2+item3+item4+item5+item6+item7+item8+item9+item10 '`

如果更多背景知识会有所帮助,请参阅我发布到help group of the package I am using 的更详细问题。我在 SO 上发布了一个更具体的问题,因为我已将问题范围缩小到 mod 对象的定义方式。

如果我使用cat() 和readLines(),它确实有效:

string <- paste("'", "tot=~item1+item2+item3+item4+item5+item6+item7+item8+item9+item10", "'", sep=" ")
cat(string, file=paste0(string, ".lav"))
mod <- readLines(paste0(string, ".lav"))

但我认为这没有必要。

【问题讨论】:

  • 很抱歉 - 目前还不清楚您想要完成什么。您最后的代码与mod &lt;- string 相同,只是非常复杂且容易出错。
  • 我想要代码块中显示的内容,并带有注释“# this is what I want”。两个单引号之间的字符串是通过几个未显示的步骤构建的。我想获取那个字符串,用单引号括起来,然后将它分配给一个名为mod 的对象。带有“这就是我想要的”注释的代码块显示的是 lavaan 语法:lavaan.ugent.be/tutorial/syntax1.html
  • 就像我说的 - 这还不清楚。你所展示的是 - 再一次,当你说 mod &lt;- string 时你会得到什么(除了它在字符串内有额外的换行符)。单引号和双引号字符串之间没有区别:"foo" == 'foo'。我不知道为什么 lavaan 文档一直坚持使用单引号。他们错了,没关系。
  • lavaan 实际上确实需要字符串。我认为@EricGreen 可能会对lavaan 文档中的这一行感到困惑:A complete lavaan model syntax is simply a combination of these formula types, enclosed between single quotes. Eric,我认为 Konrad 是对的,您实际上不应该需要单引号(只有在您尝试创建字符串时才有意义嵌入双引号)。
  • @BenBolker,你是对的。我正在努力按照指示获得单引号,但似乎双引号还可以。

标签: r


【解决方案1】:

生成数据:

set.seed(101)
dat.test <- do.call(data.frame,replicate(6,sample(1:10, 50, replace=TRUE),
                                    simplify=FALSE))
names(dat.test) <- paste0("s1.item",1:6)

myList1 <- list(scale1.tot=paste0("s1.item",1:6),
                scale1.sub1=paste0("s1.item",1:3),
                scale1.sub2=paste0("s1.item",4:6))

我在这里只制作了一个项目,但您也可以通过另一个 *apply 调用或 for 循环来应用这些项目...

这行得通(尽管它会发出警告,因为数据很琐碎)

fitList <- mapply(function(lhs,rhs) {
           mod <- paste(lhs,"=~",paste(rhs,collapse="+"))
           cfa(mod,data=dat.test)
       },
       names(myList),myList)

【讨论】:

    【解决方案2】:

    我认为您误解了 R 字符串语法。您描述的字符串是:

    # this is what I want
    mod <- '
        tot=~item1+item2+item3+item4+item5+item6+item7+item8+item9+item10
    '
    

    这和写的一模一样:

    mod <- '\ntot=~item1+item2+item3+item4+item5+item6+item7+item8+item9+item10\n'
    

    或

    mod <- "\ntot=~item1+item2+item3+item4+item5+item6+item7+item8+item9+item10\n"
    

    因此,对于您的问题,我认为运行就足够了:

    string <- "tot=~item1+item2+item3+item4+item5+item6+item7+item8+item9+item10"
    mod <- paste0("\n", string, "\n")
    

    如果您想输出不带引号的最终模型,您可以这样做:

    cat(mod)
    # 
    # tot=~item1+item2+item3+item4+item5+item6+item7+item8+item9+item10
    

    【讨论】:

    • 其实按照a discussion in their mailing list的说法,“模型语法中不需要'\n'字符”
    • @IShouldBuyABoat 不,他不是。
    • 但string(带反引号)与“字符串”不同。
    • 谢谢,@josilber。我会接受这个答案,因为它解决了我最初的问题并有一些不错的提示。但以防万一人们进入此页面试图搜索熔岩解决方案,请知道@BenBolker 的评论是正确的。你不需要单引号。您可以将string 分配给mod 而无需任何修改。
    猜你喜欢
    • 1970-01-01
    • 2017-08-21
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多