如何使用utils :: globalVariables

时间:2016-10-26 00:24:57

标签: r

按照你的建议(或者至少尝试这样做),我尝试了一些选择,但问题仍然存在,所以一定有我遗漏的东西。

我添加了更完整的代码

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())

我删除了&#34; man&#34;目录myPack11中的目录, 否则我会收到错误,因为帮助文件是空的。 我将导入工具和devtools添加到描述

然后我运行检查

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

我也试图创造一个环境,结合托马斯·卡里贝拉的建议和我在互联网上找到的一个例子。

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

等 在这种情况下,我得到相同的注释,但是使用&#34; myEnvir&#34;而不是&#34; 11和#34;

]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]

问题的第一个版本

我试图使用&#34; globalVariables&#34;从包utils。我正在R中构建一个接口,我打算提交给CRAN。这是我的第一次,所以,对不起,如果问题非常基础。我已经阅读了帮助,我试图找到示例,但我仍然不知道如何使用它。

我做了一个有点愚蠢的例子来说明我的问题,即: 我在哪里准确地放置这条线?:

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

我的例子有三个功能。 myFunctionEleven创建全局变量&#34; 11;&#34;而另外两个函数操纵它。在我的实际代码中,我不能在通过按钮调用的函数中使用参数。考虑到这只是学习如何使用globalVariables(避免绑定注释)的一个愚蠢的例子。

myFunction11 <- function(){

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

}

myFunctionSum <- function(X){

  print(X+eleven)

}

myFunctionMul <- function(X){

  print(X*eleven)

}

提前谢谢

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

所以,我需要将它放在另一个文件中:

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

并保存

答案 2 :(得分:1)

文件清楚地说:

 ## 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,则可能会掩盖问题。正确地将它放在使用它的函数附近时,有希望在编辑这些函数时提醒您。

确保将置于外部文件中的任何功能定义,否则它将无法看到。