evalSource
位于 methods
包(package)。 说明
使用trace
机制将源文件中的函数和/或方法的定义插入到包中。通常,这允许测试或调试一些函数的修改版本,而无需重新安装大型软件包。
用法
evalSource(source, package = "", lock = TRUE, cache = FALSE)
insertSource(source, package = "", functions = , methods = ,
force = )
参数
source |
由
|
package |
(可选)新代码对应的包的名称以及它将插入到的包的名称。尽管如果省略了包,计算将尝试推断包,但安全的方法是提供它。如果包未附加到搜索列表,则必须提供包名称。 |
functions, methods |
插入时使用的函数的字符串名称(可选)。 如果省略 |
lock, cache |
用于控制 通常建议使用默认设置, |
force |
如果是 |
细节
source
文件被解析和评估,默认情况下抑制其中包含的方法和类定义的实际缓存,以便可以以可逆的方式测试函数和方法。如果一切顺利,结果是一个包含与源文件中的方法和类定义相对应的分配对象和元数据的环境。
从此环境中,对象被插入到包中,插入到其命名空间(如果有的话),以便在当前会话期间使用,或者直到通过调用 untrace
恢复到原始版本。插入是通过调用 trace
的内部版本来完成的,以使恢复成为可能。
因为使用了跟踪机制,所以只会插入function-type对象、函数本身或S4方法。
当 functions
和 methods
参数均被省略时,insertSource
将从 source
文件的计算结果中选择所有合适的对象。
在所有情况下,仅插入源文件中与包中相应对象不同的对象。 “differ” 的定义是参数列表(包括默认表达式)或函数体不相同。请注意,在方法的情况下,包中的相应签名不需要特定的方法:与将为该签名选择的方法进行比较。
计算中不要求提供的源文件与原始包源中的文件相同,尽管如果要修改包,这种情况既可能又合理。计算中没有任何内容比较源文件:通过评估 source
生成的对象将作为对象与包的内容进行比较。
值
来自类 "sourceEnvironment"
的对象,"environment"
的子类(请参阅有关该类的部分) 环境包含由源文件评估产生的所有对象的版本。该类还具有用于创建时间、源文件和包名称的槽。未来的扩展可能会使用这些对象进行版本控制或其他代码工具。
返回的对象可用于调试(请参阅有关该主题的部分)或作为将来调用 insertSource
中的 source
参数。如果在第一次调用中只插入了一些修订后的函数,则可以通过提供环境和可选的合适的 functions
和/或 methods
参数,在以后的调用中插入其他函数,而无需重新评估源文件。
调试
一旦通过 insertSource
将函数或方法插入到包中,就可以通过标准调试工具对其进行研究;例如, debug
或 trace
的各种版本。
对 trace
的调用应采用额外参数 edit
= env
,其中 env
是对 evalSource
的调用返回的值。跟踪机制已用于从源文件安装修订版本,并且提供参数可确保跟踪的是此版本,而不是原始版本。请参阅下面的示例。
要关闭跟踪,但保留源版本,请使用 trace(x,
edit = env)
,如示例中所示。要从包返回到原始版本,请使用 untrace(x)
。
类"sourceEnvironment"
此类中的对象可以被视为环境,以提取 evalSource
生成的函数和方法的版本。这些对象还具有以下插槽:
packageName
:-
源代码对应的包的字符串名称。
dateCreated
:-
评估源文件的日期和时间(通常来自对
Sys.time
的调用)。 sourceFile
:-
使用的源文件的字符串名称。
请注意,使用环境不会更改 dateCreated
。
例子
## Not run:
## Suppose package P0 has a source file "all.R"
## First, evaluate the source, and from it
## insert the revised version of methods for summary()
env <- insertSource("./P0/R/all.R", package = "P0",
methods = "summary")
## now test one of the methods, tracing the version from the source
trace("summary", signature = "myMat", browser, edit = env)
## After testing, remove the browser() call but keep the source
trace("summary", signature = "myMat", edit = env)
## Now insert all the (other) revised functions and methods
## without re-evaluating the source file.
## The package name is included in the object env.
insertSource(env)
## End(Not run)
也可以看看
trace
用于底层机制,也用于 edit=
参数,可用于类似的目的;该函数以及 debug
和 setBreakpoint
,用于更面向传统调试风格的技术。当前函数直接用于修改现有包的某些源代码的情况,尽管也可以通过在源代码中插入调试代码来使用它(如果涉及的调试很重要,则更有用)。如详细信息部分所述,源文件不必与原始包源中的文件相同。
相关用法
- R as 强制对象属于某个类
- R language-class 表示未评估语言对象的类
- R className 类名包含对应的包
- R BasicClasses 基本数据类型对应的类
- R callGeneric 从方法调用当前通用函数
- R findClass 查找类定义
- R setOldClass 注册旧式 (S3) 类和继承
- R ReferenceClasses 具有按引用处理的字段的对象(OOP 样式)
- R MethodsList 方法列表对象
- R setGroupGeneric 创建函数的组通用版本
- R StructureClasses 基本结构对应的类
- R showMethods 显示指定函数或类的所有方法
- R getMethod 获取或测试方法的定义
- R slot 正式类对象中的槽
- R S4groupGeneric S4组通用函数
- R methodUtilities 用于方法和 S-Plus 兼容性的实用函数
- R getClass 获取类定义
- R is 对象是来自类吗?
- R isSealedMethod 检查密封方法或类
- R cbind2 按列或行组合两个对象
- R GenericFunctions 管理通用函数的工具
- R dotsMethods 在方法签名中使用...
- R S3Part 包含 S3 类的 S4 类
- R nonStructure-class 基本类型的非结构 S4 类
- R selectSuperClasses 类的超类(特定类型)
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Use Function Definitions from a Source File without Reinstalling a Package。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。