我如何(重新)创建类型'类型的对象?

时间:2015-06-23 16:50:38

标签: r formula

考虑以下问题:ff是一个包含一些奇特内容的公式;因此,variables的{​​{1}}属性不会包含原始变量,而是包含花哨的内容,例如。

terms(ff)

我试图将此属性破解为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 对象。我使用languagedeparsesubstitutebquote进行了很多游戏...但是不能得到正确的咒语,例如< / p>

as.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)) deparse2的包装器,用于将内容折叠为单个字符串)。我可能能够将deparse属性设置为variables(因此没有任何内容可以&#34;不匹配&#34;),否则我必须设置它将成为NULL能够并且将匹配新数据框中的变量的东西......

3 个答案:

答案 0 :(得分:4)

您与parsedeparse

走在了正确的轨道上
(lang <- parse(text=deparse(lapply(all.vars(ff), as.name)))[[1]])
# list(Age, q)
str(lang)
# language list(Age, q)

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

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

另一种方式(相当于约书亚的第二个建议):

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