关于R语言里的调用类型(call)

以下内容取自

http://www.biosino.org/R/R-doc/R-lang/Direct-manipulation-of-language-objects.html#Direct-manipulation-of-language-objects


摘选内容如下:

6.1 直接操作语言对象

有三种语言对象可用于修改,调用,表达式和函数。 基于这种认识,我们集中讨论调用对象。就是有时称之为 “未求值表达式”(unevaluated expressions)的对象,尽管 这个术语有点让人困惑。获得一个调用对象最直接的方法是把 一个表达式参数赋给 quote 函数,如

     > e1 <- quote(2 + 2)
     > e2 <- quote(plot(x, y))

参数没有被求值,结果简单地解析为参数。 对象 e1 和 e2 可以随后用 eval求值,或简单地当作数据。这就很明显 为什么 e2 对象的模式是 "call", 因为它利用一些参数调用了函数 plot。但是e1 实际上有和调用 双参数的二元操作符+完全一样的结构。 这个事实可以通过下面的例子更清晰地展示

     > quote("+"(2, 2))
     2 + 2

调用对象的分量可以通过列表类似的语法访问,并且可能用as.list 和 as.call 与列表进行相互转换

     > e2[[1]]
     plot
     > e2[[2]]
     x
     > e2[[3]]
     y

在使用关键字参数匹配时,关键字可以作为 列表的标签:

     > e3 <- quote(plot(x = age, y = weight))
     > e3$x
     age
     > e3$y
     weight

在前面的例子中,调用对象的所有分量的模式是 "name"。 对于调用对象里面的标识符确实是这样,但是一个调用对象的分量还可以是 任意类型的常量,尽管在该调用随后被成功执行时第一个分量 最好是一个函数—或者是其它调用对象以对应的子表达式。 模式名的对象可以用as.name 通过字符串创建,因此我们可以如下 修改 e2 对象

     > e2[[1]] <- as.name("+")
     > e2
     x + y

为说明子表达式是自身调用的简单分量,考虑下面的例子

     > e1[[2]] <- e2
     > e1
     x + y + 2

所有输入的成组括号在解析后的表达式中是受保护的。 它们以单参数函数调用的方式展示,因此 4 - (2 - 2) 在前缀方式中变成 "-"(4, "(" ("-"(2, 2)))。 在求值过程中,( 操作符仅仅返回它的参数。

这有点不幸,但是编写一个同时保护用户输入,以最简形式保存并且 保证解析一个语法分析过的表达式时可以返回 一样的表达式的解析器/语法分析器 不是一件容易的事情。 因为很难做到,所以 R 的解析器不可以很好的可逆,同样它的语法分析器也不行 ,如下面的例子所示

     > deparse(quote(c(1, 2)))
     [1] "c(1, 2)"
     > deparse(1:2)
     [1] "c(1, 2)"
     > quote("-"(2, 2))
     2 - 2
     > quote(2 - 2)
     2 - 2

但是语法分析过的表达式可以得到和 原始表达式一样的求值结果(直到精度错误)。

...流控制结构的内部存储...注意和 Splus 不兼容...



引用结束,就是说,调用类型(call())这个东西,其实是一个list,如果不执行,就是一个相当于list的东西,如果执行,将会返回一个值。如果想让他执行,就用eval(),一般eval()里面都有quote之类的函数,来保证里面的函数是表达式。

另外,因为call类型有list的属性,那么用as.list()和as.call()之间可以相互转换。比如list转换成了call,然后在eval()执行。明天看看那个包里是不是这么用的。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值