首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R中创建表达式树

在R中创建表达式树
EN

Stack Overflow用户
提问于 2011-12-23 06:12:31
回答 2查看 1.9K关注 0票数 12

R中的替换函数以树的形式创建一个可以解析的语言对象。如何使用list从头创建树,或者将其提供给eval?

代码语言:javascript
复制
# substitute gives a tree representation of the expression
a=1; b=2;
e1 = substitute(a+2*b)
eval(e1)      #gives 5 as expected
e1            # is type language
e1[[1]]       # this is `+`
e1[[2]]       # this is 'a' type symbol
e1[[3]]       # this is type language
e1[[3]][[1]]  # this is `*`  etc....

我想知道如何以编程方式重新构造e1对象。理想情况下,我创建一个包含复杂列表的对象,其中包含正确的对象,也许我可以在list对象上调用一些as.language。然而,这并不起作用。例如:

代码语言:javascript
复制
# how to construct the tree?
eval(list(as.symbol('+'),1,1))                # does not return 2
eval(as.expression(list(as.symbol('+'),1,1))) # does not return 2

一种方法是只生成字符串'1+1‘,然后解析它,但是当您首先拥有树时,生成字符串来再次解析它们似乎并不优雅!

代码语言:javascript
复制
eval(parse(text='1+1')) # does return 1, but not elegant if tree is 
                        # large and already in memory 

谢谢你的帮忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-23 07:14:37

代码语言:javascript
复制
> plus <- .Primitive("+")
> plus
function (e1, e2)  .Primitive("+")
> times=.Primitive("*")
> eval(call("plus", b, call("times",2, b)))
[1] 6
> eval(call("plus", a, call("times",2, b)))
[1] 5
票数 7
EN

Stack Overflow用户

发布于 2011-12-23 07:09:22

有几种方法可以通过编程方式构造R表达式。如果适用于您的情况,则最方便的是bquote

代码语言:javascript
复制
> a = 1
> bquote(.(a) + .(a))
1 + 1

其中.()是反引号。这实际上应该适用于任何事情,但如果它不适用,有一些方法可以手动构建表达式的基本构建块:

代码语言:javascript
复制
> as.symbol('f')
f
> as.call(list(quote(f), 1, 2))
f(1, 2)
> as.call(list(as.symbol('{'), 1, 2))
{
    1
    2
}
> 
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8610303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档