如何使用 utils::globalVariables

Mar*_*ina 3 r global-variables r-package

按照您的建议(或至少尝试这样做),我尝试了一些选择,但问题仍然存在,所以一定是我遗漏了什么。

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

setwd("C:/naapp")
#' @import utils 
#' @import devtools 
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用和不使用抑制外来检查

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))
  }
Run Code Online (Sandbox Code Playgroud)

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

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

我从目录 myPack11 中删除了“man”目录,否则我会因为帮助文件为空而收到错误消息。我在描述中添加了导入工具和开发工具

然后我运行检查

devtools::check("myPack11")
Run Code Online (Sandbox Code Playgroud)

我仍然收到这张纸条

#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
Run Code Online (Sandbox Code Playgroud)

我也尝试制作一个环境,结合 Tomas Kalibera 的建议和我在互联网上找到的一个例子。

myEnvir <- new.env()
myEnvir$eleven <- 11
Run Code Online (Sandbox Code Playgroud)

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


问题的第一个版本

我尝试使用包 utils 中的“globalVariables”。我正在用 R 构建一个接口,我打算提交给 CRAN。这是我的第一次,所以,如果问题很基本,请见谅。我已经阅读了帮助并试图找到示例,但我仍然不知道如何使用它。

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

if(getRversion() >= "2.15.1"){utils::globalVariables("eleven")}
Run Code Online (Sandbox Code Playgroud)

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

myFunction11 <- function(){

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

}

myFunctionSum <- function(X){

  print(X+eleven)

}

myFunctionMul <- function(X){

  print(X*eleven)

}
Run Code Online (Sandbox Code Playgroud)

先感谢您

Spa*_*man 6

文档明确指出:

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

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

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

  • 它特别必须位于函数定义的“下方”。如果它位于其上方,您会立即收到警告:“@title Missing name”(我猜如果可执行代码不以函数定义或“NULL”开头,它会与 roxygenizing 混淆?)。 (2认同)

Mar*_*ina 5

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

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

#' @import utils 
utils::globalVariables(c("eleven"))
Run Code Online (Sandbox Code Playgroud)

并保存


Tom*_*era 4

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

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