Next: , 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 函数 identifyoptionssystemwriteBin 决定了参数或用户行为的结果是否可见。 另外一些函数自己分发可能改变可见性标签的函数: 例如1.Internal, do.call, eval, eval.with.vis2, if, NextMethod, Recall, recordGraphics, standardGeneric, switchUseMethod

`专用的'原始和内部函数只有在设置 R_Visible 才给它们的参数赋值,并且参数赋值 (例如PR#9263中的一个参数)可以改变标签 的值。R 2.5.0之前,这些函数的已知实例在参数的内部 赋值后重新设置标签:相关例子包括 [, [[, $, c, cbind, dump, rbindunlist,以及 语言的一些基本构成 (它们是原始函数) for, whilerepeat

R_Visible 标签可以在函数求值过程中改变。 在代码中可以加warningwriteChar 和调用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函数用于 sourcewithVisible 和其它一些地方。