在R中的引用类中设置全局变量
Posted
技术标签:
【中文标题】在R中的引用类中设置全局变量【英文标题】:Setting Global variables inside reference class in R 【发布时间】:2013-01-09 20:15:32 【问题描述】:在阅读了很多堆栈溢出问题后,我对全局变量赋值感到有些困惑。我经历过 Global variables in R等类似问题
我有以下情况。我有 2 个全局变量 current_idx
和 previous_idx
。这两个全局变量由引用类中的方法设置。
基本上,使用<<-
赋值运算符应该可以正常工作吗?但是,我收到了这个警告
Non-local assignment to non-field names (possibly misspelled?)
我哪里错了?
编辑
使用assign(current_idx, index, envir = .GlobalEnv)
有效,即我没有收到警告。有人可以对此有所了解。
【问题讨论】:
【参考方案1】:您混淆了“全局变量”和作为环境类型的引用类。执行 <<-
将分配给函数的 parent.frame 中具有该名称的变量。如果您仅比 .GlobalEnv 低一级,它将执行与您的分配语句相同的操作。
如果你有一个参考类项目,你可以按名称分配其中的项目:
ref_item$varname <- value
不过,说起来容易做起来难。首先,您需要正确设置 ReferenceClass:
http://www.inside-r.org/r-doc/methods/ReferenceClasses
【讨论】:
啊,我没明白参考类是一种环境。所以,如果我必须将引用类中的方法的输出分配给全局变量,我必须明确地使用分配与 envir = .GlobalEnv 对吗? 我认为这行不通。您可以尝试使用 envir=RefCname 的 assign(),但我不保证成功。阅读文档并完成示例。标准方式是使用refCname$edit() <- values
我认为这个答案可能不正确。请注意,我们正在讨论的分配是从 RC 类的一个方法内部完成的。
我认为它不能被称为不正确,因为这个问题对于实际所做的事情仍然相当模糊。您是正确的,<<-
将用于特定参考类的命名方法中的分配过程。我说明的方法绕过了该路由并直接分配值。【参考方案2】:
这是因为在引用类方法中修改引用类字段的默认方法是使用<<-
。例如,在:
setRefClass(
"myClass",
fields=list(a="integer"),
methods=list(setA=function(x) a <<- x)
)
您可以通过setA
方法修改引用类的a
字段。因为这是通过引用类中的方法设置字段的规范方式,所以 R 假定在引用方法中对 <<-
的任何其他使用都是错误的。因此,如果您尝试分配存在于引用类以外的环境中的变量,R“有用地”警告您可能有错字,因为它认为在引用方法中唯一可能使用 <<-
是修改参考字段。
您仍然可以使用<<-
分配给全局对象。警告只是一个警告,也许你正在做一些你不打算做的事情。如果您打算写入全局环境中的对象,则警告不适用。
通过使用assign
,您绕过了引用方法执行的检查,以确保您不会在引用方法的赋值中意外输入字段名称,因此您不会收到警告。另请注意,assign
实际上以您提供的环境为目标,而<<-
只会在词法搜索路径中找到该名称的第一个对象。
综上所述,在极少数情况下,您实际上希望引用方法确实直接写入全局环境。你可能需要重新考虑你在做什么。你应该问自己为什么这两个变量不仅仅是引用类中的字段,而不是全局变量。
【讨论】:
以上是关于在R中的引用类中设置全局变量的主要内容,如果未能解决你的问题,请参考以下文章