我如何(重新)创建 'language' 类型的对象?
how do I (re)create an object of type 'language'?
考虑以下问题:ff
是一个包含一些奇特内容的公式;因此 terms(ff)
的 variables
属性将不包含原始变量,而是包含花哨的东西,例如
ff <- ~I(Age)+poly(q,3)
str(attr(terms(ff),"variables"))
## language list(I(Age), poly(q, 3))
我正在尝试将此属性作为 language
对象 入侵 list(Age,q)
。我可以中途到达那里:
(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
(所以什么都不会 "not match"),但除此之外我必须设置它到 deparse
-able 并将匹配新数据框中的变量的东西...
可能有更好的方法,但这似乎有效:
> (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)
替代方法(更改原始调用的条款):
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)
你在 parse
和 deparse
的正确轨道上:
(lang <- parse(text=deparse(lapply(all.vars(ff), as.name)))[[1]])
# list(Age, q)
str(lang)
# language list(Age, q)
考虑以下问题:ff
是一个包含一些奇特内容的公式;因此 terms(ff)
的 variables
属性将不包含原始变量,而是包含花哨的东西,例如
ff <- ~I(Age)+poly(q,3)
str(attr(terms(ff),"variables"))
## language list(I(Age), poly(q, 3))
我正在尝试将此属性作为 language
对象 入侵 list(Age,q)
。我可以中途到达那里:
(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
(所以什么都不会 "not match"),但除此之外我必须设置它到 deparse
-able 并将匹配新数据框中的变量的东西...
可能有更好的方法,但这似乎有效:
> (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)
替代方法(更改原始调用的条款):
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)
你在 parse
和 deparse
的正确轨道上:
(lang <- parse(text=deparse(lapply(all.vars(ff), as.name)))[[1]])
# list(Age, q)
str(lang)
# language list(Age, q)