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

Posted

技术标签:

【中文标题】在R中的引用类中设置全局变量【英文标题】:Setting Global variables inside reference class in R 【发布时间】:2013-01-09 20:15:32 【问题描述】:

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

我有以下情况。我有 2 个全局变量 current_idxprevious_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() &lt;- values 我认为这个答案可能不正确。请注意,我们正在讨论的分配是从 RC 类的一个方法内部完成的。 我认为它不能被称为不正确,因为这个问题对于实际所做的事情仍然相当模糊。您是正确的,&lt;&lt;- 将用于特定参考类的命名方法中的分配过程。我说明的方法绕过了该路由并直接分配值。【参考方案2】:

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

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

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

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

通过使用assign,您绕过了引用方法执行的检查,以确保您不会在引用方法的赋值中意外输入字段名称,因此您不会收到警告。另请注意,assign 实际上以您提供的环境为目标,而&lt;&lt;- 只会在词法搜索路径中找到该名称的第一个对象。

综上所述,在极少数情况下,您实际上希望引用方法确实直接写入全局环境。你可能需要重新考虑你在做什么。你应该问自己为什么这两个变量不仅仅是引用类中的字段,而不是全局变量。

【讨论】:

以上是关于在R中的引用类中设置全局变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个模块中设置全局变量?

如何在 Laravel 中设置全局变量?

在Jmeter中设置全局变量,实现跨线程组传参

如何在 VBA 中设置全局变量

Gradle配置全局变量

Postman 中设置全局变量,token