当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R evalSource 使用源文件中的函数定义,无需重新安装包


R语言 evalSource 位于 methods 包(package)。

说明

使用trace 机制将源文件中的函数和/或方法的定义插入到包中。通常,这允许测试或调试一些函数的修改版本,而无需重新安装大型软件包。

用法

evalSource(source, package = "", lock = TRUE, cache = FALSE)

insertSource(source, package = "", functions = , methods = ,
           force = )

参数

source

evalSource 解析和评估的文件,以查找新的函数和方法定义。

insertSource 的参数可以是从先前调用 evalSource 返回的类 "sourceEnvironment" 的对象。如果将文件名传递给 insertSource,它将调用 evalSource 来获取相应的对象。有关详细信息,请参阅有关类的部分。

package

(可选)新代码对应的包的名称以及它将插入到的包的名称。尽管如果省略了包,计算将尝试推断包,但安全的方法是提供它。如果包未附加到搜索列表,则必须提供包名称。

functions, methods

插入时使用的函数的字符串名称(可选)。 functions 参数中提供的名称应定义为源中的函数。对于 methods 参数中提供的名称,需要一个方法表(通过调用 setMethod 生成,请参阅详细信息部分);该表中的方法将由 insertSource 插入。在这两种情况下,仅当修改后的函数或方法与加载的相应包中的版本不同时才会插入。

如果省略what,则源文件的评估结果将与包的内容进行比较(请参阅详细信息部分)。

lock, cache

用于控制 evalSource 所采取的操作的可选参数。如果 lockTRUE ,则返回的对象中的环境将被锁定,其所有绑定也将被锁定。如果 cacheFALSE ,则在评估 source 文件期间将抑制方法和类定义的正常缓存。

通常建议使用默认设置,lock 支持作为源文件快照返回的对象的可信度,第二个以便 insertSource 稍后可以使用跟踪机制插入方法定义。

force

如果是 FALSE ,则仅使用 trace 重新定义当前环境中的函数。如果是 TRUE ,其他对象/函数将被简单地分配。默认情况下,如果未提供 functionsmethods 参数,则为 TRUE

细节

source 文件被解析和评估,默认情况下抑制其中包含的方法和类定义的实际缓存,以便可以以可逆的方式测试函数和方法。如果一切顺利,结果是一个包含与源文件中的方法和类定义相对应的分配对象和元数据的环境。

从此环境中,对象被插入到包中,插入到其命名空间(如果有的话),以便在当前会话期间使用,或者直到通过调用 untrace 恢复到原始版本。插入是通过调用 trace 的内部版本来完成的,以使恢复成为可能。

因为使用了跟踪机制,所以只会插入function-type对象、函数本身或S4方法。

functionsmethods 参数均被省略时,insertSource 将从 source 文件的计算结果中选择所有合适的对象。

在所有情况下,仅插入源文件中与包中相应对象不同的对象。 “differ” 的定义是参数列表(包括默认表达式)或函数体不相同。请注意,在方法的情况下,包中的相应签名不需要特定的方法:与将为该签名选择的方法进行比较。

计算中不要求提供的源文件与原始包源中的文件相同,尽管如果要修改包,这种情况既可能又合理。计算中没有任何内容比较源文件:通过评估 source 生成的对象将作为对象与包的内容进行比较。

来自类 "sourceEnvironment" 的对象,"environment" 的子类(请参阅有关该类的部分) 环境包含由源文件评估产生的所有对象的版本。该类还具有用于创建时间、源文件和包名称的槽。未来的扩展可能会使用这些对象进行版本控制或其他代码工具。

返回的对象可用于调试(请参阅有关该主题的部分)或作为将来调用 insertSource 中的 source 参数。如果在第一次调用中只插入了一些修订后的函数,则可以通过提供环境和可选的合适的 functions 和/或 methods 参数,在以后的调用中插入其他函数,而无需重新评估源文件。

调试

一旦通过 insertSource 将函数或方法插入到包中,就可以通过标准调试工具对其进行研究;例如, debugtrace 的各种版本。

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= 参数,可用于类似的目的;该函数以及 debugsetBreakpoint ,用于更面向传统调试风格的技术。当前函数直接用于修改现有包的某些源代码的情况,尽管也可以通过在源代码中插入调试代码来使用它(如果涉及的调试很重要,则更有用)。如详细信息部分所述,源文件不必与原始包源中的文件相同。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Use Function Definitions from a Source File without Reinstalling a Package。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。