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


R setLoadActions 设置包加载操作


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

说明

这些函数为包提供了一种机制,用于指定在加载包名称空间期间要完成的计算。此类操作是提供仅在加载时可用的信息(例如动态链接库中的位置)的灵活方式。

setLoadAction()setLoadActions() 的调用指定加载相应命名空间时要调用的一个或多个函数,其中...参数名称用作操作的标识名称。

getLoadActions 报告当前定义的加载操作,并将包的命名空间作为其参数。

如果先前已为 where 命名空间设置了与给定名称对应的加载操作,hasLoadAction 将返回 TRUE

evalOnLoad()evalqOnLoad() 安排特定表达式在加载时进行计算。

用法

setLoadAction(action, aname=, where=)

setLoadActions(..., .where=)

getLoadActions(where=)

hasLoadAction(aname, where=)

evalOnLoad(expr, where=, aname=)

evalqOnLoad(expr, where=, aname=)

参数

action, ...

一个或多个参数的函数,在加载此包时调用。这些函数将使用一个参数(包命名空间)进行调用,因此所有后续参数都必须具有默认值。

如果...的元素被命名,这些名称将用于相应的加载元数据。

where, .where

为其定义加载操作列表的包的命名空间。如果调用来自包本身的源代码,则通常会省略此参数,但如果一个包为另一个包提供加载操作,则需要该参数。

aname

操作的名称。如果设置操作时未提供名称,则默认使用指定操作序列中的位置( ".1" 等)。

expr

要在环境 where 中的加载操作中求值的表达式。在 evalqOnLoad() 的情况下,表达式按字面解释,在 evalOnLoad() 的情况下,必须预先计算该表达式,通常作为 "language" 类型的对象。

细节

evalOnLoad()evalqOnLoad() 函数是为了方便起见。他们构造一个函数来计算表达式并调用 setLoadAction() 来安排对该函数的调用。

作为 setLoadAction()setLoadActions() 的参数提供的每个函数都作为元数据保存在命名空间中,通常是包含对 setLoadActions() 的调用的包的元数据。当加载此包的名称空间时,将调用每个函数。操作函数按照提供给 setLoadActions() 的顺序调用。分配的对象具有根据调用中提供的名称构造的元数据名称;未命名的参数根据其在操作列表中的位置进行命名(".1" 等)。

可以在包的代码中多次调用setLoadAction()setLoadActions();这些操作将安排在任何先前指定的操作之后,除非给 setLoadAction() 指定的名称是现有操作的名称。在典型的应用程序中,当从包自己的代码调用以设置多个操作时,setLoadActions() 更方便。如果要构造操作名称,则调用 setLoadAction() 会更方便,当一个包为另一个包构造加载操作时,这种情况更为典型。

可以通过在后续调用中分配相同的名称(实际名称或构造名称)来修改操作。替换仍然必须是有效的函数,但如果目的是删除先前指定的操作,则当然不能执行任何操作。

这些函数必须至少有一个参数。它们将通过一个参数来调用,即包的名称空间。这些函数将在 S4 元数据处理结束时、动态链接任何已编译代码、调用 .onLoad()(如果有)以及缓存方法和类定义之后(但在密封命名空间之前)调用。 (仅当方法分派打开时才会调用加载操作。)

因此,函数可以分配或修改作为调用中的参数提供的命名空间中的对象。该机制允许包保存在加载时才可用的信息,例如从动态链接库获取的值。

加载操作应与 setHook() 提供的用户加载钩子进行对比。用户钩子通常是从包外部提供的,并在命名空间被密封后运行。加载操作通常是包代码的一部分,并且操作列表通常是在安装包时建立的。

加载操作可以直接在包的源代码中提供。在一个包中提供工具以在另一个包中创建加载操作也是可能且有用的。软件需要小心地在正确的环境(即目标包的命名空间)中分配操作函数。

setLoadAction()setLoadActions() 因其副作用而被调用,并且不返回任何有用的值。

getLoadActions() 返回所提供的命名空间中的操作的命名列表。

如果指定的操作名称出现在此包的操作中,hasLoadAction() 将返回 TRUE

例子

## Not run: 
## in the code for some package

## ... somewhere else
setLoadActions(function(ns)
   cat("Loaded package", sQuote(getNamespaceName(ns)),
       "at", format(Sys.time()), "\n"),
  setCount = function(ns) assign("myCount", 1, envir = ns),
  function(ns) assign("myPointer", getMyExternalPointer(), envir = ns))
  ... somewhere later
if(countShouldBe0)
  setLoadAction(function(ns) assign("myCount", 0, envir = ns), "setCount")

## End(Not run)

也可以看看

setHook 更安全(因为它们在命名空间被密封后运行)和基础包中更全面的版本。

相关用法


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