R 如何在加载时使变量对命名空间可用
在我的一个包中,我使用R 如何在加载时使变量对命名空间可用,r,devtools,r-package,R,Devtools,R Package,在我的一个包中,我使用.onAttach钩子运行一些R代码,然后使用assign使值作为包变量之一可用。我这样做是因为variable取决于某个文件的内容,该文件可以在一个会话和另一个会话之间更改。我使用的代码如下所示: .onAttach <- function(libname, pkgname) { variable <- some_function() assign("variable", variable, envir = as.environment("pack
.onAttach
钩子运行一些R代码,然后使用assign
使值作为包变量之一可用。我这样做是因为variable
取决于某个文件的内容,该文件可以在一个会话和另一个会话之间更改。我使用的代码如下所示:
.onAttach <- function(libname, pkgname) {
variable <- some_function()
assign("variable", variable, envir = as.environment("package:MyRPackage"))
}
及
.onLoad按照相关问题中的方法,您可以更改.onLoad()
函数,如下所示:
.onLoad <- function(libname, pkgname) {
variable <- some_function()
assign("variable", variable, envir = parent.env(environment()))
}
在一次新的R会议上,结果是
> MyRPackage:::variable
[1] 42
进一步解释
摘自哈德利·威克姆的:
有四种特殊环境:
- environment()是当前环境
您可以使用ls()和
使用parent.env()查看其父级
因此,如果我们进一步修改.onLoad()
函数,我们可以看到它的作用:
.onLoad <- function(libname, pkgname) {
print(environment()) # For demonstration purposes only;
print(parent.env(environment())) # Don't really do this.
variable <- 42
assign("variable", variable, envir = parent.env(environment()))
}
.onLoad基本上有两种方式:
通过assignInMyNamespace(…)
通过assign(…,envir=topenv())
虽然选项1看起来是,但实际上它需要更多的代码,因为您首先需要创建一个变量,然后才能通过assignInMyNamespace
覆盖它:
myvar=NULL
.onLoad=函数(libname,pkgname){
assignInMyNamespace('myvar',值)
}
未能预先声明变量将导致错误
相比之下,assign
完全能够创建一个以前从未声明过的新变量。我们只需要告诉R将变量分配到哪个环境中,函数就提供了这一点
.onLoad=function(libname,pkgname){
赋值('myvar',value,envir=topenv())
}
你能解释一下为什么每次加载时都要重新计算变量吗?你能导出一些函数
,这样你就可以调用MyRPackage::some\u function()
?@Dason它必须从file@lucacerone那个文件是不是每次都会改变?是的Dason,它可以在一个会话和另一个会话之间更改感谢duckymar,让我做几个测试,我会让您知道它是否工作正常它是否工作正常谢谢:)您能否通过简要解释parent.env(environment())的内容稍微改进一下答案是真的吗?@lucacerone我今天晚些时候会编辑以添加更多内容detail@lucacerone增加了一些进一步的解释。
.onLoad <- function(libname, pkgname) {
variable <- 42
assign("variable", variable, envir = parent.env(environment()))
}
> MyRPackage:::variable
[1] 42
.onLoad <- function(libname, pkgname) {
print(environment()) # For demonstration purposes only;
print(parent.env(environment())) # Don't really do this.
variable <- 42
assign("variable", variable, envir = parent.env(environment()))
}
<environment: 0x483da88>
<environment: namespace:MyRPackage>