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)
先感谢您
文档明确指出:
## 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则可能会掩盖问题。将其放在靠近使用它的函数的位置有望在您编辑这些函数时提醒您。
确保将其放在文件中任何函数定义之外,否则将看不到它。
我认为使用 globalsVariables 时会自动生成文件 globals.R。问题是我需要创建包骨架,然后创建文件 globals.R,将其添加到包中的R目录并检查包。
所以,我需要把它放在一个不同的文件中:
#' @import utils
utils::globalVariables(c("eleven"))
Run Code Online (Sandbox Code Playgroud)
并保存
一旦加载了包(并且命名空间被密封,并且绑定被锁定),您就无法修改包命名空间中的绑定。该check工具可帮助您发现违反此限制的行为,因此您可以在检查包时而不是在运行包时发现问题。globalVariables只是check在寻找这些违规行为时呼吁保持沉默,这在几乎所有情况下都是不可取的。如果您确实需要包中的可变状态,您可以创建一个新环境(使用new.env)并将其绑定到命名空间中的(未导出的)“全局”变量。此绑定将被锁定,但这没关系,因为在 R 中您可以就地更改环境(添加/删除元素,有效地修改元素)。
然而,最好的情况是您可以将所有可变状态保留在用户对象中(作为参数传递到函数中,并且它们的修改版本作为函数的输出值返回)。