【问题标题】:Using compiler- package and suppress "No visible binding for global variable"使用编译器包并抑制“全局变量没有可见绑定”
【发布时间】:2014-08-07 04:02:15
【问题描述】:

我在 Ubuntu 14 上使用 R 3.0.2。我在代码中进行了一些繁重的计算,并尝试了带有

的“编译器”包
compilePKGS(enable=TRUE)
enableJIT(3)

而且它似乎加快了我的代码速度。很不错!

但是每次我的包启用“编译器”时,我都会收到很多类似

的注释
Note: no visible binding for global variable '.Data'

或与我自己的 S4 对象类似的东西(代码中的“obj@result”):

Note: no visible binding for global variable 'result'

例如,它是自制 S4 对象的一部分。添加setCompilerOptions("suppressAll", TRUE)setCompilerOptions("suppressUndefined", TRUE)没有帮助。当我完全停用编译器包时,根本没有弹出任何注释,所以这可能是我对编译器包/jit的理解有问题?

我能做些什么来抑制这些音符?

编辑:

require(compiler)
compilePKGS(enable=TRUE)
enableJIT(3)



setClass(Class = "testobject", 
         slots = c( data     = "numeric",   
                    test     = "character", 
                    split    = "numeric",   
                    name     = "character"  
         )
)

a <- new("testobject", data=c(1,2,3,4), test="TEST", split=5, name="NAME")

for(i in a@data){
  print(i)
}

简单的例子产生

Note: no visible binding for global variable '.Data' 
Note: no visible binding for global variable '.Data' 

在 ClassDefinition 调用之后直接

【问题讨论】:

  • 如果你定义了.Data,你可以隐藏这些注释(例如在你的脚本开头添加.Data &lt;- NULL)。我不完全确定为什么在这里发布它,所以也许其他人可以确认这是一个保存的事情。
  • 是的,没错,我在 link 找到了类似的答案,但有趣的是,当我停用编译器或 jit(3) 时,这些消息不会出现。链接线程中的解决方法会在环境中创建变量。我认为那不适合打包吗?这感觉与编译器有关还是我错过了什么?谢谢你的帮助! :)
  • @Marc 你有没有找到解决办法?
  • 我在编译器包中遇到了同样的问题,它在 Spark pipe() 情况下使用它时出现在左侧字段中,我一直无法找到任何解决方案。

标签: r package


【解决方案1】:

您可以使用 R 隐藏这些注释

setCompilerOptions(suppressAll = TRUE)

没有必要单独取消“未定义”选项,取消“全部”即可。或者,您可以设置环境变量

export R_COMPILER_SUPPRESS_ALL=true (或在不同操作系统下类似)。

如果您只想抑制有关编译器未定义或似乎未定义的变量的警告,您可以这样做

setCompilerOptions(suppressUndefined=TRUE)

如果您只想对变量 .Data 执行此操作,您可以这样做

setCompilerOptions(suppressUndefined=".Data")

注意,当你使用编译器来加速你的代码时,不需要启用包的编译,你需要做的就是启用 JIT。您可以像示例中那样从 R 中执行此操作,或者只是设置另一个变量

export R_ENABLE_JIT=3

要启用最激进的优化,您还可以设置

export R_COMPILER_OPTIMIZE=3

或从 R 运行 setCompilerOptions(optimize=3)

通过环境变量启用 JIT 编译时,您不必显式加载编译器包 - 它会自动完成。

【讨论】:

  • 是的!谢谢你。我很惊讶我没有在其他地方看到suppressAll = TRUE,但这对我有用。
  • 手册中介绍了设置编译器选项 (?setCompilerOptions),新版本的 R 还将有一个示例以使其更清晰。
【解决方案2】:

你可以定义一个全局变量,例如

utils::globalVariables(".Data")

这将防止“全局变量没有可见绑定”注意。

这比抑制所有针对它的编译器消息具有优势;您不会抑制其他有用的编译器消息。

【讨论】:

  • 如果你只想抑制这个特定的警告,预期的方法是通过 setCompilerOptions(suppressUndefined=".Data")。
猜你喜欢
  • 2018-02-09
  • 2015-08-02
  • 2018-12-26
  • 2015-08-12
  • 2011-12-27
  • 1970-01-01
  • 2014-06-21
  • 2019-12-18
相关资源
最近更新 更多