【问题标题】:how do I (re)create an object of type 'language'?我如何(重新)创建“语言”类型的对象?
【发布时间】:2015-06-23 16:50:38
【问题描述】:

考虑以下问题:ff 是一个公式,其中包含一些花哨的东西;因此terms(ff)variables 属性将不包含原始变量,而是包含花哨的东西,例如

ff <- ~I(Age)+poly(q,3)
str(attr(terms(ff),"variables"))
## language list(I(Age), poly(q, 3))

我正在尝试将此属性破解为list(Age,q) 作为language 对象。我可以去那里:

(vlist <- lapply(as.list(all.vars(ff)),as.name))
## [[1]]
## Age   
## [[2]]
## q
str(vlist)
## List of 2
##  $ : symbol Age
##  $ : symbol q

但我很难将其转回language 对象。我用deparsesubstitutebquoteas.call 玩了很多次...但不能完全掌握正确的咒语,例如

deparse(vlist)
## [1] "list(Age, q)"    ## character, not language
parse(text=deparse(vlist))
## expression(list(Age, q))   ## expression, not language
as.name(vlist)
## Error in as.name(vlist) : 
##   (list) object cannot be coerced to type 'symbol'

dput(vlist)看起来不错,但它只是打印到控制台而不更改对象...

更多上下文:我在model.matrix 的下游遇到了麻烦,它在那里检查

reorder <- match(sapply(attr(t, "variables"), deparse2)[-1L], 
        names(data))

(其中deparse2deparse 的包装器,可将内容折叠为单个字符串)。我可能能够将variables 属性设置为NULL(所以没有什么会“不匹配”),但否则我必须将其设置为deparse -able 并将匹配新数据框中的变量...

【问题讨论】:

    标签: r formula


    【解决方案1】:

    parsedeparse 你走在正确的轨道上:

    (lang <- parse(text=deparse(lapply(all.vars(ff), as.name)))[[1]])
    # list(Age, q)
    str(lang)
    # language list(Age, q)
    

    【讨论】:

      【解决方案2】:

      可能有更好的方法,但这似乎可行:

      > (lang <- do.call("call", c("list", lapply(all.vars(ff), as.name)), quote=TRUE))
      list(Age, q)
      > str(lang)
       language list(Age, q)
      

      这里有一个替代方案,它可能稍微干净一些:

      > (lang <- as.call(c(quote(list), lapply(all.vars(ff), as.name))))
      list(Age, q)
      > str(lang)
       language list(Age, q)
      

      【讨论】:

        【解决方案3】:

        另一种方式(更改原始通话条款):

        lang <- attr(terms(ff),"variables")
        lang[-1] <-lapply(all.vars(ff),as.name)
        str(lang)
        language list(Age, q)
        

        另一种方式(相当于Joshua的第二种建议):

        lang <- c(quote(list), lapply(all.vars(ff),as.name))
        mode(lang) <- "call"
        str(lang)
        language list(Age, q)
        

        【讨论】:

          猜你喜欢
          • 2020-06-18
          • 2019-01-02
          • 1970-01-01
          • 2011-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多