在R中的引用类中设置全局变量

时间:2013-01-25 19:31:14

标签: r reference-class

在阅读了大量的堆栈溢出问题之后,我对全局变量赋值感到有些困惑。我经历过 Global variables in R和其他类似问题

我有以下情况。我有2个全局变量current_idxprevious_idx。这两个全局变量由引用类中的方法设置。

基本上,使用<<-赋值运算符应该正常工作吗?但是,我收到了这个警告

Non-local assignment to non-field names (possibly misspelled?)

我哪里错了?

修改

使用assign(current_idx, index, envir = .GlobalEnv)有效,即我没有收到警告。有人可以对此有所了解。

2 个答案:

答案 0 :(得分:4)

您正在混淆“全局变量”和作为一种环境类型的引用类。执行<<-将在函数的parent.frame中分配具有该名称的变量。如果你只是.GlobalEnv的一个级别,它将与你的assign语句做同样的事情。

如果您有一个参考类项目,您可以通过名称在其中分配项目:

ref_item$varname <- value
但是,说起来容易做起来难。首先,您需要正确设置ReferenceClass:

http://www.inside-r.org/r-doc/methods/ReferenceClasses

答案 1 :(得分:2)

这是因为从引用类方法中修改引用类的字段的默认方法是使用<<-。例如,在:

setRefClass(
  "myClass", 
  fields=list(a="integer"), 
  methods=list(setA=function(x) a <<- x)
)

您可以通过a方法修改参考类的setA字段。因为这是通过引用类中的方法设置字段的规范方式,所以R假定在引用方法中对<<-的任何其他使用都是错误的。因此,如果您尝试分配存在于引用类以外的环境中的变量,R&#34;有帮助地&#34;警告你,也许你有一个错字,因为它认为在参考方法中唯一可能使用<<-是修改参考字段。

您仍然可以使用<<-分配给全局对象。警告只是警告,也许你正在做一些你不打算做的事情。如果您打算在全局环境中写入对象,则警告不适用。

通过使用assign,您绕过了引用方法执行的检查,以确保您不会在引用方法中意外地在作业中拼写字段名称,因此您不会收到警告。另请注意,assign实际上是针对您提供的环境,而<<-只会在词汇搜索路径中找到该名称的第一个对象。

所有这些都说,实际上很少有实际需要参考方法直接写入全局环境的实例。您可能需要重新考虑自己在做什么。您应该问问自己为什么这两个变量不仅仅是引用类中的字段而不是全局变量。