【发布时间】: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 对象。我用deparse、substitute、bquote、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 属性设置为NULL(所以没有什么会“不匹配”),但否则我必须将其设置为deparse -able 并将匹配新数据框中的变量...
【问题讨论】: