【问题标题】:how to use utils::globalVariables如何使用 utils::globalVariables
【发布时间】:2017-03-08 04:49:53
【问题描述】:

按照您的建议(或至少尝试这样做),我尝试了一些选项,但问题仍然存在,所以我一定缺少一些东西。

我已经包含了更完整的代码

setwd("C:/naapp")
#' @import utils 
#' @import devtools 

我尝试过使用和不使用suppressForeignCheck

if(getRversion() >= "2.15.1"){

  utils::globalVariables(c("eleven"))
  utils::suppressForeignCheck(c("eleven"))

  }


myFunctionSum <- function(X){print(X+eleven)}

myFunctionMul <- function(X){print(X*eleven)}

myFunction11 <- function(X){
  assign("eleven",11,envir=environment(myFunctionMul))
  }

也许我应该使用特定的环境?

package.skeleton(name = "myPack11", list=ls(),
                 path = "C:/naapp", force = TRUE,
                 code_files = character())

我从目录 myPack11 中删除了“man”目录, 否则我会得到一个错误,因为帮助文件是空的。 我将导入工具和开发工具添加到描述中

然后我运行检查

devtools::check("myPack11")

我仍然收到这个便条

#checking R code for possible problems ... NOTE
#myFunctionMul: no visible binding for global variable 'eleven'
#myFunctionSum: no visible binding for global variable 'eleven'
#Undefined global functions or variables:eleven

我也尝试过创建一个环境,结合 Tomas Kalibera 的建议和我在 Internet 上找到的一个示例。

myEnvir <- new.env()
myEnvir$eleven <- 11

等 在这种情况下,我得到相同的注释,但使用“myEnvir”,而不是“十一”


问题的第一个版本

我尝试使用包 utils 中的“globalVariables”。我正在 R 中构建一个界面,并计划提交给 CRAN。这是我第一次,所以,如果问题非常基本,对不起。我已经阅读了帮助并尝试找到示例,但我仍然不知道如何使用它。

我做了一个小例子来说明我的问题,即: 我必须把这条线准确地放在哪里?:

if(getRversion() >= "2.15.1"){utils::globalVariables("eleven")}

我的示例具有三个功能。 myFunction11 创建全局变量“十一”,其他两个函数对其进行操作。在我的真实代码中,我不能在通过按钮调用的函数中使用参数。考虑到这只是一个学习如何使用 globalVariables 的愚蠢示例(以避免绑定注释)。

myFunction11 <- function(){

  assign("eleven",11,envir=environment(myFunctionSum))

}

myFunctionSum <- function(X){

  print(X+eleven)

}

myFunctionMul <- function(X){

  print(X*eleven)

}

提前谢谢你

【问题讨论】:

标签: r global-variables r-package


【解决方案1】:

我以为使用 globalsVariables 时会自动生成文件 globals.R。问题是我需要创建包骨架,然后创建文件globals.R,将其添加到包中的R目录并检查包。

所以,我需要将它放在不同的文件中:

#' @import utils 
utils::globalVariables(c("eleven"))

并保存

【讨论】:

    【解决方案2】:

    一旦包被加载(并且命名空间被密封,并且绑定被锁定),您就不能修改包命名空间中的绑定。 check 工具可帮助您发现违反此限制的行为,因此您可以在检查包而不是在运行包时发现问题。 globalVariables 只是在查找这些违规行为时对 check 静音的调用,这在几乎所有情况下都是不可取的。如果您确实需要包中的可变状态,您可以创建一个新环境(使用new.env)并将其绑定到您命名空间中的(未导出的)“全局”变量。此绑定将被锁定,但这没关系,因为在 R 中您可以就地更改环境(添加/删除元素,有效地修改元素)。

    然而,最好的情况是您可以在用户对象中保留所有可变状态(作为参数传入函数,并将其修改后的版本作为函数的输出值返回)。

    【讨论】:

      【解决方案3】:

      文档清楚地说:

       ## In the same source file (to remind you that you did it) add:
       if(getRversion() >= "2.15.1")  utils::globalVariables(c(".obj1", "obj2"))
      

      所以把它和你的函数放在同一个源文件中。它可以放在你的任何 R 源文件中,但上面的评论建议你把它放在靠近你的代码的地方。查看一堆 github 包发现另一个常见的模式是在其中包含一个 globals.R 函数,但这可能是一个坏主意。如果您稍后从包中删除全局但忽略更新globals.R,您可能会掩盖问题。将它放在使用它的函数附近,希望在您编辑这些函数时提醒您。

      确保将其放在文件中外部的任何函数定义之外,否则将不会被看到。

      【讨论】:

      • 它必须在函数定义。如果它在它上面,你会立即收到警告:@title Missing name(我猜如果可执行代码不是以函数定义或NULL开头?)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      相关资源
      最近更新 更多