R 如何(重新)创建类型为';语言';?

R 如何(重新)创建类型为';语言';?,r,formula,R,Formula,考虑以下问题:ff是一个公式,里面有一些奇特的东西;因此,terms(ff)的variables属性将不包含原始变量,而是包含新奇的内容,例如 ff <- ~I(Age)+poly(q,3) str(attr(terms(ff),"variables")) ## language list(I(Age), poly(q, 3)) 但我很难把它转换成语言对象。我经常玩deparse,substitute,bquote,as.call。。。但是不能得到正确的咒语,例如 deparse(vli

考虑以下问题:
ff
是一个公式,里面有一些奇特的东西;因此,
terms(ff)
variables
属性将不包含原始变量,而是包含新奇的内容,例如

ff <- ~I(Age)+poly(q,3)
str(attr(terms(ff),"variables"))
## language list(I(Age), poly(q, 3))
但我很难把它转换成
语言
对象。我经常玩
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))

重新排序可能有更好的方法,但这似乎有效:

> (lang <- do.call("call", c("list", lapply(all.vars(ff), as.name)), quote=TRUE))
list(Age, q)
> str(lang)
 language list(Age, q)
>(lang str(lang)
语言列表(年龄,q)
这里有一个可能稍微干净一点的替代方案:

> (lang <- as.call(c(quote(list), lapply(all.vars(ff), as.name))))
list(Age, q)
> str(lang)
 language list(Age, q)
>(lang str(lang)
语言列表(年龄,q)
另一种方式(更改原始通话的条款):


lang您使用
parse
deparse
的方法是正确的:

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