按照你的建议(或者至少尝试这样做),我尝试了一些选择,但问题仍然存在,所以一定有我遗漏的东西。
我添加了更完整的代码
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)
}
提前谢谢
答案 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
,则可能会掩盖问题。正确地将它放在使用它的函数附近时,有希望在编辑这些函数时提醒您。
确保将置于外部文件中的任何功能定义,否则它将无法看到。