CMD检查错误

时间:2014-04-23 19:49:45

标签: r

我正在尝试第一次创建一个包,并且我在使用R CMD检查时遇到了问题。

最初,我得到了"笔记"说我的全局变量没有可见的绑定。一世 在正在检查的文件的顶部添加了对这些变量的赋值,现在当示例运行时,我得到错误,说我无法更改锁定绑定的值。由于我没有锁定绑定,我认为这是R CMD检查正在进行的操作,但我无法找到任何文档来描述这意味着什么或如何解决它。

这是一个具体的例子。我的R文件包含这样的函数:

.ddg.init.tables <- function() {
    size <- 100
    ddg.proc.nodes <<- data.frame(ddg.type = character(size),
        ddg.num = numeric(size), ddg.name = character(size),
        ddg.value = character(size), stringsAsFactors=FALSE)
}

使用这样定义的函数,我会得到注释:

.ddg.init.tables: no visible binding for '<<-' assignment to 'ddg.proc.nodes'

为了解决这个问题,我在上面添加了.ddg.init.tables的定义:

ddg.proc.nodes <- NULL

注释消失了,但是在检查示例时,在稍后的R CMD检查过程中,从示例中运行该行:

ddg.init()

我现在收到错误:

> ddg.init()
Error in .ddg.init.tables() : 
  cannot change value of locked binding for 'ddg.proc.nodes'
Calls: ddg.init -> .ddg.init.tables
Execution halted

如果我省略初始化,我会收到说明,但示例会执行。

&#34;锁定绑定&#34;是什么意思?消息,解决它的最佳方法是什么?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

包中的符号(函数或变量)在包的所谓“名称空间”中定义。粗略地说,当你的R包被“加载”时,R会创建一个环境并用你包中定义的符号填充它。然后它“锁定”环境,以便不会意外地重新定义包符号(例如,因此用户不会意外地更改您的某个功能的定义)。然后,R可以选择将锁定的环境“附加”到search()路径,并且用户可以访问您的惊人功能。

锁定环境以保护您的功能免受用户意外更改的副作用是包代码本身不能更改符号定义。通常这是一件好事 - 您希望包代码能够始终如一地执行。

您的用例似乎是关于在“运行时”创建对象。在创建环境之后但在锁定之前执行此操作通常就足够了,这可以通过在包中编写.onLoad函数(请参阅?.onLoad)来实现,或多或少是传统的放在文件zzz.R中。然后,您可以调用ddg.init(),同时仍然可以写入名称空间。

另一种情况是,您在编写函数时确定了对象的结构。在这种情况下,可以创建一个R对象并将其直接包含在包中,可以是R / sysdata.rda,也可以是数据/文件夹,通常使用“延迟加载”,允许R中引用对象中定义的符号代码,好像它们是在包中定义的。

第三种可能性是您需要在交互式会话期间在运行时创建对象,例如,在用户执行功能时记录Web服务是否可用。为此,我们的想法是在您的名称空间中创建一个环境

.cache <- new.env(parent=emptyenv())

并修改环境的内容

setIsUp <- function() {
    .cache[["isup"]] <- TRUE
}

虽然您无法更改.cache的值(因为它已被锁定,例如,您无法将.cache从环境更改为列表或更改为新环境),您可以修改环境的内容。你已经分配了。