6.3 求值之外的东西
Next: Evaluation of expression objects,Previous: Substitutions,Up: Computing on the language
6.3 求值之外的东西
在本章前面就引入的eval 函数作为调用对象求值的一种方法。但是,这不是全部。它还可以指定求值发生的环境。默认情况下,这就是eval被调用时的求值框架,但是它常常需要设成其它值。一般情况下,相应的求值框架是当前框架的父框架。特别,当求值对象是函数参数substitute操作后的结果,它将包含只对调用者有意义的变量(注意,没有理由期望调用者的变量也在被调用者的词法作用域里面)。既然父框架里面的求值频繁发生,函数 eval.parent可以作为 eval(expr, sys.frame(sys.parent()))的简写方式存在。
另外一个常常出现的例子是一个列表或数据框的求值。例如,当 data 参数给定时,可能和model.frame函数发生关联。通常,模型公式的条目需要在data 里面求值,但是它们偶尔也包括对 model.frame 的调用者内部条目的引用。在仿真研究时,这可能非常有用。因为这个原因,不仅需要对一个列表里面的表达式求值,还需要指定一个外围以便于变量在列表中找不到时可以继续搜索。因此,调用有下面的形式
eval(expr, data, sys.frame(sys.parent()))
注意,在一个给定环境中求值可能事实上改变了那个环境,在赋值操作中这最明显,如
eval(quote(total <- 0), environment(robert$balance)) # rob Rob
这对于列表中的求值同样适用,但是原始的列表不会改变,因为我们操作的只是原始列表的一个拷贝。
Hits:Loading...
- Previous Page: 6.2 替换
- Next Page: 6.4 表达式对象的求值
