1.6 自动打印
Next: The write barrier,Previous: Argument evaluation,Up: R Internal Structures
1.6 自动打印
顶层 R 表达式的返回值是否打印由全局布尔变量 R_Visible 控制的。这个变量在所有原始的和内部的函数的条目中设置为true 或 false 是基于文件names.c 中表的eval列而作的:可以通过宏 PRIMPRINT获取适当的设置。R的原始函数 invisible 使用的机制为:它仅仅在条目前设置 R_Visibility = FALSE,并且返回它的参数。
对于大多数函数,内部情况是,当它们进入时,R_Visible的设置是它们返回时使用的值,除非一些例外情况下。R 函数identify,options,system 和 writeBin决定了参数或用户行为的结果是否可见。另外一些函数自己分发可能改变可见性标签的函数:例如1,.Internal, do.call, eval,eval.with.vis2, if,NextMethod, Recall, recordGraphics,standardGeneric, switch 和 UseMethod。
`专用的'原始和内部函数只有在设置 R_Visible 后才给它们的参数赋值,并且参数赋值 (例如PR#9263中的一个参数)可以改变标签的值。R 2.5.0之前,这些函数的已知实例在参数的内部赋值后重新设置标签:相关例子包括 [, [[, $, c, cbind,dump, rbind 和 unlist,以及语言的一些基本构成 (它们是原始函数)for, while 和repeat。
R_Visible 标签可以在函数求值过程中改变。在代码中可以加warning,writeChar和调用GText的图形函数(PR#7397)的注释。(既然C层次的函数eval 设定 R_Visible,这同样可用于其它调用它的函数。既然允诺求值的时候调用它,在对象查找的时候都可以改变 R_Visible。)从 R 2.1.0开始,通过设置R_Visible = FALSE标识的内部函数,在返回的时候强制这一步。从 R 2.5.0 开始,内部和原始函数强制 R_Visible 在返回时的文档记录设置,除非C代码允许改变它(PRIMPRINT的值为2时表明有例外)。
事实上的自动打印通过文件print.c里面的 PrintValueEnv 实现的。如果被答应的对象有S4二进制位集和打开的S4方法分发,通过调用 show 打印该对象。另外,如果对象的二进制位被设定了(因此,该对象有一个"class"属性),调用 print来分发方法:对于没有类属性的对象,调用内部代码print.default。
Footnotes
[1] 另外一个当前的例子是左花括弧,它是作为一个原始函数实现的。
[2] 一个纯的.Internal函数用于source,withVisible 和其它一些地方。
Hits:Loading...
- Previous Page: 1.5.2 ... 参数
- Next Page: 1.7 写屏障和垃圾收集器
